This commit is contained in:
dceoy
2026-06-27 22:56:08 +00:00
parent bba1008be8
commit f27febb6f5
9 changed files with 3695 additions and 2674 deletions
+326 -5
View File
@@ -796,6 +796,108 @@ views <code>cash_events</code> and <code>positions_reconstructed</code> are deri
<div class="doc doc-object doc-function">
<h3 id="mt5cli.cli.grafana_schema" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">grafana_schema</span>
<a href="#mt5cli.cli.grafana_schema" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">grafana_schema</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n"><span title="typer.Context">Context</span></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Create or refresh Grafana-ready views and indexes in a SQLite database.</p>
<p>Idempotent — safe to run repeatedly on the same database. Requires SQLite
output. Does not connect to MetaTrader 5.</p>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="typer.BadParameter">BadParameter</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the output format is not SQLite3.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/cli.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-805">805</a></span>
<span class="normal"><a href="#__codelineno-0-806">806</a></span>
<span class="normal"><a href="#__codelineno-0-807">807</a></span>
<span class="normal"><a href="#__codelineno-0-808">808</a></span>
<span class="normal"><a href="#__codelineno-0-809">809</a></span>
<span class="normal"><a href="#__codelineno-0-810">810</a></span>
<span class="normal"><a href="#__codelineno-0-811">811</a></span>
<span class="normal"><a href="#__codelineno-0-812">812</a></span>
<span class="normal"><a href="#__codelineno-0-813">813</a></span>
<span class="normal"><a href="#__codelineno-0-814">814</a></span>
<span class="normal"><a href="#__codelineno-0-815">815</a></span>
<span class="normal"><a href="#__codelineno-0-816">816</a></span>
<span class="normal"><a href="#__codelineno-0-817">817</a></span>
<span class="normal"><a href="#__codelineno-0-818">818</a></span>
<span class="normal"><a href="#__codelineno-0-819">819</a></span>
<span class="normal"><a href="#__codelineno-0-820">820</a></span>
<span class="normal"><a href="#__codelineno-0-821">821</a></span>
<span class="normal"><a href="#__codelineno-0-822">822</a></span>
<span class="normal"><a href="#__codelineno-0-823">823</a></span>
<span class="normal"><a href="#__codelineno-0-824">824</a></span>
<span class="normal"><a href="#__codelineno-0-825">825</a></span>
<span class="normal"><a href="#__codelineno-0-826">826</a></span>
<span class="normal"><a href="#__codelineno-0-827">827</a></span>
<span class="normal"><a href="#__codelineno-0-828">828</a></span>
<span class="normal"><a href="#__codelineno-0-829">829</a></span>
<span class="normal"><a href="#__codelineno-0-830">830</a></span>
<span class="normal"><a href="#__codelineno-0-831">831</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-805" name="__codelineno-0-805"></a><span class="nd">@app</span><span class="o">.</span><span class="n">command</span><span class="p">(</span><span class="n">rich_help_panel</span><span class="o">=</span><span class="s2">&quot;Collection&quot;</span><span class="p">)</span>
<a id="__codelineno-0-806" name="__codelineno-0-806"></a><span class="k">def</span><span class="w"> </span><span class="nf">grafana_schema</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n">typer</span><span class="o">.</span><span class="n">Context</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-807" name="__codelineno-0-807"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create or refresh Grafana-ready views and indexes in a SQLite database.</span>
<a id="__codelineno-0-808" name="__codelineno-0-808"></a>
<a id="__codelineno-0-809" name="__codelineno-0-809"></a><span class="sd"> Idempotent — safe to run repeatedly on the same database. Requires SQLite</span>
<a id="__codelineno-0-810" name="__codelineno-0-810"></a><span class="sd"> output. Does not connect to MetaTrader 5.</span>
<a id="__codelineno-0-811" name="__codelineno-0-811"></a>
<a id="__codelineno-0-812" name="__codelineno-0-812"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-813" name="__codelineno-0-813"></a><span class="sd"> typer.BadParameter: If the output format is not SQLite3.</span>
<a id="__codelineno-0-814" name="__codelineno-0-814"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-815" name="__codelineno-0-815"></a> <span class="kn">import</span><span class="w"> </span><span class="nn">sqlite3</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">_sqlite3</span> <span class="c1"># noqa: PLC0415</span>
<a id="__codelineno-0-816" name="__codelineno-0-816"></a>
<a id="__codelineno-0-817" name="__codelineno-0-817"></a> <span class="kn">from</span><span class="w"> </span><span class="nn">.grafana</span><span class="w"> </span><span class="kn">import</span> <span class="n">create_snapshot_tables</span><span class="p">,</span> <span class="n">ensure_grafana_schema</span> <span class="c1"># noqa: PLC0415</span>
<a id="__codelineno-0-818" name="__codelineno-0-818"></a>
<a id="__codelineno-0-819" name="__codelineno-0-819"></a> <span class="n">export_ctx</span> <span class="o">=</span> <span class="n">_get_export_context</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
<a id="__codelineno-0-820" name="__codelineno-0-820"></a> <span class="k">if</span> <span class="n">export_ctx</span><span class="o">.</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-821" name="__codelineno-0-821"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-822" name="__codelineno-0-822"></a> <span class="s2">&quot;grafana-schema requires SQLite3 output.&quot;</span>
<a id="__codelineno-0-823" name="__codelineno-0-823"></a> <span class="s2">&quot; Use a .db/.sqlite/.sqlite3 extension or --format sqlite3.&quot;</span>
<a id="__codelineno-0-824" name="__codelineno-0-824"></a> <span class="p">)</span>
<a id="__codelineno-0-825" name="__codelineno-0-825"></a> <span class="k">raise</span> <span class="n">typer</span><span class="o">.</span><span class="n">BadParameter</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<a id="__codelineno-0-826" name="__codelineno-0-826"></a> <span class="k">with</span> <span class="n">_sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">export_ctx</span><span class="o">.</span><span class="n">output</span><span class="p">)</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
<a id="__codelineno-0-827" name="__codelineno-0-827"></a> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;PRAGMA journal_mode=WAL&quot;</span><span class="p">)</span>
<a id="__codelineno-0-828" name="__codelineno-0-828"></a> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&quot;PRAGMA synchronous=NORMAL&quot;</span><span class="p">)</span>
<a id="__codelineno-0-829" name="__codelineno-0-829"></a> <span class="n">create_snapshot_tables</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>
<a id="__codelineno-0-830" name="__codelineno-0-830"></a> <span class="n">ensure_grafana_schema</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>
<a id="__codelineno-0-831" name="__codelineno-0-831"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Grafana schema applied to </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">export_ctx</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.cli.history_deals" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">history_deals</span>
@@ -1166,11 +1268,11 @@ views <code>cash_events</code> and <code>positions_reconstructed</code> are deri
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/cli.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-805">805</a></span>
<span class="normal"><a href="#__codelineno-0-806">806</a></span>
<span class="normal"><a href="#__codelineno-0-807">807</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-805" name="__codelineno-0-805"></a><span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-806" name="__codelineno-0-806"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run the mt5cli CLI.&quot;&quot;&quot;</span>
<a id="__codelineno-0-807" name="__codelineno-0-807"></a> <span class="n">app</span><span class="p">()</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-899">899</a></span>
<span class="normal"><a href="#__codelineno-0-900">900</a></span>
<span class="normal"><a href="#__codelineno-0-901">901</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-899" name="__codelineno-0-899"></a><span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-900" name="__codelineno-0-900"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run the mt5cli CLI.&quot;&quot;&quot;</span>
<a id="__codelineno-0-901" name="__codelineno-0-901"></a> <span class="n">app</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1979,6 +2081,225 @@ with no additional validation beyond what MT5 itself performs. Use
<div class="doc doc-object doc-function">
<h3 id="mt5cli.cli.snapshot" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">snapshot</span>
<a href="#mt5cli.cli.snapshot" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">snapshot</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">ctx</span><span class="p">:</span> <span class="n"><span title="typer.Context">Context</span></span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">symbol</span><span class="p">:</span> <span class="n"><span title="typing.Annotated">Annotated</span></span><span class="p">[</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="n"><span title="list">list</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n"><span title="typer.Option">Option</span></span><span class="p">(</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="s2">&quot;--symbol&quot;</span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="s2">&quot;-s&quot;</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="n"><span title="typer.Option(help)">help</span></span><span class="o">=</span><span class="s2">&quot;Symbol filter for positions/orders (repeat for multiple).&quot;</span><span class="p">,</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="p">),</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">with_account</span><span class="p">:</span> <span class="n"><span title="typing.Annotated">Annotated</span></span><span class="p">[</span>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> <span class="n"><span title="bool">bool</span></span><span class="p">,</span>
<a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a> <span class="n"><span title="typer.Option">Option</span></span><span class="p">(</span>
<a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a> <span class="s2">&quot;--with-account/--no-account&quot;</span><span class="p">,</span>
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a> <span class="n"><span title="typer.Option(help)">help</span></span><span class="o">=</span><span class="s2">&quot;Snapshot account info.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a> <span class="p">),</span>
<a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a> <span class="n">with_positions</span><span class="p">:</span> <span class="n"><span title="typing.Annotated">Annotated</span></span><span class="p">[</span>
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a> <span class="n"><span title="bool">bool</span></span><span class="p">,</span>
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a> <span class="n"><span title="typer.Option">Option</span></span><span class="p">(</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a> <span class="s2">&quot;--with-positions/--no-positions&quot;</span><span class="p">,</span>
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a> <span class="n"><span title="typer.Option(help)">help</span></span><span class="o">=</span><span class="s2">&quot;Snapshot open positions.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a> <span class="p">),</span>
<a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a> <span class="n">with_orders</span><span class="p">:</span> <span class="n"><span title="typing.Annotated">Annotated</span></span><span class="p">[</span>
<a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a> <span class="n"><span title="bool">bool</span></span><span class="p">,</span>
<a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a> <span class="n"><span title="typer.Option">Option</span></span><span class="p">(</span>
<a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a> <span class="s2">&quot;--with-orders/--no-orders&quot;</span><span class="p">,</span>
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a> <span class="n"><span title="typer.Option(help)">help</span></span><span class="o">=</span><span class="s2">&quot;Snapshot active orders.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a> <span class="p">),</span>
<a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a> <span class="n">with_terminal</span><span class="p">:</span> <span class="n"><span title="typing.Annotated">Annotated</span></span><span class="p">[</span>
<a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a> <span class="n"><span title="bool">bool</span></span><span class="p">,</span>
<a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a> <span class="n"><span title="typer.Option">Option</span></span><span class="p">(</span>
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a> <span class="s2">&quot;--with-terminal/--no-terminal&quot;</span><span class="p">,</span>
<a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a> <span class="n"><span title="typer.Option(help)">help</span></span><span class="o">=</span><span class="s2">&quot;Snapshot terminal info.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a> <span class="p">),</span>
<a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a> <span class="n">with_grafana_schema</span><span class="p">:</span> <span class="n"><span title="typing.Annotated">Annotated</span></span><span class="p">[</span>
<a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a> <span class="n"><span title="bool">bool</span></span><span class="p">,</span>
<a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a> <span class="n"><span title="typer.Option">Option</span></span><span class="p">(</span>
<a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a> <span class="s2">&quot;--with-grafana-schema/--no-grafana-schema&quot;</span><span class="p">,</span>
<a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a> <span class="n"><span title="typer.Option(help)">help</span></span><span class="o">=</span><span class="s2">&quot;Ensure Grafana views and indexes exist.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a> <span class="p">),</span>
<a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Snapshot current account, position, order, and terminal state into SQLite.</p>
<p>Appends a timestamped snapshot row for each data type. Never places
orders or modifies trading state.</p>
<p><span class="doc-section-title">Raises:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="typer.BadParameter">BadParameter</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If the output format is not SQLite3.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/cli.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-834">834</a></span>
<span class="normal"><a href="#__codelineno-0-835">835</a></span>
<span class="normal"><a href="#__codelineno-0-836">836</a></span>
<span class="normal"><a href="#__codelineno-0-837">837</a></span>
<span class="normal"><a href="#__codelineno-0-838">838</a></span>
<span class="normal"><a href="#__codelineno-0-839">839</a></span>
<span class="normal"><a href="#__codelineno-0-840">840</a></span>
<span class="normal"><a href="#__codelineno-0-841">841</a></span>
<span class="normal"><a href="#__codelineno-0-842">842</a></span>
<span class="normal"><a href="#__codelineno-0-843">843</a></span>
<span class="normal"><a href="#__codelineno-0-844">844</a></span>
<span class="normal"><a href="#__codelineno-0-845">845</a></span>
<span class="normal"><a href="#__codelineno-0-846">846</a></span>
<span class="normal"><a href="#__codelineno-0-847">847</a></span>
<span class="normal"><a href="#__codelineno-0-848">848</a></span>
<span class="normal"><a href="#__codelineno-0-849">849</a></span>
<span class="normal"><a href="#__codelineno-0-850">850</a></span>
<span class="normal"><a href="#__codelineno-0-851">851</a></span>
<span class="normal"><a href="#__codelineno-0-852">852</a></span>
<span class="normal"><a href="#__codelineno-0-853">853</a></span>
<span class="normal"><a href="#__codelineno-0-854">854</a></span>
<span class="normal"><a href="#__codelineno-0-855">855</a></span>
<span class="normal"><a href="#__codelineno-0-856">856</a></span>
<span class="normal"><a href="#__codelineno-0-857">857</a></span>
<span class="normal"><a href="#__codelineno-0-858">858</a></span>
<span class="normal"><a href="#__codelineno-0-859">859</a></span>
<span class="normal"><a href="#__codelineno-0-860">860</a></span>
<span class="normal"><a href="#__codelineno-0-861">861</a></span>
<span class="normal"><a href="#__codelineno-0-862">862</a></span>
<span class="normal"><a href="#__codelineno-0-863">863</a></span>
<span class="normal"><a href="#__codelineno-0-864">864</a></span>
<span class="normal"><a href="#__codelineno-0-865">865</a></span>
<span class="normal"><a href="#__codelineno-0-866">866</a></span>
<span class="normal"><a href="#__codelineno-0-867">867</a></span>
<span class="normal"><a href="#__codelineno-0-868">868</a></span>
<span class="normal"><a href="#__codelineno-0-869">869</a></span>
<span class="normal"><a href="#__codelineno-0-870">870</a></span>
<span class="normal"><a href="#__codelineno-0-871">871</a></span>
<span class="normal"><a href="#__codelineno-0-872">872</a></span>
<span class="normal"><a href="#__codelineno-0-873">873</a></span>
<span class="normal"><a href="#__codelineno-0-874">874</a></span>
<span class="normal"><a href="#__codelineno-0-875">875</a></span>
<span class="normal"><a href="#__codelineno-0-876">876</a></span>
<span class="normal"><a href="#__codelineno-0-877">877</a></span>
<span class="normal"><a href="#__codelineno-0-878">878</a></span>
<span class="normal"><a href="#__codelineno-0-879">879</a></span>
<span class="normal"><a href="#__codelineno-0-880">880</a></span>
<span class="normal"><a href="#__codelineno-0-881">881</a></span>
<span class="normal"><a href="#__codelineno-0-882">882</a></span>
<span class="normal"><a href="#__codelineno-0-883">883</a></span>
<span class="normal"><a href="#__codelineno-0-884">884</a></span>
<span class="normal"><a href="#__codelineno-0-885">885</a></span>
<span class="normal"><a href="#__codelineno-0-886">886</a></span>
<span class="normal"><a href="#__codelineno-0-887">887</a></span>
<span class="normal"><a href="#__codelineno-0-888">888</a></span>
<span class="normal"><a href="#__codelineno-0-889">889</a></span>
<span class="normal"><a href="#__codelineno-0-890">890</a></span>
<span class="normal"><a href="#__codelineno-0-891">891</a></span>
<span class="normal"><a href="#__codelineno-0-892">892</a></span>
<span class="normal"><a href="#__codelineno-0-893">893</a></span>
<span class="normal"><a href="#__codelineno-0-894">894</a></span>
<span class="normal"><a href="#__codelineno-0-895">895</a></span>
<span class="normal"><a href="#__codelineno-0-896">896</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-834" name="__codelineno-0-834"></a><span class="nd">@app</span><span class="o">.</span><span class="n">command</span><span class="p">(</span><span class="n">rich_help_panel</span><span class="o">=</span><span class="s2">&quot;Collection&quot;</span><span class="p">)</span>
<a id="__codelineno-0-835" name="__codelineno-0-835"></a><span class="k">def</span><span class="w"> </span><span class="nf">snapshot</span><span class="p">(</span>
<a id="__codelineno-0-836" name="__codelineno-0-836"></a> <span class="n">ctx</span><span class="p">:</span> <span class="n">typer</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span>
<a id="__codelineno-0-837" name="__codelineno-0-837"></a> <span class="n">symbol</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span>
<a id="__codelineno-0-838" name="__codelineno-0-838"></a> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-839" name="__codelineno-0-839"></a> <span class="n">typer</span><span class="o">.</span><span class="n">Option</span><span class="p">(</span>
<a id="__codelineno-0-840" name="__codelineno-0-840"></a> <span class="s2">&quot;--symbol&quot;</span><span class="p">,</span>
<a id="__codelineno-0-841" name="__codelineno-0-841"></a> <span class="s2">&quot;-s&quot;</span><span class="p">,</span>
<a id="__codelineno-0-842" name="__codelineno-0-842"></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Symbol filter for positions/orders (repeat for multiple).&quot;</span><span class="p">,</span>
<a id="__codelineno-0-843" name="__codelineno-0-843"></a> <span class="p">),</span>
<a id="__codelineno-0-844" name="__codelineno-0-844"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-845" name="__codelineno-0-845"></a> <span class="n">with_account</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span>
<a id="__codelineno-0-846" name="__codelineno-0-846"></a> <span class="nb">bool</span><span class="p">,</span>
<a id="__codelineno-0-847" name="__codelineno-0-847"></a> <span class="n">typer</span><span class="o">.</span><span class="n">Option</span><span class="p">(</span><span class="s2">&quot;--with-account/--no-account&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Snapshot account info.&quot;</span><span class="p">),</span>
<a id="__codelineno-0-848" name="__codelineno-0-848"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-849" name="__codelineno-0-849"></a> <span class="n">with_positions</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span>
<a id="__codelineno-0-850" name="__codelineno-0-850"></a> <span class="nb">bool</span><span class="p">,</span>
<a id="__codelineno-0-851" name="__codelineno-0-851"></a> <span class="n">typer</span><span class="o">.</span><span class="n">Option</span><span class="p">(</span>
<a id="__codelineno-0-852" name="__codelineno-0-852"></a> <span class="s2">&quot;--with-positions/--no-positions&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Snapshot open positions.&quot;</span>
<a id="__codelineno-0-853" name="__codelineno-0-853"></a> <span class="p">),</span>
<a id="__codelineno-0-854" name="__codelineno-0-854"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-855" name="__codelineno-0-855"></a> <span class="n">with_orders</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span>
<a id="__codelineno-0-856" name="__codelineno-0-856"></a> <span class="nb">bool</span><span class="p">,</span>
<a id="__codelineno-0-857" name="__codelineno-0-857"></a> <span class="n">typer</span><span class="o">.</span><span class="n">Option</span><span class="p">(</span><span class="s2">&quot;--with-orders/--no-orders&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Snapshot active orders.&quot;</span><span class="p">),</span>
<a id="__codelineno-0-858" name="__codelineno-0-858"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-859" name="__codelineno-0-859"></a> <span class="n">with_terminal</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span>
<a id="__codelineno-0-860" name="__codelineno-0-860"></a> <span class="nb">bool</span><span class="p">,</span>
<a id="__codelineno-0-861" name="__codelineno-0-861"></a> <span class="n">typer</span><span class="o">.</span><span class="n">Option</span><span class="p">(</span><span class="s2">&quot;--with-terminal/--no-terminal&quot;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Snapshot terminal info.&quot;</span><span class="p">),</span>
<a id="__codelineno-0-862" name="__codelineno-0-862"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-863" name="__codelineno-0-863"></a> <span class="n">with_grafana_schema</span><span class="p">:</span> <span class="n">Annotated</span><span class="p">[</span>
<a id="__codelineno-0-864" name="__codelineno-0-864"></a> <span class="nb">bool</span><span class="p">,</span>
<a id="__codelineno-0-865" name="__codelineno-0-865"></a> <span class="n">typer</span><span class="o">.</span><span class="n">Option</span><span class="p">(</span>
<a id="__codelineno-0-866" name="__codelineno-0-866"></a> <span class="s2">&quot;--with-grafana-schema/--no-grafana-schema&quot;</span><span class="p">,</span>
<a id="__codelineno-0-867" name="__codelineno-0-867"></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Ensure Grafana views and indexes exist.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-868" name="__codelineno-0-868"></a> <span class="p">),</span>
<a id="__codelineno-0-869" name="__codelineno-0-869"></a> <span class="p">]</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<a id="__codelineno-0-870" name="__codelineno-0-870"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-871" name="__codelineno-0-871"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Snapshot current account, position, order, and terminal state into SQLite.</span>
<a id="__codelineno-0-872" name="__codelineno-0-872"></a>
<a id="__codelineno-0-873" name="__codelineno-0-873"></a><span class="sd"> Appends a timestamped snapshot row for each data type. Never places</span>
<a id="__codelineno-0-874" name="__codelineno-0-874"></a><span class="sd"> orders or modifies trading state.</span>
<a id="__codelineno-0-875" name="__codelineno-0-875"></a>
<a id="__codelineno-0-876" name="__codelineno-0-876"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-877" name="__codelineno-0-877"></a><span class="sd"> typer.BadParameter: If the output format is not SQLite3.</span>
<a id="__codelineno-0-878" name="__codelineno-0-878"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-879" name="__codelineno-0-879"></a> <span class="n">export_ctx</span> <span class="o">=</span> <span class="n">_get_export_context</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
<a id="__codelineno-0-880" name="__codelineno-0-880"></a> <span class="k">if</span> <span class="n">export_ctx</span><span class="o">.</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-881" name="__codelineno-0-881"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-882" name="__codelineno-0-882"></a> <span class="s2">&quot;snapshot requires SQLite3 output.&quot;</span>
<a id="__codelineno-0-883" name="__codelineno-0-883"></a> <span class="s2">&quot; Use a .db/.sqlite/.sqlite3 extension or --format sqlite3.&quot;</span>
<a id="__codelineno-0-884" name="__codelineno-0-884"></a> <span class="p">)</span>
<a id="__codelineno-0-885" name="__codelineno-0-885"></a> <span class="k">raise</span> <span class="n">typer</span><span class="o">.</span><span class="n">BadParameter</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<a id="__codelineno-0-886" name="__codelineno-0-886"></a> <span class="n">sdk</span><span class="o">.</span><span class="n">update_observability_with_config</span><span class="p">(</span>
<a id="__codelineno-0-887" name="__codelineno-0-887"></a> <span class="n">output</span><span class="o">=</span><span class="n">export_ctx</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
<a id="__codelineno-0-888" name="__codelineno-0-888"></a> <span class="n">config</span><span class="o">=</span><span class="n">export_ctx</span><span class="o">.</span><span class="n">config</span><span class="p">,</span>
<a id="__codelineno-0-889" name="__codelineno-0-889"></a> <span class="n">symbols</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="n">symbol</span><span class="p">)</span> <span class="k">if</span> <span class="n">symbol</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-890" name="__codelineno-0-890"></a> <span class="n">include_account</span><span class="o">=</span><span class="n">with_account</span><span class="p">,</span>
<a id="__codelineno-0-891" name="__codelineno-0-891"></a> <span class="n">include_positions</span><span class="o">=</span><span class="n">with_positions</span><span class="p">,</span>
<a id="__codelineno-0-892" name="__codelineno-0-892"></a> <span class="n">include_orders</span><span class="o">=</span><span class="n">with_orders</span><span class="p">,</span>
<a id="__codelineno-0-893" name="__codelineno-0-893"></a> <span class="n">include_terminal</span><span class="o">=</span><span class="n">with_terminal</span><span class="p">,</span>
<a id="__codelineno-0-894" name="__codelineno-0-894"></a> <span class="n">with_grafana_schema</span><span class="o">=</span><span class="n">with_grafana_schema</span><span class="p">,</span>
<a id="__codelineno-0-895" name="__codelineno-0-895"></a> <span class="p">)</span>
<a id="__codelineno-0-896" name="__codelineno-0-896"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Snapshot written to </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">export_ctx</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.cli.symbol_info" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">symbol_info</span>