This commit is contained in:
dceoy
2026-06-23 16:59:18 +00:00
parent 35ac854ab0
commit e962a6adbf
7 changed files with 2270 additions and 1613 deletions
+62 -64
View File
@@ -232,9 +232,7 @@
<p>Public client for generic MT5 data access and order primitives.</p>
<p>Extends the read-only SDK client with optional order check/send helpers and
exposes the same connection lifecycle as :class:<code>~mt5cli.sdk.Mt5CliClient</code>.
Downstream applications such as private trading packages should prefer this
type over the legacy <code>Mt5CliClient</code> name.</p>
exposes the same connection lifecycle as :func:<code>mt5_session</code>.</p>
<p>mt5cli intentionally exposes minimal execution primitives only. Trading
decisions, signals, strategies, backtests, and optimization remain the
responsibility of downstream applications.</p>
@@ -380,21 +378,21 @@ responsibility of downstream applications.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/client.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-65">65</a></span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></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></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="nd">@classmethod</span>
<a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="k">def</span><span class="w"> </span><span class="nf">from_connected_client</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">client</span><span class="p">:</span> <span class="n">Mt5DataClient</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Self</span><span class="p">:</span>
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Bind to an already-connected ``Mt5DataClient`` without owning it.</span>
<a id="__codelineno-0-68" name="__codelineno-0-68"></a>
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> Client wrapper bound to the injected connection.</span>
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-72" name="__codelineno-0-72"></a> <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">client</span><span class="o">=</span><span class="n">client</span><span class="p">)</span>
<span class="normal"><a href="#__codelineno-0-70">70</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-63" name="__codelineno-0-63"></a><span class="nd">@classmethod</span>
<a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="k">def</span><span class="w"> </span><span class="nf">from_connected_client</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">client</span><span class="p">:</span> <span class="n">Mt5DataClient</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Self</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;Bind to an already-connected ``Mt5DataClient`` without owning it.</span>
<a id="__codelineno-0-66" name="__codelineno-0-66"></a>
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> Client wrapper bound to the injected connection.</span>
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-70" name="__codelineno-0-70"></a> <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">client</span><span class="o">=</span><span class="n">client</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -473,25 +471,25 @@ responsibility of downstream applications.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/client.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-36">36</a></span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-34">34</a></span>
<span class="normal"><a href="#__codelineno-0-35">35</a></span>
<span class="normal"><a href="#__codelineno-0-36">36</a></span>
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
<span class="normal"><a href="#__codelineno-0-38">38</a></span>
<span class="normal"><a href="#__codelineno-0-39">39</a></span>
<span class="normal"><a href="#__codelineno-0-40">40</a></span>
<span class="normal"><a href="#__codelineno-0-41">41</a></span>
<span class="normal"><a href="#__codelineno-0-42">42</a></span>
<span class="normal"><a href="#__codelineno-0-43">43</a></span>
<span class="normal"><a href="#__codelineno-0-44">44</a></span>
<span class="normal"><a href="#__codelineno-0-45">45</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="k">def</span><span class="w"> </span><span class="nf">order_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Check funds sufficiency for a trade request.</span>
<a id="__codelineno-0-38" name="__codelineno-0-38"></a>
<a id="__codelineno-0-39" name="__codelineno-0-39"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-40" name="__codelineno-0-40"></a><span class="sd"> request: MT5 order request dictionary.</span>
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
<a id="__codelineno-0-42" name="__codelineno-0-42"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="sd"> One-row DataFrame with the order-check result.</span>
<a id="__codelineno-0-44" name="__codelineno-0-44"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch</span><span class="p">(</span><span class="k">lambda</span> <span class="n">client</span><span class="p">:</span> <span class="n">client</span><span class="o">.</span><span class="n">order_check_as_df</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">))</span>
<span class="normal"><a href="#__codelineno-0-43">43</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-34" name="__codelineno-0-34"></a><span class="k">def</span><span class="w"> </span><span class="nf">order_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Check funds sufficiency for a trade request.</span>
<a id="__codelineno-0-36" name="__codelineno-0-36"></a>
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> request: MT5 order request dictionary.</span>
<a id="__codelineno-0-39" name="__codelineno-0-39"></a>
<a id="__codelineno-0-40" name="__codelineno-0-40"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-41" name="__codelineno-0-41"></a><span class="sd"> One-row DataFrame with the order-check result.</span>
<a id="__codelineno-0-42" name="__codelineno-0-42"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch</span><span class="p">(</span><span class="k">lambda</span> <span class="n">client</span><span class="p">:</span> <span class="n">client</span><span class="o">.</span><span class="n">order_check_as_df</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -579,7 +577,9 @@ not implement strategy logic, signal generation, or trade sizing.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/client.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-47">47</a></span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-45">45</a></span>
<span class="normal"><a href="#__codelineno-0-46">46</a></span>
<span class="normal"><a href="#__codelineno-0-47">47</a></span>
<span class="normal"><a href="#__codelineno-0-48">48</a></span>
<span class="normal"><a href="#__codelineno-0-49">49</a></span>
<span class="normal"><a href="#__codelineno-0-50">50</a></span>
@@ -593,25 +593,23 @@ not implement strategy logic, signal generation, or trade sizing.</p>
<span class="normal"><a href="#__codelineno-0-58">58</a></span>
<span class="normal"><a href="#__codelineno-0-59">59</a></span>
<span class="normal"><a href="#__codelineno-0-60">60</a></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></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="k">def</span><span class="w"> </span><span class="nf">order_send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Send a live trade request to the MT5 trade server.</span>
<a id="__codelineno-0-49" name="__codelineno-0-49"></a>
<a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="sd"> Warning:</span>
<a id="__codelineno-0-51" name="__codelineno-0-51"></a><span class="sd"> This is a live execution primitive. A successful call can place,</span>
<a id="__codelineno-0-52" name="__codelineno-0-52"></a><span class="sd"> modify, or close real trades on the connected account. Downstream</span>
<a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="sd"> applications must gate usage explicitly (for example behind manual</span>
<a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="sd"> confirmation or application-specific risk controls). mt5cli does</span>
<a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> not implement strategy logic, signal generation, or trade sizing.</span>
<a id="__codelineno-0-56" name="__codelineno-0-56"></a>
<a id="__codelineno-0-57" name="__codelineno-0-57"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-58" name="__codelineno-0-58"></a><span class="sd"> request: MT5 order request dictionary.</span>
<a id="__codelineno-0-59" name="__codelineno-0-59"></a>
<a id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-61" name="__codelineno-0-61"></a><span class="sd"> One-row DataFrame with the order-send result.</span>
<a id="__codelineno-0-62" name="__codelineno-0-62"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch</span><span class="p">(</span><span class="k">lambda</span> <span class="n">client</span><span class="p">:</span> <span class="n">client</span><span class="o">.</span><span class="n">order_send_as_df</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">))</span>
<span class="normal"><a href="#__codelineno-0-61">61</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="k">def</span><span class="w"> </span><span class="nf">order_send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-46" name="__codelineno-0-46"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Send a live trade request to the MT5 trade server.</span>
<a id="__codelineno-0-47" name="__codelineno-0-47"></a>
<a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="sd"> Warning:</span>
<a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="sd"> This is a live execution primitive. A successful call can place,</span>
<a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="sd"> modify, or close real trades on the connected account. Downstream</span>
<a id="__codelineno-0-51" name="__codelineno-0-51"></a><span class="sd"> applications must gate usage explicitly (for example behind manual</span>
<a id="__codelineno-0-52" name="__codelineno-0-52"></a><span class="sd"> confirmation or application-specific risk controls). mt5cli does</span>
<a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="sd"> not implement strategy logic, signal generation, or trade sizing.</span>
<a id="__codelineno-0-54" name="__codelineno-0-54"></a>
<a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> request: MT5 order request dictionary.</span>
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
<a id="__codelineno-0-58" name="__codelineno-0-58"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-59" name="__codelineno-0-59"></a><span class="sd"> One-row DataFrame with the order-send result.</span>
<a id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fetch</span><span class="p">(</span><span class="k">lambda</span> <span class="n">client</span><span class="p">:</span> <span class="n">client</span><span class="o">.</span><span class="n">order_send_as_df</span><span class="p">(</span><span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -952,7 +950,9 @@ attaches to a running terminal.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/client.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-75">75</a></span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></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>
@@ -963,22 +963,20 @@ attaches to a running terminal.</p>
<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></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="nd">@contextmanager</span>
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="k">def</span><span class="w"> </span><span class="nf">mt5_session</span><span class="p">(</span><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> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">MT5Client</span><span class="p">]:</span>
<a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Open an MT5 terminal session and yield a connected :class:`MT5Client`.</span>
<a id="__codelineno-0-78" name="__codelineno-0-78"></a>
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> config: MT5 connection configuration. Defaults to an empty config that</span>
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd"> attaches to a running terminal.</span>
<a id="__codelineno-0-82" name="__codelineno-0-82"></a>
<a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="sd"> Yields:</span>
<a id="__codelineno-0-84" name="__codelineno-0-84"></a><span class="sd"> Connected :class:`MT5Client` bound to the session.</span>
<a id="__codelineno-0-85" name="__codelineno-0-85"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-86" name="__codelineno-0-86"></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-87" name="__codelineno-0-87"></a> <span class="k">with</span> <span class="n">connected_client</span><span class="p">(</span><span class="n">mt5_config</span><span class="p">)</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
<a id="__codelineno-0-88" name="__codelineno-0-88"></a> <span class="k">yield</span> <span class="n">MT5Client</span><span class="o">.</span><span class="n">from_connected_client</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
<span class="normal"><a href="#__codelineno-0-86">86</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="nd">@contextmanager</span>
<a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="k">def</span><span class="w"> </span><span class="nf">mt5_session</span><span class="p">(</span><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> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">MT5Client</span><span class="p">]:</span>
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Open an MT5 terminal session and yield a connected :class:`MT5Client`.</span>
<a id="__codelineno-0-76" name="__codelineno-0-76"></a>
<a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="sd"> config: MT5 connection configuration. Defaults to an empty config that</span>
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> attaches to a running terminal.</span>
<a id="__codelineno-0-80" name="__codelineno-0-80"></a>
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd"> Yields:</span>
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd"> Connected :class:`MT5Client` bound to the session.</span>
<a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-84" name="__codelineno-0-84"></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-85" name="__codelineno-0-85"></a> <span class="k">with</span> <span class="n">connected_client</span><span class="p">(</span><span class="n">mt5_config</span><span class="p">)</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
<a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="k">yield</span> <span class="n">MT5Client</span><span class="o">.</span><span class="n">from_connected_client</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>