Spaces:
Running
Running
File size: 56,575 Bytes
8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>design/04_quick_start_guide | backtest-kit</title><meta name="description" content="Documentation for backtest-kit"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search"><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">backtest-kit</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">backtest-kit</a></li><li><a href="design_04_quick_start_guide.html">design/04_quick_start_guide</a></li></ul></div><div class="tsd-panel tsd-typography"><a id="quick-start-guide" class="tsd-anchor"></a><h1 class="tsd-anchor-link">Quick Start Guide<a href="#quick-start-guide" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h1><p>This guide demonstrates a minimal working example of the backtest-kit framework. You'll learn how to register a strategy, configure an exchange data source, set up a timeframe, and execute a backtest. For installation instructions, see <a href="design_03_installation_and_setup.html">Installation and Setup</a>. For deeper understanding of execution modes and lifecycle concepts, see <a href="design_05_core_concepts.html">Core Concepts</a> and <a href="design_08_component_registration.html">Component Registration</a>.</p>
<a id="overview-the-basic-flow" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Overview: The Basic Flow<a href="#overview-the-basic-flow" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>A minimal backtest workflow consists of four registration steps followed by execution:</p>
<p><img src="../media/04_Quick_Start_Guide_0.svg" alt="Mermaid Diagram"></p>
<a id="step-1-exchange-configuration" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Step 1: Exchange Configuration<a href="#step-1-exchange-configuration" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>The exchange provides historical candle data for backtesting. You must implement the <code>IExchangeSchema</code> interface with three required methods:</p>
<ul>
<li><code>getCandles</code>: Fetch OHLCV data</li>
<li><code>formatPrice</code>: Format price to exchange precision</li>
<li><code>formatQuantity</code>: Format quantity to exchange precision</li>
</ul>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">addExchange</span><span class="hl-1">, </span><span class="hl-4">ICandleData</span><span class="hl-1">, </span><span class="hl-4">CandleInterval</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-0">addExchange</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">exchangeName:</span><span class="hl-1"> </span><span class="hl-2">"binance"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">getCandles</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-4">symbol</span><span class="hl-1">: </span><span class="hl-11">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">interval</span><span class="hl-1">: </span><span class="hl-11">CandleInterval</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">since</span><span class="hl-1">: </span><span class="hl-11">Date</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">limit</span><span class="hl-1">: </span><span class="hl-11">number</span><br/><span class="hl-1"> ): </span><span class="hl-11">Promise</span><span class="hl-1"><</span><span class="hl-11">ICandleData</span><span class="hl-1">[]> {</span><br/><span class="hl-1"> </span><span class="hl-6">// Return historical candles from your data source</span><br/><span class="hl-1"> </span><span class="hl-6">// This example returns mock data</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">candles</span><span class="hl-1">: </span><span class="hl-11">ICandleData</span><span class="hl-1">[] = [];</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">intervalMs</span><span class="hl-1"> = </span><span class="hl-7">60000</span><span class="hl-1">; </span><span class="hl-6">// 1 minute</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-5">for</span><span class="hl-1"> (</span><span class="hl-3">let</span><span class="hl-1"> </span><span class="hl-4">i</span><span class="hl-1"> = </span><span class="hl-7">0</span><span class="hl-1">; </span><span class="hl-4">i</span><span class="hl-1"> < </span><span class="hl-4">limit</span><span class="hl-1">; </span><span class="hl-4">i</span><span class="hl-1">++) {</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">timestamp</span><span class="hl-1"> = </span><span class="hl-4">since</span><span class="hl-1">.</span><span class="hl-0">getTime</span><span class="hl-1">() + </span><span class="hl-4">i</span><span class="hl-1"> * </span><span class="hl-4">intervalMs</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-4">candles</span><span class="hl-1">.</span><span class="hl-0">push</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">timestamp</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">open:</span><span class="hl-1"> </span><span class="hl-7">50000</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">100</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">high:</span><span class="hl-1"> </span><span class="hl-7">50100</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">100</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">low:</span><span class="hl-1"> </span><span class="hl-7">49900</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">100</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">close:</span><span class="hl-1"> </span><span class="hl-7">50000</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">100</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">volume:</span><span class="hl-1"> </span><span class="hl-7">100</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-4">candles</span><span class="hl-1">;</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">formatPrice</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">: </span><span class="hl-11">string</span><span class="hl-1">, </span><span class="hl-4">price</span><span class="hl-1">: </span><span class="hl-11">number</span><span class="hl-1">): </span><span class="hl-11">Promise</span><span class="hl-1"><</span><span class="hl-11">string</span><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-4">price</span><span class="hl-1">.</span><span class="hl-0">toFixed</span><span class="hl-1">(</span><span class="hl-7">2</span><span class="hl-1">); </span><span class="hl-6">// 2 decimal places for BTC</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">formatQuantity</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">: </span><span class="hl-11">string</span><span class="hl-1">, </span><span class="hl-4">quantity</span><span class="hl-1">: </span><span class="hl-11">number</span><span class="hl-1">): </span><span class="hl-11">Promise</span><span class="hl-1"><</span><span class="hl-11">string</span><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-4">quantity</span><span class="hl-1">.</span><span class="hl-0">toFixed</span><span class="hl-1">(</span><span class="hl-7">8</span><span class="hl-1">); </span><span class="hl-6">// 8 decimal places</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<p><strong>Key Points:</strong></p>
<ul>
<li><code>exchangeName</code> must be unique across all registered exchanges</li>
<li><code>getCandles</code> is called automatically during backtest execution</li>
<li>The framework uses <code>getCandles</code> to fetch data backwards from execution time</li>
<li><code>ICandleData</code> requires: <code>timestamp</code>, <code>open</code>, <code>high</code>, <code>low</code>, <code>close</code>, <code>volume</code></li>
</ul>
<a id="step-2-frame-configuration" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Step 2: Frame Configuration<a href="#step-2-frame-configuration" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>The frame defines the backtest period and iteration interval:</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">addFrame</span><span class="hl-1">, </span><span class="hl-4">FrameInterval</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-0">addFrame</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">frameName:</span><span class="hl-1"> </span><span class="hl-2">"1d-test"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">interval:</span><span class="hl-1"> </span><span class="hl-2">"1m"</span><span class="hl-1">, </span><span class="hl-6">// Tick every 1 minute</span><br/><span class="hl-1"> </span><span class="hl-4">startDate:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Date</span><span class="hl-1">(</span><span class="hl-2">"2024-01-01T00:00:00Z"</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-4">endDate:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Date</span><span class="hl-1">(</span><span class="hl-2">"2024-01-02T00:00:00Z"</span><span class="hl-1">) </span><span class="hl-6">// 1 day backtest</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<p><strong>Available Intervals:</strong> <code>"1m"</code>, <code>"3m"</code>, <code>"5m"</code>, <code>"15m"</code>, <code>"30m"</code>, <code>"1h"</code>, <code>"2h"</code>, <code>"4h"</code>, <code>"6h"</code>, <code>"8h"</code>, <code>"12h"</code>, <code>"1d"</code>, <code>"3d"</code></p>
<p>The framework generates timestamps at the specified interval between <code>startDate</code> and <code>endDate</code>. Each timestamp triggers a <code>tick()</code> call on your strategy.</p>
<a id="step-3-strategy-definition" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Step 3: Strategy Definition<a href="#step-3-strategy-definition" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>The strategy implements your trading logic. At minimum, you must provide:</p>
<ul>
<li><code>strategyName</code>: Unique identifier</li>
<li><code>interval</code>: Signal generation throttle (minimum time between <code>getSignal</code> calls)</li>
<li><code>getSignal</code>: Function that returns trading signals or <code>null</code></li>
</ul>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">addStrategy</span><span class="hl-1">, </span><span class="hl-4">ISignalDto</span><span class="hl-1">, </span><span class="hl-4">SignalInterval</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-0">addStrategy</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">strategyName:</span><span class="hl-1"> </span><span class="hl-2">"simple-long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">interval:</span><span class="hl-1"> </span><span class="hl-2">"5m"</span><span class="hl-1"> </span><span class="hl-5">as</span><span class="hl-1"> </span><span class="hl-11">SignalInterval</span><span class="hl-1">, </span><span class="hl-6">// Check for signals every 5 minutes</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">getSignal</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">: </span><span class="hl-11">string</span><span class="hl-1">, </span><span class="hl-4">when</span><span class="hl-1">: </span><span class="hl-11">Date</span><span class="hl-1">): </span><span class="hl-11">Promise</span><span class="hl-1"><</span><span class="hl-11">ISignalDto</span><span class="hl-1"> | </span><span class="hl-11">null</span><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-6">// Your strategy logic here</span><br/><span class="hl-1"> </span><span class="hl-6">// Return null when no signal, or return a signal object</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-6">// Example: Always long when price is available</span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">position:</span><span class="hl-1"> </span><span class="hl-2">"long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">note:</span><span class="hl-1"> </span><span class="hl-2">"Simple long strategy"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">// priceOpen: undefined means open immediately at current price</span><br/><span class="hl-1"> </span><span class="hl-4">priceTakeProfit:</span><span class="hl-1"> </span><span class="hl-7">51000</span><span class="hl-1">, </span><span class="hl-6">// Exit at +2% profit</span><br/><span class="hl-1"> </span><span class="hl-4">priceStopLoss:</span><span class="hl-1"> </span><span class="hl-7">49000</span><span class="hl-1">, </span><span class="hl-6">// Exit at -2% loss</span><br/><span class="hl-1"> </span><span class="hl-4">minuteEstimatedTime:</span><span class="hl-1"> </span><span class="hl-7">60</span><span class="hl-1"> </span><span class="hl-6">// Close after 60 minutes if not hit</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<p><strong>Signal Fields:</strong></p>
<ul>
<li><code>position</code>: <code>"long"</code> (buy) or <code>"short"</code> (sell)</li>
<li><code>priceOpen</code> (optional): Entry price for scheduled signals (limit orders). If omitted, opens immediately at current VWAP</li>
<li><code>priceTakeProfit</code>: Target profit exit price</li>
<li><code>priceStopLoss</code>: Risk management exit price</li>
<li><code>minuteEstimatedTime</code>: Maximum signal lifetime in minutes</li>
</ul>
<p><strong>Validation Rules:</strong></p>
<ul>
<li><strong>LONG</strong>: <code>priceStopLoss < priceOpen < priceTakeProfit</code></li>
<li><strong>SHORT</strong>: <code>priceTakeProfit < priceOpen < priceStopLoss</code></li>
<li>All prices must be positive and finite</li>
<li><code>minuteEstimatedTime</code> must be positive integer</li>
</ul>
<a id="step-4-running-the-backtest" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Step 4: Running the Backtest<a href="#step-4-running-the-backtest" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Execute the backtest with <code>Backtest.run()</code>:</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">Backtest</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// Synchronous execution - waits for completion</span><br/><span class="hl-5">for</span><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> (</span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">result</span><span class="hl-1"> </span><span class="hl-3">of</span><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">run</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-4">strategyName:</span><span class="hl-1"> </span><span class="hl-2">"simple-long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">exchangeName:</span><span class="hl-1"> </span><span class="hl-2">"binance"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">frameName:</span><span class="hl-1"> </span><span class="hl-2">"1d-test"</span><br/><span class="hl-1">})) {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Action: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">action</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-4">result</span><span class="hl-1">.</span><span class="hl-4">action</span><span class="hl-1"> === </span><span class="hl-2">"closed"</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`PNL: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">pnl</span><span class="hl-9">.</span><span class="hl-4">pnlPercentage</span><span class="hl-9">.</span><span class="hl-0">toFixed</span><span class="hl-9">(</span><span class="hl-7">2</span><span class="hl-9">)</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Reason: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">closeReason</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Backtest completed!"</span><span class="hl-1">);</span>
</code><button type="button">Copy</button></pre>
<p><strong>Return Type:</strong> <code>AsyncGenerator<IStrategyTickResult></code></p>
<p>Each iteration yields a tick result with discriminated union type:</p>
<table>
<thead>
<tr>
<th>Action</th>
<th>Description</th>
<th>Available Fields</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>"idle"</code></td>
<td>No active signal</td>
<td><code>currentPrice</code>, <code>signal: null</code></td>
</tr>
<tr>
<td><code>"scheduled"</code></td>
<td>Limit order created</td>
<td><code>signal: IScheduledSignalRow</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>"opened"</code></td>
<td>Position opened</td>
<td><code>signal: ISignalRow</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>"active"</code></td>
<td>Monitoring TP/SL</td>
<td><code>signal: ISignalRow</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>"closed"</code></td>
<td>Position closed</td>
<td><code>signal</code>, <code>pnl</code>, <code>closeReason</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>"cancelled"</code></td>
<td>Scheduled signal expired</td>
<td><code>signal: IScheduledSignalRow</code>, <code>currentPrice</code></td>
</tr>
</tbody>
</table>
<a id="step-5-listening-to-events" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Step 5: Listening to Events<a href="#step-5-listening-to-events" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Instead of iterating results, you can listen to events asynchronously:</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">listenSignalBacktest</span><span class="hl-1">, </span><span class="hl-4">listenDoneBacktest</span><span class="hl-1">, </span><span class="hl-4">Backtest</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// Subscribe to signal events</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">unsubscribe</span><span class="hl-1"> = </span><span class="hl-0">listenSignalBacktest</span><span class="hl-1">((</span><span class="hl-4">result</span><span class="hl-1">) </span><span class="hl-3">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-4">result</span><span class="hl-1">.</span><span class="hl-4">action</span><span class="hl-1"> === </span><span class="hl-2">"closed"</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Signal closed: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">signal</span><span class="hl-9">.</span><span class="hl-4">id</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`PNL: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">pnl</span><span class="hl-9">.</span><span class="hl-4">pnlPercentage</span><span class="hl-9">.</span><span class="hl-0">toFixed</span><span class="hl-9">(</span><span class="hl-7">2</span><span class="hl-9">)</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Close reason: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">closeReason</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Subscribe to completion</span><br/><span class="hl-0">listenDoneBacktest</span><span class="hl-1">((</span><span class="hl-4">event</span><span class="hl-1">) </span><span class="hl-3">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Backtest done: </span><span class="hl-3">${</span><span class="hl-4">event</span><span class="hl-9">.</span><span class="hl-4">symbol</span><span class="hl-3">}</span><span class="hl-2"> </span><span class="hl-3">${</span><span class="hl-4">event</span><span class="hl-9">.</span><span class="hl-4">strategyName</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-0">unsubscribe</span><span class="hl-1">(); </span><span class="hl-6">// Stop listening</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// Run in background (non-blocking)</span><br/><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">background</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-4">strategyName:</span><span class="hl-1"> </span><span class="hl-2">"simple-long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">exchangeName:</span><span class="hl-1"> </span><span class="hl-2">"binance"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">frameName:</span><span class="hl-1"> </span><span class="hl-2">"1d-test"</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<p><strong>Available Listeners:</strong></p>
<ul>
<li><code>listenSignalBacktest</code>: All backtest signal events</li>
<li><code>listenSignalLive</code>: Live trading signal events only</li>
<li><code>listenSignal</code>: All signal events (both modes)</li>
<li><code>listenDoneBacktest</code>: Backtest completion</li>
<li><code>listenBacktestProgress</code>: Progress updates during execution</li>
<li><code>listenError</code>: Recoverable errors</li>
<li><code>listenExit</code>: Fatal errors</li>
</ul>
<a id="step-6-getting-results" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Step 6: Getting Results<a href="#step-6-getting-results" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p>After execution completes, retrieve statistics:</p>
<pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">Backtest</span><span class="hl-1"> } </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// Get structured data</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">stats</span><span class="hl-1"> = </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">getData</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">);</span><br/><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Total Signals: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">totalSignals</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Win Rate: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">winRate</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Sharpe Ratio: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">sharpeRatio</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Average PNL: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">avgPnl</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Total PNL: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">totalPnl</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Generate markdown report</span><br/><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">markdown</span><span class="hl-1"> = </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">getReport</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">);</span><br/><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-4">markdown</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// Export to file</span><br/><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">dump</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">, </span><span class="hl-2">"./results/backtest-report.md"</span><span class="hl-1">);</span>
</code><button type="button">Copy</button></pre>
<p><strong>Statistics Structure (<code>BacktestStatistics</code>):</strong></p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>totalSignals</code></td>
<td><code>number</code></td>
<td>Count of closed signals</td>
</tr>
<tr>
<td><code>winRate</code></td>
<td><code>number | null</code></td>
<td>Percentage of profitable trades</td>
</tr>
<tr>
<td><code>avgPnl</code></td>
<td><code>number | null</code></td>
<td>Average profit/loss per trade</td>
</tr>
<tr>
<td><code>totalPnl</code></td>
<td><code>number | null</code></td>
<td>Cumulative profit/loss</td>
</tr>
<tr>
<td><code>sharpeRatio</code></td>
<td><code>number | null</code></td>
<td>Risk-adjusted return metric</td>
</tr>
<tr>
<td><code>certaintyRatio</code></td>
<td><code>number | null</code></td>
<td>Win probability metric</td>
</tr>
<tr>
<td><code>signalList</code></td>
<td><code>IStrategyTickResultClosed[]</code></td>
<td>All closed signal details</td>
</tr>
</tbody>
</table>
<a id="complete-example" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Complete Example<a href="#complete-example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">addExchange</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">addFrame</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">addStrategy</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">listenSignalBacktest</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">listenDoneBacktest</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">ICandleData</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">ISignalDto</span><br/><span class="hl-1">} </span><span class="hl-5">from</span><span class="hl-1"> </span><span class="hl-2">'backtest-kit'</span><span class="hl-1">;</span><br/><br/><span class="hl-6">// 1. Register exchange</span><br/><span class="hl-0">addExchange</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">exchangeName:</span><span class="hl-1"> </span><span class="hl-2">"binance"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">getCandles</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">, </span><span class="hl-4">interval</span><span class="hl-1">, </span><span class="hl-4">since</span><span class="hl-1">, </span><span class="hl-4">limit</span><span class="hl-1">): </span><span class="hl-11">Promise</span><span class="hl-1"><</span><span class="hl-11">ICandleData</span><span class="hl-1">[]> {</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">candles</span><span class="hl-1">: </span><span class="hl-11">ICandleData</span><span class="hl-1">[] = [];</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">intervalMs</span><span class="hl-1"> = </span><span class="hl-7">60000</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-5">for</span><span class="hl-1"> (</span><span class="hl-3">let</span><span class="hl-1"> </span><span class="hl-4">i</span><span class="hl-1"> = </span><span class="hl-7">0</span><span class="hl-1">; </span><span class="hl-4">i</span><span class="hl-1"> < </span><span class="hl-4">limit</span><span class="hl-1">; </span><span class="hl-4">i</span><span class="hl-1">++) {</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">timestamp</span><span class="hl-1"> = </span><span class="hl-4">since</span><span class="hl-1">.</span><span class="hl-0">getTime</span><span class="hl-1">() + </span><span class="hl-4">i</span><span class="hl-1"> * </span><span class="hl-4">intervalMs</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-4">candles</span><span class="hl-1">.</span><span class="hl-0">push</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">timestamp</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">open:</span><span class="hl-1"> </span><span class="hl-7">50000</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">1000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">high:</span><span class="hl-1"> </span><span class="hl-7">50500</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">1000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">low:</span><span class="hl-1"> </span><span class="hl-7">49500</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">1000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">close:</span><span class="hl-1"> </span><span class="hl-7">50000</span><span class="hl-1"> + </span><span class="hl-4">Math</span><span class="hl-1">.</span><span class="hl-0">random</span><span class="hl-1">() * </span><span class="hl-7">1000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">volume:</span><span class="hl-1"> </span><span class="hl-7">100</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-4">candles</span><span class="hl-1">;</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">formatPrice</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">, </span><span class="hl-4">price</span><span class="hl-1">) { </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-4">price</span><span class="hl-1">.</span><span class="hl-0">toFixed</span><span class="hl-1">(</span><span class="hl-7">2</span><span class="hl-1">); },</span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">formatQuantity</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">, </span><span class="hl-4">quantity</span><span class="hl-1">) { </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-4">quantity</span><span class="hl-1">.</span><span class="hl-0">toFixed</span><span class="hl-1">(</span><span class="hl-7">8</span><span class="hl-1">); }</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// 2. Configure backtest period</span><br/><span class="hl-0">addFrame</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">frameName:</span><span class="hl-1"> </span><span class="hl-2">"1d-test"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">interval:</span><span class="hl-1"> </span><span class="hl-2">"1m"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">startDate:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Date</span><span class="hl-1">(</span><span class="hl-2">"2024-01-01T00:00:00Z"</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-4">endDate:</span><span class="hl-1"> </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Date</span><span class="hl-1">(</span><span class="hl-2">"2024-01-02T00:00:00Z"</span><span class="hl-1">)</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// 3. Define strategy</span><br/><span class="hl-3">let</span><span class="hl-1"> </span><span class="hl-4">signalGenerated</span><span class="hl-1"> = </span><span class="hl-3">false</span><span class="hl-1">;</span><br/><br/><span class="hl-0">addStrategy</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-4">strategyName:</span><span class="hl-1"> </span><span class="hl-2">"simple-long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">interval:</span><span class="hl-1"> </span><span class="hl-2">"5m"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">getSignal</span><span class="hl-1">(</span><span class="hl-4">symbol</span><span class="hl-1">, </span><span class="hl-4">when</span><span class="hl-1">): </span><span class="hl-11">Promise</span><span class="hl-1"><</span><span class="hl-11">ISignalDto</span><span class="hl-1"> | </span><span class="hl-11">null</span><span class="hl-1">> {</span><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-4">signalGenerated</span><span class="hl-1">) </span><span class="hl-5">return</span><span class="hl-1"> </span><span class="hl-3">null</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-4">signalGenerated</span><span class="hl-1"> = </span><span class="hl-3">true</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-5">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">position:</span><span class="hl-1"> </span><span class="hl-2">"long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">note:</span><span class="hl-1"> </span><span class="hl-2">"Test signal"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">priceTakeProfit:</span><span class="hl-1"> </span><span class="hl-7">51000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">priceStopLoss:</span><span class="hl-1"> </span><span class="hl-7">49000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">minuteEstimatedTime:</span><span class="hl-1"> </span><span class="hl-7">60</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// 4. Listen to events</span><br/><span class="hl-0">listenSignalBacktest</span><span class="hl-1">((</span><span class="hl-4">result</span><span class="hl-1">) </span><span class="hl-3">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`[</span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">action</span><span class="hl-3">}</span><span class="hl-2">] </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">symbol</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">if</span><span class="hl-1"> (</span><span class="hl-4">result</span><span class="hl-1">.</span><span class="hl-4">action</span><span class="hl-1"> === </span><span class="hl-2">"closed"</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">` PNL: </span><span class="hl-3">${</span><span class="hl-4">result</span><span class="hl-9">.</span><span class="hl-4">pnl</span><span class="hl-9">.</span><span class="hl-4">pnlPercentage</span><span class="hl-9">.</span><span class="hl-0">toFixed</span><span class="hl-9">(</span><span class="hl-7">2</span><span class="hl-9">)</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-0">listenDoneBacktest</span><span class="hl-1">(</span><span class="hl-3">async</span><span class="hl-1"> (</span><span class="hl-4">event</span><span class="hl-1">) </span><span class="hl-3">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Backtest completed!"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-6">// 5. Get results</span><br/><span class="hl-1"> </span><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-8">stats</span><span class="hl-1"> = </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">getData</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Win Rate: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">winRate</span><span class="hl-3">}</span><span class="hl-2">%`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Sharpe Ratio: </span><span class="hl-3">${</span><span class="hl-4">stats</span><span class="hl-9">.</span><span class="hl-4">sharpeRatio</span><span class="hl-3">}</span><span class="hl-2">`</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><br/><span class="hl-1"> </span><span class="hl-6">// Export report</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">dump</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">, </span><span class="hl-2">"./backtest-report.md"</span><span class="hl-1">);</span><br/><span class="hl-1">});</span><br/><br/><span class="hl-6">// 6. Execute</span><br/><span class="hl-4">Backtest</span><span class="hl-1">.</span><span class="hl-0">background</span><span class="hl-1">(</span><span class="hl-2">"BTCUSDT"</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-4">strategyName:</span><span class="hl-1"> </span><span class="hl-2">"simple-long"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">exchangeName:</span><span class="hl-1"> </span><span class="hl-2">"binance"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">frameName:</span><span class="hl-1"> </span><span class="hl-2">"1d-test"</span><br/><span class="hl-1">});</span>
</code><button type="button">Copy</button></pre>
<a id="execution-flow-diagram" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Execution Flow Diagram<a href="#execution-flow-diagram" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p><img src="../media/04_Quick_Start_Guide_1.svg" alt="Mermaid Diagram"></p>
<a id="next-steps" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Next Steps<a href="#next-steps" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><p><strong>Essential Reading:</strong></p>
<ul>
<li><a href="design_05_core_concepts.html">Core Concepts</a> - Understanding execution modes and signal lifecycle</li>
<li><a href="design_08_component_registration.html">Component Registration</a> - Deep dive into registration patterns</li>
<li><a href="design_07_signal_lifecycle_overview.html">Signal Lifecycle Overview</a> - State transitions and validation</li>
</ul>
<p><strong>Advanced Topics:</strong></p>
<ul>
<li><a href="design_19_live_trading_api.html">Live Trading API</a> - Real-time execution with crash recovery</li>
<li><a href="design_20_walker_api.html">Walker API</a> - Strategy comparison and optimization</li>
<li><a href="design_67_risk_management.html">Risk Management</a> - Portfolio-level risk controls</li>
<li><a href="design_86_custom_exchange_integration.html">Custom Exchange Integration</a> - Implement CCXT or database sources</li>
</ul>
<p><strong>Additional Examples:</strong></p>
<ul>
<li><a href="design_18_backtest_api.html">Backtest API</a> - Full method reference</li>
<li><a href="design_23_event_listeners.html">Event Listeners</a> - Complete event API</li>
<li><a href="design_71_reporting_and_analytics.html">Reporting and Analytics</a> - Performance metrics and statistics</li>
</ul>
</div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#quick-start-guide"><span>Quick <wbr/>Start <wbr/>Guide</span></a><ul><li><a href="#overview-the-basic-flow"><span>Overview: <wbr/>The <wbr/>Basic <wbr/>Flow</span></a></li><li><a href="#step-1-exchange-configuration"><span>Step 1: <wbr/>Exchange <wbr/>Configuration</span></a></li><li><a href="#step-2-frame-configuration"><span>Step 2: <wbr/>Frame <wbr/>Configuration</span></a></li><li><a href="#step-3-strategy-definition"><span>Step 3: <wbr/>Strategy <wbr/>Definition</span></a></li><li><a href="#step-4-running-the-backtest"><span>Step 4: <wbr/>Running the <wbr/>Backtest</span></a></li><li><a href="#step-5-listening-to-events"><span>Step 5: <wbr/>Listening to <wbr/>Events</span></a></li><li><a href="#step-6-getting-results"><span>Step 6: <wbr/>Getting <wbr/>Results</span></a></li><li><a href="#complete-example"><span>Complete <wbr/>Example</span></a></li><li><a href="#execution-flow-diagram"><span>Execution <wbr/>Flow <wbr/>Diagram</span></a></li><li><a href="#next-steps"><span>Next <wbr/>Steps</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">backtest-kit</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
<!-- Yandex.Metrika counter -->
<script type="text/javascript">
(function(m,e,t,r,i,k,a){
m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)
})(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id=105455585', 'ym');
ym(105455585, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", accurateTrackBounce:true, trackLinks:true});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/105455585" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3MQZEBBDDR"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-3MQZEBBDDR');
</script>
|