38e1d64437
CI / lint-test-build (push) Successful in 2m31s
- Introduced backtesting page and fragment in the dashboard for running backtests and viewing recent reports. - Implemented backtest run logic with configuration options including event path, starting balances, trade capital, and fee profiles. - Added recent backtest reports storage and retrieval. - Created a new strategy module for statistical arbitrage experiments with validation on configuration parameters. - Updated settings to include parameters for the statistical arbitrage strategy. - Enhanced dashboard controls to support the new strategy mode. - Added unit tests for backtesting functionality and strategy validation. - Updated templates for backtesting UI integration.
172 lines
6.0 KiB
HTML
172 lines
6.0 KiB
HTML
<div id="controls-panel" class="panel" style="margin-top: 16px">
|
|
<div class="grid">
|
|
<article class="card">
|
|
<div class="label">Runtime Status</div>
|
|
<div class="value">{{ execution_status }}</div>
|
|
<div class="meta">Updated {{ updated_at }}</div>
|
|
</article>
|
|
<article class="card">
|
|
<div class="label">Kill Switch</div>
|
|
<div class="value">{{ kill_switch_status }}</div>
|
|
<div class="meta">Reason {{ kill_switch_reason }}</div>
|
|
</article>
|
|
<article class="card">
|
|
<div class="label">Config Snapshot</div>
|
|
<div class="meta">Paper trading: {{ paper_trading_mode }}</div>
|
|
<div class="meta">Trade capital: {{ trade_capital_usd }}</div>
|
|
<div class="meta">Max trade capital: {{ max_trade_capital_usd }}</div>
|
|
<div class="meta">Max concurrent trades: {{ max_concurrent_trades }}</div>
|
|
<div class="meta">Tradable pairs: {{ tradable_pairs_display }}</div>
|
|
<div class="meta">Strategy mode: {{ strategy_mode }}</div>
|
|
<div class="meta">Profit threshold: {{ strategy_profit_threshold }}</div>
|
|
<div class="meta">Max depth levels: {{ strategy_max_depth_levels }}</div>
|
|
</article>
|
|
<article class="card">
|
|
<div class="label">Alerting</div>
|
|
<div class="meta">Status: {{ alerts_enabled }}</div>
|
|
<div class="meta">Channels: {{ alerts_channels }}</div>
|
|
<div class="meta">Min severity: {{ alerts_min_severity }}</div>
|
|
<div class="meta">Dedup window: {{ alerts_dedup_seconds }}s</div>
|
|
<div class="meta">Last result: {{ alerts_last_result }}</div>
|
|
<div class="meta">Last attempted: {{ alerts_last_attempted_at }}</div>
|
|
<div class="meta">Last success: {{ alerts_last_success_at }}</div>
|
|
<div class="meta">Last event: {{ alerts_last_event_title }}</div>
|
|
<div class="meta">Last error: {{ alerts_last_error }}</div>
|
|
{% if alerts_last_channel_results %} {% for item in
|
|
alerts_last_channel_results %}
|
|
<div class="meta">{{ item }}</div>
|
|
{% endfor %} {% endif %}
|
|
</article>
|
|
</div>
|
|
|
|
<div
|
|
class="grid"
|
|
style="
|
|
margin-top: 16px;
|
|
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
"
|
|
>
|
|
<article class="card">
|
|
<div class="label">Execution Controls</div>
|
|
<div class="control-actions">
|
|
<form
|
|
hx-post="{{ start_endpoint }}"
|
|
hx-target="#controls-panel"
|
|
hx-swap="outerHTML"
|
|
>
|
|
<button type="submit" class="button">Start</button>
|
|
</form>
|
|
<form
|
|
hx-post="{{ stop_endpoint }}"
|
|
hx-target="#controls-panel"
|
|
hx-swap="outerHTML"
|
|
>
|
|
<button type="submit" class="button secondary">Stop</button>
|
|
</form>
|
|
<form
|
|
hx-post="{{ kill_switch_endpoint }}"
|
|
hx-target="#controls-panel"
|
|
hx-swap="outerHTML"
|
|
>
|
|
<input type="hidden" name="reason" value="manual" />
|
|
<button type="submit" class="button danger">
|
|
Trigger Kill Switch
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</article>
|
|
<article class="card">
|
|
<div class="label">Edit Config</div>
|
|
<form
|
|
class="form-grid"
|
|
hx-post="{{ config_endpoint }}"
|
|
hx-target="#controls-panel"
|
|
hx-swap="outerHTML"
|
|
>
|
|
<label class="field">
|
|
<span>Trade capital USD</span>
|
|
<input
|
|
name="trade_capital_usd"
|
|
type="number"
|
|
min="0"
|
|
step="0.01"
|
|
value="{{ trade_capital_usd_value }}"
|
|
/>
|
|
</label>
|
|
<label class="field">
|
|
<span>Max trade capital USD</span>
|
|
<input
|
|
name="max_trade_capital_usd"
|
|
type="number"
|
|
min="0"
|
|
step="0.01"
|
|
value="{{ max_trade_capital_usd_value }}"
|
|
/>
|
|
</label>
|
|
<label class="field">
|
|
<span>Max concurrent trades</span>
|
|
<input
|
|
name="max_concurrent_trades"
|
|
type="number"
|
|
min="1"
|
|
step="1"
|
|
value="{{ max_concurrent_trades_value }}"
|
|
/>
|
|
</label>
|
|
<label class="field">
|
|
<span>Tradable pairs</span>
|
|
<input
|
|
name="tradable_pairs"
|
|
type="text"
|
|
placeholder="BTC/USD, ETH/BTC"
|
|
value="{{ tradable_pairs_value }}"
|
|
/>
|
|
</label>
|
|
<label class="field">
|
|
<span>Strategy mode</span>
|
|
<select name="strategy_mode">
|
|
{% set sel = "selected" if strategy_mode == "incremental" else "" %}
|
|
<option value="incremental" {{ sel }}>incremental</option>
|
|
{% set sel = "selected" if strategy_mode == "paper" else "" %}
|
|
<option value="paper" {{ sel }}>paper</option>
|
|
{% set sel = "selected" if strategy_mode == "live" else "" %}
|
|
<option value="live" {{ sel }}>live</option>
|
|
{% if strategy_stat_arb_enabled %} {% set sel = "selected" if
|
|
strategy_mode == "stat_arb_experiment" else "" %}
|
|
<option value="stat_arb_experiment" {{ sel }}>
|
|
stat_arb_experiment
|
|
</option>
|
|
{% endif %}
|
|
</select>
|
|
</label>
|
|
<label class="field">
|
|
<span>Strategy profit threshold</span>
|
|
<input
|
|
name="strategy_profit_threshold"
|
|
type="number"
|
|
min="0"
|
|
step="0.0001"
|
|
value="{{ strategy_profit_threshold }}"
|
|
/>
|
|
</label>
|
|
<label class="field">
|
|
<span>Max depth levels</span>
|
|
<input
|
|
name="strategy_max_depth_levels"
|
|
type="number"
|
|
min="1"
|
|
step="1"
|
|
value="{{ strategy_max_depth_levels }}"
|
|
/>
|
|
</label>
|
|
<label class="field checkbox">
|
|
{% set check = "checked" if paper_trading_mode == "enabled" else "" %}
|
|
<input name="paper_trading_mode" type="checkbox" {{ check }} />
|
|
<span>Paper trading mode</span>
|
|
</label>
|
|
<button type="submit" class="button">Save config</button>
|
|
</form>
|
|
</article>
|
|
</div>
|
|
</div>
|