backtest-kit-docs / classes /types.BrokerBase.html
tripolskypetr's picture
deploy: migrate media images to Git LFS
8b8fb92
<!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-4">import</span><span class="hl-1"> { </span><span class="hl-5">BrokerBase</span><span class="hl-1">, </span><span class="hl-5">Broker</span><span class="hl-1"> } </span><span class="hl-4">from</span><span class="hl-1"> </span><span class="hl-2">&quot;backtest-kit&quot;</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-5">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-5">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-5">process</span><span class="hl-1">.</span><span class="hl-5">env</span><span class="hl-1">.</span><span class="hl-8">API_KEY</span><span class="hl-1">, </span><span class="hl-5">process</span><span class="hl-1">.</span><span class="hl-5">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-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">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-5">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-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">side:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">position</span><span class="hl-1"> === </span><span class="hl-2">&quot;long&quot;</span><span class="hl-1"> ? </span><span class="hl-2">&quot;BUY&quot;</span><span class="hl-1"> : </span><span class="hl-2">&quot;SELL&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">quantity:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">cost</span><span class="hl-1"> / </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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-5">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-5">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-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">client</span><span class="hl-1">!.</span><span class="hl-0">closePosition</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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-5">Broker</span><span class="hl-1">.</span><span class="hl-0">useBrokerAdapter</span><span class="hl-1">(</span><span class="hl-5">BinanceBroker</span><span class="hl-1">);</span><br/><span class="hl-5">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-5">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-4">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-5">payload</span><span class="hl-9">.</span><span class="hl-5">position</span><span class="hl-3">}</span><span class="hl-2"> on </span><span class="hl-3">${</span><span class="hl-5">payload</span><span class="hl-9">.</span><span class="hl-5">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-5">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-5">payload</span><span class="hl-1">.</span><span class="hl-5">pnl</span><span class="hl-1">.</span><span class="hl-5">profit</span><span class="hl-1"> - </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">pnl</span><span class="hl-1">.</span><span class="hl-5">loss</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-4">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-5">payload</span><span class="hl-9">.</span><span class="hl-5">symbol</span><span class="hl-3">}</span><span class="hl-2">: PnL $</span><span class="hl-3">${</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26064">types.d.ts:26064</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onAverageBuyCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">side:</span><span class="hl-1"> </span><span class="hl-2">&quot;BUY&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">quantity:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">cost</span><span class="hl-1"> / </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26264">types.d.ts:26264</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onBreakevenCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">price:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26240">types.d.ts:26240</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onPartialLossCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">dollarAmount:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">cost</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">price:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26173">types.d.ts:26173</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onPartialProfitCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">dollarAmount:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">cost</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">price:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26149">types.d.ts:26149</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onSignalCloseCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">exchange</span><span class="hl-1">.</span><span class="hl-0">closePosition</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">db</span><span class="hl-1">.</span><span class="hl-0">recordTrade</span><span class="hl-1">({ </span><span class="hl-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">, </span><span class="hl-5">pnl:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26125">types.d.ts:26125</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onSignalOpenCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">side:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">position</span><span class="hl-1"> === </span><span class="hl-2">&quot;long&quot;</span><span class="hl-1"> ? </span><span class="hl-2">&quot;BUY&quot;</span><span class="hl-1"> : </span><span class="hl-2">&quot;SELL&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">quantity:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">cost</span><span class="hl-1"> / </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26105">types.d.ts:26105</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onTrailingStopCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">price:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26195">types.d.ts:26195</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">async</span><span class="hl-1"> </span><span class="hl-0">onTrailingTakeCommit</span><span class="hl-1">(</span><span class="hl-5">payload</span><span class="hl-1">: </span><span class="hl-5">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-5">payload</span><span class="hl-1">); </span><span class="hl-6">// Keep parent logging</span><br/><span class="hl-1"> </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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-5">symbol:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">symbol</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">price:</span><span class="hl-1"> </span><span class="hl-5">payload</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26217">types.d.ts:26217</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</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-5">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-5">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-5">process</span><span class="hl-1">.</span><span class="hl-5">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-4">await</span><span class="hl-1"> </span><span class="hl-3">this</span><span class="hl-1">.</span><span class="hl-5">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/b93fe7a5178c040a7a01701ecef340babde42e22/types.d.ts#L26082">types.d.ts:26082</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>