Files
mt5cli/api/schemas/index.html
T
2026-07-03 16:04:05 +00:00

1525 lines
92 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="dceoy">
<link rel="canonical" href="https://github.com/dceoy/mt5cli/api/schemas/">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>Schemas - mt5cli API Documentation</title>
<link href="../../css/bootstrap.min.css" rel="stylesheet">
<link href="../../css/fontawesome.min.css" rel="stylesheet">
<link href="../../css/brands.min.css" rel="stylesheet">
<link href="../../css/solid.min.css" rel="stylesheet">
<link href="../../css/v4-font-face.min.css" rel="stylesheet">
<link href="../../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<link href="../../assets/_mkdocstrings.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="../..">mt5cli API Documentation</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href="../.." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">API Reference</a>
<ul class="dropdown-menu">
<li>
<a href="../" class="dropdown-item">Overview</a>
</li>
<li>
<a href="../public-contract/" class="dropdown-item">Public API Contract</a>
</li>
<li>
<a href="../client/" class="dropdown-item">Client</a>
</li>
<li>
<a href="./" class="dropdown-item active" aria-current="page">Schemas</a>
</li>
<li>
<a href="../converters/" class="dropdown-item">Converters</a>
</li>
<li>
<a href="../exceptions/" class="dropdown-item">Exceptions</a>
</li>
<li>
<a href="../cli/" class="dropdown-item">CLI</a>
</li>
<li>
<a href="../sdk/" class="dropdown-item">SDK</a>
</li>
<li>
<a href="../trading/" class="dropdown-item">Trading</a>
</li>
<li>
<a href="../history/" class="dropdown-item">History Collection (SQLite)</a>
</li>
<li>
<a href="../telemetry/" class="dropdown-item">Telemetry</a>
</li>
<li>
<a href="../grafana/" class="dropdown-item">Grafana</a>
</li>
<li>
<a href="../utils/" class="dropdown-item">Utils</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href="../client/" class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="../converters/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
<li class="nav-item">
<a href="https://github.com/dceoy/mt5cli/edit/master/docs/api/schemas.md" class="nav-link">Edit on dceoy/mt5cli
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="1"><a href="#schemas" class="nav-link">Schemas</a>
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#mt5cli.schemas" class="nav-link">schemas</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h1 id="schemas">Schemas<a class="headerlink" href="#schemas" title="Permanent link">&para;</a></h1>
<div class="doc doc-object doc-module">
<h2 id="mt5cli.schemas" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mt5cli.schemas</span>
<a href="#mt5cli.schemas" class="headerlink" title="Permanent link">&para;</a></h2>
<div class="doc doc-contents first">
<p>Canonical DataFrame schemas for MT5 market and account datasets.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.schemas.DEDUP_KEYS" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">DEDUP_KEYS</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DEDUP_KEYS" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">DEDUP_KEYS</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span><span class="p">,</span> <span class="n"><span title="tuple">tuple</span></span><span class="p">[</span><span class="n"><span title="tuple">tuple</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="p">],</span> <span class="o">...</span><span class="p">]]</span> <span class="o">=</span> <span class="p">{</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n"><a class="autorefs autorefs-internal" title="rates
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.rates)" href="#mt5cli.schemas.DataKind.rates">rates</a></span><span class="p">:</span> <span class="p">(</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="p">(</span><span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="s2">&quot;timeframe&quot;</span><span class="p">,</span> <span class="s2">&quot;time&quot;</span><span class="p">),</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="p">(</span><span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="s2">&quot;time&quot;</span><span class="p">),</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="p">),</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n"><a class="autorefs autorefs-internal" title="ticks
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.ticks)" href="#mt5cli.schemas.DataKind.ticks">ticks</a></span><span class="p">:</span> <span class="p">((</span><span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="s2">&quot;time_msc&quot;</span><span class="p">),</span> <span class="p">(</span><span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="s2">&quot;time&quot;</span><span class="p">)),</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n"><a class="autorefs autorefs-internal" title="history_orders
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.history_orders)" href="#mt5cli.schemas.DataKind.history_orders">history_orders</a></span><span class="p">:</span> <span class="p">(</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="p">(</span><span class="s2">&quot;ticket&quot;</span><span class="p">,),</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="p">(</span><span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="s2">&quot;time&quot;</span><span class="p">,</span> <span class="s2">&quot;type&quot;</span><span class="p">),</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="p">),</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n"><a class="autorefs autorefs-internal" title="history_deals
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.history_deals)" href="#mt5cli.schemas.DataKind.history_deals">history_deals</a></span><span class="p">:</span> <span class="p">(</span>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> <span class="p">(</span><span class="s2">&quot;ticket&quot;</span><span class="p">,),</span>
<a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a> <span class="p">(</span><span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="s2">&quot;time&quot;</span><span class="p">,</span> <span class="s2">&quot;type&quot;</span><span class="p">,</span> <span class="s2">&quot;entry&quot;</span><span class="p">),</span>
<a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a> <span class="p">),</span>
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="p">}</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.schemas.KNOWN_MT5_TIME_COLUMNS" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">KNOWN_MT5_TIME_COLUMNS</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.schemas.KNOWN_MT5_TIME_COLUMNS" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">KNOWN_MT5_TIME_COLUMNS</span><span class="p">:</span> <span class="n"><span title="typing.Final">Final</span></span><span class="p">[</span><span class="n"><span title="frozenset">frozenset</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="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="s2">&quot;time&quot;</span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="s2">&quot;time_setup&quot;</span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="s2">&quot;time_setup_msc&quot;</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="s2">&quot;time_done&quot;</span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="s2">&quot;time_done_msc&quot;</span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="s2">&quot;time_msc&quot;</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">})</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.schemas.REQUIRED_COLUMNS" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">REQUIRED_COLUMNS</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.schemas.REQUIRED_COLUMNS" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">REQUIRED_COLUMNS</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span><span class="p">,</span> <span class="n"><span title="frozenset">frozenset</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="p">{</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n"><a class="autorefs autorefs-internal" title="rates
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.rates)" href="#mt5cli.schemas.DataKind.rates">rates</a></span><span class="p">:</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="s2">&quot;time&quot;</span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="s2">&quot;open&quot;</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="s2">&quot;high&quot;</span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="s2">&quot;low&quot;</span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="s2">&quot;close&quot;</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="s2">&quot;tick_volume&quot;</span><span class="p">,</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="s2">&quot;spread&quot;</span><span class="p">,</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="s2">&quot;real_volume&quot;</span><span class="p">,</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="p">}),</span>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> <span class="n"><a class="autorefs autorefs-internal" title="ticks
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.ticks)" href="#mt5cli.schemas.DataKind.ticks">ticks</a></span><span class="p">:</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a> <span class="s2">&quot;time&quot;</span><span class="p">,</span>
<a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a> <span class="s2">&quot;bid&quot;</span><span class="p">,</span>
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a> <span class="s2">&quot;ask&quot;</span><span class="p">,</span>
<a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a> <span class="s2">&quot;last&quot;</span><span class="p">,</span>
<a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a> <span class="s2">&quot;volume&quot;</span><span class="p">,</span>
<a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a> <span class="s2">&quot;time_msc&quot;</span><span class="p">,</span>
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a> <span class="s2">&quot;flags&quot;</span><span class="p">,</span>
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a> <span class="s2">&quot;volume_real&quot;</span><span class="p">,</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a> <span class="p">}),</span>
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a> <span class="n"><a class="autorefs autorefs-internal" title="orders
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.orders)" href="#mt5cli.schemas.DataKind.orders">orders</a></span><span class="p">:</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a> <span class="s2">&quot;ticket&quot;</span><span class="p">,</span>
<a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a> <span class="s2">&quot;time_setup&quot;</span><span class="p">,</span>
<a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a> <span class="s2">&quot;type&quot;</span><span class="p">,</span>
<a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a> <span class="s2">&quot;state&quot;</span><span class="p">,</span>
<a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a> <span class="s2">&quot;symbol&quot;</span><span class="p">,</span>
<a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a> <span class="s2">&quot;volume_current&quot;</span><span class="p">,</span>
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a> <span class="s2">&quot;price_open&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="n"><a class="autorefs autorefs-internal" title="positions
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.positions)" href="#mt5cli.schemas.DataKind.positions">positions</a></span><span class="p">:</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a> <span class="s2">&quot;ticket&quot;</span><span class="p">,</span>
<a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a> <span class="s2">&quot;time&quot;</span><span class="p">,</span>
<a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a> <span class="s2">&quot;type&quot;</span><span class="p">,</span>
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a> <span class="s2">&quot;symbol&quot;</span><span class="p">,</span>
<a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a> <span class="s2">&quot;volume&quot;</span><span class="p">,</span>
<a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a> <span class="s2">&quot;price_open&quot;</span><span class="p">,</span>
<a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a> <span class="s2">&quot;price_current&quot;</span><span class="p">,</span>
<a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a> <span class="s2">&quot;profit&quot;</span><span class="p">,</span>
<a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a> <span class="p">}),</span>
<a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a> <span class="n"><a class="autorefs autorefs-internal" title="history_orders
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.history_orders)" href="#mt5cli.schemas.DataKind.history_orders">history_orders</a></span><span class="p">:</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a> <span class="s2">&quot;ticket&quot;</span><span class="p">,</span>
<a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a> <span class="s2">&quot;time_setup&quot;</span><span class="p">,</span>
<a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a> <span class="s2">&quot;type&quot;</span><span class="p">,</span>
<a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a> <span class="s2">&quot;state&quot;</span><span class="p">,</span>
<a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a> <span class="s2">&quot;symbol&quot;</span><span class="p">,</span>
<a id="__codelineno-0-47" name="__codelineno-0-47" href="#__codelineno-0-47"></a> <span class="s2">&quot;volume_initial&quot;</span><span class="p">,</span>
<a id="__codelineno-0-48" name="__codelineno-0-48" href="#__codelineno-0-48"></a> <span class="s2">&quot;price_open&quot;</span><span class="p">,</span>
<a id="__codelineno-0-49" name="__codelineno-0-49" href="#__codelineno-0-49"></a> <span class="p">}),</span>
<a id="__codelineno-0-50" name="__codelineno-0-50" href="#__codelineno-0-50"></a> <span class="n"><a class="autorefs autorefs-internal" title="history_deals
class-attribute
instance-attribute
(mt5cli.schemas.DataKind.history_deals)" href="#mt5cli.schemas.DataKind.history_deals">history_deals</a></span><span class="p">:</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">({</span>
<a id="__codelineno-0-51" name="__codelineno-0-51" href="#__codelineno-0-51"></a> <span class="s2">&quot;ticket&quot;</span><span class="p">,</span>
<a id="__codelineno-0-52" name="__codelineno-0-52" href="#__codelineno-0-52"></a> <span class="s2">&quot;order&quot;</span><span class="p">,</span>
<a id="__codelineno-0-53" name="__codelineno-0-53" href="#__codelineno-0-53"></a> <span class="s2">&quot;time&quot;</span><span class="p">,</span>
<a id="__codelineno-0-54" name="__codelineno-0-54" href="#__codelineno-0-54"></a> <span class="s2">&quot;type&quot;</span><span class="p">,</span>
<a id="__codelineno-0-55" name="__codelineno-0-55" href="#__codelineno-0-55"></a> <span class="s2">&quot;entry&quot;</span><span class="p">,</span>
<a id="__codelineno-0-56" name="__codelineno-0-56" href="#__codelineno-0-56"></a> <span class="s2">&quot;symbol&quot;</span><span class="p">,</span>
<a id="__codelineno-0-57" name="__codelineno-0-57" href="#__codelineno-0-57"></a> <span class="s2">&quot;volume&quot;</span><span class="p">,</span>
<a id="__codelineno-0-58" name="__codelineno-0-58" href="#__codelineno-0-58"></a> <span class="s2">&quot;price&quot;</span><span class="p">,</span>
<a id="__codelineno-0-59" name="__codelineno-0-59" href="#__codelineno-0-59"></a> <span class="s2">&quot;profit&quot;</span><span class="p">,</span>
<a id="__codelineno-0-60" name="__codelineno-0-60" href="#__codelineno-0-60"></a> <span class="p">}),</span>
<a id="__codelineno-0-61" name="__codelineno-0-61" href="#__codelineno-0-61"></a><span class="p">}</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.schemas.TIME_COLUMNS" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">TIME_COLUMNS</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.schemas.TIME_COLUMNS" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">TIME_COLUMNS</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span><span class="p">,</span> <span class="n"><span title="frozenset">frozenset</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="p">{</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n"><span title="kind">kind</span></span><span class="p">:</span> <span class="p">(</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n"><a class="autorefs autorefs-internal" title="REQUIRED_COLUMNS
module-attribute
(mt5cli.schemas.REQUIRED_COLUMNS)" href="#mt5cli.schemas.REQUIRED_COLUMNS">REQUIRED_COLUMNS</a></span><span class="p">[</span><span class="n"><span title="kind">kind</span></span><span class="p">]</span> <span class="o">&amp;</span> <span class="n"><span title="mt5cli.schemas._TIME_COLUMN_NAMES">_TIME_COLUMN_NAMES</span></span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="o">|</span> <span class="n"><span title="mt5cli.schemas._OPTIONAL_TIME_COLUMNS_BY_KIND.get">get</span></span><span class="p">(</span><span class="n"><span title="kind">kind</span></span><span class="p">,</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">())</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="p">)</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="k">for</span> <span class="n"><span title="kind">kind</span></span> <span class="ow">in</span> <span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="p">}</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="mt5cli.schemas.__all__" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">__all__</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
<a href="#mt5cli.schemas.__all__" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="s2">&quot;DEDUP_KEYS&quot;</span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="s2">&quot;KNOWN_MT5_TIME_COLUMNS&quot;</span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="s2">&quot;REQUIRED_COLUMNS&quot;</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="s2">&quot;TIME_COLUMNS&quot;</span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="s2">&quot;DataKind&quot;</span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="s2">&quot;normalize_dataframe&quot;</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="s2">&quot;normalize_time_columns&quot;</span><span class="p">,</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="s2">&quot;schema_columns&quot;</span><span class="p">,</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="s2">&quot;validate_schema&quot;</span><span class="p">,</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="mt5cli.schemas.DataKind" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">DataKind</span>
<a href="#mt5cli.schemas.DataKind" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><span title="enum.StrEnum">StrEnum</span></code></p>
<p>Supported MT5 dataset kinds with canonical column contracts.</p>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="mt5cli.schemas.DataKind.history_deals" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">history_deals</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DataKind.history_deals" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">history_deals</span> <span class="o">=</span> <span class="s1">&#39;history_deals&#39;</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="mt5cli.schemas.DataKind.history_orders" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">history_orders</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DataKind.history_orders" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">history_orders</span> <span class="o">=</span> <span class="s1">&#39;history_orders&#39;</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="mt5cli.schemas.DataKind.orders" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">orders</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DataKind.orders" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">orders</span> <span class="o">=</span> <span class="s1">&#39;orders&#39;</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="mt5cli.schemas.DataKind.positions" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">positions</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DataKind.positions" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">positions</span> <span class="o">=</span> <span class="s1">&#39;positions&#39;</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="mt5cli.schemas.DataKind.rates" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">rates</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DataKind.rates" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">rates</span> <span class="o">=</span> <span class="s1">&#39;rates&#39;</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="mt5cli.schemas.DataKind.ticks" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">ticks</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
<a href="#mt5cli.schemas.DataKind.ticks" class="headerlink" title="Permanent link">&para;</a></h4>
<div class="doc-signature highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">ticks</span> <span class="o">=</span> <span class="s1">&#39;ticks&#39;</span>
</code></pre></div>
<div class="doc doc-contents ">
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.schemas.ensure_utc_columns" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">ensure_utc_columns</span>
<a href="#mt5cli.schemas.ensure_utc_columns" 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">ensure_utc_columns</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">frame</span><span class="p">:</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span><span class="p">,</span> <span class="n">columns</span><span class="p">:</span> <span class="n"><span title="collections.abc.Iterable">Iterable</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">]</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Return a copy with selected columns coerced to UTC datetimes.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>frame</code>
</td>
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Source DataFrame.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>columns</code>
</td>
<td>
<code><span title="collections.abc.Iterable">Iterable</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Column names to coerce.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>DataFrame copy with UTC-aware datetime columns.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/schemas.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-271">271</a></span>
<span class="normal"><a href="#__codelineno-0-272">272</a></span>
<span class="normal"><a href="#__codelineno-0-273">273</a></span>
<span class="normal"><a href="#__codelineno-0-274">274</a></span>
<span class="normal"><a href="#__codelineno-0-275">275</a></span>
<span class="normal"><a href="#__codelineno-0-276">276</a></span>
<span class="normal"><a href="#__codelineno-0-277">277</a></span>
<span class="normal"><a href="#__codelineno-0-278">278</a></span>
<span class="normal"><a href="#__codelineno-0-279">279</a></span>
<span class="normal"><a href="#__codelineno-0-280">280</a></span>
<span class="normal"><a href="#__codelineno-0-281">281</a></span>
<span class="normal"><a href="#__codelineno-0-282">282</a></span>
<span class="normal"><a href="#__codelineno-0-283">283</a></span>
<span class="normal"><a href="#__codelineno-0-284">284</a></span>
<span class="normal"><a href="#__codelineno-0-285">285</a></span>
<span class="normal"><a href="#__codelineno-0-286">286</a></span>
<span class="normal"><a href="#__codelineno-0-287">287</a></span>
<span class="normal"><a href="#__codelineno-0-288">288</a></span>
<span class="normal"><a href="#__codelineno-0-289">289</a></span>
<span class="normal"><a href="#__codelineno-0-290">290</a></span>
<span class="normal"><a href="#__codelineno-0-291">291</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-271" name="__codelineno-0-271"></a><span class="k">def</span><span class="w"> </span><span class="nf">ensure_utc_columns</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">,</span> <span class="n">columns</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-272" name="__codelineno-0-272"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a copy with selected columns coerced to UTC datetimes.</span>
<a id="__codelineno-0-273" name="__codelineno-0-273"></a>
<a id="__codelineno-0-274" name="__codelineno-0-274"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-275" name="__codelineno-0-275"></a><span class="sd"> frame: Source DataFrame.</span>
<a id="__codelineno-0-276" name="__codelineno-0-276"></a><span class="sd"> columns: Column names to coerce.</span>
<a id="__codelineno-0-277" name="__codelineno-0-277"></a>
<a id="__codelineno-0-278" name="__codelineno-0-278"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-279" name="__codelineno-0-279"></a><span class="sd"> DataFrame copy with UTC-aware datetime columns.</span>
<a id="__codelineno-0-280" name="__codelineno-0-280"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<a id="__codelineno-0-282" name="__codelineno-0-282"></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-283" name="__codelineno-0-283"></a> <span class="k">if</span> <span class="n">column</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="k">continue</span>
<a id="__codelineno-0-285" name="__codelineno-0-285"></a> <span class="k">if</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">_TIME_COLUMN_NAMES</span><span class="p">:</span>
<a id="__codelineno-0-286" name="__codelineno-0-286"></a> <span class="n">normalized</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">_coerce_mt5_time_column</span><span class="p">(</span><span class="n">normalized</span><span class="p">[</span><span class="n">column</span><span class="p">],</span> <span class="n">column</span><span class="p">)</span>
<a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">normalized</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span>
<a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="n">normalized</span><span class="p">[</span><span class="n">column</span><span class="p">],</span> <span class="n">utc</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&quot;coerce&quot;</span>
<a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="p">)</span>
<a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">return</span> <span class="n">normalized</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.schemas.normalize_dataframe" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">normalize_dataframe</span>
<a href="#mt5cli.schemas.normalize_dataframe" 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">normalize_dataframe</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">frame</span><span class="p">:</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">kind</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="o">*</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">symbol</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="n">timeframe</span><span class="p">:</span> <span class="n"><span title="int">int</span></span> <span class="o">|</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="n">sort</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Normalize MT5 DataFrame columns, timestamps, and storage metadata.</p>
<p>Ensures UTC timestamps, optionally injects <code>symbol</code> / <code>timeframe</code> for
storage-oriented datasets, and sorts chronologically when a <code>time</code> column
exists.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>frame</code>
</td>
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Source DataFrame from MT5 or pdmt5.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>kind</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Dataset kind guiding normalization rules.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>symbol</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional symbol to inject when missing.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>timeframe</code>
</td>
<td>
<code><span title="int">int</span> | <span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional timeframe integer or name to inject for rates.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>sort</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether to sort by <code>time</code> or <code>time_msc</code> when present.</p>
</div>
</td>
<td>
<code>True</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Normalized DataFrame copy.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/schemas.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-221">221</a></span>
<span class="normal"><a href="#__codelineno-0-222">222</a></span>
<span class="normal"><a href="#__codelineno-0-223">223</a></span>
<span class="normal"><a href="#__codelineno-0-224">224</a></span>
<span class="normal"><a href="#__codelineno-0-225">225</a></span>
<span class="normal"><a href="#__codelineno-0-226">226</a></span>
<span class="normal"><a href="#__codelineno-0-227">227</a></span>
<span class="normal"><a href="#__codelineno-0-228">228</a></span>
<span class="normal"><a href="#__codelineno-0-229">229</a></span>
<span class="normal"><a href="#__codelineno-0-230">230</a></span>
<span class="normal"><a href="#__codelineno-0-231">231</a></span>
<span class="normal"><a href="#__codelineno-0-232">232</a></span>
<span class="normal"><a href="#__codelineno-0-233">233</a></span>
<span class="normal"><a href="#__codelineno-0-234">234</a></span>
<span class="normal"><a href="#__codelineno-0-235">235</a></span>
<span class="normal"><a href="#__codelineno-0-236">236</a></span>
<span class="normal"><a href="#__codelineno-0-237">237</a></span>
<span class="normal"><a href="#__codelineno-0-238">238</a></span>
<span class="normal"><a href="#__codelineno-0-239">239</a></span>
<span class="normal"><a href="#__codelineno-0-240">240</a></span>
<span class="normal"><a href="#__codelineno-0-241">241</a></span>
<span class="normal"><a href="#__codelineno-0-242">242</a></span>
<span class="normal"><a href="#__codelineno-0-243">243</a></span>
<span class="normal"><a href="#__codelineno-0-244">244</a></span>
<span class="normal"><a href="#__codelineno-0-245">245</a></span>
<span class="normal"><a href="#__codelineno-0-246">246</a></span>
<span class="normal"><a href="#__codelineno-0-247">247</a></span>
<span class="normal"><a href="#__codelineno-0-248">248</a></span>
<span class="normal"><a href="#__codelineno-0-249">249</a></span>
<span class="normal"><a href="#__codelineno-0-250">250</a></span>
<span class="normal"><a href="#__codelineno-0-251">251</a></span>
<span class="normal"><a href="#__codelineno-0-252">252</a></span>
<span class="normal"><a href="#__codelineno-0-253">253</a></span>
<span class="normal"><a href="#__codelineno-0-254">254</a></span>
<span class="normal"><a href="#__codelineno-0-255">255</a></span>
<span class="normal"><a href="#__codelineno-0-256">256</a></span>
<span class="normal"><a href="#__codelineno-0-257">257</a></span>
<span class="normal"><a href="#__codelineno-0-258">258</a></span>
<span class="normal"><a href="#__codelineno-0-259">259</a></span>
<span class="normal"><a href="#__codelineno-0-260">260</a></span>
<span class="normal"><a href="#__codelineno-0-261">261</a></span>
<span class="normal"><a href="#__codelineno-0-262">262</a></span>
<span class="normal"><a href="#__codelineno-0-263">263</a></span>
<span class="normal"><a href="#__codelineno-0-264">264</a></span>
<span class="normal"><a href="#__codelineno-0-265">265</a></span>
<span class="normal"><a href="#__codelineno-0-266">266</a></span>
<span class="normal"><a href="#__codelineno-0-267">267</a></span>
<span class="normal"><a href="#__codelineno-0-268">268</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-221" name="__codelineno-0-221"></a><span class="k">def</span><span class="w"> </span><span class="nf">normalize_dataframe</span><span class="p">(</span>
<a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="n">frame</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-223" name="__codelineno-0-223"></a> <span class="n">kind</span><span class="p">:</span> <span class="n">DataKind</span><span class="p">,</span>
<a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="o">*</span><span class="p">,</span>
<a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="n">symbol</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="n">timeframe</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="n">sort</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<a id="__codelineno-0-228" name="__codelineno-0-228"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Normalize MT5 DataFrame columns, timestamps, and storage metadata.</span>
<a id="__codelineno-0-230" name="__codelineno-0-230"></a>
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd"> Ensures UTC timestamps, optionally injects ``symbol`` / ``timeframe`` for</span>
<a id="__codelineno-0-232" name="__codelineno-0-232"></a><span class="sd"> storage-oriented datasets, and sorts chronologically when a ``time`` column</span>
<a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd"> exists.</span>
<a id="__codelineno-0-234" name="__codelineno-0-234"></a>
<a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-236" name="__codelineno-0-236"></a><span class="sd"> frame: Source DataFrame from MT5 or pdmt5.</span>
<a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="sd"> kind: Dataset kind guiding normalization rules.</span>
<a id="__codelineno-0-238" name="__codelineno-0-238"></a><span class="sd"> symbol: Optional symbol to inject when missing.</span>
<a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="sd"> timeframe: Optional timeframe integer or name to inject for rates.</span>
<a id="__codelineno-0-240" name="__codelineno-0-240"></a><span class="sd"> sort: Whether to sort by ``time`` or ``time_msc`` when present.</span>
<a id="__codelineno-0-241" name="__codelineno-0-241"></a>
<a id="__codelineno-0-242" name="__codelineno-0-242"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-243" name="__codelineno-0-243"></a><span class="sd"> Normalized DataFrame copy.</span>
<a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="k">if</span> <span class="n">frame</span><span class="o">.</span><span class="n">empty</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="k">return</span> <span class="n">frame</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<a id="__codelineno-0-247" name="__codelineno-0-247"></a>
<a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">normalize_time_columns</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">kind</span><span class="p">)</span>
<a id="__codelineno-0-249" name="__codelineno-0-249"></a>
<a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="k">if</span> <span class="n">symbol</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="s2">&quot;symbol&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="n">normalized</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s2">&quot;symbol&quot;</span><span class="p">,</span> <span class="n">normalize_symbol</span><span class="p">(</span><span class="n">symbol</span><span class="p">))</span>
<a id="__codelineno-0-252" name="__codelineno-0-252"></a>
<a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="k">if</span> <span class="n">timeframe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">kind</span> <span class="ow">is</span> <span class="n">DataKind</span><span class="o">.</span><span class="n">rates</span><span class="p">:</span>
<a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="n">tf</span> <span class="o">=</span> <span class="n">parse_timeframe</span><span class="p">(</span><span class="n">timeframe</span><span class="p">)</span>
<a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="k">if</span> <span class="s2">&quot;timeframe&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="n">insert_at</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="s2">&quot;symbol&quot;</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span> <span class="k">else</span> <span class="mi">0</span>
<a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="n">normalized</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">insert_at</span><span class="p">,</span> <span class="s2">&quot;timeframe&quot;</span><span class="p">,</span> <span class="n">tf</span><span class="p">)</span>
<a id="__codelineno-0-258" name="__codelineno-0-258"></a>
<a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="n">validate_schema</span><span class="p">(</span><span class="n">normalized</span><span class="p">,</span> <span class="n">kind</span><span class="p">)</span>
<a id="__codelineno-0-260" name="__codelineno-0-260"></a>
<a id="__codelineno-0-261" name="__codelineno-0-261"></a> <span class="k">if</span> <span class="n">sort</span><span class="p">:</span>
<a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="k">if</span> <span class="s2">&quot;time&quot;</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">normalized</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="s2">&quot;time&quot;</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;stable&quot;</span><span class="p">)</span>
<a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="k">elif</span> <span class="s2">&quot;time_msc&quot;</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">normalized</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="s2">&quot;time_msc&quot;</span><span class="p">,</span> <span class="n">kind</span><span class="o">=</span><span class="s2">&quot;stable&quot;</span><span class="p">)</span>
<a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">normalized</span><span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">drop</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<a id="__codelineno-0-267" name="__codelineno-0-267"></a>
<a id="__codelineno-0-268" name="__codelineno-0-268"></a> <span class="k">return</span> <span class="n">normalized</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.schemas.normalize_time_columns" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">normalize_time_columns</span>
<a href="#mt5cli.schemas.normalize_time_columns" 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">normalize_time_columns</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">frame</span><span class="p">:</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span><span class="p">,</span> <span class="n">kind</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Coerce dataset time columns to UTC-aware datetimes when present.</p>
<p>Any column in :data:<code>KNOWN_MT5_TIME_COLUMNS</code> that is present in <code>frame</code>
is normalized. Numeric MT5 epoch values use seconds for <code>time</code>,
<code>time_setup</code>, and <code>time_done</code>, and milliseconds for <code>*_msc</code> columns.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>frame</code>
</td>
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Source DataFrame from MT5 or pdmt5.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>kind</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Dataset kind (retained for API compatibility).</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>DataFrame copy with normalized time columns.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/schemas.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-198">198</a></span>
<span class="normal"><a href="#__codelineno-0-199">199</a></span>
<span class="normal"><a href="#__codelineno-0-200">200</a></span>
<span class="normal"><a href="#__codelineno-0-201">201</a></span>
<span class="normal"><a href="#__codelineno-0-202">202</a></span>
<span class="normal"><a href="#__codelineno-0-203">203</a></span>
<span class="normal"><a href="#__codelineno-0-204">204</a></span>
<span class="normal"><a href="#__codelineno-0-205">205</a></span>
<span class="normal"><a href="#__codelineno-0-206">206</a></span>
<span class="normal"><a href="#__codelineno-0-207">207</a></span>
<span class="normal"><a href="#__codelineno-0-208">208</a></span>
<span class="normal"><a href="#__codelineno-0-209">209</a></span>
<span class="normal"><a href="#__codelineno-0-210">210</a></span>
<span class="normal"><a href="#__codelineno-0-211">211</a></span>
<span class="normal"><a href="#__codelineno-0-212">212</a></span>
<span class="normal"><a href="#__codelineno-0-213">213</a></span>
<span class="normal"><a href="#__codelineno-0-214">214</a></span>
<span class="normal"><a href="#__codelineno-0-215">215</a></span>
<span class="normal"><a href="#__codelineno-0-216">216</a></span>
<span class="normal"><a href="#__codelineno-0-217">217</a></span>
<span class="normal"><a href="#__codelineno-0-218">218</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-198" name="__codelineno-0-198"></a><span class="k">def</span><span class="w"> </span><span class="nf">normalize_time_columns</span><span class="p">(</span><span class="n">frame</span><span class="p">:</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">,</span> <span class="n">kind</span><span class="p">:</span> <span class="n">DataKind</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">:</span>
<a id="__codelineno-0-199" name="__codelineno-0-199"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Coerce dataset time columns to UTC-aware datetimes when present.</span>
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
<a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="sd"> Any column in :data:`KNOWN_MT5_TIME_COLUMNS` that is present in ``frame``</span>
<a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> is normalized. Numeric MT5 epoch values use seconds for ``time``,</span>
<a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> ``time_setup``, and ``time_done``, and milliseconds for ``*_msc`` columns.</span>
<a id="__codelineno-0-204" name="__codelineno-0-204"></a>
<a id="__codelineno-0-205" name="__codelineno-0-205"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-206" name="__codelineno-0-206"></a><span class="sd"> frame: Source DataFrame from MT5 or pdmt5.</span>
<a id="__codelineno-0-207" name="__codelineno-0-207"></a><span class="sd"> kind: Dataset kind (retained for API compatibility).</span>
<a id="__codelineno-0-208" name="__codelineno-0-208"></a>
<a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="sd"> DataFrame copy with normalized time columns.</span>
<a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="k">del</span> <span class="n">kind</span>
<a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="n">normalized</span><span class="o">.</span><span class="n">columns</span><span class="p">:</span>
<a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="k">if</span> <span class="n">column</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_TIME_COLUMN_NAMES</span><span class="p">:</span>
<a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="k">continue</span>
<a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="n">normalized</span><span class="p">[</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">_coerce_mt5_time_column</span><span class="p">(</span><span class="n">normalized</span><span class="p">[</span><span class="n">column</span><span class="p">],</span> <span class="n">column</span><span class="p">)</span>
<a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">return</span> <span class="n">normalized</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="mt5cli.schemas.schema_columns" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">schema_columns</span>
<a href="#mt5cli.schemas.schema_columns" 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">schema_columns</span><span class="p">(</span><span class="n">kind</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="frozenset">frozenset</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">]</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Return required column names for a dataset kind.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>kind</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Dataset kind.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="frozenset">frozenset</span>[<span title="str">str</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Required column names for <code>kind</code>.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/schemas.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-141">141</a></span>
<span class="normal"><a href="#__codelineno-0-142">142</a></span>
<span class="normal"><a href="#__codelineno-0-143">143</a></span>
<span class="normal"><a href="#__codelineno-0-144">144</a></span>
<span class="normal"><a href="#__codelineno-0-145">145</a></span>
<span class="normal"><a href="#__codelineno-0-146">146</a></span>
<span class="normal"><a href="#__codelineno-0-147">147</a></span>
<span class="normal"><a href="#__codelineno-0-148">148</a></span>
<span class="normal"><a href="#__codelineno-0-149">149</a></span>
<span class="normal"><a href="#__codelineno-0-150">150</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="k">def</span><span class="w"> </span><span class="nf">schema_columns</span><span class="p">(</span><span class="n">kind</span><span class="p">:</span> <span class="n">DataKind</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">frozenset</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Return required column names for a dataset kind.</span>
<a id="__codelineno-0-143" name="__codelineno-0-143"></a>
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd"> kind: Dataset kind.</span>
<a id="__codelineno-0-146" name="__codelineno-0-146"></a>
<a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> Returns:</span>
<a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> Required column names for ``kind``.</span>
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-150" name="__codelineno-0-150"></a> <span class="k">return</span> <span class="n">REQUIRED_COLUMNS</span><span class="p">[</span><span class="n">kind</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.schemas.validate_schema" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">validate_schema</span>
<a href="#mt5cli.schemas.validate_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">validate_schema</span><span class="p">(</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">frame</span><span class="p">:</span> <span class="n"><span title="pandas.DataFrame">DataFrame</span></span><span class="p">,</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">kind</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></span><span class="p">,</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="o">*</span><span class="p">,</span>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="n">extra_required</span><span class="p">:</span> <span class="n"><span title="collections.abc.Iterable">Iterable</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="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</code></pre></div>
<div class="doc doc-contents ">
<p>Validate that a DataFrame includes required columns for a dataset kind.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>frame</code>
</td>
<td>
<code><span title="pandas.DataFrame">DataFrame</span></code>
</td>
<td>
<div class="doc-md-description">
<p>DataFrame to validate.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>kind</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="DataKind (mt5cli.schemas.DataKind)" href="#mt5cli.schemas.DataKind">DataKind</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Expected dataset kind.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>extra_required</code>
</td>
<td>
<code><span title="collections.abc.Iterable">Iterable</span>[<span title="str">str</span>] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Additional columns that must be present (for example
<code>symbol</code> and <code>timeframe</code> on stored rate history).</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<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><a class="autorefs autorefs-internal" title="Mt5SchemaError (mt5cli.exceptions.Mt5SchemaError)" href="../exceptions/#mt5cli.exceptions.Mt5SchemaError">Mt5SchemaError</a></code>
</td>
<td>
<div class="doc-md-description">
<p>If required columns are missing.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="mkdocstrings-source">
<summary>Source code in <code>mt5cli/schemas.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-153">153</a></span>
<span class="normal"><a href="#__codelineno-0-154">154</a></span>
<span class="normal"><a href="#__codelineno-0-155">155</a></span>
<span class="normal"><a href="#__codelineno-0-156">156</a></span>
<span class="normal"><a href="#__codelineno-0-157">157</a></span>
<span class="normal"><a href="#__codelineno-0-158">158</a></span>
<span class="normal"><a href="#__codelineno-0-159">159</a></span>
<span class="normal"><a href="#__codelineno-0-160">160</a></span>
<span class="normal"><a href="#__codelineno-0-161">161</a></span>
<span class="normal"><a href="#__codelineno-0-162">162</a></span>
<span class="normal"><a href="#__codelineno-0-163">163</a></span>
<span class="normal"><a href="#__codelineno-0-164">164</a></span>
<span class="normal"><a href="#__codelineno-0-165">165</a></span>
<span class="normal"><a href="#__codelineno-0-166">166</a></span>
<span class="normal"><a href="#__codelineno-0-167">167</a></span>
<span class="normal"><a href="#__codelineno-0-168">168</a></span>
<span class="normal"><a href="#__codelineno-0-169">169</a></span>
<span class="normal"><a href="#__codelineno-0-170">170</a></span>
<span class="normal"><a href="#__codelineno-0-171">171</a></span>
<span class="normal"><a href="#__codelineno-0-172">172</a></span>
<span class="normal"><a href="#__codelineno-0-173">173</a></span>
<span class="normal"><a href="#__codelineno-0-174">174</a></span>
<span class="normal"><a href="#__codelineno-0-175">175</a></span>
<span class="normal"><a href="#__codelineno-0-176">176</a></span>
<span class="normal"><a href="#__codelineno-0-177">177</a></span>
<span class="normal"><a href="#__codelineno-0-178">178</a></span>
<span class="normal"><a href="#__codelineno-0-179">179</a></span>
<span class="normal"><a href="#__codelineno-0-180">180</a></span>
<span class="normal"><a href="#__codelineno-0-181">181</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="k">def</span><span class="w"> </span><span class="nf">validate_schema</span><span class="p">(</span>
<a id="__codelineno-0-154" name="__codelineno-0-154"></a> <span class="n">frame</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-155" name="__codelineno-0-155"></a> <span class="n">kind</span><span class="p">:</span> <span class="n">DataKind</span><span class="p">,</span>
<a id="__codelineno-0-156" name="__codelineno-0-156"></a> <span class="o">*</span><span class="p">,</span>
<a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="n">extra_required</span><span class="p">:</span> <span class="n">Iterable</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="o">=</span> <span class="kc">None</span><span class="p">,</span>
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Validate that a DataFrame includes required columns for a dataset kind.</span>
<a id="__codelineno-0-160" name="__codelineno-0-160"></a>
<a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="sd"> Args:</span>
<a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd"> frame: DataFrame to validate.</span>
<a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> kind: Expected dataset kind.</span>
<a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> extra_required: Additional columns that must be present (for example</span>
<a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> ``symbol`` and ``timeframe`` on stored rate history).</span>
<a id="__codelineno-0-166" name="__codelineno-0-166"></a>
<a id="__codelineno-0-167" name="__codelineno-0-167"></a><span class="sd"> Raises:</span>
<a id="__codelineno-0-168" name="__codelineno-0-168"></a><span class="sd"> Mt5SchemaError: If required columns are missing.</span>
<a id="__codelineno-0-169" name="__codelineno-0-169"></a><span class="sd"> &quot;&quot;&quot;</span>
<a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="k">if</span> <span class="n">frame</span><span class="o">.</span><span class="n">empty</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="k">return</span>
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">required</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">REQUIRED_COLUMNS</span><span class="p">[</span><span class="n">kind</span><span class="p">])</span>
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="k">if</span> <span class="n">extra_required</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="n">required</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">extra_required</span><span class="p">)</span>
<a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="n">missing</span> <span class="o">=</span> <span class="n">required</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">columns</span><span class="p">)</span>
<a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">if</span> <span class="n">missing</span><span class="p">:</span>
<a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<a id="__codelineno-0-178" name="__codelineno-0-178"></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">kind</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2"> schema is missing required columns: &quot;</span>
<a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">missing</span><span class="p">))</span><span class="si">}</span><span class="s2">.&quot;</span>
<a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="p">)</span>
<a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="k">raise</span> <span class="n">Mt5SchemaError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "../..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../../js/base.js"></script>
<script src="../../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>