Files
mt5cli/api/trading/index.html
T
2026-06-12 16:32:35 +00:00

1273 lines
77 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="dceoy">
<link rel="canonical" href="https://github.com/dceoy/mt5cli/api/trading/">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>Trading - mt5cli API Documentation</title>
<link href="../../css/bootstrap.min.css" rel="stylesheet">
<link href="../../css/fontawesome.min.css" rel="stylesheet">
<link href="../../css/brands.min.css" rel="stylesheet">
<link href="../../css/solid.min.css" rel="stylesheet">
<link href="../../css/v4-font-face.min.css" rel="stylesheet">
<link href="../../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<link href="../../assets/_mkdocstrings.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="../..">mt5cli API Documentation</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href="../.." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">API Reference</a>
<ul class="dropdown-menu">
<li>
<a href="../" class="dropdown-item">Overview</a>
</li>
<li>
<a href="../client/" class="dropdown-item">Client</a>
</li>
<li>
<a href="../schemas/" class="dropdown-item">Schemas</a>
</li>
<li>
<a href="../storage/" class="dropdown-item">Storage</a>
</li>
<li>
<a href="../converters/" class="dropdown-item">Converters</a>
</li>
<li>
<a href="../exceptions/" class="dropdown-item">Exceptions</a>
</li>
<li>
<a href="../cli/" class="dropdown-item">CLI</a>
</li>
<li>
<a href="../sdk/" class="dropdown-item">SDK</a>
</li>
<li>
<a href="./" class="dropdown-item active" aria-current="page">Trading</a>
</li>
<li>
<a href="../history/" class="dropdown-item">History Collection (SQLite)</a>
</li>
<li>
<a href="../utils/" class="dropdown-item">Utils</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href="../sdk/" class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="../history/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
<li class="nav-item">
<a href="https://github.com/dceoy/mt5cli/edit/master/docs/api/trading.md" class="nav-link">Edit on dceoy/mt5cli
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="1"><a href="#trading-module" class="nav-link">Trading Module</a>
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#mt5cli.trading" class="nav-link">trading</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#trading-capable-mt5-sessions" class="nav-link">Trading-capable MT5 sessions</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#operational-trading-helpers" class="nav-link">Operational trading helpers</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#migration-from-mteor-local-helpers" class="nav-link">Migration from mteor-local helpers</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h1 id="trading-module">Trading Module<a class="headerlink" href="#trading-module" title="Permanent link">&para;</a></h1>
<div class="doc doc-object doc-module">
<h2 id="mt5cli.trading" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mt5cli.trading</span>
<a href="#mt5cli.trading" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="doc doc-contents first">
<p>Trading-capable MetaTrader 5 session helpers and operational utilities.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.trading.OrderSide" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">OrderSide</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.trading.OrderSide" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">OrderSide</span> <span class="o">=</span> <span class="n"><span title="typing.Literal">Literal</span></span><span class="p">[</span><span class="s1">&#39;long&#39;</span><span class="p">,</span> <span class="s1">&#39;short&#39;</span><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.trading.PositionSide" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">PositionSide</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.trading.PositionSide" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">PositionSide</span> <span class="o">=</span> <span class="n"><span title="typing.Literal">Literal</span></span><span class="p">[</span><span class="s1">&#39;long&#39;</span><span class="p">,</span> <span class="s1">&#39;short&#39;</span><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.trading.__all__" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">__all__</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.trading.__all__" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="s2">&quot;OrderSide&quot;</span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="s2">&quot;PositionSide&quot;</span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="s2">&quot;calculate_margin_and_volume&quot;</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="s2">&quot;detect_position_side&quot;</span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="s2">&quot;determine_order_limits&quot;</span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="s2">&quot;mt5_trading_session&quot;</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.trading.calculate_margin_and_volume" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">calculate_margin_and_volume</span>
<a href="#mt5cli.trading.calculate_margin_and_volume" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">calculate_margin_and_volume</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">client</span><span class="p">:</span> <span class="n"><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">symbol</span><span class="p">:</span> <span class="n"><span title="str">str</span></span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">unit_margin_ratio</span><span class="p">:</span> <span class="n"><span title="float">float</span></span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">preserved_margin_ratio</span><span class="p">:</span> <span class="n"><span title="float">float</span></span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="float">float</span></span><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Calculate tradable margin and volumes from account free margin.</p>
<p>Applies <code>preserved_margin_ratio</code> to keep a reserve off <code>margin_free</code>,
then allocates <code>unit_margin_ratio</code> of the remainder as the margin budget
for volume sizing on both buy and sell sides.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>client</code>
</td>
<td>
<code><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Connected <code>Mt5TradingClient</code> instance.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>symbol</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Symbol used for minimum-lot margin and volume calculations.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>unit_margin_ratio</code>
</td>
<td>
<code><span title="float">float</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Fraction of post-reserve margin to allocate per unit.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>preserved_margin_ratio</code>
</td>
<td>
<code><span title="float">float</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Fraction of <code>margin_free</code> to preserve.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span>[<span title="str">str</span>, <span title="float">float</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary with <code>margin_free</code>, <code>available_margin</code>, <code>trade_margin</code>,</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span>[<span title="str">str</span>, <span title="float">float</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p><code>buy_volume</code>, and <code>sell_volume</code>. Negative <code>margin_free</code> values are</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span>[<span title="str">str</span>, <span title="float">float</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>clamped to <code>0.0</code> before sizing.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/trading.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-92"> 92</a></span>
<span class="normal"><a href="#__codelineno-0-93"> 93</a></span>
<span class="normal"><a href="#__codelineno-0-94"> 94</a></span>
<span class="normal"><a href="#__codelineno-0-95"> 95</a></span>
<span class="normal"><a href="#__codelineno-0-96"> 96</a></span>
<span class="normal"><a href="#__codelineno-0-97"> 97</a></span>
<span class="normal"><a href="#__codelineno-0-98"> 98</a></span>
<span class="normal"><a href="#__codelineno-0-99"> 99</a></span>
<span class="normal"><a href="#__codelineno-0-100">100</a></span>
<span class="normal"><a href="#__codelineno-0-101">101</a></span>
<span class="normal"><a href="#__codelineno-0-102">102</a></span>
<span class="normal"><a href="#__codelineno-0-103">103</a></span>
<span class="normal"><a href="#__codelineno-0-104">104</a></span>
<span class="normal"><a href="#__codelineno-0-105">105</a></span>
<span class="normal"><a href="#__codelineno-0-106">106</a></span>
<span class="normal"><a href="#__codelineno-0-107">107</a></span>
<span class="normal"><a href="#__codelineno-0-108">108</a></span>
<span class="normal"><a href="#__codelineno-0-109">109</a></span>
<span class="normal"><a href="#__codelineno-0-110">110</a></span>
<span class="normal"><a href="#__codelineno-0-111">111</a></span>
<span class="normal"><a href="#__codelineno-0-112">112</a></span>
<span class="normal"><a href="#__codelineno-0-113">113</a></span>
<span class="normal"><a href="#__codelineno-0-114">114</a></span>
<span class="normal"><a href="#__codelineno-0-115">115</a></span>
<span class="normal"><a href="#__codelineno-0-116">116</a></span>
<span class="normal"><a href="#__codelineno-0-117">117</a></span>
<span class="normal"><a href="#__codelineno-0-118">118</a></span>
<span class="normal"><a href="#__codelineno-0-119">119</a></span>
<span class="normal"><a href="#__codelineno-0-120">120</a></span>
<span class="normal"><a href="#__codelineno-0-121">121</a></span>
<span class="normal"><a href="#__codelineno-0-122">122</a></span>
<span class="normal"><a href="#__codelineno-0-123">123</a></span>
<span class="normal"><a href="#__codelineno-0-124">124</a></span>
<span class="normal"><a href="#__codelineno-0-125">125</a></span>
<span class="normal"><a href="#__codelineno-0-126">126</a></span>
<span class="normal"><a href="#__codelineno-0-127">127</a></span>
<span class="normal"><a href="#__codelineno-0-128">128</a></span>
<span class="normal"><a href="#__codelineno-0-129">129</a></span>
<span class="normal"><a href="#__codelineno-0-130">130</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-92" name="__codelineno-0-92"></a><span class="k">def</span><span class="w"> </span><span class="nf">calculate_margin_and_volume</span><span class="p">(</span>
<a id="__codelineno-0-93" name="__codelineno-0-93"></a> <span class="n">client</span><span class="p">:</span> <span class="n">Mt5TradingClient</span><span class="p">,</span>
<a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="n">symbol</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="n">unit_margin_ratio</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">preserved_margin_ratio</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
<a id="__codelineno-0-97" name="__codelineno-0-97"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">float</span><span class="p">]:</span>
<a id="__codelineno-0-98" name="__codelineno-0-98"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Calculate tradable margin and volumes from account free margin.</span>
<a id="__codelineno-0-99" name="__codelineno-0-99"></a>
<a id="__codelineno-0-100" name="__codelineno-0-100"></a><span class="sd"> Applies ``preserved_margin_ratio`` to keep a reserve off ``margin_free``,</span>
<a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="sd"> then allocates ``unit_margin_ratio`` of the remainder as the margin budget</span>
<a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="sd"> for volume sizing on both buy and sell sides.</span>
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
<a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="sd"> client: Connected ``Mt5TradingClient`` instance.</span>
<a id="__codelineno-0-106" name="__codelineno-0-106"></a><span class="sd"> symbol: Symbol used for minimum-lot margin and volume calculations.</span>
<a id="__codelineno-0-107" name="__codelineno-0-107"></a><span class="sd"> unit_margin_ratio: Fraction of post-reserve margin to allocate per unit.</span>
<a id="__codelineno-0-108" name="__codelineno-0-108"></a><span class="sd"> preserved_margin_ratio: Fraction of ``margin_free`` to preserve.</span>
<a id="__codelineno-0-109" name="__codelineno-0-109"></a>
<a id="__codelineno-0-110" name="__codelineno-0-110"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-111" name="__codelineno-0-111"></a><span class="sd"> Dictionary with ``margin_free``, ``available_margin``, ``trade_margin``,</span>
<a id="__codelineno-0-112" name="__codelineno-0-112"></a><span class="sd"> ``buy_volume``, and ``sell_volume``. Negative ``margin_free`` values are</span>
<a id="__codelineno-0-113" name="__codelineno-0-113"></a><span class="sd"> clamped to ``0.0`` before sizing.</span>
<a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="n">_require_unit_ratio</span><span class="p">(</span><span class="n">unit_margin_ratio</span><span class="p">,</span> <span class="s2">&quot;unit_margin_ratio&quot;</span><span class="p">)</span>
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="n">_require_unit_ratio</span><span class="p">(</span><span class="n">preserved_margin_ratio</span><span class="p">,</span> <span class="s2">&quot;preserved_margin_ratio&quot;</span><span class="p">)</span>
<a id="__codelineno-0-117" name="__codelineno-0-117"></a>
<a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="n">account</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">account_info_as_dict</span><span class="p">()</span>
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">margin_free</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="nb">float</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;margin_free&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="mf">0.0</span><span class="p">))</span>
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">available_margin</span> <span class="o">=</span> <span class="n">margin_free</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">preserved_margin_ratio</span><span class="p">)</span>
<a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="n">trade_margin</span> <span class="o">=</span> <span class="n">available_margin</span> <span class="o">*</span> <span class="n">unit_margin_ratio</span>
<a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">buy_volume</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">calculate_volume_by_margin</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="n">trade_margin</span><span class="p">,</span> <span class="s2">&quot;BUY&quot;</span><span class="p">)</span>
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="n">sell_volume</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">calculate_volume_by_margin</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="n">trade_margin</span><span class="p">,</span> <span class="s2">&quot;SELL&quot;</span><span class="p">)</span>
<a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="k">return</span> <span class="p">{</span>
<a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="s2">&quot;margin_free&quot;</span><span class="p">:</span> <span class="n">margin_free</span><span class="p">,</span>
<a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="s2">&quot;available_margin&quot;</span><span class="p">:</span> <span class="n">available_margin</span><span class="p">,</span>
<a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="s2">&quot;trade_margin&quot;</span><span class="p">:</span> <span class="n">trade_margin</span><span class="p">,</span>
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="s2">&quot;buy_volume&quot;</span><span class="p">:</span> <span class="n">buy_volume</span><span class="p">,</span>
<a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="s2">&quot;sell_volume&quot;</span><span class="p">:</span> <span class="n">sell_volume</span><span class="p">,</span>
<a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="p">}</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.trading.detect_position_side" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">detect_position_side</span>
<a href="#mt5cli.trading.detect_position_side" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">detect_position_side</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">client</span><span class="p">:</span> <span class="n"><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></span><span class="p">,</span> <span class="n">symbol</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="PositionSide
module-attribute
(mt5cli.trading.PositionSide)" href="#mt5cli.trading.PositionSide">PositionSide</a></span> <span class="o">|</span> <span class="kc">None</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Detect the net open position side for a symbol.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>client</code>
</td>
<td>
<code><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Connected <code>Mt5TradingClient</code> instance.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>symbol</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Symbol to inspect.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="PositionSide
module-attribute
(mt5cli.trading.PositionSide)" href="#mt5cli.trading.PositionSide">PositionSide</a> | None</code>
</td>
<td>
<div class="doc-md-description">
<p><code>"long"</code> when net buy volume exceeds sell volume, <code>"short"</code> when</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="PositionSide
module-attribute
(mt5cli.trading.PositionSide)" href="#mt5cli.trading.PositionSide">PositionSide</a> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>net sell volume exceeds buy volume, or <code>None</code> when no positions exist</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="PositionSide
module-attribute
(mt5cli.trading.PositionSide)" href="#mt5cli.trading.PositionSide">PositionSide</a> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>or buy/sell volumes are exactly balanced.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/trading.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-61">61</a></span>
<span class="normal"><a href="#__codelineno-0-62">62</a></span>
<span class="normal"><a href="#__codelineno-0-63">63</a></span>
<span class="normal"><a href="#__codelineno-0-64">64</a></span>
<span class="normal"><a href="#__codelineno-0-65">65</a></span>
<span class="normal"><a href="#__codelineno-0-66">66</a></span>
<span class="normal"><a href="#__codelineno-0-67">67</a></span>
<span class="normal"><a href="#__codelineno-0-68">68</a></span>
<span class="normal"><a href="#__codelineno-0-69">69</a></span>
<span class="normal"><a href="#__codelineno-0-70">70</a></span>
<span class="normal"><a href="#__codelineno-0-71">71</a></span>
<span class="normal"><a href="#__codelineno-0-72">72</a></span>
<span class="normal"><a href="#__codelineno-0-73">73</a></span>
<span class="normal"><a href="#__codelineno-0-74">74</a></span>
<span class="normal"><a href="#__codelineno-0-75">75</a></span>
<span class="normal"><a href="#__codelineno-0-76">76</a></span>
<span class="normal"><a href="#__codelineno-0-77">77</a></span>
<span class="normal"><a href="#__codelineno-0-78">78</a></span>
<span class="normal"><a href="#__codelineno-0-79">79</a></span>
<span class="normal"><a href="#__codelineno-0-80">80</a></span>
<span class="normal"><a href="#__codelineno-0-81">81</a></span>
<span class="normal"><a href="#__codelineno-0-82">82</a></span>
<span class="normal"><a href="#__codelineno-0-83">83</a></span>
<span class="normal"><a href="#__codelineno-0-84">84</a></span>
<span class="normal"><a href="#__codelineno-0-85">85</a></span>
<span class="normal"><a href="#__codelineno-0-86">86</a></span>
<span class="normal"><a href="#__codelineno-0-87">87</a></span>
<span class="normal"><a href="#__codelineno-0-88">88</a></span>
<span class="normal"><a href="#__codelineno-0-89">89</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-61" name="__codelineno-0-61"></a><span class="k">def</span><span class="w"> </span><span class="nf">detect_position_side</span><span class="p">(</span>
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="n">client</span><span class="p">:</span> <span class="n">Mt5TradingClient</span><span class="p">,</span>
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="n">symbol</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">PositionSide</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Detect the net open position side for a symbol.</span>
<a id="__codelineno-0-66" name="__codelineno-0-66"></a>
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> client: Connected ``Mt5TradingClient`` instance.</span>
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> symbol: Symbol to inspect.</span>
<a id="__codelineno-0-70" name="__codelineno-0-70"></a>
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> ``&quot;long&quot;`` when net buy volume exceeds sell volume, ``&quot;short&quot;`` when</span>
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> net sell volume exceeds buy volume, or ``None`` when no positions exist</span>
<a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd"> or buy/sell volumes are exactly balanced.</span>
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="n">positions</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">positions_get_as_df</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="n">symbol</span><span class="p">)</span>
<a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="k">if</span> <span class="n">positions</span><span class="o">.</span><span class="n">empty</span><span class="p">:</span>
<a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="k">return</span> <span class="kc">None</span>
<a id="__codelineno-0-79" name="__codelineno-0-79"></a>
<a id="__codelineno-0-80" name="__codelineno-0-80"></a> <span class="n">buy_type</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">mt5</span><span class="o">.</span><span class="n">POSITION_TYPE_BUY</span>
<a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="n">sell_type</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">mt5</span><span class="o">.</span><span class="n">POSITION_TYPE_SELL</span>
<a id="__codelineno-0-82" name="__codelineno-0-82"></a> <span class="n">buy_volume</span> <span class="o">=</span> <span class="n">_sum_position_volume</span><span class="p">(</span><span class="n">positions</span><span class="p">,</span> <span class="n">buy_type</span><span class="p">)</span>
<a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="n">sell_volume</span> <span class="o">=</span> <span class="n">_sum_position_volume</span><span class="p">(</span><span class="n">positions</span><span class="p">,</span> <span class="n">sell_type</span><span class="p">)</span>
<a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="n">net_volume</span> <span class="o">=</span> <span class="n">buy_volume</span> <span class="o">-</span> <span class="n">sell_volume</span>
<a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="k">if</span> <span class="n">net_volume</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="k">return</span> <span class="s2">&quot;long&quot;</span>
<a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="k">if</span> <span class="n">net_volume</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-0-88" name="__codelineno-0-88"></a> <span class="k">return</span> <span class="s2">&quot;short&quot;</span>
<a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="k">return</span> <span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.trading.determine_order_limits" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">determine_order_limits</span>
<a href="#mt5cli.trading.determine_order_limits" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">determine_order_limits</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">client</span><span class="p">:</span> <span class="n"><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">symbol</span><span class="p">:</span> <span class="n"><span title="str">str</span></span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n">side</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="OrderSide
module-attribute
(mt5cli.trading.OrderSide)" href="#mt5cli.trading.OrderSide">OrderSide</a></span> <span class="o">|</span> <span class="n"><span title="str">str</span></span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">stop_loss_limit_ratio</span><span class="p">:</span> <span class="n"><span title="float">float</span></span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">take_profit_limit_ratio</span><span class="p">:</span> <span class="n"><span title="float">float</span></span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="float">float</span></span> <span class="o">|</span> <span class="kc">None</span><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Derive entry and protective order prices from current market quotes.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>client</code>
</td>
<td>
<code><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Connected <code>Mt5TradingClient</code> instance.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>symbol</code>
</td>
<td>
<code><span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Symbol used for the quote lookup.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>side</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="OrderSide
module-attribute
(mt5cli.trading.OrderSide)" href="#mt5cli.trading.OrderSide">OrderSide</a> | <span title="str">str</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Position side as <code>"long"</code>/<code>"short"</code> (<code>"buy"</code>/<code>"sell"</code>
aliases are accepted).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>stop_loss_limit_ratio</code>
</td>
<td>
<code><span title="float">float</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Relative distance from entry for stop loss in
<code>[0, 1)</code>. A value of <code>0</code> omits the stop loss.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>take_profit_limit_ratio</code>
</td>
<td>
<code><span title="float">float</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Relative distance from entry for take profit in
<code>[0, 1)</code>. A value of <code>0</code> omits the take profit.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span>[<span title="str">str</span>, <span title="float">float</span> | None]</code>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary with <code>entry</code>, <code>stop_loss</code>, and <code>take_profit</code> keys.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="dict">dict</span>[<span title="str">str</span>, <span title="float">float</span> | None]</code>
</td>
<td>
<div class="doc-md-description">
<p>Omitted protective levels are returned as <code>None</code>.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/trading.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-133">133</a></span>
<span class="normal"><a href="#__codelineno-0-134">134</a></span>
<span class="normal"><a href="#__codelineno-0-135">135</a></span>
<span class="normal"><a href="#__codelineno-0-136">136</a></span>
<span class="normal"><a href="#__codelineno-0-137">137</a></span>
<span class="normal"><a href="#__codelineno-0-138">138</a></span>
<span class="normal"><a href="#__codelineno-0-139">139</a></span>
<span class="normal"><a href="#__codelineno-0-140">140</a></span>
<span class="normal"><a href="#__codelineno-0-141">141</a></span>
<span class="normal"><a href="#__codelineno-0-142">142</a></span>
<span class="normal"><a href="#__codelineno-0-143">143</a></span>
<span class="normal"><a href="#__codelineno-0-144">144</a></span>
<span class="normal"><a href="#__codelineno-0-145">145</a></span>
<span class="normal"><a href="#__codelineno-0-146">146</a></span>
<span class="normal"><a href="#__codelineno-0-147">147</a></span>
<span class="normal"><a href="#__codelineno-0-148">148</a></span>
<span class="normal"><a href="#__codelineno-0-149">149</a></span>
<span class="normal"><a href="#__codelineno-0-150">150</a></span>
<span class="normal"><a href="#__codelineno-0-151">151</a></span>
<span class="normal"><a href="#__codelineno-0-152">152</a></span>
<span class="normal"><a href="#__codelineno-0-153">153</a></span>
<span class="normal"><a href="#__codelineno-0-154">154</a></span>
<span class="normal"><a href="#__codelineno-0-155">155</a></span>
<span class="normal"><a href="#__codelineno-0-156">156</a></span>
<span class="normal"><a href="#__codelineno-0-157">157</a></span>
<span class="normal"><a href="#__codelineno-0-158">158</a></span>
<span class="normal"><a href="#__codelineno-0-159">159</a></span>
<span class="normal"><a href="#__codelineno-0-160">160</a></span>
<span class="normal"><a href="#__codelineno-0-161">161</a></span>
<span class="normal"><a href="#__codelineno-0-162">162</a></span>
<span class="normal"><a href="#__codelineno-0-163">163</a></span>
<span class="normal"><a href="#__codelineno-0-164">164</a></span>
<span class="normal"><a href="#__codelineno-0-165">165</a></span>
<span class="normal"><a href="#__codelineno-0-166">166</a></span>
<span class="normal"><a href="#__codelineno-0-167">167</a></span>
<span class="normal"><a href="#__codelineno-0-168">168</a></span>
<span class="normal"><a href="#__codelineno-0-169">169</a></span>
<span class="normal"><a href="#__codelineno-0-170">170</a></span>
<span class="normal"><a href="#__codelineno-0-171">171</a></span>
<span class="normal"><a href="#__codelineno-0-172">172</a></span>
<span class="normal"><a href="#__codelineno-0-173">173</a></span>
<span class="normal"><a href="#__codelineno-0-174">174</a></span>
<span class="normal"><a href="#__codelineno-0-175">175</a></span>
<span class="normal"><a href="#__codelineno-0-176">176</a></span>
<span class="normal"><a href="#__codelineno-0-177">177</a></span>
<span class="normal"><a href="#__codelineno-0-178">178</a></span>
<span class="normal"><a href="#__codelineno-0-179">179</a></span>
<span class="normal"><a href="#__codelineno-0-180">180</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-133" name="__codelineno-0-133"></a><span class="k">def</span><span class="w"> </span><span class="nf">determine_order_limits</span><span class="p">(</span>
<a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="n">client</span><span class="p">:</span> <span class="n">Mt5TradingClient</span><span class="p">,</span>
<a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="n">symbol</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="n">side</span><span class="p">:</span> <span class="n">OrderSide</span> <span class="o">|</span> <span class="nb">str</span><span class="p">,</span>
<a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="n">stop_loss_limit_ratio</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
<a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="n">take_profit_limit_ratio</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
<a id="__codelineno-0-139" name="__codelineno-0-139"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span><span class="p">]:</span>
<a id="__codelineno-0-140" name="__codelineno-0-140"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Derive entry and protective order prices from current market quotes.</span>
<a id="__codelineno-0-141" name="__codelineno-0-141"></a>
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> client: Connected ``Mt5TradingClient`` instance.</span>
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> symbol: Symbol used for the quote lookup.</span>
<a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd"> side: Position side as ``&quot;long&quot;``/``&quot;short&quot;`` (``&quot;buy&quot;``/``&quot;sell&quot;``</span>
<a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> aliases are accepted).</span>
<a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> stop_loss_limit_ratio: Relative distance from entry for stop loss in</span>
<a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> ``[0, 1)``. A value of ``0`` omits the stop loss.</span>
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> take_profit_limit_ratio: Relative distance from entry for take profit in</span>
<a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> ``[0, 1)``. A value of ``0`` omits the take profit.</span>
<a id="__codelineno-0-151" name="__codelineno-0-151"></a>
<a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> Dictionary with ``entry``, ``stop_loss``, and ``take_profit`` keys.</span>
<a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> Omitted protective levels are returned as ``None``.</span>
<a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-156" name="__codelineno-0-156"></a> <span class="n">_require_protective_ratio</span><span class="p">(</span><span class="n">stop_loss_limit_ratio</span><span class="p">,</span> <span class="s2">&quot;stop_loss_limit_ratio&quot;</span><span class="p">)</span>
<a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="n">_require_protective_ratio</span><span class="p">(</span><span class="n">take_profit_limit_ratio</span><span class="p">,</span> <span class="s2">&quot;take_profit_limit_ratio&quot;</span><span class="p">)</span>
<a id="__codelineno-0-158" name="__codelineno-0-158"></a> <span class="n">normalized_side</span> <span class="o">=</span> <span class="n">_normalize_order_side</span><span class="p">(</span><span class="n">side</span><span class="p">)</span>
<a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="n">tick</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">symbol_info_tick_as_dict</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="n">symbol</span><span class="p">)</span>
<a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="n">entry</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">tick</span><span class="p">[</span><span class="s2">&quot;ask&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="n">normalized_side</span> <span class="o">==</span> <span class="s2">&quot;long&quot;</span> <span class="k">else</span> <span class="n">tick</span><span class="p">[</span><span class="s2">&quot;bid&quot;</span><span class="p">])</span>
<a id="__codelineno-0-161" name="__codelineno-0-161"></a>
<a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="n">stop_loss</span><span class="p">:</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
<a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="k">if</span> <span class="n">stop_loss_limit_ratio</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="k">if</span> <span class="n">normalized_side</span> <span class="o">==</span> <span class="s2">&quot;long&quot;</span><span class="p">:</span>
<a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="n">stop_loss</span> <span class="o">=</span> <span class="n">entry</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">stop_loss_limit_ratio</span><span class="p">)</span>
<a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="n">stop_loss</span> <span class="o">=</span> <span class="n">entry</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">stop_loss_limit_ratio</span><span class="p">)</span>
<a id="__codelineno-0-168" name="__codelineno-0-168"></a>
<a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="n">take_profit</span><span class="p">:</span> <span class="nb">float</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
<a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="k">if</span> <span class="n">take_profit_limit_ratio</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="k">if</span> <span class="n">normalized_side</span> <span class="o">==</span> <span class="s2">&quot;long&quot;</span><span class="p">:</span>
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">take_profit</span> <span class="o">=</span> <span class="n">entry</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">take_profit_limit_ratio</span><span class="p">)</span>
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="n">take_profit</span> <span class="o">=</span> <span class="n">entry</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">take_profit_limit_ratio</span><span class="p">)</span>
<a id="__codelineno-0-175" name="__codelineno-0-175"></a>
<a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">return</span> <span class="p">{</span>
<a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="s2">&quot;entry&quot;</span><span class="p">:</span> <span class="n">entry</span><span class="p">,</span>
<a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="s2">&quot;stop_loss&quot;</span><span class="p">:</span> <span class="n">stop_loss</span><span class="p">,</span>
<a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="s2">&quot;take_profit&quot;</span><span class="p">:</span> <span class="n">take_profit</span><span class="p">,</span>
<a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="p">}</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.trading.mt5_trading_session" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">mt5_trading_session</span>
<a href="#mt5cli.trading.mt5_trading_session" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">mt5_trading_session</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">config</span><span class="p">:</span> <span class="n"><span title="pdmt5.Mt5Config">Mt5Config</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">retry_count</span><span class="p">:</span> <span class="n"><span title="int">int</span></span> <span class="o">=</span> <span class="mi">0</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="collections.abc.Iterator">Iterator</span></span><span class="p">[</span><span class="n"><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></span><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Open a trading-capable MT5 session and always shut down safely.</p>
<p>Launches the MetaTrader 5 terminal using <code>Mt5Config.path</code> when set,
initializes and logs in via <code>initialize_and_login_mt5()</code>, yields a
connected :class:<code>~pdmt5.Mt5TradingClient</code>, and calls <code>shutdown()</code> on
exit even when an error is raised inside the context.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>config</code>
</td>
<td>
<code><span title="pdmt5.Mt5Config">Mt5Config</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>MT5 connection configuration. Defaults to an empty config that
attaches to a running terminal.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>retry_count</code>
</td>
<td>
<code><span title="int">int</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Number of initialization retries passed to
<code>Mt5TradingClient</code>.</p>
</div>
</td>
<td>
<code>0</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Yields:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="pdmt5.Mt5TradingClient">Mt5TradingClient</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Connected <code>Mt5TradingClient</code> bound to the session.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/trading.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-183">183</a></span>
<span class="normal"><a href="#__codelineno-0-184">184</a></span>
<span class="normal"><a href="#__codelineno-0-185">185</a></span>
<span class="normal"><a href="#__codelineno-0-186">186</a></span>
<span class="normal"><a href="#__codelineno-0-187">187</a></span>
<span class="normal"><a href="#__codelineno-0-188">188</a></span>
<span class="normal"><a href="#__codelineno-0-189">189</a></span>
<span class="normal"><a href="#__codelineno-0-190">190</a></span>
<span class="normal"><a href="#__codelineno-0-191">191</a></span>
<span class="normal"><a href="#__codelineno-0-192">192</a></span>
<span class="normal"><a href="#__codelineno-0-193">193</a></span>
<span class="normal"><a href="#__codelineno-0-194">194</a></span>
<span class="normal"><a href="#__codelineno-0-195">195</a></span>
<span class="normal"><a href="#__codelineno-0-196">196</a></span>
<span class="normal"><a href="#__codelineno-0-197">197</a></span>
<span class="normal"><a href="#__codelineno-0-198">198</a></span>
<span class="normal"><a href="#__codelineno-0-199">199</a></span>
<span class="normal"><a href="#__codelineno-0-200">200</a></span>
<span class="normal"><a href="#__codelineno-0-201">201</a></span>
<span class="normal"><a href="#__codelineno-0-202">202</a></span>
<span class="normal"><a href="#__codelineno-0-203">203</a></span>
<span class="normal"><a href="#__codelineno-0-204">204</a></span>
<span class="normal"><a href="#__codelineno-0-205">205</a></span>
<span class="normal"><a href="#__codelineno-0-206">206</a></span>
<span class="normal"><a href="#__codelineno-0-207">207</a></span>
<span class="normal"><a href="#__codelineno-0-208">208</a></span>
<span class="normal"><a href="#__codelineno-0-209">209</a></span>
<span class="normal"><a href="#__codelineno-0-210">210</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="nd">@contextmanager</span>
<a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="k">def</span><span class="w"> </span><span class="nf">mt5_trading_session</span><span class="p">(</span>
<a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="n">config</span><span class="p">:</span> <span class="n">Mt5Config</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="n">retry_count</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<a id="__codelineno-0-187" name="__codelineno-0-187"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">Mt5TradingClient</span><span class="p">]:</span>
<a id="__codelineno-0-188" name="__codelineno-0-188"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Open a trading-capable MT5 session and always shut down safely.</span>
<a id="__codelineno-0-189" name="__codelineno-0-189"></a>
<a id="__codelineno-0-190" name="__codelineno-0-190"></a><span class="sd"> Launches the MetaTrader 5 terminal using ``Mt5Config.path`` when set,</span>
<a id="__codelineno-0-191" name="__codelineno-0-191"></a><span class="sd"> initializes and logs in via ``initialize_and_login_mt5()``, yields a</span>
<a id="__codelineno-0-192" name="__codelineno-0-192"></a><span class="sd"> connected :class:`~pdmt5.Mt5TradingClient`, and calls ``shutdown()`` on</span>
<a id="__codelineno-0-193" name="__codelineno-0-193"></a><span class="sd"> exit even when an error is raised inside the context.</span>
<a id="__codelineno-0-194" name="__codelineno-0-194"></a>
<a id="__codelineno-0-195" name="__codelineno-0-195"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-196" name="__codelineno-0-196"></a><span class="sd"> config: MT5 connection configuration. Defaults to an empty config that</span>
<a id="__codelineno-0-197" name="__codelineno-0-197"></a><span class="sd"> attaches to a running terminal.</span>
<a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="sd"> retry_count: Number of initialization retries passed to</span>
<a id="__codelineno-0-199" name="__codelineno-0-199"></a><span class="sd"> ``Mt5TradingClient``.</span>
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
<a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="sd"> Yields:</span>
<a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> Connected ``Mt5TradingClient`` bound to the session.</span>
<a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">mt5_config</span> <span class="o">=</span> <span class="n">config</span> <span class="ow">or</span> <span class="n">build_config</span><span class="p">()</span>
<a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="n">client</span> <span class="o">=</span> <span class="n">Mt5TradingClient</span><span class="p">(</span><span class="n">config</span><span class="o">=</span><span class="n">mt5_config</span><span class="p">,</span> <span class="n">retry_count</span><span class="o">=</span><span class="n">retry_count</span><span class="p">)</span>
<a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="n">client</span><span class="o">.</span><span class="n">initialize_and_login_mt5</span><span class="p">()</span>
<a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="k">yield</span> <span class="n">client</span>
<a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="k">finally</span><span class="p">:</span>
<a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="n">client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div><h2 id="trading-capable-mt5-sessions">Trading-capable MT5 sessions<a class="headerlink" href="#trading-capable-mt5-sessions" title="Permanent link">&para;</a></h2>
<p><code>mt5_trading_session()</code> complements the read-only <code>mt5_session()</code> helper in
<code>sdk.py</code>. It yields a connected <code>pdmt5.Mt5TradingClient</code>, uses
<code>Mt5Config.path</code> to launch the terminal when configured, and always calls
<code>shutdown()</code> on exit.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">pdmt5</span><span class="w"> </span><span class="kn">import</span> <span class="n">Mt5Config</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="kn">from</span><span class="w"> </span><span class="nn">mt5cli</span><span class="w"> </span><span class="kn">import</span> <span class="n">mt5_trading_session</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="k">with</span> <span class="n">mt5_trading_session</span><span class="p">(</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">Mt5Config</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;C:\Program Files\MetaTrader 5\terminal64.exe&quot;</span><span class="p">,</span> <span class="n">login</span><span class="o">=</span><span class="mi">12345</span><span class="p">),</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">retry_count</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">)</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="n">positions</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">positions_get_as_df</span><span class="p">(</span><span class="n">symbol</span><span class="o">=</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">)</span>
</code></pre></div>
<p>The read-only <code>Mt5CliClient</code> / <code>mt5_session()</code> API is unchanged.</p>
<h2 id="operational-trading-helpers">Operational trading helpers<a class="headerlink" href="#operational-trading-helpers" title="Permanent link">&para;</a></h2>
<p>These helpers are strategy-agnostic and do not depend on signal detection,
betting logic, or scheduling code in downstream applications.</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">mt5cli</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> <span class="n">calculate_margin_and_volume</span><span class="p">,</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> <span class="n">detect_position_side</span><span class="p">,</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> <span class="n">determine_order_limits</span><span class="p">,</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="p">)</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="n">side</span> <span class="o">=</span> <span class="n">detect_position_side</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s2">&quot;EURUSD&quot;</span><span class="p">)</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="n">sizing</span> <span class="o">=</span> <span class="n">calculate_margin_and_volume</span><span class="p">(</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a> <span class="n">client</span><span class="p">,</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a> <span class="n">unit_margin_ratio</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a> <span class="n">preserved_margin_ratio</span><span class="o">=</span><span class="mf">0.2</span><span class="p">,</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="p">)</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="n">limits</span> <span class="o">=</span> <span class="n">determine_order_limits</span><span class="p">(</span>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a> <span class="n">client</span><span class="p">,</span>
<a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span>
<a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a> <span class="n">side</span><span class="o">=</span><span class="s2">&quot;long&quot;</span><span class="p">,</span>
<a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a> <span class="n">stop_loss_limit_ratio</span><span class="o">=</span><span class="mf">0.01</span><span class="p">,</span>
<a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a> <span class="n">take_profit_limit_ratio</span><span class="o">=</span><span class="mf">0.02</span><span class="p">,</span>
<a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="p">)</span>
</code></pre></div>
<p>Protective ratios must satisfy <code>0 &lt;= ratio &lt; 1</code>; <code>0</code> omits that level.
<code>calculate_margin_and_volume()</code> clamps negative <code>margin_free</code> to <code>0.0</code>
before sizing.</p>
<h2 id="migration-from-mteor-local-helpers">Migration from mteor-local helpers<a class="headerlink" href="#migration-from-mteor-local-helpers" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>mteor-local concern</th>
<th>mt5cli replacement</th>
</tr>
</thead>
<tbody>
<tr>
<td>Manual terminal spawn/kill around trading code</td>
<td><code>mt5_trading_session()</code></td>
</tr>
<tr>
<td>Local position-side detection</td>
<td><code>detect_position_side()</code></td>
</tr>
<tr>
<td>Local margin/volume sizing</td>
<td><code>calculate_margin_and_volume()</code></td>
</tr>
<tr>
<td>Local SL/TP price derivation</td>
<td><code>determine_order_limits()</code></td>
</tr>
<tr>
<td>Throttled SQLite history loop with ad-hoc error handling</td>
<td><code>ThrottledHistoryUpdater(suppress_errors=True)</code></td>
</tr>
</tbody>
</table>
<p>Keep read-only data collection on <code>mt5_session()</code> / <code>Mt5CliClient</code>; use
<code>mt5_trading_session()</code> only where order placement or trading calculations are
required.</p></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "../..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../../js/base.js"></script>
<script src="../../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>