This commit is contained in:
dceoy
2026-06-25 05:04:06 +00:00
parent 2ec68691e8
commit 62063bbf22
5 changed files with 414 additions and 355 deletions
+95 -95
View File
@@ -942,16 +942,7 @@ suffixes (for example <code>XAUUSDm</code>, <code>US500.cash</code>, or <code>EU
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-343">343</a></span>
<span class="normal"><a href="#__codelineno-0-344">344</a></span>
<span class="normal"><a href="#__codelineno-0-345">345</a></span>
<span class="normal"><a href="#__codelineno-0-346">346</a></span>
<span class="normal"><a href="#__codelineno-0-347">347</a></span>
<span class="normal"><a href="#__codelineno-0-348">348</a></span>
<span class="normal"><a href="#__codelineno-0-349">349</a></span>
<span class="normal"><a href="#__codelineno-0-350">350</a></span>
<span class="normal"><a href="#__codelineno-0-351">351</a></span>
<span class="normal"><a href="#__codelineno-0-352">352</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-352">352</a></span>
<span class="normal"><a href="#__codelineno-0-353">353</a></span>
<span class="normal"><a href="#__codelineno-0-354">354</a></span>
<span class="normal"><a href="#__codelineno-0-355">355</a></span>
@@ -962,27 +953,36 @@ suffixes (for example <code>XAUUSDm</code>, <code>US500.cash</code>, or <code>EU
<span class="normal"><a href="#__codelineno-0-360">360</a></span>
<span class="normal"><a href="#__codelineno-0-361">361</a></span>
<span class="normal"><a href="#__codelineno-0-362">362</a></span>
<span class="normal"><a href="#__codelineno-0-363">363</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-343" name="__codelineno-0-343"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_datetime</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">datetime</span><span class="p">:</span>
<a id="__codelineno-0-344" name="__codelineno-0-344"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse an ISO 8601 datetime string to a timezone-aware datetime.</span>
<a id="__codelineno-0-345" name="__codelineno-0-345"></a>
<a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> value: ISO 8601 datetime string (e.g., &#39;2024-01-01&#39; or</span>
<a id="__codelineno-0-348" name="__codelineno-0-348"></a><span class="sd"> &#39;2024-01-01T12:00:00+00:00&#39;).</span>
<a id="__codelineno-0-349" name="__codelineno-0-349"></a>
<a id="__codelineno-0-350" name="__codelineno-0-350"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-351" name="__codelineno-0-351"></a><span class="sd"> Parsed datetime with UTC timezone if no timezone is specified.</span>
<a id="__codelineno-0-352" name="__codelineno-0-352"></a>
<a id="__codelineno-0-353" name="__codelineno-0-353"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-354" name="__codelineno-0-354"></a><span class="sd"> ValueError: If the string cannot be parsed.</span>
<a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-356" name="__codelineno-0-356"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-357" name="__codelineno-0-357"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid datetime format: &#39;</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">&#39;. Use ISO 8601 format.&quot;</span>
<a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="k">if</span> <span class="n">dt</span><span class="o">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">)</span>
<a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="k">return</span> <span class="n">dt</span>
<span class="normal"><a href="#__codelineno-0-363">363</a></span>
<span class="normal"><a href="#__codelineno-0-364">364</a></span>
<span class="normal"><a href="#__codelineno-0-365">365</a></span>
<span class="normal"><a href="#__codelineno-0-366">366</a></span>
<span class="normal"><a href="#__codelineno-0-367">367</a></span>
<span class="normal"><a href="#__codelineno-0-368">368</a></span>
<span class="normal"><a href="#__codelineno-0-369">369</a></span>
<span class="normal"><a href="#__codelineno-0-370">370</a></span>
<span class="normal"><a href="#__codelineno-0-371">371</a></span>
<span class="normal"><a href="#__codelineno-0-372">372</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-352" name="__codelineno-0-352"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_datetime</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">datetime</span><span class="p">:</span>
<a id="__codelineno-0-353" name="__codelineno-0-353"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse an ISO 8601 datetime string to a timezone-aware datetime.</span>
<a id="__codelineno-0-354" name="__codelineno-0-354"></a>
<a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-356" name="__codelineno-0-356"></a><span class="sd"> value: ISO 8601 datetime string (e.g., &#39;2024-01-01&#39; or</span>
<a id="__codelineno-0-357" name="__codelineno-0-357"></a><span class="sd"> &#39;2024-01-01T12:00:00+00:00&#39;).</span>
<a id="__codelineno-0-358" name="__codelineno-0-358"></a>
<a id="__codelineno-0-359" name="__codelineno-0-359"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-360" name="__codelineno-0-360"></a><span class="sd"> Parsed datetime with UTC timezone if no timezone is specified.</span>
<a id="__codelineno-0-361" name="__codelineno-0-361"></a>
<a id="__codelineno-0-362" name="__codelineno-0-362"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-363" name="__codelineno-0-363"></a><span class="sd"> ValueError: If the string cannot be parsed.</span>
<a id="__codelineno-0-364" name="__codelineno-0-364"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid datetime format: &#39;</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">&#39;. Use ISO 8601 format.&quot;</span>
<a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="k">if</span> <span class="n">dt</span><span class="o">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-371" name="__codelineno-0-371"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">)</span>
<a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="k">return</span> <span class="n">dt</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1084,16 +1084,7 @@ suffixes (for example <code>XAUUSDm</code>, <code>US500.cash</code>, or <code>EU
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-390">390</a></span>
<span class="normal"><a href="#__codelineno-0-391">391</a></span>
<span class="normal"><a href="#__codelineno-0-392">392</a></span>
<span class="normal"><a href="#__codelineno-0-393">393</a></span>
<span class="normal"><a href="#__codelineno-0-394">394</a></span>
<span class="normal"><a href="#__codelineno-0-395">395</a></span>
<span class="normal"><a href="#__codelineno-0-396">396</a></span>
<span class="normal"><a href="#__codelineno-0-397">397</a></span>
<span class="normal"><a href="#__codelineno-0-398">398</a></span>
<span class="normal"><a href="#__codelineno-0-399">399</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-399">399</a></span>
<span class="normal"><a href="#__codelineno-0-400">400</a></span>
<span class="normal"><a href="#__codelineno-0-401">401</a></span>
<span class="normal"><a href="#__codelineno-0-402">402</a></span>
@@ -1105,28 +1096,37 @@ suffixes (for example <code>XAUUSDm</code>, <code>US500.cash</code>, or <code>EU
<span class="normal"><a href="#__codelineno-0-408">408</a></span>
<span class="normal"><a href="#__codelineno-0-409">409</a></span>
<span class="normal"><a href="#__codelineno-0-410">410</a></span>
<span class="normal"><a href="#__codelineno-0-411">411</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-390" name="__codelineno-0-390"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_tick_flags</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-391" name="__codelineno-0-391"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse tick flags string or integer value.</span>
<a id="__codelineno-0-392" name="__codelineno-0-392"></a>
<a id="__codelineno-0-393" name="__codelineno-0-393"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-394" name="__codelineno-0-394"></a><span class="sd"> value: Tick flag name (ALL, INFO, TRADE, COPY_TICKS_*) or integer value.</span>
<a id="__codelineno-0-395" name="__codelineno-0-395"></a>
<a id="__codelineno-0-396" name="__codelineno-0-396"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-397" name="__codelineno-0-397"></a><span class="sd"> Integer tick flag value compatible with MetaTrader 5 ``COPY_TICKS_*``.</span>
<a id="__codelineno-0-398" name="__codelineno-0-398"></a>
<a id="__codelineno-0-399" name="__codelineno-0-399"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-400" name="__codelineno-0-400"></a><span class="sd"> ValueError: If the flag is invalid.</span>
<a id="__codelineno-0-401" name="__codelineno-0-401"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-402" name="__codelineno-0-402"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-403" name="__codelineno-0-403"></a> <span class="k">return</span> <span class="n">_parse_copy_ticks</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-404" name="__codelineno-0-404"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-405" name="__codelineno-0-405"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-406" name="__codelineno-0-406"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_TICK_FLAG_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-407" name="__codelineno-0-407"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-408" name="__codelineno-0-408"></a> <span class="sa">f</span><span class="s2">&quot;Invalid tick flags: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-409" name="__codelineno-0-409"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-410" name="__codelineno-0-410"></a> <span class="p">)</span>
<a id="__codelineno-0-411" name="__codelineno-0-411"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<span class="normal"><a href="#__codelineno-0-411">411</a></span>
<span class="normal"><a href="#__codelineno-0-412">412</a></span>
<span class="normal"><a href="#__codelineno-0-413">413</a></span>
<span class="normal"><a href="#__codelineno-0-414">414</a></span>
<span class="normal"><a href="#__codelineno-0-415">415</a></span>
<span class="normal"><a href="#__codelineno-0-416">416</a></span>
<span class="normal"><a href="#__codelineno-0-417">417</a></span>
<span class="normal"><a href="#__codelineno-0-418">418</a></span>
<span class="normal"><a href="#__codelineno-0-419">419</a></span>
<span class="normal"><a href="#__codelineno-0-420">420</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-399" name="__codelineno-0-399"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_tick_flags</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-400" name="__codelineno-0-400"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse tick flags string or integer value.</span>
<a id="__codelineno-0-401" name="__codelineno-0-401"></a>
<a id="__codelineno-0-402" name="__codelineno-0-402"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-403" name="__codelineno-0-403"></a><span class="sd"> value: Tick flag name (ALL, INFO, TRADE, COPY_TICKS_*) or integer value.</span>
<a id="__codelineno-0-404" name="__codelineno-0-404"></a>
<a id="__codelineno-0-405" name="__codelineno-0-405"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-406" name="__codelineno-0-406"></a><span class="sd"> Integer tick flag value compatible with MetaTrader 5 ``COPY_TICKS_*``.</span>
<a id="__codelineno-0-407" name="__codelineno-0-407"></a>
<a id="__codelineno-0-408" name="__codelineno-0-408"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-409" name="__codelineno-0-409"></a><span class="sd"> ValueError: If the flag is invalid.</span>
<a id="__codelineno-0-410" name="__codelineno-0-410"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-411" name="__codelineno-0-411"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-412" name="__codelineno-0-412"></a> <span class="k">return</span> <span class="n">_parse_copy_ticks</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-413" name="__codelineno-0-413"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-414" name="__codelineno-0-414"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-415" name="__codelineno-0-415"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_TICK_FLAG_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-416" name="__codelineno-0-416"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-417" name="__codelineno-0-417"></a> <span class="sa">f</span><span class="s2">&quot;Invalid tick flags: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-418" name="__codelineno-0-418"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-419" name="__codelineno-0-419"></a> <span class="p">)</span>
<a id="__codelineno-0-420" name="__codelineno-0-420"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1228,16 +1228,7 @@ suffixes (for example <code>XAUUSDm</code>, <code>US500.cash</code>, or <code>EU
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-366">366</a></span>
<span class="normal"><a href="#__codelineno-0-367">367</a></span>
<span class="normal"><a href="#__codelineno-0-368">368</a></span>
<span class="normal"><a href="#__codelineno-0-369">369</a></span>
<span class="normal"><a href="#__codelineno-0-370">370</a></span>
<span class="normal"><a href="#__codelineno-0-371">371</a></span>
<span class="normal"><a href="#__codelineno-0-372">372</a></span>
<span class="normal"><a href="#__codelineno-0-373">373</a></span>
<span class="normal"><a href="#__codelineno-0-374">374</a></span>
<span class="normal"><a href="#__codelineno-0-375">375</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-375">375</a></span>
<span class="normal"><a href="#__codelineno-0-376">376</a></span>
<span class="normal"><a href="#__codelineno-0-377">377</a></span>
<span class="normal"><a href="#__codelineno-0-378">378</a></span>
@@ -1249,28 +1240,37 @@ suffixes (for example <code>XAUUSDm</code>, <code>US500.cash</code>, or <code>EU
<span class="normal"><a href="#__codelineno-0-384">384</a></span>
<span class="normal"><a href="#__codelineno-0-385">385</a></span>
<span class="normal"><a href="#__codelineno-0-386">386</a></span>
<span class="normal"><a href="#__codelineno-0-387">387</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-366" name="__codelineno-0-366"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-367" name="__codelineno-0-367"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse a timeframe string or integer value.</span>
<a id="__codelineno-0-368" name="__codelineno-0-368"></a>
<a id="__codelineno-0-369" name="__codelineno-0-369"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-370" name="__codelineno-0-370"></a><span class="sd"> value: Timeframe name (e.g., &#39;M1&#39;, &#39;H1&#39;, &#39;D1&#39;) or integer value.</span>
<a id="__codelineno-0-371" name="__codelineno-0-371"></a>
<a id="__codelineno-0-372" name="__codelineno-0-372"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-373" name="__codelineno-0-373"></a><span class="sd"> Integer timeframe value.</span>
<a id="__codelineno-0-374" name="__codelineno-0-374"></a>
<a id="__codelineno-0-375" name="__codelineno-0-375"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-376" name="__codelineno-0-376"></a><span class="sd"> ValueError: If the timeframe is invalid.</span>
<a id="__codelineno-0-377" name="__codelineno-0-377"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="k">return</span> <span class="n">_parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TIMEFRAME_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-383" name="__codelineno-0-383"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="sa">f</span><span class="s2">&quot;Invalid timeframe: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-386" name="__codelineno-0-386"></a> <span class="p">)</span>
<a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<span class="normal"><a href="#__codelineno-0-387">387</a></span>
<span class="normal"><a href="#__codelineno-0-388">388</a></span>
<span class="normal"><a href="#__codelineno-0-389">389</a></span>
<span class="normal"><a href="#__codelineno-0-390">390</a></span>
<span class="normal"><a href="#__codelineno-0-391">391</a></span>
<span class="normal"><a href="#__codelineno-0-392">392</a></span>
<span class="normal"><a href="#__codelineno-0-393">393</a></span>
<span class="normal"><a href="#__codelineno-0-394">394</a></span>
<span class="normal"><a href="#__codelineno-0-395">395</a></span>
<span class="normal"><a href="#__codelineno-0-396">396</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-375" name="__codelineno-0-375"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-376" name="__codelineno-0-376"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse a timeframe string or integer value.</span>
<a id="__codelineno-0-377" name="__codelineno-0-377"></a>
<a id="__codelineno-0-378" name="__codelineno-0-378"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-379" name="__codelineno-0-379"></a><span class="sd"> value: Timeframe name (e.g., &#39;M1&#39;, &#39;H1&#39;, &#39;D1&#39;) or integer value.</span>
<a id="__codelineno-0-380" name="__codelineno-0-380"></a>
<a id="__codelineno-0-381" name="__codelineno-0-381"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-382" name="__codelineno-0-382"></a><span class="sd"> Integer timeframe value.</span>
<a id="__codelineno-0-383" name="__codelineno-0-383"></a>
<a id="__codelineno-0-384" name="__codelineno-0-384"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-385" name="__codelineno-0-385"></a><span class="sd"> ValueError: If the timeframe is invalid.</span>
<a id="__codelineno-0-386" name="__codelineno-0-386"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="k">return</span> <span class="n">_parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TIMEFRAME_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-393" name="__codelineno-0-393"></a> <span class="sa">f</span><span class="s2">&quot;Invalid timeframe: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-394" name="__codelineno-0-394"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="p">)</span>
<a id="__codelineno-0-396" name="__codelineno-0-396"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
+53 -25
View File
@@ -1889,6 +1889,16 @@ completed bars. Empty frames and single-row frames return empty results.</p>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="ImportError">ImportError</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the parquet format is requested but pyarrow is not installed.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="ValueError">ValueError</span></code>
@@ -1943,7 +1953,16 @@ completed bars. Empty frames and single-row frames return empty results.</p>
<span class="normal"><a href="#__codelineno-0-337">337</a></span>
<span class="normal"><a href="#__codelineno-0-338">338</a></span>
<span class="normal"><a href="#__codelineno-0-339">339</a></span>
<span class="normal"><a href="#__codelineno-0-340">340</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="k">def</span><span class="w"> </span><span class="nf">export_dataframe</span><span class="p">(</span>
<span class="normal"><a href="#__codelineno-0-340">340</a></span>
<span class="normal"><a href="#__codelineno-0-341">341</a></span>
<span class="normal"><a href="#__codelineno-0-342">342</a></span>
<span class="normal"><a href="#__codelineno-0-343">343</a></span>
<span class="normal"><a href="#__codelineno-0-344">344</a></span>
<span class="normal"><a href="#__codelineno-0-345">345</a></span>
<span class="normal"><a href="#__codelineno-0-346">346</a></span>
<span class="normal"><a href="#__codelineno-0-347">347</a></span>
<span class="normal"><a href="#__codelineno-0-348">348</a></span>
<span class="normal"><a href="#__codelineno-0-349">349</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="k">def</span><span class="w"> </span><span class="nf">export_dataframe</span><span class="p">(</span>
<a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="n">df</span><span class="p">:</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">,</span>
<a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="n">output_path</span><span class="p">:</span> <span class="n">Path</span><span class="p">,</span>
<a id="__codelineno-0-305" name="__codelineno-0-305"></a> <span class="n">output_format</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
@@ -1958,30 +1977,39 @@ completed bars. Empty frames and single-row frames return empty results.</p>
<a id="__codelineno-0-314" name="__codelineno-0-314"></a><span class="sd"> table_name: Table name for SQLite3 output.</span>
<a id="__codelineno-0-315" name="__codelineno-0-315"></a>
<a id="__codelineno-0-316" name="__codelineno-0-316"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> ValueError: If the output format is not supported.</span>
<a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="k">if</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;csv&quot;</span><span class="p">:</span>
<a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;json&quot;</span><span class="p">:</span>
<a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_json</span><span class="p">(</span>
<a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="n">orient</span><span class="o">=</span><span class="s2">&quot;records&quot;</span><span class="p">,</span>
<a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="n">date_format</span><span class="o">=</span><span class="s2">&quot;iso&quot;</span><span class="p">,</span>
<a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<a id="__codelineno-0-327" name="__codelineno-0-327"></a> <span class="p">)</span>
<a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;parquet&quot;</span><span class="p">:</span>
<a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_parquet</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;sqlite3&quot;</span><span class="p">:</span>
<a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="n">export_dataframe_to_sqlite</span><span class="p">(</span>
<a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">df</span><span class="p">,</span>
<a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="n">table_name</span><span class="p">,</span>
<a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="n">if_exists</span><span class="o">=</span><span class="n">IfExists</span><span class="o">.</span><span class="n">REPLACE</span><span class="p">,</span>
<a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="p">)</span>
<a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Unsupported output format: </span><span class="si">{</span><span class="n">output_format</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> ImportError: If the parquet format is requested but pyarrow is not installed.</span>
<a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> ValueError: If the output format is not supported.</span>
<a id="__codelineno-0-319" name="__codelineno-0-319"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="k">if</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;csv&quot;</span><span class="p">:</span>
<a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;json&quot;</span><span class="p">:</span>
<a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_json</span><span class="p">(</span>
<a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="n">orient</span><span class="o">=</span><span class="s2">&quot;records&quot;</span><span class="p">,</span>
<a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">date_format</span><span class="o">=</span><span class="s2">&quot;iso&quot;</span><span class="p">,</span>
<a id="__codelineno-0-327" name="__codelineno-0-327"></a> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="p">)</span>
<a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;parquet&quot;</span><span class="p">:</span>
<a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="nb">__import__</span><span class="p">(</span><span class="s2">&quot;pyarrow&quot;</span><span class="p">)</span>
<a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="s2">&quot;Parquet export requires the optional dependency pyarrow. &quot;</span>
<a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="s1">&#39;Install it with: pip install &quot;mt5cli[parquet]&quot;&#39;</span>
<a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="p">)</span>
<a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="k">raise</span> <span class="ne">ImportError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">exc</span>
<a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_parquet</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;sqlite3&quot;</span><span class="p">:</span>
<a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="n">export_dataframe_to_sqlite</span><span class="p">(</span>
<a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="n">df</span><span class="p">,</span>
<a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="n">table_name</span><span class="p">,</span>
<a id="__codelineno-0-344" name="__codelineno-0-344"></a> <span class="n">if_exists</span><span class="o">=</span><span class="n">IfExists</span><span class="o">.</span><span class="n">REPLACE</span><span class="p">,</span>
<a id="__codelineno-0-345" name="__codelineno-0-345"></a> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<a id="__codelineno-0-346" name="__codelineno-0-346"></a> <span class="p">)</span>
<a id="__codelineno-0-347" name="__codelineno-0-347"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-348" name="__codelineno-0-348"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Unsupported output format: </span><span class="si">{</span><span class="n">output_format</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
+189 -161
View File
@@ -1227,6 +1227,16 @@
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="ImportError">ImportError</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the parquet format is requested but pyarrow is not installed.</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="ValueError">ValueError</span></code>
@@ -1281,7 +1291,16 @@
<span class="normal"><a href="#__codelineno-0-337">337</a></span>
<span class="normal"><a href="#__codelineno-0-338">338</a></span>
<span class="normal"><a href="#__codelineno-0-339">339</a></span>
<span class="normal"><a href="#__codelineno-0-340">340</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="k">def</span><span class="w"> </span><span class="nf">export_dataframe</span><span class="p">(</span>
<span class="normal"><a href="#__codelineno-0-340">340</a></span>
<span class="normal"><a href="#__codelineno-0-341">341</a></span>
<span class="normal"><a href="#__codelineno-0-342">342</a></span>
<span class="normal"><a href="#__codelineno-0-343">343</a></span>
<span class="normal"><a href="#__codelineno-0-344">344</a></span>
<span class="normal"><a href="#__codelineno-0-345">345</a></span>
<span class="normal"><a href="#__codelineno-0-346">346</a></span>
<span class="normal"><a href="#__codelineno-0-347">347</a></span>
<span class="normal"><a href="#__codelineno-0-348">348</a></span>
<span class="normal"><a href="#__codelineno-0-349">349</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="k">def</span><span class="w"> </span><span class="nf">export_dataframe</span><span class="p">(</span>
<a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="n">df</span><span class="p">:</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">,</span>
<a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="n">output_path</span><span class="p">:</span> <span class="n">Path</span><span class="p">,</span>
<a id="__codelineno-0-305" name="__codelineno-0-305"></a> <span class="n">output_format</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
@@ -1296,30 +1315,39 @@
<a id="__codelineno-0-314" name="__codelineno-0-314"></a><span class="sd"> table_name: Table name for SQLite3 output.</span>
<a id="__codelineno-0-315" name="__codelineno-0-315"></a>
<a id="__codelineno-0-316" name="__codelineno-0-316"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> ValueError: If the output format is not supported.</span>
<a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="k">if</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;csv&quot;</span><span class="p">:</span>
<a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;json&quot;</span><span class="p">:</span>
<a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_json</span><span class="p">(</span>
<a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="n">orient</span><span class="o">=</span><span class="s2">&quot;records&quot;</span><span class="p">,</span>
<a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="n">date_format</span><span class="o">=</span><span class="s2">&quot;iso&quot;</span><span class="p">,</span>
<a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<a id="__codelineno-0-327" name="__codelineno-0-327"></a> <span class="p">)</span>
<a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;parquet&quot;</span><span class="p">:</span>
<a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_parquet</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;sqlite3&quot;</span><span class="p">:</span>
<a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="n">export_dataframe_to_sqlite</span><span class="p">(</span>
<a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="n">df</span><span class="p">,</span>
<a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="n">table_name</span><span class="p">,</span>
<a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="n">if_exists</span><span class="o">=</span><span class="n">IfExists</span><span class="o">.</span><span class="n">REPLACE</span><span class="p">,</span>
<a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="p">)</span>
<a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Unsupported output format: </span><span class="si">{</span><span class="n">output_format</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="sd"> ImportError: If the parquet format is requested but pyarrow is not installed.</span>
<a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> ValueError: If the output format is not supported.</span>
<a id="__codelineno-0-319" name="__codelineno-0-319"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="k">if</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;csv&quot;</span><span class="p">:</span>
<a id="__codelineno-0-321" name="__codelineno-0-321"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_csv</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;json&quot;</span><span class="p">:</span>
<a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_json</span><span class="p">(</span>
<a id="__codelineno-0-324" name="__codelineno-0-324"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="n">orient</span><span class="o">=</span><span class="s2">&quot;records&quot;</span><span class="p">,</span>
<a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">date_format</span><span class="o">=</span><span class="s2">&quot;iso&quot;</span><span class="p">,</span>
<a id="__codelineno-0-327" name="__codelineno-0-327"></a> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<a id="__codelineno-0-328" name="__codelineno-0-328"></a> <span class="p">)</span>
<a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;parquet&quot;</span><span class="p">:</span>
<a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="nb">__import__</span><span class="p">(</span><span class="s2">&quot;pyarrow&quot;</span><span class="p">)</span>
<a id="__codelineno-0-332" name="__codelineno-0-332"></a> <span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-334" name="__codelineno-0-334"></a> <span class="s2">&quot;Parquet export requires the optional dependency pyarrow. &quot;</span>
<a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="s1">&#39;Install it with: pip install &quot;mt5cli[parquet]&quot;&#39;</span>
<a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="p">)</span>
<a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="k">raise</span> <span class="ne">ImportError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">exc</span>
<a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="n">df</span><span class="o">.</span><span class="n">to_parquet</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s2">&quot;sqlite3&quot;</span><span class="p">:</span>
<a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="n">export_dataframe_to_sqlite</span><span class="p">(</span>
<a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="n">df</span><span class="p">,</span>
<a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="n">output_path</span><span class="p">,</span>
<a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="n">table_name</span><span class="p">,</span>
<a id="__codelineno-0-344" name="__codelineno-0-344"></a> <span class="n">if_exists</span><span class="o">=</span><span class="n">IfExists</span><span class="o">.</span><span class="n">REPLACE</span><span class="p">,</span>
<a id="__codelineno-0-345" name="__codelineno-0-345"></a> <span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<a id="__codelineno-0-346" name="__codelineno-0-346"></a> <span class="p">)</span>
<a id="__codelineno-0-347" name="__codelineno-0-347"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-348" name="__codelineno-0-348"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Unsupported output format: </span><span class="si">{</span><span class="n">output_format</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-349" name="__codelineno-0-349"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1680,16 +1708,7 @@ columns when appending frequently.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-343">343</a></span>
<span class="normal"><a href="#__codelineno-0-344">344</a></span>
<span class="normal"><a href="#__codelineno-0-345">345</a></span>
<span class="normal"><a href="#__codelineno-0-346">346</a></span>
<span class="normal"><a href="#__codelineno-0-347">347</a></span>
<span class="normal"><a href="#__codelineno-0-348">348</a></span>
<span class="normal"><a href="#__codelineno-0-349">349</a></span>
<span class="normal"><a href="#__codelineno-0-350">350</a></span>
<span class="normal"><a href="#__codelineno-0-351">351</a></span>
<span class="normal"><a href="#__codelineno-0-352">352</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-352">352</a></span>
<span class="normal"><a href="#__codelineno-0-353">353</a></span>
<span class="normal"><a href="#__codelineno-0-354">354</a></span>
<span class="normal"><a href="#__codelineno-0-355">355</a></span>
@@ -1700,27 +1719,36 @@ columns when appending frequently.</p>
<span class="normal"><a href="#__codelineno-0-360">360</a></span>
<span class="normal"><a href="#__codelineno-0-361">361</a></span>
<span class="normal"><a href="#__codelineno-0-362">362</a></span>
<span class="normal"><a href="#__codelineno-0-363">363</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-343" name="__codelineno-0-343"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_datetime</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">datetime</span><span class="p">:</span>
<a id="__codelineno-0-344" name="__codelineno-0-344"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse an ISO 8601 datetime string to a timezone-aware datetime.</span>
<a id="__codelineno-0-345" name="__codelineno-0-345"></a>
<a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="sd"> value: ISO 8601 datetime string (e.g., &#39;2024-01-01&#39; or</span>
<a id="__codelineno-0-348" name="__codelineno-0-348"></a><span class="sd"> &#39;2024-01-01T12:00:00+00:00&#39;).</span>
<a id="__codelineno-0-349" name="__codelineno-0-349"></a>
<a id="__codelineno-0-350" name="__codelineno-0-350"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-351" name="__codelineno-0-351"></a><span class="sd"> Parsed datetime with UTC timezone if no timezone is specified.</span>
<a id="__codelineno-0-352" name="__codelineno-0-352"></a>
<a id="__codelineno-0-353" name="__codelineno-0-353"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-354" name="__codelineno-0-354"></a><span class="sd"> ValueError: If the string cannot be parsed.</span>
<a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-356" name="__codelineno-0-356"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-357" name="__codelineno-0-357"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-358" name="__codelineno-0-358"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-359" name="__codelineno-0-359"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid datetime format: &#39;</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">&#39;. Use ISO 8601 format.&quot;</span>
<a id="__codelineno-0-360" name="__codelineno-0-360"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<a id="__codelineno-0-361" name="__codelineno-0-361"></a> <span class="k">if</span> <span class="n">dt</span><span class="o">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-362" name="__codelineno-0-362"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">)</span>
<a id="__codelineno-0-363" name="__codelineno-0-363"></a> <span class="k">return</span> <span class="n">dt</span>
<span class="normal"><a href="#__codelineno-0-363">363</a></span>
<span class="normal"><a href="#__codelineno-0-364">364</a></span>
<span class="normal"><a href="#__codelineno-0-365">365</a></span>
<span class="normal"><a href="#__codelineno-0-366">366</a></span>
<span class="normal"><a href="#__codelineno-0-367">367</a></span>
<span class="normal"><a href="#__codelineno-0-368">368</a></span>
<span class="normal"><a href="#__codelineno-0-369">369</a></span>
<span class="normal"><a href="#__codelineno-0-370">370</a></span>
<span class="normal"><a href="#__codelineno-0-371">371</a></span>
<span class="normal"><a href="#__codelineno-0-372">372</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-352" name="__codelineno-0-352"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_datetime</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">datetime</span><span class="p">:</span>
<a id="__codelineno-0-353" name="__codelineno-0-353"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse an ISO 8601 datetime string to a timezone-aware datetime.</span>
<a id="__codelineno-0-354" name="__codelineno-0-354"></a>
<a id="__codelineno-0-355" name="__codelineno-0-355"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-356" name="__codelineno-0-356"></a><span class="sd"> value: ISO 8601 datetime string (e.g., &#39;2024-01-01&#39; or</span>
<a id="__codelineno-0-357" name="__codelineno-0-357"></a><span class="sd"> &#39;2024-01-01T12:00:00+00:00&#39;).</span>
<a id="__codelineno-0-358" name="__codelineno-0-358"></a>
<a id="__codelineno-0-359" name="__codelineno-0-359"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-360" name="__codelineno-0-360"></a><span class="sd"> Parsed datetime with UTC timezone if no timezone is specified.</span>
<a id="__codelineno-0-361" name="__codelineno-0-361"></a>
<a id="__codelineno-0-362" name="__codelineno-0-362"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-363" name="__codelineno-0-363"></a><span class="sd"> ValueError: If the string cannot be parsed.</span>
<a id="__codelineno-0-364" name="__codelineno-0-364"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-365" name="__codelineno-0-365"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-366" name="__codelineno-0-366"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-367" name="__codelineno-0-367"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-368" name="__codelineno-0-368"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid datetime format: &#39;</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">&#39;. Use ISO 8601 format.&quot;</span>
<a id="__codelineno-0-369" name="__codelineno-0-369"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<a id="__codelineno-0-370" name="__codelineno-0-370"></a> <span class="k">if</span> <span class="n">dt</span><span class="o">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-371" name="__codelineno-0-371"></a> <span class="n">dt</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">)</span>
<a id="__codelineno-0-372" name="__codelineno-0-372"></a> <span class="k">return</span> <span class="n">dt</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1823,16 +1851,7 @@ JSON object.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-418">418</a></span>
<span class="normal"><a href="#__codelineno-0-419">419</a></span>
<span class="normal"><a href="#__codelineno-0-420">420</a></span>
<span class="normal"><a href="#__codelineno-0-421">421</a></span>
<span class="normal"><a href="#__codelineno-0-422">422</a></span>
<span class="normal"><a href="#__codelineno-0-423">423</a></span>
<span class="normal"><a href="#__codelineno-0-424">424</a></span>
<span class="normal"><a href="#__codelineno-0-425">425</a></span>
<span class="normal"><a href="#__codelineno-0-426">426</a></span>
<span class="normal"><a href="#__codelineno-0-427">427</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-427">427</a></span>
<span class="normal"><a href="#__codelineno-0-428">428</a></span>
<span class="normal"><a href="#__codelineno-0-429">429</a></span>
<span class="normal"><a href="#__codelineno-0-430">430</a></span>
@@ -1853,37 +1872,46 @@ JSON object.</p>
<span class="normal"><a href="#__codelineno-0-445">445</a></span>
<span class="normal"><a href="#__codelineno-0-446">446</a></span>
<span class="normal"><a href="#__codelineno-0-447">447</a></span>
<span class="normal"><a href="#__codelineno-0-448">448</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-418" name="__codelineno-0-418"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_request</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><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="n">Any</span><span class="p">]:</span>
<a id="__codelineno-0-419" name="__codelineno-0-419"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse a JSON-formatted order request string or file reference.</span>
<a id="__codelineno-0-420" name="__codelineno-0-420"></a>
<a id="__codelineno-0-421" name="__codelineno-0-421"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-422" name="__codelineno-0-422"></a><span class="sd"> value: JSON object string, or &#39;@path&#39; to read JSON from a file.</span>
<a id="__codelineno-0-423" name="__codelineno-0-423"></a>
<a id="__codelineno-0-424" name="__codelineno-0-424"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-425" name="__codelineno-0-425"></a><span class="sd"> Parsed request dictionary.</span>
<a id="__codelineno-0-426" name="__codelineno-0-426"></a>
<a id="__codelineno-0-427" name="__codelineno-0-427"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-428" name="__codelineno-0-428"></a><span class="sd"> ValueError: If the request file cannot be read or the value is not a</span>
<a id="__codelineno-0-429" name="__codelineno-0-429"></a><span class="sd"> JSON object.</span>
<a id="__codelineno-0-430" name="__codelineno-0-430"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-431" name="__codelineno-0-431"></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;@&quot;</span><span class="p">):</span>
<a id="__codelineno-0-432" name="__codelineno-0-432"></a> <span class="n">path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<a id="__codelineno-0-433" name="__codelineno-0-433"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-434" name="__codelineno-0-434"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">read_text</span><span class="p">(</span><span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span>
<a id="__codelineno-0-435" name="__codelineno-0-435"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">OSError</span><span class="p">,</span> <span class="ne">UnicodeDecodeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-0-436" name="__codelineno-0-436"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Failed to read JSON request file &#39;</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&#39;: </span><span class="si">{</span><span class="n">exc</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-437" name="__codelineno-0-437"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">exc</span>
<a id="__codelineno-0-438" name="__codelineno-0-438"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-439" name="__codelineno-0-439"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">value</span>
<a id="__codelineno-0-440" name="__codelineno-0-440"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-441" name="__codelineno-0-441"></a> <span class="n">parsed</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<a id="__codelineno-0-442" name="__codelineno-0-442"></a> <span class="k">except</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-0-443" name="__codelineno-0-443"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid JSON request: </span><span class="si">{</span><span class="n">exc</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-444" name="__codelineno-0-444"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">exc</span>
<a id="__codelineno-0-445" name="__codelineno-0-445"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">_is_request_dict</span><span class="p">(</span><span class="n">parsed</span><span class="p">):</span>
<a id="__codelineno-0-446" name="__codelineno-0-446"></a> <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Order request must be a JSON object.&quot;</span>
<a id="__codelineno-0-447" name="__codelineno-0-447"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<a id="__codelineno-0-448" name="__codelineno-0-448"></a> <span class="k">return</span> <span class="n">parsed</span>
<span class="normal"><a href="#__codelineno-0-448">448</a></span>
<span class="normal"><a href="#__codelineno-0-449">449</a></span>
<span class="normal"><a href="#__codelineno-0-450">450</a></span>
<span class="normal"><a href="#__codelineno-0-451">451</a></span>
<span class="normal"><a href="#__codelineno-0-452">452</a></span>
<span class="normal"><a href="#__codelineno-0-453">453</a></span>
<span class="normal"><a href="#__codelineno-0-454">454</a></span>
<span class="normal"><a href="#__codelineno-0-455">455</a></span>
<span class="normal"><a href="#__codelineno-0-456">456</a></span>
<span class="normal"><a href="#__codelineno-0-457">457</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-427" name="__codelineno-0-427"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_request</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><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="n">Any</span><span class="p">]:</span>
<a id="__codelineno-0-428" name="__codelineno-0-428"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse a JSON-formatted order request string or file reference.</span>
<a id="__codelineno-0-429" name="__codelineno-0-429"></a>
<a id="__codelineno-0-430" name="__codelineno-0-430"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-431" name="__codelineno-0-431"></a><span class="sd"> value: JSON object string, or &#39;@path&#39; to read JSON from a file.</span>
<a id="__codelineno-0-432" name="__codelineno-0-432"></a>
<a id="__codelineno-0-433" name="__codelineno-0-433"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-434" name="__codelineno-0-434"></a><span class="sd"> Parsed request dictionary.</span>
<a id="__codelineno-0-435" name="__codelineno-0-435"></a>
<a id="__codelineno-0-436" name="__codelineno-0-436"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-437" name="__codelineno-0-437"></a><span class="sd"> ValueError: If the request file cannot be read or the value is not a</span>
<a id="__codelineno-0-438" name="__codelineno-0-438"></a><span class="sd"> JSON object.</span>
<a id="__codelineno-0-439" name="__codelineno-0-439"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-440" name="__codelineno-0-440"></a> <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;@&quot;</span><span class="p">):</span>
<a id="__codelineno-0-441" name="__codelineno-0-441"></a> <span class="n">path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<a id="__codelineno-0-442" name="__codelineno-0-442"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-443" name="__codelineno-0-443"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">read_text</span><span class="p">(</span><span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span>
<a id="__codelineno-0-444" name="__codelineno-0-444"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">OSError</span><span class="p">,</span> <span class="ne">UnicodeDecodeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-0-445" name="__codelineno-0-445"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Failed to read JSON request file &#39;</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&#39;: </span><span class="si">{</span><span class="n">exc</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-446" name="__codelineno-0-446"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">exc</span>
<a id="__codelineno-0-447" name="__codelineno-0-447"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-448" name="__codelineno-0-448"></a> <span class="n">text</span> <span class="o">=</span> <span class="n">value</span>
<a id="__codelineno-0-449" name="__codelineno-0-449"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-450" name="__codelineno-0-450"></a> <span class="n">parsed</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<a id="__codelineno-0-451" name="__codelineno-0-451"></a> <span class="k">except</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-0-452" name="__codelineno-0-452"></a> <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid JSON request: </span><span class="si">{</span><span class="n">exc</span><span class="si">}</span><span class="s2">&quot;</span>
<a id="__codelineno-0-453" name="__codelineno-0-453"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">exc</span>
<a id="__codelineno-0-454" name="__codelineno-0-454"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">_is_request_dict</span><span class="p">(</span><span class="n">parsed</span><span class="p">):</span>
<a id="__codelineno-0-455" name="__codelineno-0-455"></a> <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Order request must be a JSON object.&quot;</span>
<a id="__codelineno-0-456" name="__codelineno-0-456"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<a id="__codelineno-0-457" name="__codelineno-0-457"></a> <span class="k">return</span> <span class="n">parsed</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1985,16 +2013,7 @@ JSON object.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-390">390</a></span>
<span class="normal"><a href="#__codelineno-0-391">391</a></span>
<span class="normal"><a href="#__codelineno-0-392">392</a></span>
<span class="normal"><a href="#__codelineno-0-393">393</a></span>
<span class="normal"><a href="#__codelineno-0-394">394</a></span>
<span class="normal"><a href="#__codelineno-0-395">395</a></span>
<span class="normal"><a href="#__codelineno-0-396">396</a></span>
<span class="normal"><a href="#__codelineno-0-397">397</a></span>
<span class="normal"><a href="#__codelineno-0-398">398</a></span>
<span class="normal"><a href="#__codelineno-0-399">399</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-399">399</a></span>
<span class="normal"><a href="#__codelineno-0-400">400</a></span>
<span class="normal"><a href="#__codelineno-0-401">401</a></span>
<span class="normal"><a href="#__codelineno-0-402">402</a></span>
@@ -2006,28 +2025,37 @@ JSON object.</p>
<span class="normal"><a href="#__codelineno-0-408">408</a></span>
<span class="normal"><a href="#__codelineno-0-409">409</a></span>
<span class="normal"><a href="#__codelineno-0-410">410</a></span>
<span class="normal"><a href="#__codelineno-0-411">411</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-390" name="__codelineno-0-390"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_tick_flags</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-391" name="__codelineno-0-391"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse tick flags string or integer value.</span>
<a id="__codelineno-0-392" name="__codelineno-0-392"></a>
<a id="__codelineno-0-393" name="__codelineno-0-393"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-394" name="__codelineno-0-394"></a><span class="sd"> value: Tick flag name (ALL, INFO, TRADE, COPY_TICKS_*) or integer value.</span>
<a id="__codelineno-0-395" name="__codelineno-0-395"></a>
<a id="__codelineno-0-396" name="__codelineno-0-396"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-397" name="__codelineno-0-397"></a><span class="sd"> Integer tick flag value compatible with MetaTrader 5 ``COPY_TICKS_*``.</span>
<a id="__codelineno-0-398" name="__codelineno-0-398"></a>
<a id="__codelineno-0-399" name="__codelineno-0-399"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-400" name="__codelineno-0-400"></a><span class="sd"> ValueError: If the flag is invalid.</span>
<a id="__codelineno-0-401" name="__codelineno-0-401"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-402" name="__codelineno-0-402"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-403" name="__codelineno-0-403"></a> <span class="k">return</span> <span class="n">_parse_copy_ticks</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-404" name="__codelineno-0-404"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-405" name="__codelineno-0-405"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-406" name="__codelineno-0-406"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_TICK_FLAG_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-407" name="__codelineno-0-407"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-408" name="__codelineno-0-408"></a> <span class="sa">f</span><span class="s2">&quot;Invalid tick flags: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-409" name="__codelineno-0-409"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-410" name="__codelineno-0-410"></a> <span class="p">)</span>
<a id="__codelineno-0-411" name="__codelineno-0-411"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<span class="normal"><a href="#__codelineno-0-411">411</a></span>
<span class="normal"><a href="#__codelineno-0-412">412</a></span>
<span class="normal"><a href="#__codelineno-0-413">413</a></span>
<span class="normal"><a href="#__codelineno-0-414">414</a></span>
<span class="normal"><a href="#__codelineno-0-415">415</a></span>
<span class="normal"><a href="#__codelineno-0-416">416</a></span>
<span class="normal"><a href="#__codelineno-0-417">417</a></span>
<span class="normal"><a href="#__codelineno-0-418">418</a></span>
<span class="normal"><a href="#__codelineno-0-419">419</a></span>
<span class="normal"><a href="#__codelineno-0-420">420</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-399" name="__codelineno-0-399"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_tick_flags</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-400" name="__codelineno-0-400"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse tick flags string or integer value.</span>
<a id="__codelineno-0-401" name="__codelineno-0-401"></a>
<a id="__codelineno-0-402" name="__codelineno-0-402"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-403" name="__codelineno-0-403"></a><span class="sd"> value: Tick flag name (ALL, INFO, TRADE, COPY_TICKS_*) or integer value.</span>
<a id="__codelineno-0-404" name="__codelineno-0-404"></a>
<a id="__codelineno-0-405" name="__codelineno-0-405"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-406" name="__codelineno-0-406"></a><span class="sd"> Integer tick flag value compatible with MetaTrader 5 ``COPY_TICKS_*``.</span>
<a id="__codelineno-0-407" name="__codelineno-0-407"></a>
<a id="__codelineno-0-408" name="__codelineno-0-408"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-409" name="__codelineno-0-409"></a><span class="sd"> ValueError: If the flag is invalid.</span>
<a id="__codelineno-0-410" name="__codelineno-0-410"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-411" name="__codelineno-0-411"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-412" name="__codelineno-0-412"></a> <span class="k">return</span> <span class="n">_parse_copy_ticks</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-413" name="__codelineno-0-413"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-414" name="__codelineno-0-414"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-415" name="__codelineno-0-415"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_TICK_FLAG_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-416" name="__codelineno-0-416"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-417" name="__codelineno-0-417"></a> <span class="sa">f</span><span class="s2">&quot;Invalid tick flags: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-418" name="__codelineno-0-418"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-419" name="__codelineno-0-419"></a> <span class="p">)</span>
<a id="__codelineno-0-420" name="__codelineno-0-420"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -2129,16 +2157,7 @@ JSON object.</p>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/utils.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-366">366</a></span>
<span class="normal"><a href="#__codelineno-0-367">367</a></span>
<span class="normal"><a href="#__codelineno-0-368">368</a></span>
<span class="normal"><a href="#__codelineno-0-369">369</a></span>
<span class="normal"><a href="#__codelineno-0-370">370</a></span>
<span class="normal"><a href="#__codelineno-0-371">371</a></span>
<span class="normal"><a href="#__codelineno-0-372">372</a></span>
<span class="normal"><a href="#__codelineno-0-373">373</a></span>
<span class="normal"><a href="#__codelineno-0-374">374</a></span>
<span class="normal"><a href="#__codelineno-0-375">375</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-375">375</a></span>
<span class="normal"><a href="#__codelineno-0-376">376</a></span>
<span class="normal"><a href="#__codelineno-0-377">377</a></span>
<span class="normal"><a href="#__codelineno-0-378">378</a></span>
@@ -2150,28 +2169,37 @@ JSON object.</p>
<span class="normal"><a href="#__codelineno-0-384">384</a></span>
<span class="normal"><a href="#__codelineno-0-385">385</a></span>
<span class="normal"><a href="#__codelineno-0-386">386</a></span>
<span class="normal"><a href="#__codelineno-0-387">387</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-366" name="__codelineno-0-366"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-367" name="__codelineno-0-367"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse a timeframe string or integer value.</span>
<a id="__codelineno-0-368" name="__codelineno-0-368"></a>
<a id="__codelineno-0-369" name="__codelineno-0-369"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-370" name="__codelineno-0-370"></a><span class="sd"> value: Timeframe name (e.g., &#39;M1&#39;, &#39;H1&#39;, &#39;D1&#39;) or integer value.</span>
<a id="__codelineno-0-371" name="__codelineno-0-371"></a>
<a id="__codelineno-0-372" name="__codelineno-0-372"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-373" name="__codelineno-0-373"></a><span class="sd"> Integer timeframe value.</span>
<a id="__codelineno-0-374" name="__codelineno-0-374"></a>
<a id="__codelineno-0-375" name="__codelineno-0-375"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-376" name="__codelineno-0-376"></a><span class="sd"> ValueError: If the timeframe is invalid.</span>
<a id="__codelineno-0-377" name="__codelineno-0-377"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="k">return</span> <span class="n">_parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TIMEFRAME_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-383" name="__codelineno-0-383"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-384" name="__codelineno-0-384"></a> <span class="sa">f</span><span class="s2">&quot;Invalid timeframe: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-385" name="__codelineno-0-385"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-386" name="__codelineno-0-386"></a> <span class="p">)</span>
<a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<span class="normal"><a href="#__codelineno-0-387">387</a></span>
<span class="normal"><a href="#__codelineno-0-388">388</a></span>
<span class="normal"><a href="#__codelineno-0-389">389</a></span>
<span class="normal"><a href="#__codelineno-0-390">390</a></span>
<span class="normal"><a href="#__codelineno-0-391">391</a></span>
<span class="normal"><a href="#__codelineno-0-392">392</a></span>
<span class="normal"><a href="#__codelineno-0-393">393</a></span>
<span class="normal"><a href="#__codelineno-0-394">394</a></span>
<span class="normal"><a href="#__codelineno-0-395">395</a></span>
<span class="normal"><a href="#__codelineno-0-396">396</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-375" name="__codelineno-0-375"></a><span class="k">def</span><span class="w"> </span><span class="nf">parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a id="__codelineno-0-376" name="__codelineno-0-376"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Parse a timeframe string or integer value.</span>
<a id="__codelineno-0-377" name="__codelineno-0-377"></a>
<a id="__codelineno-0-378" name="__codelineno-0-378"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-379" name="__codelineno-0-379"></a><span class="sd"> value: Timeframe name (e.g., &#39;M1&#39;, &#39;H1&#39;, &#39;D1&#39;) or integer value.</span>
<a id="__codelineno-0-380" name="__codelineno-0-380"></a>
<a id="__codelineno-0-381" name="__codelineno-0-381"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-382" name="__codelineno-0-382"></a><span class="sd"> Integer timeframe value.</span>
<a id="__codelineno-0-383" name="__codelineno-0-383"></a>
<a id="__codelineno-0-384" name="__codelineno-0-384"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-385" name="__codelineno-0-385"></a><span class="sd"> ValueError: If the timeframe is invalid.</span>
<a id="__codelineno-0-386" name="__codelineno-0-386"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-387" name="__codelineno-0-387"></a> <span class="k">try</span><span class="p">:</span>
<a id="__codelineno-0-388" name="__codelineno-0-388"></a> <span class="k">return</span> <span class="n">_parse_timeframe</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-389" name="__codelineno-0-389"></a> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<a id="__codelineno-0-390" name="__codelineno-0-390"></a> <span class="n">display</span> <span class="o">=</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<a id="__codelineno-0-391" name="__codelineno-0-391"></a> <span class="n">valid</span> <span class="o">=</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TIMEFRAME_NAMES</span><span class="p">)</span>
<a id="__codelineno-0-392" name="__codelineno-0-392"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-393" name="__codelineno-0-393"></a> <span class="sa">f</span><span class="s2">&quot;Invalid timeframe: &#39;</span><span class="si">{</span><span class="n">display</span><span class="si">}</span><span class="s2">&#39;. &quot;</span>
<a id="__codelineno-0-394" name="__codelineno-0-394"></a> <span class="sa">f</span><span class="s2">&quot;Use one of: </span><span class="si">{</span><span class="n">valid</span><span class="si">}</span><span class="s2">, or a supported integer.&quot;</span>
<a id="__codelineno-0-395" name="__codelineno-0-395"></a> <span class="p">)</span>
<a id="__codelineno-0-396" name="__codelineno-0-396"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
+76 -73
View File
@@ -210,80 +210,83 @@
<h2 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>pip<span class="w"> </span>install<span class="w"> </span>mt5cli
</code></pre></div>
<p>Parquet export is not included by default. To enable it, install the <code>parquet</code> extra:</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">&quot;mt5cli[parquet]&quot;</span>
</code></pre></div>
<h2 id="python-api-for-downstream-packages">Python API for downstream packages<a class="headerlink" href="#python-api-for-downstream-packages" title="Permanent link">&para;</a></h2>
<p>Import <code>MT5Client</code> for generic MT5 data access, schema normalization, and optional order primitives.</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">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">UTC</span><span class="p">,</span> <span class="n">datetime</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></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-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="n">DataKind</span><span class="p">,</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="n">Dataset</span><span class="p">,</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="n">MT5Client</span><span class="p">,</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="n">build_config</span><span class="p">,</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a> <span class="n">collect_history</span><span class="p">,</span>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a> <span class="n">export_dataframe</span><span class="p">,</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a> <span class="n">load_rate_data</span><span class="p">,</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a> <span class="n">minimum_margins</span><span class="p">,</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a> <span class="n">mt5_session</span><span class="p">,</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a> <span class="n">normalize_dataframe</span><span class="p">,</span>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a> <span class="n">recent_ticks</span><span class="p">,</span>
<a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a> <span class="n">resolve_rate_view_name</span><span class="p">,</span>
<a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="p">)</span>
<a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a>
<a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a><span class="c1"># Persistent session for multiple calls</span>
<a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="k">with</span> <span class="n">mt5_session</span><span class="p">(</span><span class="n">build_config</span><span class="p">(</span><span class="n">login</span><span class="o">=</span><span class="mi">12345</span><span class="p">,</span> <span class="n">server</span><span class="o">=</span><span class="s2">&quot;Broker-Demo&quot;</span><span class="p">))</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
<a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a> <span class="n">rates</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">copy_rates_range</span><span class="p">(</span>
<a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span>
<a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a> <span class="n">timeframe</span><span class="o">=</span><span class="s2">&quot;H1&quot;</span><span class="p">,</span>
<a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a> <span class="n">date_from</span><span class="o">=</span><span class="s2">&quot;2024-01-01&quot;</span><span class="p">,</span>
<a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a> <span class="n">date_to</span><span class="o">=</span><span class="s2">&quot;2024-02-01&quot;</span><span class="p">,</span>
<a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a> <span class="p">)</span>
<a id="__codelineno-1-27" name="__codelineno-1-27" href="#__codelineno-1-27"></a> <span class="n">positions</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">positions</span><span class="p">()</span>
<a id="__codelineno-1-28" name="__codelineno-1-28" href="#__codelineno-1-28"></a> <span class="n">check</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">order_check</span><span class="p">({</span><span class="s2">&quot;action&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;symbol&quot;</span><span class="p">:</span> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="s2">&quot;volume&quot;</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">})</span>
<a id="__codelineno-1-29" name="__codelineno-1-29" href="#__codelineno-1-29"></a>
<a id="__codelineno-1-30" name="__codelineno-1-30" href="#__codelineno-1-30"></a><span class="c1"># Normalize MT5 frames to the public schema contract before storage</span>
<a id="__codelineno-1-31" name="__codelineno-1-31" href="#__codelineno-1-31"></a><span class="n">closed_rates</span> <span class="o">=</span> <span class="n">normalize_dataframe</span><span class="p">(</span>
<a id="__codelineno-1-32" name="__codelineno-1-32" href="#__codelineno-1-32"></a> <span class="n">rates</span><span class="p">,</span> <span class="n">DataKind</span><span class="o">.</span><span class="n">rates</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> <span class="n">timeframe</span><span class="o">=</span><span class="s2">&quot;H1&quot;</span>
<a id="__codelineno-1-33" name="__codelineno-1-33" href="#__codelineno-1-33"></a><span class="p">)</span>
<a id="__codelineno-1-34" name="__codelineno-1-34" href="#__codelineno-1-34"></a><span class="n">export_dataframe</span><span class="p">(</span><span class="n">closed_rates</span><span class="p">,</span> <span class="n">Path</span><span class="p">(</span><span class="s2">&quot;rates.csv&quot;</span><span class="p">),</span> <span class="s2">&quot;csv&quot;</span><span class="p">)</span>
<a id="__codelineno-1-35" name="__codelineno-1-35" href="#__codelineno-1-35"></a>
<a id="__codelineno-1-36" name="__codelineno-1-36" href="#__codelineno-1-36"></a><span class="c1"># Offline rate loading from mt5cli-managed SQLite history</span>
<a id="__codelineno-1-37" name="__codelineno-1-37" href="#__codelineno-1-37"></a><span class="n">view</span> <span class="o">=</span> <span class="n">resolve_rate_view_name</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="s2">&quot;history.db&quot;</span><span class="p">),</span> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="s2">&quot;M1&quot;</span><span class="p">,</span> <span class="n">require_existing</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<a id="__codelineno-1-38" name="__codelineno-1-38" href="#__codelineno-1-38"></a><span class="n">offline_rates</span> <span class="o">=</span> <span class="n">load_rate_data</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="s2">&quot;history.db&quot;</span><span class="p">),</span> <span class="n">view</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<a id="__codelineno-1-39" name="__codelineno-1-39" href="#__codelineno-1-39"></a>
<a id="__codelineno-1-40" name="__codelineno-1-40" href="#__codelineno-1-40"></a><span class="c1"># One-off helpers still work without instantiating a client</span>
<a id="__codelineno-1-41" name="__codelineno-1-41" href="#__codelineno-1-41"></a><span class="n">ticks</span> <span class="o">=</span> <span class="n">recent_ticks</span><span class="p">(</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span>
<a id="__codelineno-1-42" name="__codelineno-1-42" href="#__codelineno-1-42"></a><span class="n">margins</span> <span class="o">=</span> <span class="n">minimum_margins</span><span class="p">(</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">)</span>
<a id="__codelineno-1-43" name="__codelineno-1-43" href="#__codelineno-1-43"></a>
<a id="__codelineno-1-44" name="__codelineno-1-44" href="#__codelineno-1-44"></a><span class="n">collect_history</span><span class="p">(</span>
<a id="__codelineno-1-45" name="__codelineno-1-45" href="#__codelineno-1-45"></a> <span class="n">Path</span><span class="p">(</span><span class="s2">&quot;history.db&quot;</span><span class="p">),</span>
<a id="__codelineno-1-46" name="__codelineno-1-46" href="#__codelineno-1-46"></a> <span class="n">symbols</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="s2">&quot;GBPUSD&quot;</span><span class="p">],</span>
<a id="__codelineno-1-47" name="__codelineno-1-47" href="#__codelineno-1-47"></a> <span class="n">date_from</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2024</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">),</span>
<a id="__codelineno-1-48" name="__codelineno-1-48" href="#__codelineno-1-48"></a> <span class="n">date_to</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2024</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">),</span>
<a id="__codelineno-1-49" name="__codelineno-1-49" href="#__codelineno-1-49"></a> <span class="n">datasets</span><span class="o">=</span><span class="p">{</span><span class="n">Dataset</span><span class="o">.</span><span class="n">rates</span><span class="p">,</span> <span class="n">Dataset</span><span class="o">.</span><span class="n">history_deals</span><span class="p">},</span>
<a id="__codelineno-1-50" name="__codelineno-1-50" href="#__codelineno-1-50"></a><span class="p">)</span>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">UTC</span><span class="p">,</span> <span class="n">datetime</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></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-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="n">DataKind</span><span class="p">,</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="n">Dataset</span><span class="p">,</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="n">MT5Client</span><span class="p">,</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="n">build_config</span><span class="p">,</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> <span class="n">collect_history</span><span class="p">,</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> <span class="n">export_dataframe</span><span class="p">,</span>
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> <span class="n">load_rate_data</span><span class="p">,</span>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> <span class="n">minimum_margins</span><span class="p">,</span>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> <span class="n">mt5_session</span><span class="p">,</span>
<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a> <span class="n">normalize_dataframe</span><span class="p">,</span>
<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a> <span class="n">recent_ticks</span><span class="p">,</span>
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a> <span class="n">resolve_rate_view_name</span><span class="p">,</span>
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a><span class="p">)</span>
<a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a>
<a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a><span class="c1"># Persistent session for multiple calls</span>
<a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a><span class="k">with</span> <span class="n">mt5_session</span><span class="p">(</span><span class="n">build_config</span><span class="p">(</span><span class="n">login</span><span class="o">=</span><span class="mi">12345</span><span class="p">,</span> <span class="n">server</span><span class="o">=</span><span class="s2">&quot;Broker-Demo&quot;</span><span class="p">))</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
<a id="__codelineno-2-21" name="__codelineno-2-21" href="#__codelineno-2-21"></a> <span class="n">rates</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">copy_rates_range</span><span class="p">(</span>
<a id="__codelineno-2-22" name="__codelineno-2-22" href="#__codelineno-2-22"></a> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span>
<a id="__codelineno-2-23" name="__codelineno-2-23" href="#__codelineno-2-23"></a> <span class="n">timeframe</span><span class="o">=</span><span class="s2">&quot;H1&quot;</span><span class="p">,</span>
<a id="__codelineno-2-24" name="__codelineno-2-24" href="#__codelineno-2-24"></a> <span class="n">date_from</span><span class="o">=</span><span class="s2">&quot;2024-01-01&quot;</span><span class="p">,</span>
<a id="__codelineno-2-25" name="__codelineno-2-25" href="#__codelineno-2-25"></a> <span class="n">date_to</span><span class="o">=</span><span class="s2">&quot;2024-02-01&quot;</span><span class="p">,</span>
<a id="__codelineno-2-26" name="__codelineno-2-26" href="#__codelineno-2-26"></a> <span class="p">)</span>
<a id="__codelineno-2-27" name="__codelineno-2-27" href="#__codelineno-2-27"></a> <span class="n">positions</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">positions</span><span class="p">()</span>
<a id="__codelineno-2-28" name="__codelineno-2-28" href="#__codelineno-2-28"></a> <span class="n">check</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">order_check</span><span class="p">({</span><span class="s2">&quot;action&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;symbol&quot;</span><span class="p">:</span> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="s2">&quot;volume&quot;</span><span class="p">:</span> <span class="mf">0.1</span><span class="p">})</span>
<a id="__codelineno-2-29" name="__codelineno-2-29" href="#__codelineno-2-29"></a>
<a id="__codelineno-2-30" name="__codelineno-2-30" href="#__codelineno-2-30"></a><span class="c1"># Normalize MT5 frames to the public schema contract before storage</span>
<a id="__codelineno-2-31" name="__codelineno-2-31" href="#__codelineno-2-31"></a><span class="n">closed_rates</span> <span class="o">=</span> <span class="n">normalize_dataframe</span><span class="p">(</span>
<a id="__codelineno-2-32" name="__codelineno-2-32" href="#__codelineno-2-32"></a> <span class="n">rates</span><span class="p">,</span> <span class="n">DataKind</span><span class="o">.</span><span class="n">rates</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> <span class="n">timeframe</span><span class="o">=</span><span class="s2">&quot;H1&quot;</span>
<a id="__codelineno-2-33" name="__codelineno-2-33" href="#__codelineno-2-33"></a><span class="p">)</span>
<a id="__codelineno-2-34" name="__codelineno-2-34" href="#__codelineno-2-34"></a><span class="n">export_dataframe</span><span class="p">(</span><span class="n">closed_rates</span><span class="p">,</span> <span class="n">Path</span><span class="p">(</span><span class="s2">&quot;rates.csv&quot;</span><span class="p">),</span> <span class="s2">&quot;csv&quot;</span><span class="p">)</span>
<a id="__codelineno-2-35" name="__codelineno-2-35" href="#__codelineno-2-35"></a>
<a id="__codelineno-2-36" name="__codelineno-2-36" href="#__codelineno-2-36"></a><span class="c1"># Offline rate loading from mt5cli-managed SQLite history</span>
<a id="__codelineno-2-37" name="__codelineno-2-37" href="#__codelineno-2-37"></a><span class="n">view</span> <span class="o">=</span> <span class="n">resolve_rate_view_name</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="s2">&quot;history.db&quot;</span><span class="p">),</span> <span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="s2">&quot;M1&quot;</span><span class="p">,</span> <span class="n">require_existing</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<a id="__codelineno-2-38" name="__codelineno-2-38" href="#__codelineno-2-38"></a><span class="n">offline_rates</span> <span class="o">=</span> <span class="n">load_rate_data</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="s2">&quot;history.db&quot;</span><span class="p">),</span> <span class="n">view</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<a id="__codelineno-2-39" name="__codelineno-2-39" href="#__codelineno-2-39"></a>
<a id="__codelineno-2-40" name="__codelineno-2-40" href="#__codelineno-2-40"></a><span class="c1"># One-off helpers still work without instantiating a client</span>
<a id="__codelineno-2-41" name="__codelineno-2-41" href="#__codelineno-2-41"></a><span class="n">ticks</span> <span class="o">=</span> <span class="n">recent_ticks</span><span class="p">(</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span>
<a id="__codelineno-2-42" name="__codelineno-2-42" href="#__codelineno-2-42"></a><span class="n">margins</span> <span class="o">=</span> <span class="n">minimum_margins</span><span class="p">(</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">)</span>
<a id="__codelineno-2-43" name="__codelineno-2-43" href="#__codelineno-2-43"></a>
<a id="__codelineno-2-44" name="__codelineno-2-44" href="#__codelineno-2-44"></a><span class="n">collect_history</span><span class="p">(</span>
<a id="__codelineno-2-45" name="__codelineno-2-45" href="#__codelineno-2-45"></a> <span class="n">Path</span><span class="p">(</span><span class="s2">&quot;history.db&quot;</span><span class="p">),</span>
<a id="__codelineno-2-46" name="__codelineno-2-46" href="#__codelineno-2-46"></a> <span class="n">symbols</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;EURUSD&quot;</span><span class="p">,</span> <span class="s2">&quot;GBPUSD&quot;</span><span class="p">],</span>
<a id="__codelineno-2-47" name="__codelineno-2-47" href="#__codelineno-2-47"></a> <span class="n">date_from</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2024</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">),</span>
<a id="__codelineno-2-48" name="__codelineno-2-48" href="#__codelineno-2-48"></a> <span class="n">date_to</span><span class="o">=</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2024</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">),</span>
<a id="__codelineno-2-49" name="__codelineno-2-49" href="#__codelineno-2-49"></a> <span class="n">datasets</span><span class="o">=</span><span class="p">{</span><span class="n">Dataset</span><span class="o">.</span><span class="n">rates</span><span class="p">,</span> <span class="n">Dataset</span><span class="o">.</span><span class="n">history_deals</span><span class="p">},</span>
<a id="__codelineno-2-50" name="__codelineno-2-50" href="#__codelineno-2-50"></a><span class="p">)</span>
</code></pre></div>
<p>Schema contracts live in <code>mt5cli.schemas</code> (<code>DataKind</code>, <code>validate_schema</code>, <code>normalize_dataframe</code>). Storage helpers are re-exported from <code>mt5cli.storage</code> and the package root.</p>
<p><code>MT5Client.order_send()</code> is a live execution primitive: it can place real trades on the connected account. mt5cli does not implement strategy logic, signal generation, backtesting, or optimization — downstream applications must gate live execution explicitly (the CLI requires <code>--yes</code> for <code>order-send</code>).</p>
<p><code>MT5Client.mt5_summary()</code> returns structured nested Python values. Use <code>MT5Client.mt5_summary_as_df()</code> when you need a one-row DataFrame for export.</p>
<h2 id="quick-start">Quick Start<a class="headerlink" href="#quick-start" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Export account information to CSV</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>account.csv<span class="w"> </span>account-info
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="c1"># Export EURUSD M1 rates to Parquet</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>rates.parquet<span class="w"> </span>rates-from<span class="w"> </span>--symbol<span class="w"> </span>EURUSD<span class="w"> </span>--timeframe<span class="w"> </span>M1<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span>--date-from<span class="w"> </span><span class="m">2024</span>-01-01<span class="w"> </span>--count<span class="w"> </span><span class="m">1000</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="c1"># Export ticks to JSON</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>ticks.json<span class="w"> </span>ticks-from<span class="w"> </span>--symbol<span class="w"> </span>EURUSD<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="w"> </span>--date-from<span class="w"> </span><span class="m">2024</span>-01-01<span class="w"> </span>--count<span class="w"> </span><span class="m">500</span><span class="w"> </span>--flags<span class="w"> </span>ALL
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="c1"># Export symbols to SQLite3 with custom table name</span>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>data.db<span class="w"> </span>--table<span class="w"> </span>symbols<span class="w"> </span>symbols<span class="w"> </span>--group<span class="w"> </span><span class="s2">&quot;*USD*&quot;</span>
<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a>
<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="c1"># Export with connection credentials</span>
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a>mt5cli<span class="w"> </span>--login<span class="w"> </span><span class="m">12345</span><span class="w"> </span>--password<span class="w"> </span>mypass<span class="w"> </span>--server<span class="w"> </span>MyBroker-Demo<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a><span class="w"> </span>-o<span class="w"> </span>positions.csv<span class="w"> </span>positions
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># Export account information to CSV</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>account.csv<span class="w"> </span>account-info
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># Export EURUSD M1 rates to Parquet</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>rates.parquet<span class="w"> </span>rates-from<span class="w"> </span>--symbol<span class="w"> </span>EURUSD<span class="w"> </span>--timeframe<span class="w"> </span>M1<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span>--date-from<span class="w"> </span><span class="m">2024</span>-01-01<span class="w"> </span>--count<span class="w"> </span><span class="m">1000</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="c1"># Export ticks to JSON</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>ticks.json<span class="w"> </span>ticks-from<span class="w"> </span>--symbol<span class="w"> </span>EURUSD<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span>--date-from<span class="w"> </span><span class="m">2024</span>-01-01<span class="w"> </span>--count<span class="w"> </span><span class="m">500</span><span class="w"> </span>--flags<span class="w"> </span>ALL
<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a>
<a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a><span class="c1"># Export symbols to SQLite3 with custom table name</span>
<a id="__codelineno-3-13" name="__codelineno-3-13" href="#__codelineno-3-13"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>data.db<span class="w"> </span>--table<span class="w"> </span>symbols<span class="w"> </span>symbols<span class="w"> </span>--group<span class="w"> </span><span class="s2">&quot;*USD*&quot;</span>
<a id="__codelineno-3-14" name="__codelineno-3-14" href="#__codelineno-3-14"></a>
<a id="__codelineno-3-15" name="__codelineno-3-15" href="#__codelineno-3-15"></a><span class="c1"># Export with connection credentials</span>
<a id="__codelineno-3-16" name="__codelineno-3-16" href="#__codelineno-3-16"></a>mt5cli<span class="w"> </span>--login<span class="w"> </span><span class="m">12345</span><span class="w"> </span>--password<span class="w"> </span>mypass<span class="w"> </span>--server<span class="w"> </span>MyBroker-Demo<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-17" name="__codelineno-3-17" href="#__codelineno-3-17"></a><span class="w"> </span>-o<span class="w"> </span>positions.csv<span class="w"> </span>positions
</code></pre></div>
<h2 id="commands">Commands<a class="headerlink" href="#commands" title="Permanent link">&para;</a></h2>
<h3 id="rates">Rates<a class="headerlink" href="#rates" title="Permanent link">&para;</a></h3>
@@ -442,11 +445,11 @@
</tr>
</tbody>
</table>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>history.db<span class="w"> </span>collect-history<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span>--symbol<span class="w"> </span>EURUSD<span class="w"> </span>--symbol<span class="w"> </span>GBPUSD<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span>--date-from<span class="w"> </span><span class="m">2024</span>-01-01<span class="w"> </span>--date-to<span class="w"> </span><span class="m">2024</span>-02-01<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span>--dataset<span class="w"> </span>rates<span class="w"> </span>--dataset<span class="w"> </span>history-deals<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span>--timeframe<span class="w"> </span>M1<span class="w"> </span>--flags<span class="w"> </span>ALL<span class="w"> </span>--if-exists<span class="w"> </span>append<span class="w"> </span>--with-views
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>mt5cli<span class="w"> </span>-o<span class="w"> </span>history.db<span class="w"> </span>collect-history<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="w"> </span>--symbol<span class="w"> </span>EURUSD<span class="w"> </span>--symbol<span class="w"> </span>GBPUSD<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="w"> </span>--date-from<span class="w"> </span><span class="m">2024</span>-01-01<span class="w"> </span>--date-to<span class="w"> </span><span class="m">2024</span>-02-01<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="w"> </span>--dataset<span class="w"> </span>rates<span class="w"> </span>--dataset<span class="w"> </span>history-deals<span class="w"> </span><span class="se">\</span>
<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span>--timeframe<span class="w"> </span>M1<span class="w"> </span>--flags<span class="w"> </span>ALL<span class="w"> </span>--if-exists<span class="w"> </span>append<span class="w"> </span>--with-views
</code></pre></div>
<p><code>collect-history</code> options:</p>
<table>
@@ -653,5 +656,5 @@
<!--
MkDocs version : 1.6.1
Build Date UTC : 2026-06-25 01:40:41.692888+00:00
Build Date UTC : 2026-06-25 05:04:04.117479+00:00
-->
File diff suppressed because one or more lines are too long