2025-08-02 21:26:22 +08:00
|
|
|
<!-- templates/backtesting.html (Setelah Refactor) -->
|
|
|
|
|
{% extends "base.html" %}
|
|
|
|
|
|
2025-10-16 01:47:55 +08:00
|
|
|
{% block title_key %}nav.backtest{% endblock %}
|
|
|
|
|
{% block title %}Strategy Backtester{% endblock %}
|
2025-08-02 21:26:22 +08:00
|
|
|
|
|
|
|
|
{% block content %}
|
2025-08-08 10:39:03 +08:00
|
|
|
<div class="flex justify-between items-center mb-4">
|
2025-10-16 01:47:55 +08:00
|
|
|
<h2 class="text-2xl font-bold text-gray-800" data-i18n="nav.backtest">Strategy Backtester</h2>
|
2025-09-24 11:31:37 +08:00
|
|
|
<div class="flex space-x-2">
|
|
|
|
|
<a href="{{ url_for('backtest_history_page') }}" class="bg-gray-200 text-gray-800 py-2 px-4 rounded-lg font-medium hover:bg-gray-300">
|
2025-10-16 01:47:55 +08:00
|
|
|
<i class="fas fa-history mr-2"></i><span data-i18n="action.view">Lihat Riwayat</span>
|
2025-09-24 11:31:37 +08:00
|
|
|
</a>
|
|
|
|
|
</div>
|
2025-08-08 10:39:03 +08:00
|
|
|
</div>
|
2025-08-02 21:26:22 +08:00
|
|
|
|
2025-08-29 20:02:10 +08:00
|
|
|
<!-- Enhanced Engine Info -->
|
|
|
|
|
<div class="mb-6 p-4 bg-blue-50 border border-blue-200 rounded-lg">
|
|
|
|
|
<div class="flex items-start">
|
|
|
|
|
<div class="flex-shrink-0">
|
|
|
|
|
<i class="fas fa-rocket text-blue-600 text-xl"></i>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="ml-3">
|
2025-10-16 01:47:55 +08:00
|
|
|
<h3 class="text-sm font-medium text-blue-800" data-i18n="backtest.enhanced_engine_active">🚀 Enhanced Backtesting Engine Active</h3>
|
2025-08-29 20:02:10 +08:00
|
|
|
<div class="mt-1 text-sm text-blue-700">
|
2025-10-16 01:47:55 +08:00
|
|
|
<p data-i18n="backtest.includes">Your backtesting now includes:</p>
|
2025-08-29 20:02:10 +08:00
|
|
|
<ul class="mt-1 list-disc list-inside text-xs space-y-1">
|
2025-10-16 01:47:55 +08:00
|
|
|
<li>✅ <strong data-i18n="backtest.realistic_spread">Realistic spread costs</strong> - <span data-i18n="backtest.actual_costs">Actual trading costs deducted</span></li>
|
|
|
|
|
<li>✅ <strong data-i18n="backtest.atr_risk">ATR-based risk management</strong> - <span data-i18n="backtest.dynamic_sizing">Dynamic position sizing</span></li>
|
|
|
|
|
<li>✅ <strong data-i18n="backtest.instrument_protection">Instrument protection</strong> - <span data-i18n="backtest.gold_safeguards">Gold trading safeguards</span></li>
|
|
|
|
|
<li>✅ <strong data-i18n="backtest.slippage">Slippage simulation</strong> - <span data-i18n="backtest.accurate_modeling">More accurate execution modeling</span></li>
|
2025-08-29 20:02:10 +08:00
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2025-08-02 21:26:22 +08:00
|
|
|
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
|
|
|
|
|
<!-- Kolom Konfigurasi -->
|
|
|
|
|
<div class="lg:col-span-1 bg-white p-6 rounded-lg shadow">
|
|
|
|
|
<form id="backtest-form">
|
|
|
|
|
<div class="space-y-4">
|
|
|
|
|
<div>
|
2025-10-16 01:47:55 +08:00
|
|
|
<label for="strategy-select" class="block text-sm font-medium text-gray-700" data-i18n="label.strategy">Pilih Strategi</label>
|
2025-08-02 21:26:22 +08:00
|
|
|
<select id="strategy-select" name="strategy" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm"></select>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
2025-10-16 01:47:55 +08:00
|
|
|
<label for="data-file" class="block text-sm font-medium text-gray-700" data-i18n="backtest.upload_data">Unggah Data Historis (CSV)</label>
|
2025-08-02 21:26:22 +08:00
|
|
|
<input type="file" id="data-file" name="file" accept=".csv" class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-full file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100" required>
|
|
|
|
|
</div>
|
2025-08-21 23:36:25 +08:00
|
|
|
|
2025-08-29 20:02:10 +08:00
|
|
|
<!-- Risk Management Inputs (Enhanced Engine) -->
|
2025-08-21 23:36:25 +08:00
|
|
|
<div class="grid grid-cols-2 gap-4 pt-4 border-t">
|
|
|
|
|
<div>
|
2025-08-29 20:02:10 +08:00
|
|
|
<label for="sl_atr_multiplier" class="block text-sm font-medium text-gray-700">
|
2025-10-16 01:47:55 +08:00
|
|
|
<span data-i18n="label.sl_atr">SL (ATR Multiplier)</span>
|
|
|
|
|
<span class="text-xs text-blue-600" data-i18n="backtest.enhanced">🚀 Enhanced</span>
|
2025-08-29 20:02:10 +08:00
|
|
|
</label>
|
|
|
|
|
<input type="number" name="sl_atr_multiplier" id="sl_atr_multiplier" value="2.0" step="0.1" min="0.5" max="5.0"
|
|
|
|
|
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500">
|
2025-10-16 01:47:55 +08:00
|
|
|
<p class="text-xs text-gray-500 mt-1" data-i18n="backtest.dynamic_sl">Dynamic SL based on volatility</p>
|
2025-08-21 23:36:25 +08:00
|
|
|
</div>
|
|
|
|
|
<div>
|
2025-08-29 20:02:10 +08:00
|
|
|
<label for="tp_atr_multiplier" class="block text-sm font-medium text-gray-700">
|
2025-10-16 01:47:55 +08:00
|
|
|
<span data-i18n="label.tp_atr">TP (ATR Multiplier)</span>
|
|
|
|
|
<span class="text-xs text-blue-600" data-i18n="backtest.enhanced">🚀 Enhanced</span>
|
2025-08-29 20:02:10 +08:00
|
|
|
</label>
|
|
|
|
|
<input type="number" name="tp_atr_multiplier" id="tp_atr_multiplier" value="4.0" step="0.1" min="1.0" max="10.0"
|
|
|
|
|
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500">
|
2025-10-16 01:47:55 +08:00
|
|
|
<p class="text-xs text-gray-500 mt-1" data-i18n="backtest.dynamic_tp">Dynamic TP based on volatility</p>
|
2025-08-21 23:36:25 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2025-08-02 21:26:22 +08:00
|
|
|
<div id="params-container" class="space-y-4 pt-4 border-t">
|
|
|
|
|
<!-- Parameter akan dimuat di sini -->
|
2025-10-16 01:47:55 +08:00
|
|
|
<span data-i18n="bots.strategy_params_loaded">Parameter strategi akan dimuat di sini</span>
|
2025-08-02 21:26:22 +08:00
|
|
|
</div>
|
2025-10-16 01:47:55 +08:00
|
|
|
<button type="submit" id="run-backtest-btn" class="w-full bg-blue-600 text-white py-2 px-4 rounded-lg font-medium hover:bg-blue-700" data-i18n="backtest.run">
|
2025-08-02 21:26:22 +08:00
|
|
|
Jalankan Backtest
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Kolom Hasil -->
|
|
|
|
|
<div id="results-container" class="lg:col-span-2 bg-white p-6 rounded-lg shadow hidden">
|
2025-10-16 01:47:55 +08:00
|
|
|
<h3 class="text-xl font-bold mb-4" data-i18n="backtest.results">Hasil Backtest</h3>
|
2025-08-02 21:26:22 +08:00
|
|
|
<div id="results-summary" class="grid grid-cols-2 md:grid-cols-3 gap-4 mb-6"></div>
|
|
|
|
|
<div class="mb-6">
|
|
|
|
|
<canvas id="equity-chart"></canvas>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="results-log"></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="loading-spinner" class="lg:col-span-2 flex items-center justify-center hidden">
|
|
|
|
|
<i class="fas fa-spinner fa-spin text-blue-500 text-4xl"></i>
|
2025-10-16 01:47:55 +08:00
|
|
|
<p class="ml-4 text-gray-600" data-i18n="backtest.running">Menjalankan simulasi...</p>
|
2025-08-02 21:26:22 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
{% endblock %}
|
|
|
|
|
|
|
|
|
|
{% block scripts %}
|
|
|
|
|
<script src="{{ url_for('static', filename='js/backtesting.js') }}"></script>
|
2025-09-24 11:31:37 +08:00
|
|
|
{% endblock %}
|