| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <title>Forex Backtest Tracker</title> | |
| <meta name="description" content="Track and compare forex backtesting results across multiple strategies." /> | |
| <link rel="preconnect" href="https://fonts.googleapis.com" /> | |
| <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> | |
| <link rel="stylesheet" href="style.css" /> | |
| <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js"></script> | |
| </head> | |
| <body> | |
| <!-- ──────────── SIDEBAR ──────────── --> | |
| <aside class="sidebar" id="sidebar"> | |
| <div class="sidebar-logo"> | |
| <span class="logo-icon">📈</span> | |
| <span class="logo-text">BacktestTracker</span> | |
| </div> | |
| <nav class="sidebar-nav"> | |
| <a href="#" class="nav-item active" id="nav-dashboard" onclick="showPage('dashboard')"> | |
| <span class="nav-icon">🏠</span> Dashboard | |
| </a> | |
| <a href="#" class="nav-item" id="nav-strategies" onclick="showPage('strategies')"> | |
| <span class="nav-icon">📋</span> Strategies | |
| </a> | |
| </nav> | |
| <div class="sidebar-footer"> | |
| <span>Forex Backtest v1.0</span> | |
| </div> | |
| </aside> | |
| <!-- ──────────── MAIN CONTENT ──────────── --> | |
| <main class="main-content" id="main-content"> | |
| <!-- TOP BAR --> | |
| <header class="topbar"> | |
| <div class="topbar-left" style="display:flex; align-items:center; gap:16px;"> | |
| <button class="sidebar-toggle" onclick="toggleSidebar()" title="Toggle sidebar" | |
| style="background:none; border:none; color:var(--text-primary); font-size:20px; cursor:pointer;">☰</button> | |
| <h1 class="topbar-title" id="page-title">Dashboard</h1> | |
| </div> | |
| <div class="topbar-right"> | |
| <button class="btn btn-primary" id="topbar-btn" onclick="openStrategyModal()"> | |
| + New Strategy | |
| </button> | |
| </div> | |
| </header> | |
| <!-- ── PAGE: DASHBOARD ── --> | |
| <section class="page active" id="page-dashboard"> | |
| <!-- Summary Cards --> | |
| <div class="stats-grid" id="summary-cards"> | |
| <div class="stat-card"> | |
| <div class="stat-label">Total Strategies</div> | |
| <div class="stat-value" id="sum-total">0</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-label">Active</div> | |
| <div class="stat-value green" id="sum-active">0</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-label">Testing</div> | |
| <div class="stat-value yellow" id="sum-testing">0</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-label">Total Backtests</div> | |
| <div class="stat-value blue" id="sum-backtests">0</div> | |
| </div> | |
| </div> | |
| <!-- Charts Row --> | |
| <div class="charts-row"> | |
| <div class="card chart-card"> | |
| <div class="card-header"> | |
| <span class="card-title">Net Profit % Comparison</span> | |
| <select id="chart-metric-select" class="select-sm" onchange="renderComparisonChart()"> | |
| <option value="net_profit">Net Profit %</option> | |
| <option value="profit_factor">Profit Factor</option> | |
| <option value="max_dd_pct">Max DD %</option> | |
| <option value="rr">RR</option> | |
| <option value="total_return">Total Return</option> | |
| <option value="carg">CARG</option> | |
| </select> | |
| </div> | |
| <div class="chart-wrapper"><canvas id="comparison-chart"></canvas></div> | |
| </div> | |
| <div class="card chart-card"> | |
| <div class="card-header"> | |
| <span class="card-title">Winrate Comparison</span> | |
| </div> | |
| <div class="chart-wrapper"><canvas id="winrate-chart"></canvas></div> | |
| </div> | |
| </div> | |
| <!-- Ranking Table --> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <span class="card-title">Strategy Rankings</span> | |
| <div class="sort-controls"> | |
| <label class="select-label">Sort by</label> | |
| <select id="rank-sort-field" class="select-sm" onchange="renderRankingTable()"> | |
| <option value="net_profit">Net Profit %</option> | |
| <option value="profit_factor">Profit Factor</option> | |
| <option value="max_dd_pct">Max DD %</option> | |
| <option value="rr">RR</option> | |
| <option value="total_return">Total Return</option> | |
| <option value="carg">CARG</option> | |
| <option value="profit_trade">Profit Trades</option> | |
| </select> | |
| <select id="rank-sort-dir" class="select-sm" onchange="renderRankingTable()"> | |
| <option value="desc">↓ Best first</option> | |
| <option value="asc">↑ Worst first</option> | |
| </select> | |
| </div> | |
| </div> | |
| <div class="table-wrapper"> | |
| <table class="data-table" id="ranking-table"> | |
| <thead> | |
| <tr> | |
| <th>#</th> | |
| <th>Strategy</th> | |
| <th>Status</th> | |
| <th>Backtests</th> | |
| <th>Net Profit %</th> | |
| <th>Profit Factor</th> | |
| <th>Max DD %</th> | |
| <th>RR</th> | |
| <th>Total Return</th> | |
| <th>CARG</th> | |
| <th></th> | |
| </tr> | |
| </thead> | |
| <tbody id="ranking-tbody"></tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- ── PAGE: STRATEGIES LIST ── --> | |
| <section class="page" id="page-strategies"> | |
| <div class="strategies-grid" id="strategies-grid"></div> | |
| </section> | |
| <!-- ── PAGE: STRATEGY DETAIL ── --> | |
| <section class="page" id="page-detail"> | |
| <button class="btn btn-ghost back-btn" onclick="showPage('strategies')">← Back</button> | |
| <!-- Strategy header --> | |
| <div class="card strategy-header-card" id="detail-header"> | |
| <div class="detail-name-row"> | |
| <div class="detail-name-badge"> | |
| <h2 id="detail-name"></h2> | |
| <span class="badge" id="detail-status-badge"></span> | |
| </div> | |
| <div class="detail-actions"> | |
| <button class="btn btn-secondary" onclick="openEditStrategyModal()">Edit</button> | |
| <button class="btn btn-primary" onclick="openBacktestModal()">+ Add Backtest</button> | |
| </div> | |
| </div> | |
| <div class="detail-meta-row"> | |
| <p id="detail-description" class="detail-description"></p> | |
| <span class="detail-details-inline" id="detail-details-section"> | |
| <span class="detail-details-sep" id="detail-details-sep"> ·</span> | |
| <span id="detail-details" class="detail-details-text"></span> | |
| </span> | |
| </div> | |
| </div> | |
| <!-- Aggregated Stats --> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <span class="card-title">Aggregated Metrics (Average across all backtests)</span> | |
| <span class="agg-count" id="detail-agg-count"></span> | |
| </div> | |
| <div class="metrics-grid" id="detail-metrics-grid"></div> | |
| </div> | |
| <!-- Backtest Entries Table --> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <span class="card-title">Backtest Entries</span> | |
| </div> | |
| <div class="table-wrapper"> | |
| <table class="data-table" id="backtest-entries-table"> | |
| <thead> | |
| <tr> | |
| <th>Pair</th> | |
| <th>TF</th> | |
| <th>Period</th> | |
| <th>Net P%</th> | |
| <th>Total Ret</th> | |
| <th>Trades</th> | |
| <th>PF</th> | |
| <th>Max DD%</th> | |
| <th>AR/MDD</th> | |
| <th>Avg P</th> | |
| <th>Avg L</th> | |
| <th>Recover</th> | |
| <th>Lgst P</th> | |
| <th>Lgst L</th> | |
| <th>CARG</th> | |
| <th>RR</th> | |
| <th></th> | |
| </tr> | |
| </thead> | |
| <tbody id="backtest-entries-tbody"></tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </section> | |
| </main> | |
| <!-- ──────────── MODALS ──────────── --> | |
| <!-- Strategy Modal --> | |
| <div class="modal-overlay" id="strategy-modal" onclick="closeModal('strategy-modal')"> | |
| <div class="modal" onclick="event.stopPropagation()"> | |
| <div class="modal-header"> | |
| <h3 id="strategy-modal-title">New Strategy</h3> | |
| <button class="modal-close" onclick="closeModal('strategy-modal')">×</button> | |
| </div> | |
| <div class="modal-body"> | |
| <form id="strategy-form"> | |
| <input type="hidden" id="strategy-id" /> | |
| <div class="form-group"> | |
| <label class="field-label">Name *</label> | |
| <input type="text" id="strategy-name" class="form-input" placeholder="e.g. RSI System v3" required /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Status</label> | |
| <select id="strategy-status" class="form-input"> | |
| <option value="testing">🔬 Testing</option> | |
| <option value="active">✅ Active</option> | |
| </select> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Description</label> | |
| <textarea id="strategy-description" class="form-input" rows="4" | |
| placeholder="Brief description..."></textarea> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Strategy Details</label> | |
| <textarea id="strategy-details" class="form-input" rows="6" | |
| placeholder="Entry rules, indicators, risk management..."></textarea> | |
| </div> | |
| </form> | |
| </div> | |
| <div class="modal-footer"> | |
| <button class="btn btn-ghost" onclick="closeModal('strategy-modal')">Cancel</button> | |
| <button class="btn btn-primary" onclick="saveStrategy()">Save Strategy</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Backtest Entry Modal --> | |
| <div class="modal-overlay" id="backtest-modal" onclick="closeModal('backtest-modal')"> | |
| <div class="modal modal-wide" onclick="event.stopPropagation()"> | |
| <div class="modal-header"> | |
| <h3 id="backtest-modal-title">Add Backtest Entry</h3> | |
| <button class="modal-close" onclick="closeModal('backtest-modal')">×</button> | |
| </div> | |
| <div class="modal-body"> | |
| <form id="backtest-form"> | |
| <input type="hidden" id="backtest-id" /> | |
| <!-- Meta --> | |
| <div class="form-row-3"> | |
| <div class="form-group"> | |
| <label class="field-label">Currency Pair *</label> | |
| <input type="text" id="bt-pair" class="form-input" placeholder="EURUSD" required /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Timeframe *</label> | |
| <input type="text" id="bt-timeframe" class="form-input" placeholder="H1" required /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Period From</label> | |
| <input type="text" id="bt-date-from" class="form-input" placeholder="2023-01-01" /> | |
| </div> | |
| </div> | |
| <div class="form-row-3"> | |
| <div class="form-group"> | |
| <label class="field-label">Period To</label> | |
| <input type="text" id="bt-date-to" class="form-input" placeholder="2024-01-01" /> | |
| </div> | |
| <div class="form-group" style="grid-column: span 2"> | |
| <label class="field-label">Notes</label> | |
| <input type="text" id="bt-notes" class="form-input" placeholder="Any notes..." /> | |
| </div> | |
| </div> | |
| <!-- Metrics Divider --> | |
| <div class="form-divider"><span>📊 Metrics</span></div> | |
| <div class="form-row-4"> | |
| <div class="form-group"> | |
| <label class="field-label">Net Profit %</label> | |
| <input type="number" step="any" id="bt-net_profit" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Initial Balance</label> | |
| <input type="number" step="any" id="bt-initial_balance" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Total Return</label> | |
| <input type="number" step="any" id="bt-total_return" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Total Trades</label> | |
| <input type="number" id="bt-total_trades" class="form-input" placeholder="0" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Profit Factor</label> | |
| <input type="number" step="any" id="bt-profit_factor" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Max DD %</label> | |
| <input type="number" step="any" id="bt-max_dd_pct" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">AR/MDD</label> | |
| <input type="number" step="any" id="bt-ar_mdd" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Avg Profit Trade</label> | |
| <input type="number" step="any" id="bt-avg_profit_trade" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Avg Loss Trade</label> | |
| <input type="number" step="any" id="bt-avg_loss_trade" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Recover Factor</label> | |
| <input type="number" step="any" id="bt-recover_factor" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Largest Profit Trade</label> | |
| <input type="number" step="any" id="bt-largest_profit_trade" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">Largest Loss Trade</label> | |
| <input type="number" step="any" id="bt-largest_loss_trade" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">CARG</label> | |
| <input type="number" step="any" id="bt-carg" class="form-input" placeholder="0.00" /> | |
| </div> | |
| <div class="form-group"> | |
| <label class="field-label">RR</label> | |
| <input type="number" step="any" id="bt-rr" class="form-input" placeholder="0.00" /> | |
| </div> | |
| </div> | |
| </form> | |
| </div> | |
| <div class="modal-footer"> | |
| <button class="btn btn-ghost" onclick="closeModal('backtest-modal')">Cancel</button> | |
| <button class="btn btn-primary" onclick="saveBacktest()">Save Backtest</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Confirm Delete Modal --> | |
| <div class="modal-overlay" id="confirm-modal" onclick="closeModal('confirm-modal')"> | |
| <div class="modal modal-sm" onclick="event.stopPropagation()"> | |
| <div class="modal-header"> | |
| <h3>Confirm Delete</h3> | |
| <button class="modal-close" onclick="closeModal('confirm-modal')">×</button> | |
| </div> | |
| <div class="modal-body"> | |
| <p id="confirm-message">Are you sure you want to delete this?</p> | |
| </div> | |
| <div class="modal-footer"> | |
| <button class="btn btn-ghost" onclick="closeModal('confirm-modal')">Cancel</button> | |
| <button class="btn btn-danger" id="confirm-action-btn">Delete</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Toast --> | |
| <div class="toast" id="toast"></div> | |
| <script src="app.js"></script> | |
| </body> | |
| </html> |
Xet Storage Details
- Size:
- 16.3 kB
- Xet hash:
- 919b30a2f9665c1ff04cddd481cc75d9fdfe312d9e86e52db33a3a45f5a6492d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.