Spaces:
Running
Running
File size: 67,232 Bytes
8b8fb92 615c2b5 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 8b8fb92 615c2b5 8b8fb92 b1cf532 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 | <!DOCTYPE html><html class="default" lang="en" data-base=".."><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BrokerBase | 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="../modules/types.html">types</a></li><li><a href="types.BrokerBase.html">BrokerBase</a></li></ul><h1>Class BrokerBase</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Base class for custom broker adapter implementations.</p>
<p>Provides default no-op implementations for all IBroker methods that log events.
Extend this class to implement a real exchange adapter for:</p>
<ul>
<li>Placing and canceling limit/market orders</li>
<li>Updating stop-loss and take-profit levels on exchange</li>
<li>Tracking position state in an external system</li>
<li>Sending trade notifications (Telegram, Discord, Email)</li>
<li>Recording trades to a database or analytics service</li>
</ul>
<p>Key features:</p>
<ul>
<li>All methods have default implementations (no need to override unused methods)</li>
<li>Automatic logging of all events via bt.loggerService</li>
<li>Implements the full IBroker interface</li>
<li><code>makeExtendable</code> applied for correct subclass instantiation</li>
</ul>
<p>Lifecycle:</p>
<ol>
<li>Constructor called (no arguments)</li>
<li><code>waitForInit()</code> called once for async initialization (e.g. exchange login)</li>
<li>Event methods called as strategy executes</li>
<li>No explicit dispose — clean up in <code>waitForInit</code> teardown or externally</li>
</ol>
<p>Event flow (called only in live mode, skipped in backtest):</p>
<ul>
<li><code>onSignalOpenCommit</code> — new position opened</li>
<li><code>onSignalCloseCommit</code> — position closed (SL/TP hit or manual close)</li>
<li><code>onPartialProfitCommit</code> — partial close at profit executed</li>
<li><code>onPartialLossCommit</code> — partial close at loss executed</li>
<li><code>onTrailingStopCommit</code> — trailing stop-loss updated</li>
<li><code>onTrailingTakeCommit</code> — trailing take-profit updated</li>
<li><code>onBreakevenCommit</code> — stop-loss moved to entry price</li>
<li><code>onAverageBuyCommit</code> — new DCA entry added to position</li>
</ul>
</div><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example" class="tsd-anchor"></a>Example<a href="#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></h4><pre><code class="typescript"><span class="hl-5">import</span><span class="hl-1"> { </span><span class="hl-4">BrokerBase</span><span class="hl-1">, </span><span class="hl-4">Broker</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">// Extend BrokerBase and override only needed methods</span><br/><span class="hl-3">class</span><span class="hl-1"> </span><span class="hl-11">BinanceBroker</span><span class="hl-1"> </span><span class="hl-3">extends</span><span class="hl-1"> </span><span class="hl-11">BrokerBase</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-3">private</span><span class="hl-1"> </span><span class="hl-4">client</span><span class="hl-1">: </span><span class="hl-11">BinanceClient</span><span class="hl-1"> | </span><span class="hl-11">null</span><span class="hl-1"> = </span><span class="hl-3">null</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">waitForInit</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">waitForInit</span><span class="hl-1">(); </span><span class="hl-6">// Call parent for logging</span><br/><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">client</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">BinanceClient</span><span class="hl-1">(</span><span class="hl-4">process</span><span class="hl-1">.</span><span class="hl-4">env</span><span class="hl-1">.</span><span class="hl-8">API_KEY</span><span class="hl-1">, </span><span class="hl-4">process</span><span class="hl-1">.</span><span class="hl-4">env</span><span class="hl-1">.</span><span class="hl-8">SECRET</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">client</span><span class="hl-1">.</span><span class="hl-0">connect</span><span class="hl-1">();</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">onSignalOpenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-11">BrokerSignalOpenPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onSignalOpenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Call parent for logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">client</span><span class="hl-1">!.</span><span class="hl-0">placeOrder</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">side:</span><span class="hl-1"> </span><span class="hl-4">payload</span><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><span class="hl-2">"BUY"</span><span class="hl-1"> : </span><span class="hl-2">"SELL"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">quantity:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">cost</span><span class="hl-1"> / </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">priceOpen</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">onSignalCloseCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-11">BrokerSignalClosePayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onSignalCloseCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Call parent for logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">client</span><span class="hl-1">!.</span><span class="hl-0">closePosition</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-6">// Register the adapter</span><br/><span class="hl-4">Broker</span><span class="hl-1">.</span><span class="hl-0">useBrokerAdapter</span><span class="hl-1">(</span><span class="hl-4">BinanceBroker</span><span class="hl-1">);</span><br/><span class="hl-4">Broker</span><span class="hl-1">.</span><span class="hl-0">enable</span><span class="hl-1">();</span>
</code><button type="button">Copy</button></pre>
</div><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-1" class="tsd-anchor"></a>Example<a href="#example-1" 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></h4><pre><code class="typescript"><span class="hl-6">// Minimal implementation — only handle opens and closes</span><br/><span class="hl-3">class</span><span class="hl-1"> </span><span class="hl-11">NotifyBroker</span><span class="hl-1"> </span><span class="hl-3">extends</span><span class="hl-1"> </span><span class="hl-11">BrokerBase</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">onSignalOpenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-11">BrokerSignalOpenPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-0">sendTelegram</span><span class="hl-1">(</span><span class="hl-2">`Opened </span><span class="hl-3">${</span><span class="hl-4">payload</span><span class="hl-9">.</span><span class="hl-4">position</span><span class="hl-3">}</span><span class="hl-2"> on </span><span class="hl-3">${</span><span class="hl-4">payload</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><br/><br/><span class="hl-1"> </span><span class="hl-3">async</span><span class="hl-1"> </span><span class="hl-0">onSignalCloseCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-11">BrokerSignalClosePayload</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">pnl</span><span class="hl-1"> = </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">pnl</span><span class="hl-1">.</span><span class="hl-4">profit</span><span class="hl-1"> - </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">pnl</span><span class="hl-1">.</span><span class="hl-4">loss</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-0">sendTelegram</span><span class="hl-1">(</span><span class="hl-2">`Closed </span><span class="hl-3">${</span><span class="hl-4">payload</span><span class="hl-9">.</span><span class="hl-4">symbol</span><span class="hl-3">}</span><span class="hl-2">: PnL $</span><span class="hl-3">${</span><span class="hl-4">pnl</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>
</code><button type="button">Copy</button></pre>
</div></div></section><section class="tsd-panel"><h4>Implements</h4><ul class="tsd-hierarchy"><li><a href="../interfaces/types.IBroker.html" class="tsd-signature-type tsd-kind-interface">IBroker</a></li></ul></section><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28018">types.d.ts:28018</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Constructors</h3><div class="tsd-index-list"><a href="types.BrokerBase.html#constructor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Constructor"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a>
</div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="types.BrokerBase.html#onaveragebuycommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Average<wbr/>Buy<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#onbreakevencommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Breakeven<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#onpartiallosscommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Partial<wbr/>Loss<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#onpartialprofitcommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Partial<wbr/>Profit<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#onsignalclosecommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Signal<wbr/>Close<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#onsignalopencommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Signal<wbr/>Open<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#ontrailingstopcommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Trailing<wbr/>Stop<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#ontrailingtakecommit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Trailing<wbr/>Take<wbr/>Commit</span></a>
<a href="types.BrokerBase.html#waitforinit" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>wait<wbr/>For<wbr/>Init</span></a>
</div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Constructors</h2></summary><section><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="constructorbrokerbase" class="tsd-anchor"></a><span class="tsd-signature-keyword">new</span> <span class="tsd-kind-constructor-signature">BrokerBase</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <a href="types.BrokerBase.html" class="tsd-signature-type tsd-kind-class">BrokerBase</a><a href="#constructorbrokerbase" 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></div><div class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="types.BrokerBase.html" class="tsd-signature-type tsd-kind-class">BrokerBase</a></h4></div></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Methods"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Methods</h2></summary><section><section class="tsd-panel tsd-member"><a id="onaveragebuycommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Average<wbr/>Buy<wbr/>Commit</span><a href="#onaveragebuycommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="onaveragebuycommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onAverageBuyCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerAverageBuyPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerAverageBuyPayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#onaveragebuycommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when a new DCA entry is added to the active position.</p>
<p>Triggered explicitly after all validations pass, before <code>strategyCoreService.averageBuy()</code>.
<code>currentPrice</code> is the market price at which the new averaging entry is placed.
<code>cost</code> is the dollar amount of the new DCA entry.</p>
<p>Default implementation: Logs average buy event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerAverageBuyPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerAverageBuyPayload</a></span><div class="tsd-comment tsd-typography"><p>Average buy details: symbol, currentPrice, cost, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-2" class="tsd-anchor"></a>Example<a href="#example-2" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onAverageBuyCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerAverageBuyPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onAverageBuyCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">placeMarketOrder</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">side:</span><span class="hl-1"> </span><span class="hl-2">"BUY"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">quantity:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">cost</span><span class="hl-1"> / </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">currentPrice</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#onaveragebuycommit">onAverageBuyCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28218">types.d.ts:28218</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="onbreakevencommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Breakeven<wbr/>Commit</span><a href="#onbreakevencommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="onbreakevencommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onBreakevenCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerBreakevenPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerBreakevenPayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#onbreakevencommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when the stop-loss is moved to breakeven (entry price).</p>
<p>Triggered explicitly after all validations pass, before <code>strategyCoreService.breakeven()</code>.
<code>newStopLossPrice</code> equals <code>effectivePriceOpen</code> — the position's effective entry price.
<code>newTakeProfitPrice</code> is unchanged by breakeven.</p>
<p>Default implementation: Logs breakeven event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerBreakevenPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerBreakevenPayload</a></span><div class="tsd-comment tsd-typography"><p>Breakeven details: symbol, currentPrice, newStopLossPrice, newTakeProfitPrice, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-3" class="tsd-anchor"></a>Example<a href="#example-3" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onBreakevenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerBreakevenPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onBreakevenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">updateStopLoss</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">price:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">newStopLossPrice</span><span class="hl-1">, </span><span class="hl-6">// = entry price</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#onbreakevencommit">onBreakevenCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28194">types.d.ts:28194</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="onpartiallosscommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Partial<wbr/>Loss<wbr/>Commit</span><a href="#onpartiallosscommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="onpartiallosscommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onPartialLossCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerPartialLossPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerPartialLossPayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#onpartiallosscommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when a partial close at loss is executed.</p>
<p>Triggered explicitly from strategy.ts / Live.ts / Backtest.ts after all validations pass,
before <code>strategyCoreService.partialLoss()</code>. If this method throws, the DI mutation is skipped.
Use to partially close the position on the exchange at the loss level.</p>
<p>Default implementation: Logs partial loss event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerPartialLossPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerPartialLossPayload</a></span><div class="tsd-comment tsd-typography"><p>Partial loss details: symbol, percentToClose, cost (dollar value), currentPrice, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-4" class="tsd-anchor"></a>Example<a href="#example-4" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onPartialLossCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerPartialLossPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onPartialLossCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">reducePosition</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">dollarAmount:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">cost</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">price:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">currentPrice</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#onpartiallosscommit">onPartialLossCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28127">types.d.ts:28127</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="onpartialprofitcommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Partial<wbr/>Profit<wbr/>Commit</span><a href="#onpartialprofitcommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="onpartialprofitcommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onPartialProfitCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerPartialProfitPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerPartialProfitPayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#onpartialprofitcommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when a partial close at profit is executed.</p>
<p>Triggered explicitly from strategy.ts / Live.ts / Backtest.ts after all validations pass,
before <code>strategyCoreService.partialProfit()</code>. If this method throws, the DI mutation is skipped.
Use to partially close the position on the exchange at the profit level.</p>
<p>Default implementation: Logs partial profit event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerPartialProfitPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerPartialProfitPayload</a></span><div class="tsd-comment tsd-typography"><p>Partial profit details: symbol, percentToClose, cost (dollar value), currentPrice, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-5" class="tsd-anchor"></a>Example<a href="#example-5" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onPartialProfitCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerPartialProfitPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onPartialProfitCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">reducePosition</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">dollarAmount:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">cost</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">price:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">currentPrice</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#onpartialprofitcommit">onPartialProfitCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28103">types.d.ts:28103</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="onsignalclosecommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Signal<wbr/>Close<wbr/>Commit</span><a href="#onsignalclosecommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="onsignalclosecommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onSignalCloseCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerSignalClosePayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerSignalClosePayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#onsignalclosecommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when a position is fully closed (SL/TP hit or manual close).</p>
<p>Triggered automatically via syncSubject when a pending signal is closed.
Use to place the exit order and record final PnL.</p>
<p>Default implementation: Logs signal-close event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerSignalClosePayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerSignalClosePayload</a></span><div class="tsd-comment tsd-typography"><p>Signal close details: symbol, cost, position, currentPrice, pnl, totalEntries, totalPartials, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-6" class="tsd-anchor"></a>Example<a href="#example-6" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onSignalCloseCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerSignalClosePayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onSignalCloseCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">closePosition</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">db</span><span class="hl-1">.</span><span class="hl-0">recordTrade</span><span class="hl-1">({ </span><span class="hl-4">symbol:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">, </span><span class="hl-4">pnl:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">pnl</span><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#onsignalclosecommit">onSignalCloseCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28079">types.d.ts:28079</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="onsignalopencommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Signal<wbr/>Open<wbr/>Commit</span><a href="#onsignalopencommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="onsignalopencommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onSignalOpenCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerSignalOpenPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerSignalOpenPayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#onsignalopencommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when a new position is opened (signal activated).</p>
<p>Triggered automatically via syncSubject when a scheduled signal's priceOpen is hit.
Use to place the actual entry order on the exchange.</p>
<p>Default implementation: Logs signal-open event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerSignalOpenPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerSignalOpenPayload</a></span><div class="tsd-comment tsd-typography"><p>Signal open details: symbol, cost, position, priceOpen, priceTakeProfit, priceStopLoss, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-7" class="tsd-anchor"></a>Example<a href="#example-7" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onSignalOpenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerSignalOpenPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onSignalOpenCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">placeMarketOrder</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">side:</span><span class="hl-1"> </span><span class="hl-4">payload</span><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><span class="hl-2">"BUY"</span><span class="hl-1"> : </span><span class="hl-2">"SELL"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">quantity:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">cost</span><span class="hl-1"> / </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">priceOpen</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#onsignalopencommit">onSignalOpenCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28059">types.d.ts:28059</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="ontrailingstopcommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Trailing<wbr/>Stop<wbr/>Commit</span><a href="#ontrailingstopcommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="ontrailingstopcommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onTrailingStopCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerTrailingStopPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerTrailingStopPayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#ontrailingstopcommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when the trailing stop-loss level is updated.</p>
<p>Triggered explicitly after all validations pass, before <code>strategyCoreService.trailingStop()</code>.
<code>newStopLossPrice</code> is the absolute SL price — use it to update the exchange order directly.</p>
<p>Default implementation: Logs trailing stop event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerTrailingStopPayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerTrailingStopPayload</a></span><div class="tsd-comment tsd-typography"><p>Trailing stop details: symbol, percentShift, currentPrice, newStopLossPrice, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-8" class="tsd-anchor"></a>Example<a href="#example-8" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onTrailingStopCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerTrailingStopPayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onTrailingStopCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">updateStopLoss</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">price:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">newStopLossPrice</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#ontrailingstopcommit">onTrailingStopCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28149">types.d.ts:28149</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="ontrailingtakecommit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>on<wbr/>Trailing<wbr/>Take<wbr/>Commit</span><a href="#ontrailingtakecommit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="ontrailingtakecommit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">onTrailingTakeCommit</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">payload</span><span class="tsd-signature-symbol">:</span> <a href="../types/types.BrokerTrailingTakePayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerTrailingTakePayload</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#ontrailingtakecommit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Called when the trailing take-profit level is updated.</p>
<p>Triggered explicitly after all validations pass, before <code>strategyCoreService.trailingTake()</code>.
<code>newTakeProfitPrice</code> is the absolute TP price — use it to update the exchange order directly.</p>
<p>Default implementation: Logs trailing take event.</p>
</div><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">payload</span>: <a href="../types/types.BrokerTrailingTakePayload.html" class="tsd-signature-type tsd-kind-type-alias">BrokerTrailingTakePayload</a></span><div class="tsd-comment tsd-typography"><p>Trailing take details: symbol, percentShift, currentPrice, newTakeProfitPrice, context, backtest</p>
</div><div class="tsd-comment tsd-typography"></div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-9" class="tsd-anchor"></a>Example<a href="#example-9" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">onTrailingTakeCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">: </span><span class="hl-4">BrokerTrailingTakePayload</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">onTrailingTakeCommit</span><span class="hl-1">(</span><span class="hl-4">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">updateTakeProfit</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-4">payload</span><span class="hl-1">.</span><span class="hl-4">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">price:</span><span class="hl-1"> </span><span class="hl-4">payload</span><span class="hl-1">.</span><span class="hl-4">newTakeProfitPrice</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#ontrailingtakecommit">onTrailingTakeCommit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28171">types.d.ts:28171</a></li></ul></aside></div></li></ul></section><section class="tsd-panel tsd-member"><a id="waitforinit" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>wait<wbr/>For<wbr/>Init</span><a href="#waitforinit" 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></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link"><a id="waitforinit-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">waitForInit</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><a href="#waitforinit-1" 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></div><div class="tsd-description"><div class="tsd-comment tsd-typography"><p>Performs async initialization before the broker starts receiving events.</p>
<p>Called once by BrokerProxy via <code>waitForInit()</code> (singleshot) before the first event.
Override to establish exchange connections, authenticate API clients, load configuration.</p>
<p>Default implementation: Logs initialization event.</p>
</div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4><div class="tsd-comment tsd-typography"><div class="tsd-tag-example"><h4 class="tsd-anchor-link"><a id="example-10" class="tsd-anchor"></a>Example<a href="#example-10" 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></h4><pre><code class="typescript"><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-0">waitForInit</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-3">super</span><span class="hl-1">.</span><span class="hl-0">waitForInit</span><span class="hl-1">(); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">ExchangeClient</span><span class="hl-1">(</span><span class="hl-4">process</span><span class="hl-1">.</span><span class="hl-4">env</span><span class="hl-1">.</span><span class="hl-8">API_KEY</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-4">exchange</span><span class="hl-1">.</span><span class="hl-0">authenticate</span><span class="hl-1">();</span><br/><span class="hl-1">}</span>
</code><button type="button">Copy</button></pre>
</div></div><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.IBroker.html">IBroker</a>.<a href="../interfaces/types.IBroker.html#waitforinit">waitForInit</a></p><ul><li>Defined in <a href="https://github.com/tripolskypetr/backtest-kit/blob/5090652c4cd47db85471527b71798a237c7a438b/types.d.ts#L28036">types.d.ts:28036</a></li></ul></aside></div></li></ul></section></section></details></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"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Constructor"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#onaveragebuycommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Average<wbr/>Buy<wbr/>Commit</span></a><a href="#onbreakevencommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Breakeven<wbr/>Commit</span></a><a href="#onpartiallosscommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Partial<wbr/>Loss<wbr/>Commit</span></a><a href="#onpartialprofitcommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Partial<wbr/>Profit<wbr/>Commit</span></a><a href="#onsignalclosecommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Signal<wbr/>Close<wbr/>Commit</span></a><a href="#onsignalopencommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Signal<wbr/>Open<wbr/>Commit</span></a><a href="#ontrailingstopcommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Trailing<wbr/>Stop<wbr/>Commit</span></a><a href="#ontrailingtakecommit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>on<wbr/>Trailing<wbr/>Take<wbr/>Commit</span></a><a href="#waitforinit" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>wait<wbr/>For<wbr/>Init</span></a></div></details></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>
|