disLodge's picture
Adding fees inclusion
2dee41b
import gradio as gr
import asyncio
from triangular_arbitrage import detector
async def run_detection_ui(
exchange_name,
include_fees,
use_taker,
trade_size_usd,
slippage_factor,
api_key,
api_secret
):
try:
best_opps, best_profit, fee_breakdown = await detector.run_detection(
exchange_name=exchange_name,
max_cycle=3, # fixed triangular only
include_fees=include_fees,
use_taker=use_taker,
trade_size_usd=trade_size_usd,
slippage_factor=slippage_factor,
api_key=api_key if api_key else None,
api_secret=api_secret if api_secret else None,
)
if not best_opps:
return "No arbitrage opportunity found."
result_lines = []
result_lines.append("## Trading Cycle:")
for i, ticker in enumerate(best_opps, 1):
result_lines.append(
f"{i}. {ticker.symbol} | price: {ticker.last_price:.8f}"
)
result_lines.append("\n## Profit Analysis:")
if include_fees and fee_breakdown:
result_lines.append(f"**Gross Profit:** {fee_breakdown['gross_profit']*100:.4f}%")
result_lines.append(f"**Trading Fees:** {fee_breakdown['total_fees']*100:.4f}% ({fee_breakdown['fee_rate_per_trade']*100:.2f}% per trade)")
result_lines.append(f"**Slippage:** {fee_breakdown['total_slippage']*100:.4f}% ({fee_breakdown['slippage_per_trade']*100:.4f}% per trade)")
result_lines.append(f"**Net Profit:** {fee_breakdown['net_profit']*100:.4f}%")
result_lines.append(f"\n**Net Profit Multiplier:** {best_profit:.8f}")
else:
result_lines.append(f"**Gross Profit:** {(best_profit - 1)*100:.4f}%")
result_lines.append(f"**Profit Multiplier:** {best_profit:.8f}")
result_lines.append("\n*Note: Fees and slippage not included. Enable 'Include Fees' to see net profit.*")
return "\n".join(result_lines)
except Exception as e:
return f"Error while scanning: {str(e)}"
with gr.Blocks(title="Triangular Arbitrage Scanner") as demo:
gr.Markdown("# Triangular Arbitrage Scanner")
gr.Markdown("Scan for triangular arbitrage opportunities with fee and slippage calculations.")
with gr.Row():
with gr.Column():
exchange = gr.Dropdown(
choices=[
"binanceus",
"binance",
"huobi",
"htx",
],
value="binanceus",
label="Exchange",
)
include_fees = gr.Checkbox(
value=True,
label="Include Fees & Slippage",
info="Calculate net profit after trading fees and slippage"
)
use_taker = gr.Radio(
choices=[("Taker Fees", True), ("Maker Fees", False)],
value=True,
label="Fee Type",
info="Taker fees are typically higher but execute immediately"
)
trade_size_usd = gr.Slider(
minimum=100,
maximum=100000,
value=1000,
step=100,
label="Trade Size (USD)",
info="Estimated trade size for slippage calculation"
)
slippage_factor = gr.Slider(
minimum=0.0001,
maximum=0.002,
value=0.0005,
step=0.0001,
label="Slippage Factor",
info="Slippage per $1000 traded (0.0005 = 0.05% per $1000)"
)
with gr.Column():
gr.Markdown("### API Keys (Optional)")
gr.Markdown("Provide API keys to fetch your actual fee tier (VIP discounts, etc.)")
api_key = gr.Textbox(
label="API Key",
type="password",
placeholder="Enter your API key (optional)",
info="Used to fetch your actual fee tier"
)
api_secret = gr.Textbox(
label="API Secret",
type="password",
placeholder="Enter your API secret (optional)",
info="Used to fetch your actual fee tier"
)
scan_btn = gr.Button("Scan for opportunities", variant="primary", size="lg")
output = gr.Markdown(
value="Select exchange and click **Scan**.",
label="Result"
)
scan_btn.click(
fn=run_detection_ui,
inputs=[
exchange,
include_fees,
use_taker,
trade_size_usd,
slippage_factor,
api_key,
api_secret
],
outputs=output,
)
demo.launch()