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">&#39;backtest-kit&#39;</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">&quot;binance&quot;</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">&lt;</span><span class="hl-11">ICandleData</span><span class="hl-1">[]&gt; {</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"> &lt; </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">&lt;</span><span class="hl-11">string</span><span class="hl-1">&gt; {</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">&lt;</span><span class="hl-11">string</span><span class="hl-1">&gt; {</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">&#39;backtest-kit&#39;</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">&quot;1d-test&quot;</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">&quot;1m&quot;</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">&quot;2024-01-01T00:00:00Z&quot;</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">&quot;2024-01-02T00:00:00Z&quot;</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>&quot;1m&quot;</code>, <code>&quot;3m&quot;</code>, <code>&quot;5m&quot;</code>, <code>&quot;15m&quot;</code>, <code>&quot;30m&quot;</code>, <code>&quot;1h&quot;</code>, <code>&quot;2h&quot;</code>, <code>&quot;4h&quot;</code>, <code>&quot;6h&quot;</code>, <code>&quot;8h&quot;</code>, <code>&quot;12h&quot;</code>, <code>&quot;1d&quot;</code>, <code>&quot;3d&quot;</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">&#39;backtest-kit&#39;</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">&quot;simple-long&quot;</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">&quot;5m&quot;</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">&lt;</span><span class="hl-11">ISignalDto</span><span class="hl-1"> | </span><span class="hl-11">null</span><span class="hl-1">&gt; {</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">&quot;long&quot;</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">&quot;Simple long strategy&quot;</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>&quot;long&quot;</code> (buy) or <code>&quot;short&quot;</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 &lt; priceOpen &lt; priceTakeProfit</code></li>
<li><strong>SHORT</strong>: <code>priceTakeProfit &lt; priceOpen &lt; 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">&#39;backtest-kit&#39;</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">&quot;BTCUSDT&quot;</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">&quot;simple-long&quot;</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">&quot;binance&quot;</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">&quot;1d-test&quot;</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">&quot;closed&quot;</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">&quot;Backtest completed!&quot;</span><span class="hl-1">);</span>
</code><button type="button">Copy</button></pre>

<p><strong>Return Type:</strong> <code>AsyncGenerator&lt;IStrategyTickResult&gt;</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>&quot;idle&quot;</code></td>
<td>No active signal</td>
<td><code>currentPrice</code>, <code>signal: null</code></td>
</tr>
<tr>
<td><code>&quot;scheduled&quot;</code></td>
<td>Limit order created</td>
<td><code>signal: IScheduledSignalRow</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>&quot;opened&quot;</code></td>
<td>Position opened</td>
<td><code>signal: ISignalRow</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>&quot;active&quot;</code></td>
<td>Monitoring TP/SL</td>
<td><code>signal: ISignalRow</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>&quot;closed&quot;</code></td>
<td>Position closed</td>
<td><code>signal</code>, <code>pnl</code>, <code>closeReason</code>, <code>currentPrice</code></td>
</tr>
<tr>
<td><code>&quot;cancelled&quot;</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">&#39;backtest-kit&#39;</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">=&gt;</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">&quot;closed&quot;</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">=&gt;</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">&quot;BTCUSDT&quot;</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">&quot;simple-long&quot;</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">&quot;binance&quot;</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">&quot;1d-test&quot;</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">&#39;backtest-kit&#39;</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">&quot;BTCUSDT&quot;</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">&quot;BTCUSDT&quot;</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">&quot;BTCUSDT&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;./results/backtest-report.md&quot;</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">&#39;backtest-kit&#39;</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">&quot;binance&quot;</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">&lt;</span><span class="hl-11">ICandleData</span><span class="hl-1">[]&gt; {</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"> &lt; </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">&quot;1d-test&quot;</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">&quot;1m&quot;</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">&quot;2024-01-01T00:00:00Z&quot;</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">&quot;2024-01-02T00:00:00Z&quot;</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">&quot;simple-long&quot;</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">&quot;5m&quot;</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">&lt;</span><span class="hl-11">ISignalDto</span><span class="hl-1"> | </span><span class="hl-11">null</span><span class="hl-1">&gt; {</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">&quot;long&quot;</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">&quot;Test signal&quot;</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">=&gt;</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">&quot;closed&quot;</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">=&gt;</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">&quot;Backtest completed!&quot;</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">&quot;BTCUSDT&quot;</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">&quot;BTCUSDT&quot;</span><span class="hl-1">, </span><span class="hl-2">&quot;./backtest-report.md&quot;</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">&quot;BTCUSDT&quot;</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">&quot;simple-long&quot;</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">&quot;binance&quot;</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">&quot;1d-test&quot;</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>