<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>WTSolutions Invest</title>
  
  <subtitle>| QMT 使用指南 | IBKR 使用指南 | Investment故事 |</subtitle>
  <link href="https://invest.wtsolutions.cn/atom.xml" rel="self"/>
  
  <link href="https://invest.wtsolutions.cn/"/>
  <updated>2026-08-16T07:05:31.969Z</updated>
  <id>https://invest.wtsolutions.cn/</id>
  
  <author>
    <name>WTSolutions</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>MiniQMT停用？HTTP桥接拯救旧策略</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-miniqmt-bridge/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-miniqmt-bridge/</id>
    <published>2026-08-16T03:00:00.000Z</published>
    <updated>2026-08-16T07:05:31.969Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、背景：MiniQMT-退出舞台，旧策略怎么办？"><a href="#一、背景：MiniQMT-退出舞台，旧策略怎么办？" class="headerlink" title="一、背景：MiniQMT 退出舞台，旧策略怎么办？"></a>一、背景：MiniQMT 退出舞台，旧策略怎么办？</h2><p>在上一篇 <a href="../miniqmt-termination">《网传 MiniQMT 将被关闭？事实核查与应对指南（2026 版）》</a> 里已经说过：自 2026 年 7 月起，多家券商已陆续收紧 MiniQMT 权限，存量客户大概率会在 1～2 个月内被清退，本地原生 Python + <code>xtquant</code> 直连模式即将成为历史。</p><p>但现实是：<strong>大多数个人量化的策略代码已经跑了很多年</strong>——指标计算、信号判断、行情订阅都依赖 <code>xtquant</code>，迁移成本极高。重写一遍不仅费时，还容易把原本稳定的策略写崩。</p><p>那有没有办法<strong>既不放弃 MiniQMT 端成熟的策略代码，又能把”真实下单”放到合规的大 QMT 里跑</strong>？答案是：<strong>HTTP 桥接</strong>。</p><hr><h2 id="二、方案核心思想：分析在-miniQMT，下单在大-QMT"><a href="#二、方案核心思想：分析在-miniQMT，下单在大-QMT" class="headerlink" title="二、方案核心思想：分析在 miniQMT，下单在大 QMT"></a>二、方案核心思想：分析在 miniQMT，下单在大 QMT</h2><p>把整个交易流程拆成两段：</p><table><thead><tr><th>角色</th><th>职责</th><th>运行环境</th></tr></thead><tbody><tr><td><strong>QMT 外 python端</strong></td><td>用python 代码计算指标、产生信号、通过 HTTP 发起下单</td><td>Python</td></tr><tr><td><strong>大 QMT 端</strong></td><td>起一个 HTTP 服务，接收下单&#x2F;撤单&#x2F;查询请求，在 QMT 主线程通过 <code>passorder</code> 执行</td><td>大 QMT 模型交易沙箱</td></tr></tbody></table><p>这样做的好处非常明显：</p><ol><li>✅ <strong>策略代码 90% 不用动</strong>：指标、信号、风控逻辑继续留在 python 跑</li><li>✅ <strong>下单走合规通道</strong>：所有 <code>passorder</code> 都在大 QMT 内执行，不触碰”外接系统”红线</li><li>✅ <strong>行情双通道</strong>：miniQMT 本地 <code>xtdata</code> 仍可作主源，大 QMT HTTP 作 fallback</li><li>✅ <strong>平滑过渡</strong>：MiniQMT 真正停用那天，只需把”分析”也迁到大 QMT，桥接代码可保留复用</li></ol><hr><h2 id="三、架构总览"><a href="#三、架构总览" class="headerlink" title="三、架构总览"></a>三、架构总览</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">+----------------------+          +----------------------+</span><br><span class="line">|      外部python端     |          |      大 QMT 端       |</span><br><span class="line">| +------------------+ |  HTTP    | +------------------+ |</span><br><span class="line">| | xtquant 取行情    | | --POST--&gt;| | passorder 下单    | |</span><br><span class="line">| | 计算指标 / 信号    | | &lt;-JSON--| | get_full_tick 行情 | |</span><br><span class="line">| | QMTClient 下单    | |         | | get_trade_detail  | |</span><br><span class="line">| +------------------+ |          | +------------------+ |</span><br><span class="line">+----------------------+          +----------------------+</span><br></pre></td></tr></table></figure><p><strong>关键设计点</strong>：</p><ul><li><strong>下单&#x2F;撤单走任务队列 + 200ms 定时器消费</strong>：避免 HTTP 线程直接调 <code>passorder</code> 的多线程风险（QMT 交易 API 不保证线程安全）</li><li><strong>查询&#x2F;行情直接在 HTTP 线程读取本地缓存</strong>：<code>get_full_tick</code> &#x2F; <code>get_trade_detail_data</code> 是只读本地缓存，可安全跨线程调用</li><li><strong>HTTP 服务用 daemon 线程</strong>：策略停止时自动退出，不留僵尸进程</li></ul><hr><h2 id="四、部署步骤"><a href="#四、部署步骤" class="headerlink" title="四、部署步骤"></a>四、部署步骤</h2><h3 id="4-1-大-QMT-端（qmt-http-server-py）"><a href="#4-1-大-QMT-端（qmt-http-server-py）" class="headerlink" title="4.1 大 QMT 端（qmt_http_server.py）"></a>4.1 大 QMT 端（<code>qmt_http_server.py</code>）</h3><ol><li>打开大 QMT 客户端 → <strong>模型交易</strong> → <strong>新建策略</strong>，把 <code>qmt_http_server.py</code> 内容粘贴进去</li><li>在右侧设置：<ul><li><strong>资金账号</strong>：选择已登录的实盘&#x2F;模拟账号（<strong>先用模拟账号验证！</strong>）</li><li><strong>运行模式</strong>：实盘模式</li><li><strong>周期</strong>：随意（本策略不依赖 K 线）</li></ul></li><li>启动策略，输出框看到以下两行即服务就绪：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[Bridge] HTTP server started on 0.0.0.0:8899</span><br><span class="line">[Bridge] init done. account=XXX type=STOCK consume_interval=200ms</span><br></pre></td></tr></table></figure><h3 id="4-2-外部-python-端（miniqmt-client-py）"><a href="#4-2-外部-python-端（miniqmt-client-py）" class="headerlink" title="4.2 外部 python 端（miniqmt_client.py）"></a>4.2 外部 python 端（<code>miniqmt_client.py</code>）</h3><ol><li>编辑 <code>miniqmt_client.py</code>，确认 <code>QMT_HTTP_HOST</code> 指向大 QMT 所在机器：</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">QMT_HTTP_HOST = <span class="string">&#x27;http://127.0.0.1:8899&#x27;</span>  <span class="comment"># 跨机时改大 QMT 的实际 IP</span></span><br></pre></td></tr></table></figure><ol start="2"><li>把 <code>miniqmt_client.py</code> 复制到策略目录</li><li>python 客户端 → <strong>策略列表</strong> → <strong>新建策略</strong> → 选择本文件 → 运行</li><li>看到以下输出即桥接打通：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[Bridge] 大 QMT 已连接，account=XXX</span><br><span class="line">[Bridge] xtquant 加载成功</span><br></pre></td></tr></table></figure><hr><h2 id="五、代码详解"><a href="#五、代码详解" class="headerlink" title="五、代码详解"></a>五、代码详解</h2><h3 id="5-1-大-QMT-端：HTTP-服务-任务队列"><a href="#5-1-大-QMT-端：HTTP-服务-任务队列" class="headerlink" title="5.1 大 QMT 端：HTTP 服务 + 任务队列"></a>5.1 大 QMT 端：HTTP 服务 + 任务队列</h3><p><code>qmt_http_server.py</code> 的核心是三件事：</p><ol><li><strong>在 <code>init</code> 钩子里启动 daemon HTTP 线程</strong> + 注册 200ms 定时器</li><li><strong>HTTP Handler 接收请求</strong>：下单&#x2F;撤单进队列，查询&#x2F;行情直接返回</li><li><strong><code>consume_tasks</code> 定时器回调</strong>：在策略主线程从队列取出任务调 <code>passorder</code></li></ol><p>下面是关键代码片段：</p><p><strong>启动 HTTP 服务 + 定时器（init 钩子）</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="keyword">global</span> G_CONTEXT, G_ACCOUNT, G_ACCOUNT_TYPE</span><br><span class="line">    G_CONTEXT = ContextInfo</span><br><span class="line">    G_ACCOUNT = account</span><br><span class="line">    G_ACCOUNT_TYPE = accountType</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 起 daemon HTTP 线程，策略停止时自动退出</span></span><br><span class="line">    t = threading.Thread(target=_start_http_server, daemon=<span class="literal">True</span>)</span><br><span class="line">    t.start()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 注册 200ms 定时器消费任务队列</span></span><br><span class="line">    period = <span class="string">&#x27;%dnMilliSecond&#x27;</span> % CONSUME_INTERVAL_MS</span><br><span class="line">    ContextInfo.run_time(<span class="string">&#x27;consume_tasks&#x27;</span>, period, <span class="string">&#x27;2000-01-01 00:00:00&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;[Bridge] init done. account=%s type=%s consume_interval=%dms&#x27;</span></span><br><span class="line">          % (G_ACCOUNT, G_ACCOUNT_TYPE, CONSUME_INTERVAL_MS))</span><br></pre></td></tr></table></figure><p><strong>下单入队（HTTP 线程，不做真实下单）</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">_handle_order</span>(<span class="params">self, body</span>):</span><br><span class="line">    required = [<span class="string">&#x27;opType&#x27;</span>, <span class="string">&#x27;orderType&#x27;</span>, <span class="string">&#x27;orderCode&#x27;</span>, <span class="string">&#x27;prType&#x27;</span>, <span class="string">&#x27;price&#x27;</span>, <span class="string">&#x27;volume&#x27;</span>]</span><br><span class="line">    <span class="keyword">for</span> r <span class="keyword">in</span> required:</span><br><span class="line">        <span class="keyword">if</span> r <span class="keyword">not</span> <span class="keyword">in</span> body:</span><br><span class="line">            <span class="variable language_">self</span>._send(<span class="number">400</span>, &#123;<span class="string">&#x27;error&#x27;</span>: <span class="string">&#x27;missing field: &#x27;</span> + r&#125;)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">    task = &#123;</span><br><span class="line">        <span class="string">&#x27;kind&#x27;</span>: <span class="string">&#x27;order&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;opType&#x27;</span>: <span class="built_in">int</span>(body[<span class="string">&#x27;opType&#x27;</span>]),</span><br><span class="line">        <span class="string">&#x27;orderType&#x27;</span>: <span class="built_in">int</span>(body[<span class="string">&#x27;orderType&#x27;</span>]),</span><br><span class="line">        <span class="string">&#x27;accountid&#x27;</span>: body.get(<span class="string">&#x27;accountid&#x27;</span>, G_ACCOUNT),</span><br><span class="line">        <span class="string">&#x27;orderCode&#x27;</span>: body[<span class="string">&#x27;orderCode&#x27;</span>],</span><br><span class="line">        <span class="string">&#x27;prType&#x27;</span>: <span class="built_in">int</span>(body[<span class="string">&#x27;prType&#x27;</span>]),</span><br><span class="line">        <span class="string">&#x27;price&#x27;</span>: <span class="built_in">float</span>(body[<span class="string">&#x27;price&#x27;</span>]),</span><br><span class="line">        <span class="string">&#x27;volume&#x27;</span>: <span class="built_in">float</span>(body[<span class="string">&#x27;volume&#x27;</span>]),</span><br><span class="line">        <span class="string">&#x27;strategyName&#x27;</span>: body.get(<span class="string">&#x27;strategyName&#x27;</span>, <span class="string">&#x27;http_bridge&#x27;</span>),</span><br><span class="line">        <span class="string">&#x27;quickTrade&#x27;</span>: <span class="built_in">int</span>(body.get(<span class="string">&#x27;quickTrade&#x27;</span>, <span class="number">2</span>)),</span><br><span class="line">        <span class="string">&#x27;userOrderId&#x27;</span>: body.get(<span class="string">&#x27;userOrderId&#x27;</span>, <span class="string">&#x27;&#x27;</span>),</span><br><span class="line">        <span class="string">&#x27;enqueued_at&#x27;</span>: time.time(),</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">with</span> TASK_LOCK:</span><br><span class="line">        TASK_QUEUE.append(task)</span><br><span class="line">        queued = <span class="built_in">len</span>(TASK_QUEUE)</span><br><span class="line">    <span class="variable language_">self</span>._send(<span class="number">200</span>, &#123;<span class="string">&#x27;ok&#x27;</span>: <span class="literal">True</span>, <span class="string">&#x27;msg&#x27;</span>: <span class="string">&#x27;order queued&#x27;</span>, <span class="string">&#x27;queued&#x27;</span>: queued&#125;)</span><br></pre></td></tr></table></figure><p><strong>定时器消费任务（主线程，安全调 passorder）</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">consume_tasks</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    batch = []</span><br><span class="line">    <span class="keyword">with</span> TASK_LOCK:</span><br><span class="line">        <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(MAX_BATCH_PER_TICK):</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> TASK_QUEUE:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            batch.append(TASK_QUEUE.popleft())</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> batch:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> task <span class="keyword">in</span> batch:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">if</span> task[<span class="string">&#x27;kind&#x27;</span>] == <span class="string">&#x27;order&#x27;</span>:</span><br><span class="line">                <span class="comment"># 11 参数完整版 passorder</span></span><br><span class="line">                passorder(</span><br><span class="line">                    task[<span class="string">&#x27;opType&#x27;</span>], task[<span class="string">&#x27;orderType&#x27;</span>], task[<span class="string">&#x27;accountid&#x27;</span>],</span><br><span class="line">                    task[<span class="string">&#x27;orderCode&#x27;</span>], task[<span class="string">&#x27;prType&#x27;</span>], task[<span class="string">&#x27;price&#x27;</span>],</span><br><span class="line">                    task[<span class="string">&#x27;volume&#x27;</span>], task[<span class="string">&#x27;strategyName&#x27;</span>],</span><br><span class="line">                    task[<span class="string">&#x27;quickTrade&#x27;</span>], task[<span class="string">&#x27;userOrderId&#x27;</span>], ContextInfo</span><br><span class="line">                )</span><br><span class="line">            <span class="keyword">elif</span> task[<span class="string">&#x27;kind&#x27;</span>] == <span class="string">&#x27;cancel&#x27;</span>:</span><br><span class="line">                cancel(task[<span class="string">&#x27;orderId&#x27;</span>], task[<span class="string">&#x27;accountid&#x27;</span>],</span><br><span class="line">                       task[<span class="string">&#x27;accountType&#x27;</span>], ContextInfo)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;[Bridge] task error: %s | task=%s&#x27;</span> % (e, task))</span><br></pre></td></tr></table></figure><p><strong>为什么必须用队列 + 定时器，不能直接在 HTTP 线程里调 <code>passorder</code>？</strong></p><p><code>passorder</code> 是 QMT 客户端交易主线程的同步调用，从其他线程直接调可能导致：</p><ul><li>委托号错乱</li><li>客户端崩溃</li><li>柜台连接断开</li></ul><p>QMT 官方文档明确要求：<strong>所有交易相关 API 必须在策略主线程调用</strong>。所以最稳的做法是 HTTP 线程只入队，主线程定时器出队执行。</p><h3 id="5-2-miniQMT-端：策略-HTTP-客户端封装"><a href="#5-2-miniQMT-端：策略-HTTP-客户端封装" class="headerlink" title="5.2 miniQMT 端：策略 + HTTP 客户端封装"></a>5.2 miniQMT 端：策略 + HTTP 客户端封装</h3><p><code>miniqmt_client.py</code> 提供了一个 <code>QMTClient</code> 类，把所有 HTTP 调用封装成 Python 方法，使用起来就像本地 API：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">QMTClient</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host=QMT_HTTP_HOST, timeout=HTTP_TIMEOUT</span>):</span><br><span class="line">        <span class="variable language_">self</span>.host = host.rstrip(<span class="string">&#x27;/&#x27;</span>)</span><br><span class="line">        <span class="variable language_">self</span>.timeout = timeout</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_post</span>(<span class="params">self, path, body</span>):</span><br><span class="line">        data = json.dumps(body, ensure_ascii=<span class="literal">False</span>).encode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        req = urllib.request.Request(</span><br><span class="line">            <span class="variable language_">self</span>.host + path, data=data,</span><br><span class="line">            headers=&#123;<span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json; charset=utf-8&#x27;</span>&#125;,</span><br><span class="line">            method=<span class="string">&#x27;POST&#x27;</span></span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">with</span> urllib.request.urlopen(req, timeout=<span class="variable language_">self</span>.timeout) <span class="keyword">as</span> resp:</span><br><span class="line">                <span class="keyword">return</span> json.loads(resp.read().decode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">        <span class="keyword">except</span> urllib.error.HTTPError <span class="keyword">as</span> e:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="keyword">return</span> json.loads(e.read().decode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">            <span class="keyword">except</span> Exception:</span><br><span class="line">                <span class="keyword">return</span> &#123;<span class="string">&#x27;error&#x27;</span>: <span class="string">&#x27;HTTP %d&#x27;</span> % e.code, <span class="string">&#x27;detail&#x27;</span>: <span class="built_in">str</span>(e)&#125;</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="keyword">return</span> &#123;<span class="string">&#x27;error&#x27;</span>: <span class="built_in">str</span>(e)&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">buy_stock</span>(<span class="params">self, code, volume, price=<span class="number">0</span>, prType=<span class="number">5</span>,</span></span><br><span class="line"><span class="params">                  strategyName=<span class="string">&#x27;&#x27;</span>, userOrderId=<span class="string">&#x27;&#x27;</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;股票买入：opType=23 orderType=1101（按数量）&quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">self</span>.order(<span class="number">23</span>, <span class="number">1101</span>, code, prType, price, volume,</span><br><span class="line">                          strategyName, <span class="number">2</span>, userOrderId)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">sell_stock</span>(<span class="params">self, code, volume, price=<span class="number">0</span>, prType=<span class="number">5</span>,</span></span><br><span class="line"><span class="params">                   strategyName=<span class="string">&#x27;&#x27;</span>, userOrderId=<span class="string">&#x27;&#x27;</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;股票卖出：opType=24 orderType=1101（按数量）&quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">self</span>.order(<span class="number">24</span>, <span class="number">1101</span>, code, prType, price, volume,</span><br><span class="line">                          strategyName, <span class="number">2</span>, userOrderId)</span><br></pre></td></tr></table></figure><p><strong>策略主循环（miniQMT 端演示）</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">on_strategy_tick</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="keyword">if</span> cli <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    now = time.strftime(<span class="string">&#x27;%H%M%S&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> now &lt; <span class="string">&#x27;093000&#x27;</span> <span class="keyword">or</span> now &gt; <span class="string">&#x27;150000&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    ticks = _get_ticks(STOCK_POOL)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ticks:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> code, tick <span class="keyword">in</span> ticks.items():</span><br><span class="line">        last = tick.get(<span class="string">&#x27;lastPrice&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">        pre_close = tick.get(<span class="string">&#x27;lastClose&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> (last &gt; <span class="number">0</span> <span class="keyword">and</span> pre_close &gt; <span class="number">0</span>):</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        ratio = last / pre_close</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;[miniQMT] %s last=%s preClose=%s ratio=%.4f&#x27;</span></span><br><span class="line">              % (code, last, pre_close, ratio))</span><br><span class="line"></span><br><span class="line">        <span class="comment"># ====== 策略信号演示（!!实盘慎用!! 先用模拟账号） ======</span></span><br><span class="line">        <span class="comment"># 信号：涨幅 &gt;= 2% 触发买入 100 股（最新价）</span></span><br><span class="line">        <span class="comment"># if ratio &gt;= BUY_THRESHOLD:</span></span><br><span class="line">        <span class="comment">#     r = cli.buy_stock(code, 100, strategyName=&#x27;demo_buy&#x27;)</span></span><br><span class="line">        <span class="comment">#     print(&#x27;[miniQMT] 下单结果:&#x27;, r)</span></span><br></pre></td></tr></table></figure><p><strong>行情双通道（重点）</strong></p><p>miniQMT 端取行情有两种方式，互为补充：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">_get_ticks</span>(<span class="params">codes</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;优先 xtquant 取行情，否则走大 QMT HTTP&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 方式 A：xtquant（miniQMT 本地行情源，无网络往返）</span></span><br><span class="line">    <span class="keyword">if</span> xt <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            data = xt.get_full_tick(codes)</span><br><span class="line">            <span class="keyword">return</span> data <span class="keyword">or</span> &#123;&#125;</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;[miniQMT] xtquant get_full_tick 失败，转 HTTP:&#x27;</span>, e)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 方式 B：大 QMT HTTP（兜底）</span></span><br><span class="line">    r = cli.quote(codes)</span><br><span class="line">    <span class="keyword">if</span> r.get(<span class="string">&#x27;ok&#x27;</span>):</span><br><span class="line">        <span class="keyword">return</span> r.get(<span class="string">&#x27;data&#x27;</span>, &#123;&#125;)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;[miniQMT] HTTP quote 失败:&#x27;</span>, r.get(<span class="string">&#x27;error&#x27;</span>))</span><br><span class="line">    <span class="keyword">return</span> &#123;&#125;</span><br></pre></td></tr></table></figure><p>策略代码里这一段是迁移的核心红利——<strong>MiniQMT 真正停用后，把方式 A 注释掉，方式 B 自动接管</strong>，几乎零修改就能继续跑。</p><hr><h2 id="六、HTTP-接口文档"><a href="#六、HTTP-接口文档" class="headerlink" title="六、HTTP 接口文档"></a>六、HTTP 接口文档</h2><p>所有响应均为 JSON。</p><table><thead><tr><th>路径</th><th>方法</th><th>用途</th></tr></thead><tbody><tr><td><code>/ping</code></td><td>GET</td><td>健康检查，返回 <code>account</code> &#x2F; <code>accountType</code></td></tr><tr><td><code>/quote?code=A,B,C</code></td><td>GET</td><td>取最新 tick 快照（多码逗号分隔）</td></tr><tr><td><code>/quote</code></td><td>POST</td><td>body: <code>{&quot;codes&quot;: [&quot;A&quot;,&quot;B&quot;]}</code>，同上</td></tr><tr><td><code>/position</code></td><td>GET</td><td>查询持仓（<code>get_trade_detail_data</code>）</td></tr><tr><td><code>/order</code></td><td>GET</td><td>查询当日委托</td></tr><tr><td><code>/deal</code></td><td>GET</td><td>查询当日成交</td></tr><tr><td><code>/account</code></td><td>GET</td><td>查询账号资金</td></tr><tr><td><code>/query</code></td><td>POST</td><td>body: <code>{&quot;type&quot;:&quot;position|order|deal|account&quot;}</code></td></tr><tr><td><code>/order</code></td><td>POST</td><td>下单（入队，200ms 内消费）</td></tr><tr><td><code>/cancel</code></td><td>POST</td><td>撤单（入队，200ms 内消费）</td></tr></tbody></table><h3 id="下单-order-的-body-字段"><a href="#下单-order-的-body-字段" class="headerlink" title="下单 /order 的 body 字段"></a>下单 <code>/order</code> 的 body 字段</h3><p><strong>必填</strong>：</p><table><thead><tr><th>字段</th><th>类型</th><th>说明</th></tr></thead><tbody><tr><td><code>opType</code></td><td>int</td><td>23&#x3D;股票买 24&#x3D;股票卖 0&#x3D;期货开多 …（见枚举速查）</td></tr><tr><td><code>orderType</code></td><td>int</td><td>1101&#x3D;按数量 1102&#x3D;按金额</td></tr><tr><td><code>orderCode</code></td><td>str</td><td><code>&#39;000001.SZ&#39;</code> &#x2F; <code>&#39;rb2401.SF&#39;</code> 等</td></tr><tr><td><code>prType</code></td><td>int</td><td>5&#x3D;最新价 11&#x3D;指定价 14&#x3D;对手价 42&#x3D;市价</td></tr><tr><td><code>price</code></td><td>float</td><td><code>prType=11/49</code> 时填具体价格，其余填 0</td></tr><tr><td><code>volume</code></td><td>float</td><td>股数 &#x2F; 手数 &#x2F; 金额（视 <code>orderType</code> 而定）</td></tr></tbody></table><p><strong>可选</strong>：</p><table><thead><tr><th>字段</th><th>类型</th><th>说明</th></tr></thead><tbody><tr><td><code>accountid</code></td><td>str</td><td>不填则用策略配置的账号</td></tr><tr><td><code>strategyName</code></td><td>str</td><td>策略名，用于区分不同来源的委托</td></tr><tr><td><code>quickTrade</code></td><td>int</td><td>默认 2（立即下单，定时器场景必须用 2）；0&#x3D;K 线结束触发 1&#x3D;最新 K 线触发 2&#x3D;立即触发</td></tr><tr><td><code>userOrderId</code></td><td>str</td><td>投资备注，用于后续查询&#x2F;匹配委托</td></tr></tbody></table><p><strong>下单响应</strong>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;ok&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span> <span class="attr">&quot;msg&quot;</span><span class="punctuation">:</span> <span class="string">&quot;order queued&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;queued&quot;</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><code>queued</code> &#x3D; 当前队列里还没消费的任务数。</p><h3 id="撤单-cancel-的-body-字段"><a href="#撤单-cancel-的-body-字段" class="headerlink" title="撤单 /cancel 的 body 字段"></a>撤单 <code>/cancel</code> 的 body 字段</h3><table><thead><tr><th>字段</th><th>类型</th><th>说明</th></tr></thead><tbody><tr><td><code>orderId</code></td><td>str</td><td><strong>必填</strong>，委托号</td></tr><tr><td><code>accountid</code></td><td>str</td><td>可选，不填用默认账号</td></tr><tr><td><code>accountType</code></td><td>str</td><td>可选，<code>&#39;STOCK&#39;</code>&#x2F;<code>&#39;FUTURE&#39;</code>&#x2F;<code>&#39;CREDIT&#39;</code> 等</td></tr></tbody></table><h3 id="行情-quote-响应字段（get-full-tick-返回）"><a href="#行情-quote-响应字段（get-full-tick-返回）" class="headerlink" title="行情 /quote 响应字段（get_full_tick 返回）"></a>行情 <code>/quote</code> 响应字段（<code>get_full_tick</code> 返回）</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;000001.SZ&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;lastPrice&quot;</span><span class="punctuation">:</span> <span class="number">10.60</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;lastClose&quot;</span><span class="punctuation">:</span> <span class="number">10.50</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;open&quot;</span><span class="punctuation">:</span> <span class="number">10.55</span><span class="punctuation">,</span> <span class="attr">&quot;high&quot;</span><span class="punctuation">:</span> <span class="number">10.70</span><span class="punctuation">,</span> <span class="attr">&quot;low&quot;</span><span class="punctuation">:</span> <span class="number">10.40</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;volume&quot;</span><span class="punctuation">:</span> <span class="number">100000</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;amount&quot;</span><span class="punctuation">:</span> <span class="number">1060000</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;askPrice&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="number">10.61</span><span class="punctuation">,</span> <span class="number">10.62</span><span class="punctuation">,</span> <span class="number">10.63</span><span class="punctuation">,</span> <span class="number">10.64</span><span class="punctuation">,</span> <span class="number">10.65</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;bidPrice&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="number">10.59</span><span class="punctuation">,</span> <span class="number">10.58</span><span class="punctuation">,</span> <span class="number">10.57</span><span class="punctuation">,</span> <span class="number">10.56</span><span class="punctuation">,</span> <span class="number">10.55</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;askVol&quot;</span><span class="punctuation">:</span>   <span class="punctuation">[</span><span class="number">1000</span><span class="punctuation">,</span> <span class="number">2000</span><span class="punctuation">,</span> <span class="number">1500</span><span class="punctuation">,</span> <span class="number">800</span><span class="punctuation">,</span> <span class="number">600</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;bidVol&quot;</span><span class="punctuation">:</span>   <span class="punctuation">[</span><span class="number">500</span><span class="punctuation">,</span> <span class="number">800</span><span class="punctuation">,</span> <span class="number">1200</span><span class="punctuation">,</span> <span class="number">900</span><span class="punctuation">,</span> <span class="number">400</span><span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="持仓-position-字段（节选）"><a href="#持仓-position-字段（节选）" class="headerlink" title="持仓 /position 字段（节选）"></a>持仓 <code>/position</code> 字段（节选）</h3><table><thead><tr><th>字段</th><th>含义</th></tr></thead><tbody><tr><td><code>m_strInstrumentID</code></td><td>证券代码</td></tr><tr><td><code>m_strExchangeID</code></td><td>市场</td></tr><tr><td><code>m_nVolume</code></td><td>持仓量</td></tr><tr><td><code>m_nCanUseVolume</code></td><td>可用数量</td></tr><tr><td><code>m_dOpenPrice</code></td><td>成本价</td></tr><tr><td><code>m_dInstrumentValue</code></td><td>市值</td></tr><tr><td><code>m_dPositionCost</code></td><td>持仓成本</td></tr><tr><td><code>m_dPositionProfit</code></td><td>持仓盈亏</td></tr></tbody></table><h3 id="账号-account-字段（节选）"><a href="#账号-account-字段（节选）" class="headerlink" title="账号 /account 字段（节选）"></a>账号 <code>/account</code> 字段（节选）</h3><table><thead><tr><th>字段</th><th>含义</th></tr></thead><tbody><tr><td><code>m_dBalance</code></td><td>总资产</td></tr><tr><td><code>m_dAssureAsset</code></td><td>净资产</td></tr><tr><td><code>m_dInstrumentValue</code></td><td>总市值</td></tr><tr><td><code>m_dTotalDebit</code></td><td>总负债</td></tr><tr><td><code>m_dAvailable</code></td><td>可用金额</td></tr><tr><td><code>m_dPositionProfit</code></td><td>持仓盈亏</td></tr></tbody></table><hr><h2 id="七、常用枚举速查"><a href="#七、常用枚举速查" class="headerlink" title="七、常用枚举速查"></a>七、常用枚举速查</h2><h3 id="opType（操作类型）"><a href="#opType（操作类型）" class="headerlink" title="opType（操作类型）"></a>opType（操作类型）</h3><table><thead><tr><th>值</th><th>含义</th><th>值</th><th>含义</th></tr></thead><tbody><tr><td>23</td><td>股票买入</td><td>24</td><td>股票卖出</td></tr><tr><td>0</td><td>期货开多</td><td>3</td><td>期货开空</td></tr><tr><td>2</td><td>期货平今多</td><td>5</td><td>期货平今空</td></tr><tr><td>33</td><td>两融担保品买入</td><td>34</td><td>两融担保品卖出</td></tr><tr><td>27</td><td>融资买入</td><td>28</td><td>融券卖出</td></tr><tr><td>50</td><td>期权买入开仓</td><td>51</td><td>期权卖出平仓</td></tr><tr><td>60</td><td>ETF 申购</td><td>61</td><td>ETF 赎回</td></tr></tbody></table><h3 id="prType（价格类型）"><a href="#prType（价格类型）" class="headerlink" title="prType（价格类型）"></a>prType（价格类型）</h3><table><thead><tr><th>值</th><th>含义</th></tr></thead><tbody><tr><td>5</td><td>最新价</td></tr><tr><td>11</td><td>指定价（必须填 <code>price</code>）</td></tr><tr><td>14</td><td>对手价</td></tr><tr><td>42</td><td>市价（沪市有保护限价）</td></tr><tr><td>49</td><td>五档即时剩转限</td></tr></tbody></table><hr><h2 id="八、可调参数（qmt-http-server-py-顶部）"><a href="#八、可调参数（qmt-http-server-py-顶部）" class="headerlink" title="八、可调参数（qmt_http_server.py 顶部）"></a>八、可调参数（<code>qmt_http_server.py</code> 顶部）</h2><table><thead><tr><th>参数</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>HTTP_HOST</code></td><td><code>&#39;0.0.0.0&#39;</code></td><td>监听网卡；只本机访问改 <code>&#39;127.0.0.1&#39;</code></td></tr><tr><td><code>HTTP_PORT</code></td><td><code>8899</code></td><td>HTTP 端口</td></tr><tr><td><code>CONSUME_INTERVAL_MS</code></td><td><code>200</code></td><td>任务消费周期（毫秒），越小越实时</td></tr><tr><td><code>MAX_BATCH_PER_TICK</code></td><td><code>20</code></td><td>定时器单次最多消费任务数</td></tr></tbody></table><hr><h2 id="九、安全-风险注意事项"><a href="#九、安全-风险注意事项" class="headerlink" title="九、安全 &#x2F; 风险注意事项"></a>九、安全 &#x2F; 风险注意事项</h2><h3 id="9-1-务必先用模拟账号验证"><a href="#9-1-务必先用模拟账号验证" class="headerlink" title="9.1 务必先用模拟账号验证"></a>9.1 务必先用模拟账号验证</h3><p><code>qmt_http_server.py</code> 默认 <code>quickTrade=2</code>（立即下单），<strong>任何能访问该端口的请求都会真实下单</strong>。生产环境务必：</p><ul><li><strong>(a)</strong> <code>HTTP_HOST</code> 改成 <code>&#39;127.0.0.1&#39;</code>，只允许本机访问</li><li><strong>(b)</strong> 或在内网用 nginx + basic auth 反代</li><li><strong>(c)</strong> 或在 miniQMT 端的 <code>QMTClient</code> 里统一加 <code>X-Token</code> 鉴权 header</li></ul><h3 id="9-2-价格笼子（2-规则）"><a href="#9-2-价格笼子（2-规则）" class="headerlink" title="9.2 价格笼子（2% 规则）"></a>9.2 价格笼子（2% 规则）</h3><p>沪深主板&#x2F;创业板委托价超出基准价 ±2% 会<strong>废单</strong>，下单前最好自查 <code>price</code> 是否在笼子内。</p><h3 id="9-3-委托数量上限"><a href="#9-3-委托数量上限" class="headerlink" title="9.3 委托数量上限"></a>9.3 委托数量上限</h3><table><thead><tr><th>板块</th><th>限价单上限</th></tr></thead><tbody><tr><td>主板</td><td>100 万股</td></tr><tr><td>创业板</td><td>30 万股</td></tr><tr><td>科创板</td><td>10 万股</td></tr></tbody></table><p>超量会产生废单。</p><h3 id="9-4-废单查询延迟"><a href="#9-4-废单查询延迟" class="headerlink" title="9.4 废单查询延迟"></a>9.4 废单查询延迟</h3><p>下单后约 <strong>50ms~6s</strong> 才能通过 <code>/order</code> 接口查到（柜台推送周期），<strong>不要在 200ms 内反复查询</strong>。</p><h3 id="9-5-策略阻塞"><a href="#9-5-策略阻塞" class="headerlink" title="9.5 策略阻塞"></a>9.5 策略阻塞</h3><p><code>qmt_http_server.py</code> 的 HTTP 线程是 daemon，策略停止时自动退出；定时器 200ms 周期不会阻塞其他策略。</p><h3 id="9-6-GBK-编码"><a href="#9-6-GBK-编码" class="headerlink" title="9.6 GBK 编码"></a>9.6 GBK 编码</h3><p>三个 <code>.py</code> 文件本身是 <strong>GBK 编码</strong>（QMT 内置 Python 3.6 的硬性要求）。如果在 macOS&#x2F;Linux 编辑器里中文乱码，请用支持 GBK 的编辑器（VS Code、Notepad++）打开。</p><hr><h2 id="十、常见问题-FAQ"><a href="#十、常见问题-FAQ" class="headerlink" title="十、常见问题 FAQ"></a>十、常见问题 FAQ</h2><p><strong>Q1：启动报 <code>Address already in use</code>？</strong><br>A：端口 8899 被占。改 <code>HTTP_PORT</code> 或杀掉占用进程。</p><p><strong>Q2：miniQMT 端 ping 返回 error？</strong><br>A：大 QMT 端策略未启动 &#x2F; 防火墙拦截 &#x2F; IP 错。先在大 QMT 本机跑 <code>test_client.py</code> 验证本地服务。</p><p><strong>Q3：行情返回空 &#x2F; <code>lastPrice=0</code>？</strong><br>A：大 QMT 客户端右下角行情源未选「五档」级别；或非交易时段。</p><p><strong>Q4：下单后 <code>/position</code> 查不到新持仓？</strong><br>A：柜台推送有 50ms~6s 延迟，等几秒再查；委托状态先查 <code>/order</code>。</p><p><strong>Q5：想做鉴权？</strong><br>A：在 <code>qmt_http_server.py</code> 的 <code>QMTHandler.do_GET/do_POST</code> 里加 header 校验（如 <code>X-Token</code>），或者在 miniQMT 端的 <code>QMTClient</code> 里统一加 header。</p><hr><h2 id="十一、源代码下载"><a href="#十一、源代码下载" class="headerlink" title="十一、源代码下载"></a>十一、源代码下载</h2><p>完整源代码（含 <code>qmt_http_server.py</code>、<code>miniqmt_client.py</code>、<code>README.py</code>）已打包上传至夸克网盘：</p><blockquote><p>🔗 <strong><a href="https://pan.quark.cn/s/27baf28d2c89">https://pan.quark.cn/s/27baf28d2c89</a></strong></p></blockquote><p>下载后按本文第四节的部署步骤操作即可。三个文件均为 GBK 编码，可直接在 QMT 编辑器中打开。</p><hr><h2 id="十二、写在最后：迁移路径建议"><a href="#十二、写在最后：迁移路径建议" class="headerlink" title="十二、写在最后：迁移路径建议"></a>十二、写在最后：迁移路径建议</h2><p>这套 HTTP 桥接方案的本质，是给老策略争取了一段**”过渡期”**：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[阶段 1] miniQMT 还能用        →  分析 + 下单都在 miniQMT（旧代码不动）</span><br><span class="line">   ↓ MiniQMT 收紧</span><br><span class="line">[阶段 2] MiniQMT 还能用 + 大 QMT →  分析在 mini，下单走桥接（本文方案）</span><br><span class="line">   ↓ MiniQMT 完全停用</span><br><span class="line">[阶段 3] 只有大 QMT             →  分析也迁大 QMT，QMTClient 改成本地调用</span><br></pre></td></tr></table></figure><p>到了阶段 3，<strong><code>QMTClient</code> 这个类仍然有用</strong>——把它的 <code>_post</code> 方法替换成对大 QMT 本地 <code>passorder</code> 的直接调用，上层策略代码（信号、风控、订单管理）一行都不用改。</p><p>这才是这套设计真正的价值：<strong>让迁移成本分摊到多年，而不是被迫在一个周末里全部重写</strong>。</p><hr><h2 id="⚠️-风险提醒与免责声明"><a href="#⚠️-风险提醒与免责声明" class="headerlink" title="⚠️ 风险提醒与免责声明"></a>⚠️ 风险提醒与免责声明</h2><blockquote><p><strong>量化交易涉及真实资金风险</strong>。本文仅提供 MiniQMT 到大 QMT 迁移的代码方案与技术分享：</p><ul><li>文中代码仅供学习参考，<strong>不构成任何投资建议</strong></li><li>任何策略在实盘前必须先在 QMT「模拟信号模式」或「模拟柜台」中充分验证</li><li><code>quickTrade=2</code> 是立即下单模式，端口暴露在公网会导致真实资金损失</li><li>因使用本文代码、文档或建议造成的任何盈亏，由使用者自行承担全部责任</li><li>QMT、迅投 为迅投公司或其关联公司的商标</li></ul></blockquote><hr><p><em>本文更新于2026年8月16日</em></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;一、背景：MiniQMT-退出舞台，旧策略怎么办？&quot;&gt;&lt;a href=&quot;#一、背景：MiniQMT-退出舞台，旧策略怎么办？&quot; class=&quot;headerlink&quot; title=&quot;一、背景：MiniQMT</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
    <category term="miniQMT" scheme="https://invest.wtsolutions.cn/tags/miniQMT/"/>
    
    <category term="迁移" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%81%E7%A7%BB/"/>
    
    <category term="HTTP 桥接" scheme="https://invest.wtsolutions.cn/tags/HTTP-%E6%A1%A5%E6%8E%A5/"/>
    
    <category term="策略代码" scheme="https://invest.wtsolutions.cn/tags/%E7%AD%96%E7%95%A5%E4%BB%A3%E7%A0%81/"/>
    
  </entry>
  
  <entry>
    <title>量化交易因子全面分类指南：从基本面到另类数据</title>
    <link href="https://invest.wtsolutions.cn/posts/quant-factors-guide/"/>
    <id>https://invest.wtsolutions.cn/posts/quant-factors-guide/</id>
    <published>2026-08-16T02:00:00.000Z</published>
    <updated>2026-08-16T02:39:55.273Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引言：什么是量化因子？"><a href="#引言：什么是量化因子？" class="headerlink" title="引言：什么是量化因子？"></a>引言：什么是量化因子？</h2><p>因子（Factor）是量化交易中最核心的概念之一。一句话概括：<strong>因子就是能够预测资产未来收益的信号</strong>。</p><p>比如「市盈率越低，未来收益越高」，这里的「市盈率」就是一个因子。再比如「最近一个月涨幅越大，未来一个月越可能继续涨」，这里的「最近一个月涨幅」就是动量因子。</p><p>因子投资（Factor Investing）的思想非常朴素：找到能持续赚钱的信号，然后通过系统化方法筛选股票、配置仓位，获取超额收益。</p><p>这篇文章的目标，是对市面上常见的量化因子做一个系统的分类梳理，帮助有一定量化基础但仍在入门阶段的朋友建立完整的因子知识框架。</p><hr><h2 id="一、因子分类总览"><a href="#一、因子分类总览" class="headerlink" title="一、因子分类总览"></a>一、因子分类总览</h2><p>量化因子可以按照不同维度分类，最常见的分类方式是按<strong>数据来源和逻辑</strong>分为以下几大类：</p><ol><li><strong>基本面因子（Fundamental Factors）</strong>：基于公司财务报表数据</li><li><strong>技术面因子（Technical Factors）</strong>：基于价格和成交量数据</li><li><strong>资金面因子（Capital Flow Factors）</strong>：基于资金流向数据</li><li><strong>情绪因子（Sentiment Factors）</strong>：基于市场情绪和行为</li><li><strong>另类数据因子（Alternative Data Factors）</strong>：基于传统金融数据之外的信息</li><li><strong>宏观因子（Macro Factors）</strong>：基于宏观经济数据</li></ol><p>下面逐一详细展开。</p><hr><h2 id="二、基本面因子"><a href="#二、基本面因子" class="headerlink" title="二、基本面因子"></a>二、基本面因子</h2><p>基本面因子是因子投资中最经典、研究最充分的一类。其核心思想是：<strong>公司的基本面价值与市场当前定价之间存在偏离，这种偏离最终会被市场修正，从而产生超额收益</strong>。</p><h3 id="2-1-价值因子（Value）"><a href="#2-1-价值因子（Value）" class="headerlink" title="2.1 价值因子（Value）"></a>2.1 价值因子（Value）</h3><p>价值因子认为市场会系统性地高估某些股票、低估某些股票，买入被低估的股票可以获取超额收益。</p><ul><li><strong>市盈率（PE &#x3D; 股价 &#x2F; 每股收益）</strong>：最经典的价值指标，PE越低，理论上越便宜。</li><li><strong>市净率（PB &#x3D; 股价 &#x2F; 每股净资产）</strong>：适用于重资产行业（如银行、地产），PB低于1可能意味着股价跌破净资产。</li><li><strong>市销率（PS &#x3D; 总市值 &#x2F; 营业收入）</strong>：适用于尚未盈利但收入增长快的公司。</li><li><strong>EV&#x2F;EBITDA</strong>：企业价值与息税折旧摊销前利润之比，消除了资本结构和税率的差异。</li><li><strong>净资产收益率（ROE）反向</strong>：某些时候市场给予高ROE股票过高的估值。</li></ul><p><strong>使用注意事项</strong>：价值因子在A股存在一定的「价值陷阱」问题，低PE可能意味着公司基本面恶化。因此实践中常常使用「预期PE」或结合成长性指标一起使用。</p><h3 id="2-2-成长因子（Growth）"><a href="#2-2-成长因子（Growth）" class="headerlink" title="2.2 成长因子（Growth）"></a>2.2 成长因子（Growth）</h3><p>成长因子关注公司的增长速度，认为高成长的公司理应享受更高的估值溢价。</p><ul><li><strong>营收增长率</strong>：营业收入同比增速，衡量公司业务扩张能力。</li><li><strong>净利润增长率</strong>：净利润同比增速，最直接的增长指标。</li><li><strong>EPS增长率</strong>：每股收益增速，直接反映股东回报能力。</li><li><strong>ROE变化率</strong>：ROE同比变化，衡量公司盈利能力的边际改善。</li><li><strong>PEG（PE &#x2F; 盈利增长率）</strong>：将估值与成长结合起来，PEG &lt; 1 通常被视为低估。</li></ul><h3 id="2-3-质量因子（Quality）"><a href="#2-3-质量因子（Quality）" class="headerlink" title="2.3 质量因子（Quality）"></a>2.3 质量因子（Quality）</h3><p>质量因子关注公司的盈利质量和财务健康程度，认为高质量公司的长期回报更好。</p><ul><li><strong>ROE（净资产收益率）</strong>：巴菲特最看重的指标，衡量公司用股东资本赚钱的效率。</li><li><strong>ROA（总资产收益率）</strong>：衡量公司利用全部资产创造利润的能力。</li><li><strong>毛利率（Gross Margin）</strong>：反映公司产品的竞争力和定价权。</li><li><strong>营业利润率（Operating Margin）</strong>：反映公司核心业务的盈利能力。</li><li><strong>资产周转率（Asset Turnover）</strong>：衡量公司资产利用效率。</li><li><strong>负债率（Debt Ratio）</strong>：衡量财务风险，低负债率通常更安全。</li><li><strong>现金流因子</strong>：经营性现金流 &#x2F; 净利润，比值高说明利润质量好（真金白银），比值低说明利润可能靠应收账款堆砌。</li></ul><h3 id="2-4-财务健康因子（Financial-Health）"><a href="#2-4-财务健康因子（Financial-Health）" class="headerlink" title="2.4 财务健康因子（Financial Health）"></a>2.4 财务健康因子（Financial Health）</h3><ul><li><strong>速动比率</strong>：（流动资产 - 存货）&#x2F; 流动负债，衡量短期偿债能力。</li><li><strong>利息保障倍数</strong>：息税前利润 &#x2F; 利息费用，衡量支付利息的能力。</li><li><strong>应收账款周转天数</strong>：天数越短，回款能力越强。</li><li><strong>存货周转天数</strong>：天数越短，销售效率越高。</li></ul><hr><h2 id="三、技术面因子"><a href="#三、技术面因子" class="headerlink" title="三、技术面因子"></a>三、技术面因子</h2><p>技术面因子基于价格和成交量数据计算，认为历史的价格行为中包含对未来收益有预测力的信息。</p><h3 id="3-1-动量因子（Momentum）"><a href="#3-1-动量因子（Momentum）" class="headerlink" title="3.1 动量因子（Momentum）"></a>3.1 动量因子（Momentum）</h3><p>动量因子是学术界实证最稳健的因子之一，核心假设是<strong>趋势会延续</strong>。</p><ul><li><strong>价格动量（Price Momentum）</strong>：过去N天&#x2F;N周的累计收益率。常见的有20日动量、60日动量、120日动量等。</li><li><strong>收益率动量</strong>：与价格动量类似，但使用收益率序列。</li><li><strong>相对强度指标（RSI）</strong>：14日RSI在30-70之间为正常，&gt;70超买，&lt;30超卖。</li><li><strong>MACD（指数平滑异同移动平均线）</strong>：快慢线金叉死叉，零轴上下穿越。</li><li><strong>ADX（平均趋向指标）</strong>：衡量趋势强度，&gt;25表示趋势明显。</li><li><strong>均线多头排列</strong>：短期均线 &gt; 中期均线 &gt; 长期均线，是趋势向好的信号。</li></ul><p><strong>A股特别说明</strong>：A股存在明显的「短期反转、长期动量」特征。1-5日动量往往失效（甚至反向），而120-250日动量相对有效。</p><h3 id="3-2-反转因子（Reversion）"><a href="#3-2-反转因子（Reversion）" class="headerlink" title="3.2 反转因子（Reversion）"></a>3.2 反转因子（Reversion）</h3><p>反转因子与动量因子相反，认为<strong>过去涨多的会跌回来，跌多的会涨回来</strong>。</p><ul><li><strong>短期价格反转</strong>：过去1-5日收益率，在A股中是有效的反向预测信号。</li><li><strong>日内反转</strong>：开盘后短时间内的大幅上涨&#x2F;下跌，当天往往有反转。</li><li><strong>超买超卖反转</strong>：RSI &lt; 30时买入，RSI &gt; 70时卖出的策略。</li><li><strong>布林带反转</strong>：价格触及布林带下轨时买入，触及上轨时卖出。</li></ul><h3 id="3-3-波动率因子（Volatility）"><a href="#3-3-波动率因子（Volatility）" class="headerlink" title="3.3 波动率因子（Volatility）"></a>3.3 波动率因子（Volatility）</h3><p>大量研究表明，<strong>低波动率股票的长期收益往往高于高波动率股票</strong>，这与传统金融学理论相悖，被称为「低波动率之谜」。</p><ul><li><strong>历史波动率</strong>：过去N日收益率的标准差。</li><li><strong>年化波动率</strong>：历史波动率 × √252。</li><li><strong>隐含波动率</strong>：期权市场隐含的未来波动预期。</li><li><strong>波动率倒数因子</strong>：直接使用 1&#x2F;波动率 作为做多信号，低波动率股票得分高。</li></ul><h3 id="3-4-趋势因子（Trend）"><a href="#3-4-趋势因子（Trend）" class="headerlink" title="3.4 趋势因子（Trend）"></a>3.4 趋势因子（Trend）</h3><ul><li><strong>相对强弱（相对大盘）</strong>：个股收益率 - 大盘收益率，持续为正说明个股强于大盘。</li><li><strong>通道突破</strong>：价格突破布林带上轨或唐奇安通道上轨。</li><li><strong>Z-Score偏离度</strong>：当前价格相对于过去N日均值的偏离程度。</li></ul><h3 id="3-5-成交量因子（Volume）"><a href="#3-5-成交量因子（Volume）" class="headerlink" title="3.5 成交量因子（Volume）"></a>3.5 成交量因子（Volume）</h3><ul><li><strong>成交量比率</strong>：当前成交量 &#x2F; 过去N日平均成交量，放量可能是变盘信号。</li><li><strong>量价配合</strong>：价格上涨伴随成交量放大，信号更可靠。</li><li><strong>换手率</strong>：换手率突然放大可能意味着有资金异动。</li></ul><h3 id="3-6-技术指标因子（Technical-Indicators）"><a href="#3-6-技术指标因子（Technical-Indicators）" class="headerlink" title="3.6 技术指标因子（Technical Indicators）"></a>3.6 技术指标因子（Technical Indicators）</h3><p>QMT 自带的 TA_Lib 库提供了大量技术指标，都可以作为因子使用：</p><ul><li><strong>布林带宽度</strong>：布林带由窄变宽，可能意味着大行情来临。</li><li><strong>KDJ、WR（威廉指标）</strong>：超买超卖指标。</li><li><strong>OBV（能量潮）</strong>：结合价格和成交量判断资金流向。</li><li><strong>乖离率（BIAS）</strong>：当前价格与均线的偏离程度。</li><li><strong>ATR（平均真实波幅）</strong>：衡量波动大小，也可用于止损设置。</li></ul><hr><h2 id="四、资金面因子"><a href="#四、资金面因子" class="headerlink" title="四、资金面因子"></a>四、资金面因子</h2><p>资金面因子关注资金的市场行为，认为「聪明钱」的流向能够预示未来股价走势。</p><h3 id="4-1-主力资金流向"><a href="#4-1-主力资金流向" class="headerlink" title="4.1 主力资金流向"></a>4.1 主力资金流向</h3><ul><li><strong>主力资金净流入&#x2F;流出</strong>：大单、超大单净买入金额。</li><li><strong>主力持续流入天数</strong>：连续多日主力资金净流入，信号更可靠。</li><li><strong>大单占比</strong>：大单成交量占总成交量的比例。</li></ul><h3 id="4-2-北向资金"><a href="#4-2-北向资金" class="headerlink" title="4.2 北向资金"></a>4.2 北向资金</h3><p>北向资金（沪股通&#x2F;深股通）被称为「聪明钱」，在中国A股市场具有较高的关注度。</p><ul><li><strong>北向资金净买入额</strong>：当日或累计净买入金额。</li><li><strong>北向持仓占比</strong>：北向资金持有该股的市值 &#x2F; 该股总市值。</li><li><strong>北向资金持仓变动</strong>：近期持仓比例的变化速度。</li><li><strong>北向资金趋势</strong>：连续净买入的天数。</li></ul><h3 id="4-3-融资融券"><a href="#4-3-融资融券" class="headerlink" title="4.3 融资融券"></a>4.3 融资融券</h3><ul><li><strong>融资余额</strong>：投资者通过融资融券买入该股的金额。</li><li><strong>融资余额变化率</strong>：融资余额的增速，加速增长可能预示看多情绪升温。</li><li><strong>融券余额</strong>：投资者融券卖出该股的金额（数据相对不透明）。</li><li><strong>两融余额占比</strong>：两融余额 &#x2F; 流通市值，占比过高可能意味着杠杆交易拥挤。</li></ul><h3 id="4-4-股东增减持"><a href="#4-4-股东增减持" class="headerlink" title="4.4 股东增减持"></a>4.4 股东增减持</h3><ul><li><strong>大股东增持</strong>：大股东或高管增持，通常视为利好信号。</li><li><strong>大股东减持</strong>：大股东减持，可能意味着内部人不看好当前股价。</li><li><strong>机构持仓变化</strong>：基金等机构投资者持仓比例的季度变化。</li></ul><h3 id="4-5-龙虎榜数据"><a href="#4-5-龙虎榜数据" class="headerlink" title="4.5 龙虎榜数据"></a>4.5 龙虎榜数据</h3><ul><li><strong>机构席位净买入</strong>：龙虎榜显示机构席位净买入，信号较强。</li><li><strong>游资席位活跃度</strong>：知名游资席位出现，可能意味着短期有炒作。</li></ul><hr><h2 id="五、情绪因子"><a href="#五、情绪因子" class="headerlink" title="五、情绪因子"></a>五、情绪因子</h2><p>情绪因子捕捉市场中非理性的群体行为，认为市场的过度反应可以被反向利用。</p><h3 id="5-1-市场情绪指标"><a href="#5-1-市场情绪指标" class="headerlink" title="5.1 市场情绪指标"></a>5.1 市场情绪指标</h3><ul><li><strong>涨跌家数比</strong>：上涨股票数 &#x2F; 下跌股票数，极端值可能预示反转。</li><li><strong>涨停板数量</strong>：涨停板过多可能意味着市场过热。</li><li><strong>跌停板数量</strong>：跌停板过多可能意味着恐慌过度。</li><li><strong>市场波动率指数</strong>：类似恐慌指数，高值代表市场恐慌。</li></ul><h3 id="5-2-个股情绪指标"><a href="#5-2-个股情绪指标" class="headerlink" title="5.2 个股情绪指标"></a>5.2 个股情绪指标</h3><ul><li><strong>换手率</strong>：异常高换手率可能意味着情绪过热或过度恐慌。</li><li><strong>连续涨停&#x2F;跌停天数</strong>：情绪极端的信号。</li><li><strong>龙虎榜游资炒作热度</strong>：是否被游资高度关注。</li></ul><h3 id="5-3-分析师情绪"><a href="#5-3-分析师情绪" class="headerlink" title="5.3 分析师情绪"></a>5.3 分析师情绪</h3><ul><li><strong>分析师评级上调&#x2F;下调</strong>：评级上调次数越多，市场关注度越高。</li><li><strong>分析师目标价与实际股价的偏离</strong>：目标价远高于当前价，可能说明分析师看好。</li><li><strong>分析师覆盖度变化</strong>：新增分析师覆盖可能意味着公司受到关注。</li></ul><h3 id="5-4-网络舆情"><a href="#5-4-网络舆情" class="headerlink" title="5.4 网络舆情"></a>5.4 网络舆情</h3><ul><li><strong>搜索指数</strong>：百度搜索指数、微信指数等，搜索量飙升可能意味着关注度异常。</li><li><strong>社交媒体讨论热度</strong>：股吧、雪球等平台讨论热度。</li><li><strong>新闻舆情得分</strong>：正面新闻多则情绪偏乐观，负面新闻多则偏悲观。</li></ul><hr><h2 id="六、另类数据因子"><a href="#六、另类数据因子" class="headerlink" title="六、另类数据因子"></a>六、另类数据因子</h2><p>另类数据因子来自于传统金融数据（财报、行情）之外的信息源。个人量化在获取另类数据方面有一定局限，但部分数据仍然可以获取。</p><h3 id="6-1-行业与产业链数据"><a href="#6-1-行业与产业链数据" class="headerlink" title="6.1 行业与产业链数据"></a>6.1 行业与产业链数据</h3><ul><li><strong>行业景气度</strong>：行业PMI、行业收入增速等。</li><li><strong>上下游数据</strong>：原材料价格、产品价格变化。</li><li><strong>行业竞争格局</strong>：市场份额变化。</li></ul><h3 id="6-2-政策与事件"><a href="#6-2-政策与事件" class="headerlink" title="6.2 政策与事件"></a>6.2 政策与事件</h3><ul><li><strong>政策支持力度</strong>：是否属于国家政策支持的行业&#x2F;方向。</li><li><strong>重大事件</strong>：业绩预告、重大合同、重组并购等。</li><li><strong>限售股解禁</strong>：解禁后股价可能承压。</li></ul><h3 id="6-3-公司治理"><a href="#6-3-公司治理" class="headerlink" title="6.3 公司治理"></a>6.3 公司治理</h3><ul><li><strong>股东结构</strong>：国有&#x2F;民营&#x2F;外资控股的差异。</li><li><strong>管理层稳定性</strong>：高管频繁变动可能是不利信号。</li><li><strong>分红政策</strong>：持续稳定分红的公司通常质量较好。</li></ul><h3 id="6-4-可获取的另类数据源（个人量化友好）"><a href="#6-4-可获取的另类数据源（个人量化友好）" class="headerlink" title="6.4 可获取的另类数据源（个人量化友好）"></a>6.4 可获取的另类数据源（个人量化友好）</h3><ul><li><strong>东方财富、同花顺等网站</strong>提供的龙虎榜、资金流向等数据。</li><li><strong>聚宽（JoinQuant）、米筐（RiceQuant）等量化平台</strong>提供的因子数据。</li><li><strong>Tushare、AkShare等Python数据接口</strong>可以获取的部分另类数据。</li><li><strong>雪球、股吧等平台</strong>的舆情数据（需要爬虫技术）。</li></ul><hr><h2 id="七、宏观因子"><a href="#七、宏观因子" class="headerlink" title="七、宏观因子"></a>七、宏观因子</h2><p>宏观因子基于宏观经济变量，虽然更多用于资产配置层面，但对选股策略也有参考价值。</p><ul><li><strong>GDP增长率</strong>：经济增速影响整体市场。</li><li><strong>CPI&#x2F;PPI</strong>：通胀水平影响货币政策和不同行业。</li><li><strong>利率（如10年期国债收益率）</strong>：利率上升不利于高估值成长股。</li><li><strong>M2、社融</strong>：流动性指标，流动性宽松利好股市。</li><li><strong>美元指数</strong>：影响新兴市场资金流向。</li></ul><hr><h2 id="八、因子检验与评估方法"><a href="#八、因子检验与评估方法" class="headerlink" title="八、因子检验与评估方法"></a>八、因子检验与评估方法</h2><p>有了因子之后，如何判断一个因子是否有效？以下是因子检验的标准流程：</p><h3 id="8-1-分层回测（Factor-Backtest）"><a href="#8-1-分层回测（Factor-Backtest）" class="headerlink" title="8.1 分层回测（Factor Backtest）"></a>8.1 分层回测（Factor Backtest）</h3><p>按因子的值将股票分成若干组（如10组），看最高组和最低组之间的收益差（多空收益）是否显著为正。</p><h3 id="8-2-关键指标"><a href="#8-2-关键指标" class="headerlink" title="8.2 关键指标"></a>8.2 关键指标</h3><ul><li><strong>IC（Information Coefficient，信息系数）</strong>：因子值与下期收益率的排名相关性，通常 &gt; 0.03 就算不错，&gt; 0.05 算较好。</li><li><strong>ICIR（IC的夏普比率）</strong>：IC均值 &#x2F; IC标准差，衡量因子的稳定性，&gt; 0.5 算不错。</li><li><strong>多空收益（Long-Short Return）</strong>：高分组与低分组的收益差。</li><li><strong>多空夏普比率</strong>：多空策略的夏普比率。</li><li><strong>月胜率</strong>：多空策略在多少比例的月份中是赚钱的。</li></ul><h3 id="8-3-常见陷阱"><a href="#8-3-常见陷阱" class="headerlink" title="8.3 常见陷阱"></a>8.3 常见陷阱</h3><ul><li><strong>幸存者偏差</strong>：只回测了还存在的股票，退市股票被忽略了。</li><li><strong>前视偏差</strong>：用了未来才能知道的数据（如财报发布前就用了财报数据）。</li><li><strong>过拟合</strong>：在历史数据上反复调参，选出看似很好的参数，但未来不一定有效。</li><li><strong>因子共线性</strong>：多个因子之间高度相关，组合使用并不能增加信息量。</li></ul><hr><h2 id="九、多因子模型"><a href="#九、多因子模型" class="headerlink" title="九、多因子模型"></a>九、多因子模型</h2><p>单个因子往往不够稳健，实践中通常将多个因子组合成一个综合打分系统，即多因子模型。</p><h3 id="9-1-等权模型"><a href="#9-1-等权模型" class="headerlink" title="9.1 等权模型"></a>9.1 等权模型</h3><p>将每个因子的标准化得分简单平均，得到综合得分。最简单但也常用。</p><h3 id="9-2-加权模型"><a href="#9-2-加权模型" class="headerlink" title="9.2 加权模型"></a>9.2 加权模型</h3><p>根据每个因子的历史表现（如IC、ICIR）赋予不同权重。</p><h3 id="9-3-机器学习模型"><a href="#9-3-机器学习模型" class="headerlink" title="9.3 机器学习模型"></a>9.3 机器学习模型</h3><p>使用随机森林、XGBoost等机器学习方法，让模型自己学习因子的非线性关系和交互作用。</p><h3 id="9-4-因子正交化"><a href="#9-4-因子正交化" class="headerlink" title="9.4 因子正交化"></a>9.4 因子正交化</h3><p>多个因子之间可能存在相关性，通过正交化处理可以让每个因子提供独立的信息，避免重复计入。</p><hr><h2 id="十、给个人量化新手的建议"><a href="#十、给个人量化新手的建议" class="headerlink" title="十、给个人量化新手的建议"></a>十、给个人量化新手的建议</h2><h3 id="10-1-从经典因子入手"><a href="#10-1-从经典因子入手" class="headerlink" title="10.1 从经典因子入手"></a>10.1 从经典因子入手</h3><p>不要一开始就去追求复杂的另类数据因子。先做好基本面因子（价值、成长、质量）和技术面因子（动量、反转、波动率），这些已经足够支撑一个有竞争力的策略。</p><h3 id="10-2-注意A股的特殊性"><a href="#10-2-注意A股的特殊性" class="headerlink" title="10.2 注意A股的特殊性"></a>10.2 注意A股的特殊性</h3><p>A股是一个散户占比高、政策影响大、散户情绪化程度高的市场。因此：</p><ul><li>短期反转比短期动量更有效</li><li>情绪因子的作用可能比成熟市场更大</li><li>政策因子的影响力不可忽视</li></ul><h3 id="10-3-控制过拟合"><a href="#10-3-控制过拟合" class="headerlink" title="10.3 控制过拟合"></a>10.3 控制过拟合</h3><p>历史回测再漂亮，不代表未来能赚钱。建议：</p><ul><li>样本外检验：留出最近1-2年的数据不做回测，看因子在新数据上是否仍然有效。</li><li>滚动回测：用滚动窗口检验因子的稳定性。</li><li>简化模型：因子越简单，越可能具有普适性。</li></ul><h3 id="10-4-工具推荐"><a href="#10-4-工具推荐" class="headerlink" title="10.4 工具推荐"></a>10.4 工具推荐</h3><ul><li><strong>QMT + TA_Lib</strong>：可以直接在QMT中调用大量技术指标，编写因子。</li><li><strong>Tushare &#x2F; AkShare</strong>：获取基本面数据、行情数据等。</li><li><strong>聚宽&#x2F;米筐</strong>：在线量化平台，内置了大量因子，可以直接使用。</li></ul><h3 id="10-5-实践路径"><a href="#10-5-实践路径" class="headerlink" title="10.5 实践路径"></a>10.5 实践路径</h3><ol><li>先理解每个因子的逻辑（为什么它可能有效）</li><li>写代码计算因子值</li><li>做分层回测，检验因子的IC、多空收益</li><li>将多个有效因子组合，做多因子选股</li><li>设置合理的调仓频率和止损规则</li><li>在模拟环境中验证，再考虑实盘</li></ol><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>量化因子是量化交易的核心基石。本文对常见的因子做了系统分类：</p><table><thead><tr><th>因子大类</th><th>代表因子</th></tr></thead><tbody><tr><td>基本面因子</td><td>PE、PB、ROE、营收增长率、毛利率、现金流质量</td></tr><tr><td>技术面因子</td><td>动量、反转、波动率、MACD、RSI、布林带</td></tr><tr><td>资金面因子</td><td>北向资金、主力资金、融资融券、股东增减持</td></tr><tr><td>情绪因子</td><td>换手率、涨跌家数比、搜索指数、龙虎榜</td></tr><tr><td>另类数据因子</td><td>行业景气度、政策事件、公司治理</td></tr><tr><td>宏观因子</td><td>GDP、CPI、利率、M2</td></tr></tbody></table><p>记住一句话：<strong>因子是工具，不是圣杯</strong>。没有任何一个因子能持续稳定地赚钱，关键是要理解因子的逻辑、验证因子的有效性、并合理地将多个因子组合起来，构建一个具有统计意义的投资体系。</p><p>希望这篇文章能帮助你建立完整的因子知识框架。下一步，可以挑选几个感兴趣的因子，动手写代码验证一下，看看在A股数据上是否真的有效。</p><h2 id="⚠️-免责声明"><a href="#⚠️-免责声明" class="headerlink" title="⚠️ 免责声明"></a>⚠️ 免责声明</h2><blockquote><p><strong>量化交易存在巨大风险</strong>。本文仅提供因子投资的知识介绍与方法论分享：</p><ul><li>文中所述因子仅供学习参考，<strong>不构成任何投资建议</strong></li><li>任何因子在实盘前必须经过充分回测验证，历史有效不代表未来有效</li><li>因使用本文所述方法造成的任何盈亏，由使用者自行承担全部责任</li></ul></blockquote><hr><p><em>本文更新于2026年8月16日</em></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;引言：什么是量化因子？&quot;&gt;&lt;a href=&quot;#引言：什么是量化因子？&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="个人量化" scheme="https://invest.wtsolutions.cn/categories/%E4%B8%AA%E4%BA%BA%E9%87%8F%E5%8C%96/"/>
    
    
    <category term="因子" scheme="https://invest.wtsolutions.cn/tags/%E5%9B%A0%E5%AD%90/"/>
    
    <category term="量化交易" scheme="https://invest.wtsolutions.cn/tags/%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93/"/>
    
    <category term="因子投资" scheme="https://invest.wtsolutions.cn/tags/%E5%9B%A0%E5%AD%90%E6%8A%95%E8%B5%84/"/>
    
    <category term="多因子模型" scheme="https://invest.wtsolutions.cn/tags/%E5%A4%9A%E5%9B%A0%E5%AD%90%E6%A8%A1%E5%9E%8B/"/>
    
    <category term="个人量化" scheme="https://invest.wtsolutions.cn/tags/%E4%B8%AA%E4%BA%BA%E9%87%8F%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>qmt-knowledge-skill 把 QMT 知识库装进 AI Agent 让大模型直接写大 QMT 代码</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-knowledge-skill/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-knowledge-skill/</id>
    <published>2026-08-11T08:00:00.000Z</published>
    <updated>2026-08-12T01:48:48.347Z</updated>
    
    <content type="html"><![CDATA[<h2 id="⚠️-免责声明"><a href="#⚠️-免责声明" class="headerlink" title="⚠️ 免责声明"></a>⚠️ 免责声明</h2><blockquote><p><strong>量化交易存在巨大风险</strong>。本项目仅提供 QMT API 文档的知识结构化整理与 AI Agent 辅助能力：</p><ul><li>生成的所有策略代码仅供学习参考，<strong>不构成任何投资建议</strong></li><li>实盘交易前务必在「模拟信号模式」或「模拟柜台」中充分验证策略逻辑</li><li>因使用本项目代码、文档造成的任何盈亏，由使用者自行承担全部责任</li></ul></blockquote><p>QMT、迅投 为迅投公司或其关联公司的商标。本项目仅为社区用户自发整理的非官方知识库。</p><h2 id="一、为什么要做这个-Skill"><a href="#一、为什么要做这个-Skill" class="headerlink" title="一、为什么要做这个 Skill"></a>一、为什么要做这个 Skill</h2><p>我之前分享过两篇相关文章：</p><ul><li><a href="https://invest.wtsolutions.cn/posts/write-qmt-code-with-deepseek">使用 DeepSeek R1 大模型编写迅投 QMT 的量化交易 Python 代码</a></li><li><a href="https://invest.wtsolutions.cn/posts/qmt-knowledge-base">QMT 知识库 XtQuant 知识库使用文档 pdf markdown html 格式</a></li></ul><p>最早的做法是把 QMT 官方文档打印成 PDF，再投喂给腾讯 IMA.Copilot、DeepSeek 等大模型，让 AI 帮我写代码。这种方法能用，但有几个明显痛点：</p><ol><li><strong>每次都要重新投喂</strong>：换一个对话窗口，又得重新上传 PDF，AI 才能再次「知道」QMT 是什么。</li><li><strong>AI 给的是 miniQMT 代码</strong>：直接问 DeepSeek，它默认返回的是基于 <code>xtquant</code> 的 miniQMT 代码，并不是我们大 QMT 客户端里能直接运行的 <code>init / handlebar</code> 钩子代码。而现在券商逐步在关闭 miniQMT <a href="https://invest.wtsolutions.cn/posts/miniqmt-termination">参考</a>，大 QMT 才是后续主线。</li><li><strong>枚举值经常被臆造</strong>：<code>opType</code>、<code>prType</code>、<code>orderType</code> 这些参数一旦被 AI 凭记忆瞎猜，下单就是废单。</li><li><strong>缺少硬性编码约束</strong>：AI 经常忘记写 <code># coding:gbk</code>，或者用上 Python 3.7+ 才有的 <code>dataclass</code>、海象运算符，结果在 QMT 内置的 Python 3.6 环境里跑不起来。</li></ol><p>为了解决这些问题，我把整理好的 QMT 官方文档做成了一个标准化的 <strong>Skill 包</strong>：<a href="https://github.com/he-yang/qmt-knowledge-skill">qmt-knowledge-skill</a>。装上之后，AI Agent 就自带一份结构化、可检索的 QMT 知识库，写出来的代码天然符合大 QMT 的编码规范。</p><h2 id="二、qmt-knowledge-skill-是什么"><a href="#二、qmt-knowledge-skill-是什么" class="headerlink" title="二、qmt-knowledge-skill 是什么"></a>二、qmt-knowledge-skill 是什么</h2><p>一句话：<strong>给 AI Agent 用的 QMT 极速策略交易系统智能知识技能包</strong>。</p><p>它把 QMT 官方 Python 3.6 API 文档按「入门 → API → 数据与枚举 → 示例与 FAQ」四大类整理成 16 份 markdown 文档，再加一份 <code>SKILL.md</code> 作为 Agent 行为规范。AI Agent 装上这个 Skill 后，就具备以下能力：</p><table><thead><tr><th>场景</th><th>示例问题</th></tr></thead><tbody><tr><td>📖 <strong>新手入门</strong></td><td>「QMT 怎么运行第一个策略？」「回测和实盘模型有什么区别？」</td></tr><tr><td>💻 <strong>代码生成</strong></td><td>「帮我写一个双均线策略」「写一个获取全市场 Tick 的脚本」</td></tr><tr><td>🔎 <strong>API 查询</strong></td><td>「passorder 的参数有哪些？」「get_market_data_ex 怎么用？」</td></tr><tr><td>🎯 <strong>枚举参数</strong></td><td>「opType 股票买入是多少？」「prType 最新价对应值？」</td></tr><tr><td>🧱 <strong>数据结构</strong></td><td>「Tick 对象有哪些字段？」「Bar 数据包含什么？」</td></tr><tr><td>⚠️ <strong>错误排查</strong></td><td>「为什么下单是废单？」「取行情数据为空怎么办？」「pandas 报错如何解决？」</td></tr><tr><td>📊 <strong>指标公式</strong></td><td>「MA、MACD、RSI、KDJ 怎么引用？」</td></tr><tr><td>🛠️ <strong>环境配置</strong></td><td>「如何下载历史数据？」「模拟账号和实盘账号区别？」</td></tr></tbody></table><h2 id="三、项目结构"><a href="#三、项目结构" class="headerlink" title="三、项目结构"></a>三、项目结构</h2><p>整个 Skill 包结构非常清爽，核心就是一份 <code>SKILL.md</code> + 一个 <code>knowledge/</code> 知识库目录：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">qmt-knowledge-skill/</span><br><span class="line">├── SKILL.md              # ⭐ Skill 主入口（Agent 行为规范 + 索引 + 约束）</span><br><span class="line">├── README.md             # 项目说明</span><br><span class="line">└── knowledge/            # QMT 官方知识库（按四大类共 16 份文档）</span><br><span class="line">    ├── 01-入门/</span><br><span class="line">    │   ├── 快速开始.md                 # QMT架构总览 / 回测实盘对比 / 三种运行机制</span><br><span class="line">    │   ├── QMT新人上手教程.md          # 从零开始上手步骤</span><br><span class="line">    │   ├── 迅投研新手指南.md           # 迅投研云端版本指引</span><br><span class="line">    │   ├── 使用须知.md                 # Python 3.6 环境 / 白名单 / 账号类型</span><br><span class="line">    │   ├── 变量约定.md                 # ContextInfo / 运行模式 / 变量规范</span><br><span class="line">    │   └── 界面操作.md                 # 账号配置 / 数据管理 / 模型交易界面</span><br><span class="line">    ├── 02-API/</span><br><span class="line">    │   ├── 交易函数.md                 # ⭐ passorder 综合下单 / 持仓查询 / 撤单改单</span><br><span class="line">    │   ├── 行情函数.md                 # 下载 / 获取 / 订阅 / Tick 快照全套</span><br><span class="line">    │   ├── 引用函数.md                 # MA/EMA/MACD/RSI/KDJ/DMI/BOLL/ATR 等指标</span><br><span class="line">    │   ├── 系统函数.md                 # run_time / 板块 / is_last_bar 等</span><br><span class="line">    │   ├── 成交回报实时主推函数.md      # 委托/成交/持仓/资金变动回调</span><br><span class="line">    │   └── 绘图函数.md                 # paint/drawline/LINETHICK/COLOR 等</span><br><span class="line">    ├── 03-数据与枚举/</span><br><span class="line">    │   ├── 枚举常量.md                 # ⚠️ opType/orderType/prType/市场代码 等</span><br><span class="line">    │   └── 数据结构.md                 # Tick/Bar/L2Quote/Position/Account 等字段</span><br><span class="line">    └── 04-示例与FAQ/</span><br><span class="line">        ├── 完整示例.md                 # 两融/K线全推/目标持仓/快速交易/组合套利 模板</span><br><span class="line">        └── 常见问题.md                 # 白名单报错/编码/废单/数据空等高频问题</span><br></pre></td></tr></table></figure><p><code>SKILL.md</code> 是 Skill 的灵魂——它告诉 Agent <strong>遇到什么问题该读哪个文件</strong>、<strong>生成代码必须遵守哪些硬性约束</strong>、<strong>回答末尾必须附什么风险提示</strong>。这样 Agent 不再凭「记忆」乱写，而是先去知识库里查准了再回答。</p><h2 id="四、安装"><a href="#四、安装" class="headerlink" title="四、安装"></a>四、安装</h2><p>任选其中一条命令即可：</p><p><strong>命令 1：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openclaw skills install @he-yang/qmt-knowledge-skill</span><br></pre></td></tr></table></figure><p><strong>命令 2：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add https://clawhub.ai/he-yang/skills/qmt-knowledge-skill</span><br></pre></td></tr></table></figure><p>装上后，在你的 AI Agent 里直接提问，例如「帮我写一个获取全市场 Tick 的脚本」「passorder 的 prType&#x3D;11 是什么意思」，Agent 就会自动调用本 Skill 查阅知识库并给出符合 QMT 规范的答案。</p><h2 id="五、Skill-内置的代码硬约束（重点）"><a href="#五、Skill-内置的代码硬约束（重点）" class="headerlink" title="五、Skill 内置的代码硬约束（重点）"></a>五、Skill 内置的代码硬约束（重点）</h2><p>这是这个 Skill 区别于「直接把 PDF 丢给 DeepSeek」最关键的地方。<code>SKILL.md</code> 里硬编码了以下规则，Agent 生成的所有代码都会自动遵守：</p><table><thead><tr><th>规则</th><th>说明</th></tr></thead><tbody><tr><td>🔤 <strong>GBK 编码</strong></td><td>所有脚本第一行必须写 <code># coding:gbk</code>，否则中文乱码</td></tr><tr><td>🪝 <strong>双钩子结构</strong></td><td>必须有 <code>def init(ContextInfo):</code> + <code>def handlebar(ContextInfo):</code></td></tr><tr><td>🐍 <strong>Python 3.6</strong></td><td>不支持 3.7+ 语法特性（f-string &#x3D; 3.6 可用，但 dataclass &#x2F; 海象运算符不可用）</td></tr><tr><td>📊 <strong>第三方库</strong></td><td>默认自带 NumPy&#x2F;Pandas&#x2F;TA-Lib&#x2F;SciPy，其他库需要券商开通白名单</td></tr><tr><td>🔢 <strong>枚举值</strong></td><td>opType&#x2F;orderType&#x2F;prType 等必须使用 <code>枚举常量.md</code> 中合法数值，禁止臆造</td></tr><tr><td>⚠️ <strong>实盘风险</strong></td><td>所有生成的 passorder 代码自动附带风险提示语</td></tr></tbody></table><h3 id="标准代码模板"><a href="#标准代码模板" class="headerlink" title="标准代码模板"></a>标准代码模板</h3><p>Agent 生成的代码都会长这样：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># coding:gbk</span></span><br><span class="line"></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">功能：双均线策略</span></span><br><span class="line"><span class="string">模式：回测模型 / 实盘模型</span></span><br><span class="line"><span class="string">机制：逐K线 handlebar / 订阅 subscribe / 定时 run_time</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">account = <span class="string">&quot;test&quot;</span>  <span class="comment"># 策略交易界面运行时会自动替换为配置账号</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;初始化，策略启动时仅执行一次&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handlebar</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;逐K线回调，核心策略逻辑&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h2 id="六、高频-API-速览"><a href="#六、高频-API-速览" class="headerlink" title="六、高频 API 速览"></a>六、高频 API 速览</h2><p>Skill 里内置了一份 Top 10 高频查询索引，Agent 会优先在这张表里定位：</p><table><thead><tr><th>#</th><th>功能</th><th>核心函数</th><th>知识库位置</th></tr></thead><tbody><tr><td>1</td><td>🛒 综合下单</td><td><code>passorder(...)</code></td><td>02-API&#x2F;交易函数.md</td></tr><tr><td>2</td><td>📈 获取K线行情</td><td><code>ContextInfo.get_market_data_ex(...)</code></td><td>02-API&#x2F;行情函数.md</td></tr><tr><td>3</td><td>⬇️ 下载历史数据</td><td><code>download_history_data(...)</code></td><td>02-API&#x2F;行情函数.md</td></tr><tr><td>4</td><td>📡 订阅行情回调</td><td><code>ContextInfo.subscribe_quote(...)</code></td><td>02-API&#x2F;行情函数.md</td></tr><tr><td>5</td><td>📊 获取 Tick 快照</td><td><code>get_full_tick(...)</code></td><td>02-API&#x2F;行情函数.md</td></tr><tr><td>6</td><td>🏦 查持仓&#x2F;资金</td><td><code>ContextInfo.get_trade_detail_data(...)</code></td><td>02-API&#x2F;交易函数.md</td></tr><tr><td>7</td><td>🏭 获取板块成分</td><td><code>ContextInfo.get_stock_list_in_sector(...)</code></td><td>02-API&#x2F;系统函数.md</td></tr><tr><td>8</td><td>📐 技术指标</td><td><code>MA(...)</code> &#x2F; <code>MACD(...)</code> &#x2F; <code>RSI(...)</code> 等</td><td>02-API&#x2F;引用函数.md</td></tr></tbody></table><h2 id="七、和「PDF-投喂」方案的对比"><a href="#七、和「PDF-投喂」方案的对比" class="headerlink" title="七、和「PDF 投喂」方案的对比"></a>七、和「PDF 投喂」方案的对比</h2><table><thead><tr><th>对比项</th><th>PDF 投喂给 DeepSeek</th><th>qmt-knowledge-skill</th></tr></thead><tbody><tr><td>上手成本</td><td>每次对话都要重新上传</td><td>装一次，长期生效</td></tr><tr><td>生成的代码类型</td><td>默认 miniQMT &#x2F; xtquant 代码</td><td>大 QMT 原生 <code>init/handlebar</code> 代码</td></tr><tr><td>GBK 编码</td><td>经常漏掉</td><td>强制写入</td></tr><tr><td>枚举值准确性</td><td>凭记忆可能臆造</td><td>强制查阅 <code>枚举常量.md</code></td></tr><tr><td>Python 3.6 兼容</td><td>可能用上 3.7+ 语法</td><td>硬性约束禁用</td></tr><tr><td>实盘风险提示</td><td>无</td><td>自动附带</td></tr><tr><td>Fallback 渠道</td><td>无</td><td>本地未覆盖时访问 <code>https://invest.wtsolutions.cn</code></td></tr></tbody></table><p>简单说：<strong>PDF 投喂是「一次性参考」，Skill 是「常驻专家」</strong>。</p><h2 id="八、配合我整理的-QMT-知识库使用"><a href="#八、配合我整理的-QMT-知识库使用" class="headerlink" title="八、配合我整理的 QMT 知识库使用"></a>八、配合我整理的 QMT 知识库使用</h2><p>这个 Skill 里的 <code>knowledge/</code> 目录，其实就是我在 <a href="https://invest.wtsolutions.cn/posts/qmt-knowledge-base">QMT 知识库使用文档</a> 那篇文章里持续维护的 markdown 版本的子集。如果你想要 pdf &#x2F; html 版本，或者想自己搭一份本地知识库，可以去那篇文章里下载网盘资源。</p><p>由于现在券商逐步在关闭 miniQMT <a href="https://invest.wtsolutions.cn/posts/miniqmt-termination">参考</a>，所以这个 Skill 后续也只更新大 QMT 的内容，不再维护 xtquant 部分。</p><p>特别说明：资料是从 QMT 官方网站通过 AI 爬取的，大家使用前可以自己和官方的文档对比一下，具体以官方文档为准。</p><p>项目地址：<a href="https://github.com/he-yang/qmt-knowledge-skill">https://github.com/he-yang/qmt-knowledge-skill</a> ，MIT 协议开源，欢迎 Issue &#x2F; PR 一起维护。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;⚠️-免责声明&quot;&gt;&lt;a href=&quot;#⚠️-免责声明&quot; class=&quot;headerlink&quot; title=&quot;⚠️ 免责声明&quot;&gt;&lt;/a&gt;⚠️ 免责声明&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;量化交易存在巨大风险&lt;/strong&gt;。本项目仅提供</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="AI" scheme="https://invest.wtsolutions.cn/tags/AI/"/>
    
    <category term="知识库" scheme="https://invest.wtsolutions.cn/tags/%E7%9F%A5%E8%AF%86%E5%BA%93/"/>
    
    <category term="skill" scheme="https://invest.wtsolutions.cn/tags/skill/"/>
    
  </entry>
  
  <entry>
    <title>QMT 知识库 XtQuant知识库 使用文档 pdf markdown html格式</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-knowledge-base/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-knowledge-base/</id>
    <published>2026-08-11T02:26:06.000Z</published>
    <updated>2026-08-12T01:48:36.999Z</updated>
    
    <content type="html"><![CDATA[<h2 id="⚠️-免责声明"><a href="#⚠️-免责声明" class="headerlink" title="⚠️ 免责声明"></a>⚠️ 免责声明</h2><blockquote><p><strong>量化交易存在巨大风险</strong>。本项目仅提供 QMT API 文档的知识结构化整理与 AI Agent 辅助能力：</p><ul><li>生成的所有策略代码仅供学习参考，<strong>不构成任何投资建议</strong></li><li>实盘交易前务必在「模拟信号模式」或「模拟柜台」中充分验证策略逻辑</li><li>因使用本项目代码、文档造成的任何盈亏，由使用者自行承担全部责任</li></ul></blockquote><p>QMT、迅投 为迅投公司或其关联公司的商标。本项目仅为社区用户自发整理的非官方知识库。</p><p>本博客文章，多次更新过，20260205 更新和 20260811 更新，推荐使用最新的内容。</p><blockquote><p>20260205 更新 </p></blockquote><p>今天分享下，讯投QMT和XtQuant知识库的使用文档。你可以前往他们的官方网站查看最新的文档。</p><p>本次分享是我在20260205，前往他们的官网一页一页查看，然后另存为pdf格式的技术文档。</p><p>PDF格式，比较方便的地方是，你进行全文档搜索，也比较方便投喂给AI人工智能，让AI帮你解决在QMT使用过程中遇到的问题，甚至可以让AI帮你根据文档写量化交易的python代码。参考：使用DeepSeek R1大模型编写迅投 QMT 的量化交易 Python 代码 <a href="../write-qmt-code-with-deepseek">开始阅读</a></p><p>下载链接1：我用夸克网盘分享了「QMT XtQuant知识库」，点击链接保存到你的网盘，以防丢失。<br>链接：<a href="https://pan.quark.cn/s/a68a9e9ce7d7">https://pan.quark.cn/s/a68a9e9ce7d7</a></p><p>下载链接2: <a href="https://pan.xunlei.com/s/VOkg0EFYiG0G-L-pBebz2tEcA1?pwd=vhbz#">https://pan.xunlei.com/s/VOkg0EFYiG0G-L-pBebz2tEcA1?pwd=vhbz#</a> 迅雷云盘。</p><p>这个文件夹里面有1个zip压缩包，分别是：</p><ul><li>QMT知识库完整版.pdf （包含了整个知识库的所有内容，可以全文档搜索）</li><li>XtQuant知识库完整版.pdf （包含了整个知识库的所有内容，可以全文档搜索）</li><li>[文件夹]QMT知识库 - 分章节版本（包含了QMT知识库的所有内容，但是每个章节都单独保存为一个pdf文件）</li><li>[文件夹]XtQuant知识库 - 分章节版本（包含了XtQuant知识库的所有内容，但是每个章节都单独保存为一个pdf文件）</li></ul><blockquote><p>20260811 更新</p></blockquote><p>现在有 ai 了，所以抓取技术更方便了，所以准备后续常态性的更新讯投 QMT 知识库，包括</p><ul><li>pdf 格式</li><li>html 格式</li><li>markdown 格式</li></ul><p>大家获取后，可以直接投喂给 ai，用于做成 skill 或者自己的本地知识库都可以。投喂给 ai 之后，ai 就能帮我们写量化交易的python代码<a href="../write-qmt-code-with-deepseek">参考</a>。</p><p>我用夸克网盘分享了「QMT XtQuant知识库」，点击链接保存到你的网盘，以防丢失。<br>链接：<a href="https://pan.quark.cn/s/a68a9e9ce7d7">https://pan.quark.cn/s/a68a9e9ce7d7</a></p><p>由于现在券商逐步在关闭 miniqmt，所以不再更新 xtquant 的知识库<a href="../miniqmt-termination">参考</a>，只更新大 qmt 的知识库了。</p><p>特别说明： 资料是从 qmt 官方网站通过 ai 爬取的，大家使用前可以自己和官方的文档对比一下，具体以官方文档为准。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;⚠️-免责声明&quot;&gt;&lt;a href=&quot;#⚠️-免责声明&quot; class=&quot;headerlink&quot; title=&quot;⚠️ 免责声明&quot;&gt;&lt;/a&gt;⚠️ 免责声明&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;量化交易存在巨大风险&lt;/strong&gt;。本项目仅提供</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="知识库" scheme="https://invest.wtsolutions.cn/tags/%E7%9F%A5%E8%AF%86%E5%BA%93/"/>
    
    <category term="技术文档" scheme="https://invest.wtsolutions.cn/tags/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
  </entry>
  
  <entry>
    <title>IBKR 通知解读：你的账户已迁移至新的日内保证金标准（IMD取代PDT）</title>
    <link href="https://invest.wtsolutions.cn/posts/ibkr-pdt-to-imd-migration/"/>
    <id>https://invest.wtsolutions.cn/posts/ibkr-pdt-to-imd-migration/</id>
    <published>2026-08-11T01:00:00.000Z</published>
    <updated>2026-08-12T01:46:41.965Z</updated>
    
    <content type="html"><![CDATA[<p>今天有朋友转给我一个来自盈透证券的IBKR通知，Your Account Has Been Migrated to New Margin Standards，问我这个通知是什么意思。</p><p>现在对IBKR 的这则通知进行解读。</p><h2 id="通知原文"><a href="#通知原文" class="headerlink" title="通知原文"></a>通知原文</h2><blockquote><p><strong>Important Update: Your Account Has Been Migrated to New Margin Standards</strong></p><p>Dear Client,</p><p>As part of FINRA’s new rules replacing the Pattern Day Trading (“PDT”) requirements, your account UXXXXX111 has been successfully migrated from the PDT rule structure to the new Intraday Margin Standards, effective 11-Aug-2026.</p><p>What has changed for your account:</p><ul><li>The $25,000 minimum equity requirement for pattern day trading no longer applies to your account</li><li>You are still subject to the standard Reg T $2,000 minimum for trades using margin or short sales</li><li>Your trading activity will now be monitored for Intraday Margin Deficits (“IMD”) rather than day trade counts</li></ul><p>What you should know going forward:</p><ul><li>In certain circumstances, trades that reduce your account’s excess liquidity may generate an IMD call</li><li>IMD calls should be satisfied as promptly as possible and ideally within 3 business days</li><li>Failing to satisfy IMD calls on 4 or more occasions within 12 months may result in a 90-day trading restriction across all associated margin accounts</li></ul></blockquote><hr><h2 id="中文翻译"><a href="#中文翻译" class="headerlink" title="中文翻译"></a>中文翻译</h2><blockquote><p><strong>重要更新：你的账户已迁移至新的保证金标准</strong></p><p>尊敬的客户：</p><p>作为美国金融业监管局（FINRA）新规则的一部分——该规则将取代原有的”日内交易模式”（Pattern Day Trading，简称 PDT）要求——你的账户 UXXXXX111 已成功从 PDT 规则体系迁移至新的日内保证金标准（Intraday Margin Standards），自 <strong>2026年8月11日</strong> 起生效。</p><p>你的账户发生了以下变化：</p><ul><li>日内交易模式的 <strong>25,000美元最低净资产要求</strong> 不再适用于你的账户</li><li>你仍需遵守使用保证金或做空交易时 <strong>Reg T 2,000美元的最低资金要求</strong></li><li>你的交易活动现在将按照 <strong>日内保证金赤字（Intraday Margin Deficit，简称 IMD）</strong> 进行监控，而不是按照日内交易次数来监控</li></ul><p>你需要注意的后续事项：</p><ul><li>在某些情况下，减少你账户超额流动性的交易可能会触发 IMD 追缴通知</li><li>IMD 追缴应尽快满足，理想情况下在 <strong>3 个工作日内</strong> 完成</li><li>如果 12 个月内累计 <strong>4 次或以上</strong> 未能满足 IMD 追缴要求，可能会导致所有关联保证金账户被限制交易 <strong>90 天</strong></li></ul></blockquote><hr><h2 id="背景：PDT-规则是什么？为什么要改？"><a href="#背景：PDT-规则是什么？为什么要改？" class="headerlink" title="背景：PDT 规则是什么？为什么要改？"></a>背景：PDT 规则是什么？为什么要改？</h2><h3 id="旧的-PDT-规则"><a href="#旧的-PDT-规则" class="headerlink" title="旧的 PDT 规则"></a>旧的 PDT 规则</h3><p>PDT（Pattern Day Trading）是 FINRA 长期执行的一项规则，核心逻辑很简单：</p><ul><li>如果你在 5 个交易日内进行了 <strong>4 次或以上</strong> 日内交易（当天买入又卖出同一只股票），你就会被标记为”日内交易模式交易者”（Pattern Day Trader）。</li><li>一旦被标记，你的账户净资产必须保持在 <strong>25,000 美元以上</strong>，否则无法进行日内交易。</li><li>如果你的资金在 2,000 到 25,000 美元之间，你最多只能在 5 个交易日内做 3 次日内交易，第 4 次就会触发 PDT 限制。</li></ul><p>这个规则对小散户非常不友好——很多人根本不需要做高频日内交易，只是偶尔 T+0 做一两次，一不小心就触发了限制。</p><h3 id="新规的变化"><a href="#新规的变化" class="headerlink" title="新规的变化"></a>新规的变化</h3><p>2026 年 6 月，美国证监会（SEC）发布了新规，决定取消 PDT 规则中 <strong>25,000 美元的最低净资产门槛</strong>，代之以新的日内保证金赤字（IMD）监控机制。各券商有 18 个月的过渡期来落实这项政策调整。</p><p>盈透证券（IBKR）在 2026 年 8 月 11 日正式完成了对你的账户迁移。</p><hr><h2 id="对普通小散户的影响"><a href="#对普通小散户的影响" class="headerlink" title="对普通小散户的影响"></a>对普通小散户的影响</h2><h3 id="好消息：25-000-美元门槛取消了"><a href="#好消息：25-000-美元门槛取消了" class="headerlink" title="好消息：25,000 美元门槛取消了"></a>好消息：25,000 美元门槛取消了</h3><p>这是最大的利好。对于资金量在 <strong>2,000～25,000 美元之间</strong> 的小散户来说，你不再因为”做了 4 次日内交易”就被系统判定为 PDT 账户。这意味着你理论上可以比之前更自由地进行日内交易，而不必担心被标记后触发 25,000 美元的硬性门槛。</p><h3 id="仍需注意：2-000-美元底线还在"><a href="#仍需注意：2-000-美元底线还在" class="headerlink" title="仍需注意：2,000 美元底线还在"></a>仍需注意：2,000 美元底线还在</h3><p>虽然 25,000 美元的门槛取消了，但 <strong>Reg T 的 2,000 美元最低保证金要求仍然存在</strong>。如果你的账户权益低于 2,000 美元，你仍然无法使用保证金交易或做空。这点和之前一样，没有变化。</p><h3 id="新风险：IMD-追缴机制"><a href="#新风险：IMD-追缴机制" class="headerlink" title="新风险：IMD 追缴机制"></a>新风险：IMD 追缴机制</h3><p>这是新规中需要你重点关注的部分。以前系统只数你做了几次日内交易，现在系统会实时关注你的 <strong>账户流动性是否被消耗到危险水平</strong>。</p><p>具体来说：</p><ul><li><strong>什么情况会触发 IMD？</strong> 当你进行的一些交易导致账户的”超额流动性”（Excess Liquidity）下降甚至为负时，就可能产生 IMD 追缴通知。简单理解：你的账户净值扣除已占用保证金后，剩余可用于缓冲的额度变少了，系统就会提醒你。</li><li><strong>多快要补上？</strong> 官方建议 <strong>3 个工作日内</strong> 补齐。可以通过入金、卖出持仓等方式提高账户的流动性。</li><li><strong>不补有什么后果？</strong> 如果在 12 个月内累计 <strong>4 次或以上</strong> 未按时满足 IMD 追缴，<strong>所有关联的保证金账户将被限制交易 90 天</strong>。这个后果比以前的 PDT 限制更严重——以前只是限制日内交易，现在是全面禁止交易。</li></ul><hr><h2 id="小散户实操建议"><a href="#小散户实操建议" class="headerlink" title="小散户实操建议"></a>小散户实操建议</h2><h3 id="1-不要因此放松风险管理"><a href="#1-不要因此放松风险管理" class="headerlink" title="1. 不要因此放松风险管理"></a>1. 不要因此放松风险管理</h3><p>虽然 PDT 的 25,000 美元门槛取消了，但新规的 IMD 机制实际上<strong>对账户流动性的要求可能更严格</strong>。以前的规则只看交易次数，新规则看的是你的账户实际”还剩多少缓冲”。频繁日内交易导致保证金被反复占用，更容易触发 IMD。</p><h3 id="2-关注账户的”Excess-Liquidity”（超额流动性）"><a href="#2-关注账户的”Excess-Liquidity”（超额流动性）" class="headerlink" title="2. 关注账户的”Excess Liquidity”（超额流动性）"></a>2. 关注账户的”Excess Liquidity”（超额流动性）</h3><p>在 IBKR 客户端中，经常查看账户的超额流动性指标。如果发现某笔交易后该数值大幅下滑，及时考虑减仓或入金。</p><h3 id="3-收到-IMD-通知后尽快处理"><a href="#3-收到-IMD-通知后尽快处理" class="headerlink" title="3. 收到 IMD 通知后尽快处理"></a>3. 收到 IMD 通知后尽快处理</h3><p>如果 IBKR 向你发送了 IMD 追缴通知（通常通过邮件或客户端弹窗），<strong>尽快处理，不要拖</strong>。最迟在 3 个工作日内完成。处理方式包括：</p><ul><li>入金补充资金</li><li>卖出部分持仓，释放占用的保证金</li><li>减仓降低杠杆</li></ul><h3 id="4-控制日内交易频率"><a href="#4-控制日内交易频率" class="headerlink" title="4. 控制日内交易频率"></a>4. 控制日内交易频率</h3><p>虽然没有 25,000 美元的硬门槛了，但频繁日内交易会快速消耗账户流动性，增加触发 IMD 的概率。对于普通小散户来说，<strong>控制日内交易频率、避免过度交易</strong>仍然是最好的策略。</p><h3 id="5-现金账户不受此规则影响"><a href="#5-现金账户不受此规则影响" class="headerlink" title="5. 现金账户不受此规则影响"></a>5. 现金账户不受此规则影响</h3><p>如果你的账户是现金账户（Cash Account），上述 PDT 和 IMD 规则都不适用于你。现金账户不能使用杠杆，自然也不会产生保证金赤字。但现金账户在交易结算上有自己的限制（T+2 交割），需要等资金交割完成才能再次使用。</p><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><table><thead><tr><th>对比项</th><th>旧 PDT 规则</th><th>新 IMD 规则</th></tr></thead><tbody><tr><td>最低资金门槛</td><td>25,000 美元（日内交易模式）</td><td>无 25,000 美元限制</td></tr><tr><td>最低保证金</td><td>2,000 美元（Reg T）</td><td>2,000 美元（不变）</td></tr><tr><td>监控方式</td><td>数日内交易次数（5日4次触发）</td><td>监控账户超额流动性</td></tr><tr><td>违规后果</td><td>限制日内交易</td><td>限制全部交易 90 天（12 个月内累计 4 次）</td></tr><tr><td>对小散户影响</td><td>25,000 美元以下账户受限</td><td>门槛降低，但需关注流动性风险</td></tr></tbody></table><p><strong>核心结论：</strong> 新规对于资金量在 2,000～25,000 美元的小散户来说，日内交易限制有所放松，但同时引入了更实时的流动性监控机制。关键是要注意账户的超额流动性，避免频繁触发 IMD 追缴。对于大多数不追求高频日内交易的普通投资者来说，这个变化基本是中性偏利好的，只要注意不要过度交易即可。</p><hr><p>本文写于 2026 年 8 月 11 日</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;今天有朋友转给我一个来自盈透证券的IBKR通知，Your Account Has Been Migrated to New Margin Standards，问我这个通知是什么意思。&lt;/p&gt;
&lt;p&gt;现在对IBKR 的这则通知进行解读。&lt;/p&gt;
&lt;h2</summary>
        
      
    
    
    
    <category term="ibkr" scheme="https://invest.wtsolutions.cn/categories/ibkr/"/>
    
    
    <category term="ibkr" scheme="https://invest.wtsolutions.cn/tags/ibkr/"/>
    
    <category term="盈透证券" scheme="https://invest.wtsolutions.cn/tags/%E7%9B%88%E9%80%8F%E8%AF%81%E5%88%B8/"/>
    
    <category term="IMD" scheme="https://invest.wtsolutions.cn/tags/IMD/"/>
    
    <category term="PDT" scheme="https://invest.wtsolutions.cn/tags/PDT/"/>
    
    <category term="日内保证金" scheme="https://invest.wtsolutions.cn/tags/%E6%97%A5%E5%86%85%E4%BF%9D%E8%AF%81%E9%87%91/"/>
    
    <category term="保证金标准" scheme="https://invest.wtsolutions.cn/tags/%E4%BF%9D%E8%AF%81%E9%87%91%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT量化交易系统新手指南及常见问题</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-guide/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-guide/</id>
    <published>2026-08-09T05:03:00.000Z</published>
    <updated>2026-08-13T02:23:49.533Z</updated>
    
    <content type="html"><![CDATA[<h2 id="⚠️-免责声明"><a href="#⚠️-免责声明" class="headerlink" title="⚠️ 免责声明"></a>⚠️ 免责声明</h2><blockquote><p><strong>量化交易存在巨大风险</strong>。本项目仅提供 QMT API 文档的知识结构化整理与 AI Agent 辅助能力：</p><ul><li>生成的所有策略代码仅供学习参考，<strong>不构成任何投资建议</strong></li><li>实盘交易前务必在「模拟信号模式」或「模拟柜台」中充分验证策略逻辑</li><li>因使用本项目代码、文档造成的任何盈亏，由使用者自行承担全部责任</li></ul></blockquote><p>QMT、迅投 为迅投公司或其关联公司的商标。本项目仅为社区用户自发整理的非官方知识库。</p><h2 id="迅投QMT门槛"><a href="#迅投QMT门槛" class="headerlink" title="迅投QMT门槛"></a>迅投QMT门槛</h2><p>迅投QMT量化交易系统是一款基于python语言开发的程序化交易（量化交易）平台，它提供了丰富的量化交易功能，包括策略开发、回测、实盘交易等。</p><p>迅投QMT量化交易系统的门槛相对较低，只需要具备一定的python编程基础，资金门槛也比较低，就可以开始使用。现在一些大语言模型也可以帮你编写代码了。</p><p>迅投QMT还是比较适合入门级和中级个人投资者的，如果是那种特别专业的个人投资者或者机构的投资者，不一定会选择迅投QMT，还有其他的量化交易平台，比如大家经常能在龙虎榜上面看到的华鑫某某某，当然华鑫的门槛会更高，对资金和对技术能力都会有更高的门槛。不过最近上交所据说已经被取消了内网直连，所以可能华鑫某某某的优势好像有降低一些，不知道选择 QMT 的人会不会因此增多。</p><h2 id="开通QMT的方法"><a href="#开通QMT的方法" class="headerlink" title="开通QMT的方法"></a>开通QMT的方法</h2><p>首先就是开通一个券商，选择的券商要能支持QMT的接入，然后开通QMT的账号，就可以开始使用了。有一些券商基本没什么开户门槛，就能开通QMT，如果有需要，可以通过底部的微信二维码，与我联系。</p><p><a href="https://invest.wtsolutions.cn/posts/qmt-account-open/">开户qmt</a></p><p>QMT交易的权限，券商那边是管控的，一般来说股票、可转债的是门槛比较低的，只需要编写一些策略文件等就可以开通了。如果要开通ETF期权的交易权限，那么资金量就要求比较高了，需要提交的文书也特别复杂。</p><h2 id="QMT的安装"><a href="#QMT的安装" class="headerlink" title="QMT的安装"></a>QMT的安装</h2><p>安装包要从你的券商那里下载，一定不要随便从网上自己下载。千万不要轻信第三方提供的安装包。安装很简单，就和平时安装一个软件一样。要使用windows的平台设备， win 10, win 11 , win server等。</p><p>我这边提供一个供你参考研究的安装包，是某金证券的QMT安装包。下载时间是20260407，是这个时间对应的最新版本。仅供学习研究使用，如果开始交易，请务必直接从券商那边获取正规的安装包，不要轻信他人提供的安装包。<a href="https://pan.quark.cn/s/a68a9e9ce7d7">网盘链接</a></p><h2 id="QMT的登陆"><a href="#QMT的登陆" class="headerlink" title="QMT的登陆"></a>QMT的登陆</h2><p>需要从自己的券商那里获取，有一个用户名和一个密码，然后登陆即可。一般在开通QMT交易权限的时候，券商会告诉你用户名和密码。</p><h2 id="Python版本"><a href="#Python版本" class="headerlink" title="Python版本"></a>Python版本</h2><p>QMT策略编写使用的语言是python，版本为3.6。如果完全不懂python的话，要么赶紧学习，要么这个帖子就是一个劝退帖。他并不是那种点一点鼠标就能写策略的，必须要有python编写能力。在使用python包的时候，要注意版本问题，因为QMT里面内置的python版本是3.6，所以在编写策略的时候，要注意使用的python包的版本是否支持3.6。</p><h3 id="关于线程和进程"><a href="#关于线程和进程" class="headerlink" title="关于线程和进程"></a>关于线程和进程</h3><p>QMT中，python无法使用多线程和多进程，所有策略都在同一线程中执行，所以策略中应该尽量避免阻塞类的写法，否则会影响其他策略的执行。</p><h3 id="QMT自带python库"><a href="#QMT自带python库" class="headerlink" title="QMT自带python库"></a>QMT自带python库</h3><p>QMT里面内置了一些常用的python库，包括：</p><ul><li>numpy, pandas, patsy, scipy, statsmodels, TA_Lib<br>其中多种指标如 ADX, MACD, RSI, 布林轨道等；K 线形态识别，如黄昏之星，锤形线等等可以使用TA_Lib库。</li></ul><p>如果你想要使用其他的python库，有的券商qmt是支持自行安装的，有的可能需要联系券商给你打开权限。可以先自行尝试安装，要是不行就问问客户经理是不是不让自己安装。详细的安装方法可以参考我的文章 <a href="../qmt-install-python-lib">迅投QMT量化交易系统-如何正确安装Python库</a>。</p><h2 id="QMT自带策略"><a href="#QMT自带策略" class="headerlink" title="QMT自带策略"></a>QMT自带策略</h2><p>QMT里面自带了一些策略，包括：</p><ul><li>均线策略</li><li>日内交易策略</li><li>国债逆回购策略</li></ul><p>等等，当然这些仅供参考，基本上大家都要自己编写自己的策略。不过有了这些自带策略作为例子，学习起来会轻松很多。</p><h2 id="QMT的行情数据"><a href="#QMT的行情数据" class="headerlink" title="QMT的行情数据"></a>QMT的行情数据</h2><p>量化策略离不开行情数据，QMT 提供了历史行情数据下载与本地缓存的能力。在实盘运行前，建议先把所需品种的历史K线、tick数据下载到本地，这样回测和策略初始化时才不会因为数据缺失而报错。同时合理地管理本地缓存，可以减少重复下载、提升策略运行效率。</p><ul><li>讯投QMT使用小技巧: 历史行情数据下载与本地缓存方案 <a href="../qmt-history-data">开始阅读</a></li></ul><h2 id="QMT的下单与回调"><a href="#QMT的下单与回调" class="headerlink" title="QMT的下单与回调"></a>QMT的下单与回调</h2><p>QMT 的交易接口是异步的，下单后不会立刻返回成交结果，需要通过回调函数来获取委托和成交的状态更新。其中 <code>passorder</code> 是最核心的下单函数，参数较多，新手容易踩坑；而 <code>order_callback</code>（委托回调）和 <code>deal_callback</code>（成交回调）则是获取订单状态变化的关键。</p><ul><li>讯投QMT使用小技巧: 下单函数 passorder 参数详解与实战 <a href="../qmt-passorder-guide">开始阅读</a></li><li>讯投QMT使用小技巧: 委托回调 order_callback 与成交回调 deal_callback 的正确用法 <a href="../qmt-order-deal-callback">开始阅读</a></li></ul><h2 id="QMT的运行环境"><a href="#QMT的运行环境" class="headerlink" title="QMT的运行环境"></a>QMT的运行环境</h2><p>需要一台Windows电脑，win10, win11, 也可以使用云服务器 win server，电脑的性能取决于你自己的策略，如果策略的数量不多，且策略并不复杂，其实普通的电脑都没有问题。对于新手来说，完全可以使用一台现有的电脑开始使用，如果后面上了复杂的策略，慢慢的再增加性能更好的电脑硬件。我自己的策略比较简单，我把我的电脑的一些硬件，比如USB接口只开启了一个，声卡什么用不到的硬件都关闭了，只保留了必须的硬件，这样可以保证电脑的性能，也可以保证电脑的稳定性，同时电耗也会比较低，目前我的电耗每天不到0.5度。</p><ul><li>我的帖子，分享如何低成本的选择迅投QMT的服务器&#x2F;电脑，低成本运行？ <a href="../qmt-low-cost-ops">开始阅读</a></li></ul><p>QMT的运行，很多时候，我们并不是一直盯着的，会需要在电脑上&#x2F;云服务器上面安装一个远程协助软件，这样可以随时远程连接到QMT，然后进行一些操作。</p><h2 id="QMT与手机的通信"><a href="#QMT与手机的通信" class="headerlink" title="QMT与手机的通信"></a>QMT与手机的通信</h2><p>QMT与手机的通信是非常重要的，因为很多时候，QMT运行的电脑并不是实时由人工监管的，可能会出现程序报错，或者策略不符合预期等。我们需要在程序中添加代码，将错误信息通过短信、邮件、app推送等方式通知发送到手机，这样我们可以及时的处理出现的问题。</p><p>目前常用的方法有：</p><ul><li>短信推送 （要收费）</li><li>邮件推送  具体方法详见我的博客文章<a href="../qmt-email-notification">qmt-email-notification</a></li><li>飞书推送</li><li>微信推送  具体方法详见我的博客文章<a href="../qmt-wechat-notification">QMT推送发送消息到微信的几种方案</a><br>等等</li></ul><p>除了被动接收策略发来的消息之外，建议再搭配一个”心跳报警”机制，定时向手机汇报 QMT 进程的存活状态，一旦 QMT 进程异常退出或断线，你就能第一时间收到告警，避免无人值守时出现问题而不知情。</p><ul><li>讯投QMT使用小技巧: 运行状态监控与心跳报警 <a href="../qmt-monitoring-alert">开始阅读</a></li></ul><h2 id="远程操作QMT电脑"><a href="#远程操作QMT电脑" class="headerlink" title="远程操作QMT电脑"></a>远程操作QMT电脑</h2><p>有时候，我们需要远程操控QMT的电脑，可以通过一些远程的操作软件，比如teamviewer, 向日葵等。如果你是在远程服务器上面运行QMT，那么你咨询一下服务器的供应商，如何进行远程连接。</p><h2 id="一些Bug与解决方案"><a href="#一些Bug与解决方案" class="headerlink" title="一些Bug与解决方案"></a>一些Bug与解决方案</h2><blockquote><p>关于这个bug我又单独的写了两个文章，一个是关于QMT的服务器延迟问题，一个是关于QMT的账号成交状态变化主推 deal_callback() ， 当账号成交状态有变化时，这个函数被客户端调用。</p></blockquote><blockquote><p>迅投QMT量化交易系统服务器连接 中断与再连接 <a href="../qmt-server-connection">开始阅读</a></p></blockquote><blockquote><p>迅投QMT交易系统 延迟 委托&#x2F;成交&#x2F;持仓&#x2F;账号信息延迟 get_trade_detail_data延迟 <a href="../qmt-server-delay">开始阅读</a></p></blockquote><p>QMT量化交易系统中的 账号成交状态变化主推 deal_callback() ， 当账号成交状态有变化时，这个函数被客户端调用。</p><p>在使用的过程中发现，deal_callback() 函数在会被调用多次，后来咨询国金证券QMT的工作人员后，才发现，会在至少如下两种情况下调用：</p><ol><li>当账号成交状态有变化时，会调用 deal_callback() 函数。</li><li>当网络出现中断之后，QMT系统与服务器重新连接的时候，会调用 deal_callback() 函数, 并且把当日的所有成交全部都推送一遍。</li></ol><p>因此务必不可以相信 deal_callback() 函数的推送数据，因为 deal_callback() 函数的推送数据可能是重复推送的。为了解决这个问题，我们需要自己建立数据库，去记录每一次下单，下单的成交状态。后续所有的下单，都要基于自己的数据库数据，不可相信QMT的推送数据。</p><p>关于 <code>order_callback</code> 和 <code>deal_callback</code> 的完整用法、区别以及避免重复处理成交的实践，可以参考我单独写的文章：</p><blockquote><p>讯投QMT使用小技巧: 委托回调 order_callback 与成交回调 deal_callback 的正确用法 <a href="../qmt-order-deal-callback">开始阅读</a></p></blockquote><p>下单函数 <code>passorder</code> 是与回调配合使用的关键，参数含义和实战示例可以参考：</p><blockquote><p>讯投QMT使用小技巧: 下单函数 passorder 参数详解与实战 <a href="../qmt-passorder-guide">开始阅读</a></p></blockquote><p>如下摘取自迅投QMT的官方文档：</p><blockquote><p><strong>下单与回报相关</strong></p><p>为保证以尽快的速度执行交易信号, qmt 客户端提供的交易接口是异步的, 以快速交易参数填2的passorder函数为例，调用后会立刻发出委托, 然后返回。不会等待委托回报, 也不会阻塞python线程的运行。</p><p>委托&#x2F;成交&#x2F;持仓&#x2F;账号信息的更新, 是在客户端后台进行的, python策略中无法手动控制。python提供的取账号信息接口 get_trade_detail_data， 与四种交易回调函数, 都是从客户端本地缓存中读取数据 &#x2F; 触发调用，不是调用时查询柜台再返回。客户端本地缓存状态定期接收柜台推送刷新，有交易主推的柜台50ms一次，没有交易主推的柜台1-6秒一次。 不能认为get_trade_detail_data查到的状态是与柜台完全一致的, 比如卖出委托后立刻查询, 不会查到对应委托, 可用资金也不会变多。</p><p>实盘策略需要设计盘中保存&#x2F;更新委托状态的机制。常见的做法是用全局变量字典保存委托状态, 给每一笔委托独立的投资备注作为字典的key，委托状态作为字典的value, 下单后默认设置为待报, 之后查到委托后更新状态。如果某品种股票存在待报状态委托, 暂停该品种后续报单, 防止发生超单的情况。(实现可以参考实盘示例7-调整至目标持仓Demo)</p><p>QMT 所有策略是在同一个线程中被调用的，任意一个策略阻塞线程(死循环 sleep 加锁等操作)会导致所有策略的执行被阻塞，所以不能在策略里写等待操作。如需要多线程 &#x2F; 多进程的用法，可以使用极简模式配合 xtquant 库使用</p></blockquote><p><strong>deal_callback()没有被调用</strong><br>deal_callback() 函数没有被调用，或者定义了deal_callback() 函数，收不到推送数据，可能是因为没有在初始化的时候，设置set_account()函数。要先在init里调用ContextInfo.set_account后生效<br>另外，推送仅在实盘运行模式下生效。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 设置对应的资金账号</span></span><br><span class="line">    <span class="comment"># 示例需要在策略交易界面运行</span></span><br><span class="line">    ContextInfo.set_account(account)</span><br></pre></td></tr></table></figure><h2 id="MiniQMT-与极简模式"><a href="#MiniQMT-与极简模式" class="headerlink" title="MiniQMT 与极简模式"></a>MiniQMT 与极简模式</h2><p>除了完整版的 QMT 客户端之外，迅投还提供了 MiniQMT（极简模式），配合 <code>xtquant</code> 库使用，可以绕开 QMT 全功能客户端，在自己的 Python 环境里调用行情和交易接口。这种方式更灵活，也支持多线程&#x2F;多进程，适合有一定开发能力的用户。</p><p>需要注意的是，MiniQMT 同样依赖券商开通权限，并且网上时不时会有”MiniQMT 即将被关闭”的传闻。如果你正在使用或打算使用 MiniQMT，建议先了解一下实际情况和应对方案：</p><blockquote><p>网传 MiniQMT 将被关闭？事实核查与应对指南（2026 版） <a href="../miniqmt-termination">开始阅读</a></p></blockquote><h2 id="定时任务与每天重置"><a href="#定时任务与每天重置" class="headerlink" title="定时任务与每天重置"></a>定时任务与每天重置</h2><p>QMT 在每个交易日开盘前会进行一些初始化操作，很多策略也需要在每个交易日开始时重置全局状态、清理缓存、重新下载数据等。利用 QMT 提供的定时任务机制（如 <code>run_time</code>），可以让策略在指定时间自动执行这些操作，避免每天手动干预。</p><ul><li>迅投QMT交易终端小技巧-每天代码重置与定时任务设置 <a href="../qmt-daily-reset">开始阅读</a></li></ul><p>本文更新于2026年8月12日</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;⚠️-免责声明&quot;&gt;&lt;a href=&quot;#⚠️-免责声明&quot; class=&quot;headerlink&quot; title=&quot;⚠️ 免责声明&quot;&gt;&lt;/a&gt;⚠️ 免责声明&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;量化交易存在巨大风险&lt;/strong&gt;。本项目仅提供</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
  </entry>
  
  <entry>
    <title>中国身份证可开的海外账户与钱包推荐</title>
    <link href="https://invest.wtsolutions.cn/posts/wise-overseas-wallet-with-chinese-id/"/>
    <id>https://invest.wtsolutions.cn/posts/wise-overseas-wallet-with-chinese-id/</id>
    <published>2026-08-09T02:00:00.000Z</published>
    <updated>2026-08-12T01:50:48.081Z</updated>
    
    <content type="html"><![CDATA[<h2 id="身份证可以开户的海外账户-钱包有哪些？"><a href="#身份证可以开户的海外账户-钱包有哪些？" class="headerlink" title="身份证可以开户的海外账户&#x2F;钱包有哪些？"></a>身份证可以开户的海外账户&#x2F;钱包有哪些？</h2><p>很多朋友在做跨境电商、海外投资（如美股、港股）、海淘、留学缴费或向海外亲友汇款时，都会遇到一个共同的难题：<strong>没有一个海外账户可以收付款</strong>。</p><p>专门飞一趟香港、新加坡或美国去开银行账户，时间成本和差旅成本都很高，而且有些地区开户还需要地址证明、高额的最低存款门槛，甚至需要预约排队。</p><p>那么，<strong>仅凭中国大陆居民身份证，能不能开一个海外账户&#x2F;钱包？</strong></p><p>答案是：<strong>可以</strong>。目前最主流、最方便的方案就是 <strong>Wise</strong>（原 TransferWise）。本文重点介绍 Wise，并附上官方开户链接和完整流程。</p><h2 id="Wise：身份证即可开户的海外多币种钱包"><a href="#Wise：身份证即可开户的海外多币种钱包" class="headerlink" title="Wise：身份证即可开户的海外多币种钱包"></a>Wise：身份证即可开户的海外多币种钱包</h2><p><strong>Wise</strong> 是一家总部位于英国伦敦的全球知名金融科技公司，在全球拥有数千万用户。它最大的优势是：<strong>中国大陆用户凭居民身份证即可在线开设海外多币种账户</strong>，全程无需出国、无需护照（部分后续操作可能用到护照，详见下文）。</p><h3 id="👉-Wise-官方开户链接"><a href="#👉-Wise-官方开户链接" class="headerlink" title="👉 Wise 官方开户链接"></a>👉 Wise 官方开户链接</h3><blockquote><p><strong>开户链接：<a href="https://wise.com/invite/ahpc/f0epglc">https://wise.com/invite/ahpc/f0epglc</a></strong></p></blockquote><p>通过此链接注册，您和邀请人都可以获得 Wise 的推荐奖励，目前是 4500 元的手续费减免（具体奖励以 Wise 官方当时活动为准）。</p><h3 id="Wise-钱包的核心优势"><a href="#Wise-钱包的核心优势" class="headerlink" title="Wise 钱包的核心优势"></a>Wise 钱包的核心优势</h3><ol><li><p><strong>开户门槛低</strong></p><ul><li>仅需中国居民身份证</li><li>全程在线完成，无需前往银行</li><li>几分钟即可完成注册</li></ul></li><li><p><strong>支持 50+ 种货币</strong></p><ul><li>美元（USD）、欧元（EUR）、港币（HKD）、英镑（GBP）</li><li>澳元（AUD）、加元（CAD）、日元（JPY）、新加坡元（SGD）</li><li>以及其他 50 多种货币</li></ul></li><li><p><strong>获得真实的银行账户信息</strong></p><ul><li>开户后，您会得到每个币种对应的真实银行账号、Routing Number、SWIFT 等信息</li><li>例如美元账户可接收来自美国本地 ACH 转账</li><li>港币账户由 DBS 香港提供支持，可接收本地 FPS 转账</li></ul></li><li><p><strong>费用透明、汇率公道</strong></p><ul><li>无月度管理费</li><li>转账费用提前展示，无隐藏收费</li><li>采用中间市场汇率，不赚汇率差价</li></ul></li><li><p><strong>功能丰富</strong></p><ul><li>接收海外平台收款（如 PayPal、Amazon、Stripe 等）</li><li>向全球汇款</li><li>Wise 借记卡（部分地区用户可申请，用于线上&#x2F;线下消费）</li></ul></li></ol><h2 id="Wise-开户完整流程"><a href="#Wise-开户完整流程" class="headerlink" title="Wise 开户完整流程"></a>Wise 开户完整流程</h2><h3 id="第-1-步：访问-Wise-官网注册"><a href="#第-1-步：访问-Wise-官网注册" class="headerlink" title="第 1 步：访问 Wise 官网注册"></a>第 1 步：访问 Wise 官网注册</h3><p>点击上面的开户链接：<a href="https://wise.com/invite/ahpc/f0epglc">https://wise.com/invite/ahpc/f0epglc</a>，使用邮箱注册账户，设置登录密码。</p><h3 id="第-2-步：选择居住国家"><a href="#第-2-步：选择居住国家" class="headerlink" title="第 2 步：选择居住国家"></a>第 2 步：选择居住国家</h3><p>注册时，<strong>居住国家选择”中国大陆”</strong>。Wise 明确支持中国大陆居民身份证开户。</p><h3 id="第-3-步：填写个人信息"><a href="#第-3-步：填写个人信息" class="headerlink" title="第 3 步：填写个人信息"></a>第 3 步：填写个人信息</h3><ul><li>填写真实姓名（与身份证一致）</li><li>填写出生日期、地址等基本信息</li><li>选择”个人”账户类型</li><li>填写职业和收入来源（如实填写即可）</li></ul><h3 id="第-4-步：上传身份证完成实名认证"><a href="#第-4-步：上传身份证完成实名认证" class="headerlink" title="第 4 步：上传身份证完成实名认证"></a>第 4 步：上传身份证完成实名认证</h3><ul><li>上传中国身份证正反面照片（确保清晰、四角完整）</li><li>部分用户可能需要完成人脸识别验证</li><li>等待审核，通常几分钟到几个小时内完成</li></ul><h3 id="第-5-步：账户激活，开始使用"><a href="#第-5-步：账户激活，开始使用" class="headerlink" title="第 5 步：账户激活，开始使用"></a>第 5 步：账户激活，开始使用</h3><p>审核通过后，登录账户即可看到各个币种的”收款账户”信息，您可以：</p><ul><li>把美元账户信息发给海外付款方，接收美元汇款</li><li>把港币账户信息发给香港付款方，接收港币汇款</li><li>在不同币种之间兑换（按中间汇率，费用很低）</li></ul><h3 id="第-6-步（重要）：将中文姓名改为拼音"><a href="#第-6-步（重要）：将中文姓名改为拼音" class="headerlink" title="第 6 步（重要）：将中文姓名改为拼音"></a>第 6 步（重要）：将中文姓名改为拼音</h3><p>使用身份证开户后，账户名称默认是中文。但很多海外银行系统不支持中文字符，可能导致收款失败。建议开户后立即将姓名修改为拼音。</p><p>详细的改名教程请参考本博客另一篇文章：<a href="/posts/wise-change-name-to-pinyin/">Wise 账户名称修改指南 - 如何将中文名改为拼音</a></p><blockquote><p>注意：改名为拼音通常需要提供护照扫描件，建议提前准备好护照。</p></blockquote><h2 id="为什么推荐-Wise-而不是其他方案？"><a href="#为什么推荐-Wise-而不是其他方案？" class="headerlink" title="为什么推荐 Wise 而不是其他方案？"></a>为什么推荐 Wise 而不是其他方案？</h2><table><thead><tr><th>方案</th><th>是否支持身份证开户</th><th>是否需出国</th><th>货币种类</th><th>费用透明度</th></tr></thead><tbody><tr><td><strong>Wise</strong></td><td>✅ 支持</td><td>❌ 不需要</td><td>50+ 种</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td>香港银行亲临开户</td><td>❌ 需通行证&#x2F;护照</td><td>✅ 需要</td><td>港币为主</td><td>⭐⭐⭐</td></tr><tr><td>美国银行开户</td><td>❌ 需护照+地址证明</td><td>✅ 需要</td><td>美元为主</td><td>⭐⭐⭐</td></tr><tr><td>部分虚拟银行卡</td><td>视平台而定</td><td>❌ 不需要</td><td>有限</td><td>⭐⭐</td></tr></tbody></table><p>Wise 在”门槛低 + 货币多 + 费用透明”三个维度上综合表现最好，是最适合普通用户的海外账户&#x2F;钱包方案。</p><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li><p><strong>入金限制</strong></p><ul><li>内地 Wise 账户暂不支持直接用人民币入金</li><li>需通过外币转账（如从国内银行购汇后汇出）向 Wise 账户充值</li></ul></li><li><p><strong>使用场景定位</strong></p><ul><li>适合中小额跨境收付款、过渡性资金中转</li><li>不适合长期存放大额资金（非银行存款，不受存款保险保护）</li><li>主要用于收款、付款、汇兑，而非储蓄</li></ul></li><li><p><strong>合规申报</strong></p><ul><li>个人外汇业务需遵守中国国家外汇管理局相关规定</li><li>年度便利化额度内购汇汇出需符合规定用途</li></ul></li><li><p><strong>姓名格式</strong></p><ul><li>港币账户（DBS 香港）建议姓在前：<code>Zhang San</code></li><li>其他币种账户建议名在前：<code>San Zhang</code></li><li>详见：<a href="/posts/wise-chinese-name-pinyin-order/">Wise 收款姓名拼音顺序指南</a></li></ul></li></ol><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="Q-Wise-开户真的只需要身份证吗？"><a href="#Q-Wise-开户真的只需要身份证吗？" class="headerlink" title="Q: Wise 开户真的只需要身份证吗？"></a>Q: Wise 开户真的只需要身份证吗？</h3><p>A: 是的，注册和实名认证仅需中国大陆居民身份证。但后续如果要把姓名改成拼音，通常需要提供护照。</p><h3 id="Q-Wise-账户里的钱安全吗？"><a href="#Q-Wise-账户里的钱安全吗？" class="headerlink" title="Q: Wise 账户里的钱安全吗？"></a>Q: Wise 账户里的钱安全吗？</h3><p>A: Wise 受英国金融行为监管局（FCA）等监管机构监管，客户资金独立托管存放于 Barclays、JP Morgan 等大型银行，与 Wise 自有资金隔离。但请注意它不是银行存款，不享受银行存款保险，因此不建议存放过大金额。</p><h3 id="Q-可以用-Wise-收-Amazon、PayPal-的钱吗？"><a href="#Q-可以用-Wise-收-Amazon、PayPal-的钱吗？" class="headerlink" title="Q: 可以用 Wise 收 Amazon、PayPal 的钱吗？"></a>Q: 可以用 Wise 收 Amazon、PayPal 的钱吗？</h3><p>A: 可以。Wise 提供的美元账户带有真实的美国本地银行账号和 Routing Number，可以绑定 Amazon、PayPal、Stripe 等平台作为收款账户。</p><h3 id="Q-从国内怎么把钱转进-Wise-账户？"><a href="#Q-从国内怎么把钱转进-Wise-账户？" class="headerlink" title="Q: 从国内怎么把钱转进 Wise 账户？"></a>Q: 从国内怎么把钱转进 Wise 账户？</h3><p>A: 在国内银行购汇后，通过电汇（SWIFT）将外币转入 Wise 提供的对应币种账户。具体操作可咨询您的国内银行。</p><h3 id="Q-开户后多久能用？"><a href="#Q-开户后多久能用？" class="headerlink" title="Q: 开户后多久能用？"></a>Q: 开户后多久能用？</h3><p>A: 实名认证审核通常几分钟到几小时，通过后即可立即获得收款账户信息并开始使用。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>如果你需要一个<strong>仅凭中国身份证就能开设</strong>的海外账户&#x2F;钱包，<strong>Wise</strong> 是目前综合体验最好的选择：</p><ul><li>✅ 身份证即可开户，无需出国</li><li>✅ 50+ 种货币，一个账户搞定多币种收付</li><li>✅ 真实的银行账户信息，可绑定海外平台收款</li><li>✅ 费用透明，中间汇率，无隐藏收费</li></ul><blockquote><p>📌 <strong>立即开户：<a href="https://wise.com/invite/ahpc/f0epglc">https://wise.com/invite/ahpc/f0epglc</a></strong></p></blockquote><p>无论是跨境电商收款、海外投资资金中转、留学缴费还是个人跨境汇款，Wise 都能提供便捷、低成本的解决方案。开户后记得第一时间把姓名改成拼音，避免后续收款出现问题。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;身份证可以开户的海外账户-钱包有哪些？&quot;&gt;&lt;a href=&quot;#身份证可以开户的海外账户-钱包有哪些？&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="wise" scheme="https://invest.wtsolutions.cn/categories/wise/"/>
    
    
    <category term="海外账户" scheme="https://invest.wtsolutions.cn/tags/%E6%B5%B7%E5%A4%96%E8%B4%A6%E6%88%B7/"/>
    
    <category term="Wise" scheme="https://invest.wtsolutions.cn/tags/Wise/"/>
    
    <category term="跨境支付" scheme="https://invest.wtsolutions.cn/tags/%E8%B7%A8%E5%A2%83%E6%94%AF%E4%BB%98/"/>
    
    <category term="海外钱包" scheme="https://invest.wtsolutions.cn/tags/%E6%B5%B7%E5%A4%96%E9%92%B1%E5%8C%85/"/>
    
    <category term="身份证开户" scheme="https://invest.wtsolutions.cn/tags/%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%BC%80%E6%88%B7/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: QMT推送发送消息到微信的几种方案</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-wechat-notification/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-wechat-notification/</id>
    <published>2026-08-04T07:30:06.000Z</published>
    <updated>2026-08-12T01:50:26.634Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>策略上线后，最朴素的诉求就是”出事的时候手机能响一下”。邮件方案在 <a href="../qmt-email-notification">邮件推送</a> 里讲过了，但邮件有个问题：到达手机的即时性依赖邮箱 App 的推送策略，有时会延迟几分钟甚至几十分钟。而微信几乎是国人打开频率最高的 App，把告警直接送到微信，体验会好很多。</p><p>本文整理 QMT 策略中可用的几条微信推送通道——Server酱、企业微信群机器人、WxPusher、PushPlus，给出统一封装的工具类和 QMT 集成示例，并和 <a href="../qmt-monitoring-alert">运行状态监控与心跳报警</a> 配合，构成完整的告警链路。</p><h2 id="一、方案选型"><a href="#一、方案选型" class="headerlink" title="一、方案选型"></a>一、方案选型</h2><table><thead><tr><th>方案</th><th>触达位置</th><th>注册门槛</th><th>频率限制</th><th>适合场景</th></tr></thead><tbody><tr><td>Server酱</td><td>个人微信「Server酱Turbo」应用</td><td>扫码登录拿 SendKey</td><td>免费版 5 条&#x2F;天，Turbo 200 条&#x2F;天</td><td>个人单策略、低频告警</td></tr><tr><td>企业微信群机器人</td><td>企业微信群</td><td>建群+添加机器人</td><td>20 条&#x2F;分钟</td><td>多策略集中告警、团队协作</td></tr><tr><td>WxPusher</td><td>个人微信「WxPusher」公众号</td><td>注册+关注公众号</td><td>免费版较宽松</td><td>一对多推送、带 UI 管理</td></tr><tr><td>PushPlus</td><td>个人微信「PushPlus推送加」公众号</td><td>注册+关注公众号</td><td>免费版 200 条&#x2F;天</td><td>个人推送、支持模板</td></tr></tbody></table><blockquote><p>选型建议：<strong>个人单策略选 Server酱或 PushPlus，多策略&#x2F;团队选企业微信群机器人</strong>。企业微信群机器人不需要个人开通企业微信会员，建个只有自己的群也能用。</p></blockquote><h2 id="二、Server酱：最简单的方案"><a href="#二、Server酱：最简单的方案" class="headerlink" title="二、Server酱：最简单的方案"></a>二、Server酱：最简单的方案</h2><p>Server酱（sct.ftqq.com）走的是「一个 HTTP 请求 &#x3D; 一条微信消息」的模式，整个接入只需要一个 SendKey。</p><h3 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h3><ol><li>访问 <a href="https://sct.ftqq.com/">sct.ftqq.com</a>，微信扫码登录</li><li>在「SendKey」页面拿到 <code>SCT****</code> 开头的 key</li><li>在「微信推送」页面扫码绑定要接收消息的微信号</li><li>调用接口</li></ol><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># wechat_utils.py</span></span><br><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">SERVERCHAN_KEY = <span class="string">&quot;SCT****your_send_key****&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_serverchan</span>(<span class="params">title, content=<span class="string">&quot;&quot;</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    通过 Server酱 推送到微信</span></span><br><span class="line"><span class="string">    :param title: 消息标题（必填，最长 32）</span></span><br><span class="line"><span class="string">    :param content: 消息内容，支持 Markdown</span></span><br><span class="line"><span class="string">    :return: 是否发送成功</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    url = <span class="string">f&quot;https://sctapi.ftqq.com/<span class="subst">&#123;SERVERCHAN_KEY&#125;</span>.send&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        r = requests.post(url, data=&#123;<span class="string">&quot;title&quot;</span>: title, <span class="string">&quot;desp&quot;</span>: content&#125;, timeout=<span class="number">10</span>)</span><br><span class="line">        <span class="keyword">return</span> r.json().get(<span class="string">&quot;code&quot;</span>) == <span class="number">0</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Server酱推送失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><blockquote><p>Server酱免费版每天 5 条，对监控告警来说偏少。要么升级 Turbo 版，要么配合下面的节流策略只用它发关键告警。</p></blockquote><h2 id="三、企业微信群机器人：多策略群告警"><a href="#三、企业微信群机器人：多策略群告警" class="headerlink" title="三、企业微信群机器人：多策略群告警"></a>三、企业微信群机器人：多策略群告警</h2><p>企业微信群机器人不需要企业认证，建一个群、加个机器人就能拿到 Webhook URL，最适合把多个策略的告警集中到一个群里。</p><h3 id="步骤-1"><a href="#步骤-1" class="headerlink" title="步骤"></a>步骤</h3><ol><li>在企业微信里建一个群（自己一个人的群也行）</li><li>群设置 → 群机器人 → 添加机器人 → 起个名字</li><li>复制 Webhook 地址，形如 <code>https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx</code></li></ol><h3 id="文本消息"><a href="#文本消息" class="headerlink" title="文本消息"></a>文本消息</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">WECOM_WEBHOOK = <span class="string">&quot;https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_wecom_text</span>(<span class="params">content, mentioned_list=<span class="literal">None</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    发送文本消息</span></span><br><span class="line"><span class="string">    :param content: 文本内容</span></span><br><span class="line"><span class="string">    :param mentioned_list: 需要@的用户ID列表，[&#x27;@all&#x27;] 表示@所有人</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&quot;msgtype&quot;</span>: <span class="string">&quot;text&quot;</span>,</span><br><span class="line">        <span class="string">&quot;text&quot;</span>: &#123;</span><br><span class="line">            <span class="string">&quot;content&quot;</span>: content,</span><br><span class="line">            <span class="string">&quot;mentioned_list&quot;</span>: mentioned_list <span class="keyword">or</span> [],</span><br><span class="line">            <span class="string">&quot;mentioned_mobile_list&quot;</span>: []</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        r = requests.post(WECOM_WEBHOOK, json=data, timeout=<span class="number">10</span>)</span><br><span class="line">        <span class="keyword">return</span> r.json().get(<span class="string">&quot;errcode&quot;</span>) == <span class="number">0</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;企业微信推送失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h3 id="Markdown-消息"><a href="#Markdown-消息" class="headerlink" title="Markdown 消息"></a>Markdown 消息</h3><p>告警内容用 Markdown 排版会清晰很多：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">send_wecom_markdown</span>(<span class="params">content</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    发送 Markdown 消息（企业微信群机器人支持有限 Markdown 语法）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&quot;msgtype&quot;</span>: <span class="string">&quot;markdown&quot;</span>,</span><br><span class="line">        <span class="string">&quot;markdown&quot;</span>: &#123;<span class="string">&quot;content&quot;</span>: content&#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        r = requests.post(WECOM_WEBHOOK, json=data, timeout=<span class="number">10</span>)</span><br><span class="line">        <span class="keyword">return</span> r.json().get(<span class="string">&quot;errcode&quot;</span>) == <span class="number">0</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;企业微信推送失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用示例</span></span><br><span class="line">msg = <span class="string">&quot;&quot;&quot;## QMT 告警</span></span><br><span class="line"><span class="string">&gt; **策略**: 双均线</span></span><br><span class="line"><span class="string">&gt; **账号**: 600000</span></span><br><span class="line"><span class="string">&gt; **时间**: 2026-08-04 14:30</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">**事件**: 账号掉线</span></span><br><span class="line"><span class="string">&lt;font color=&quot;warning&quot;&gt;请及时检查&lt;/font&gt;&quot;&quot;&quot;</span></span><br><span class="line">send_wecom_markdown(msg)</span><br></pre></td></tr></table></figure><blockquote><p>企业微信群机器人支持 <code>&lt;font color=&quot;info|comment|warning&quot;&gt;</code> 给文字上色，warning 是橙红色，比较醒目。</p></blockquote><h2 id="四、WxPusher-PushPlus"><a href="#四、WxPusher-PushPlus" class="headerlink" title="四、WxPusher &#x2F; PushPlus"></a>四、WxPusher &#x2F; PushPlus</h2><p>两者都是「关注公众号 → 注册拿 token → HTTP 调接口」的模式，用法和 Server酱 类似，只是接口参数不同。</p><h3 id="WxPusher"><a href="#WxPusher" class="headerlink" title="WxPusher"></a>WxPusher</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">WXPUSHER_TOKEN = <span class="string">&quot;your_app_token&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_wxpusher</span>(<span class="params">title, content</span>):</span><br><span class="line">    url = <span class="string">&quot;https://wxpusher.????.com/api/send/message&quot;</span></span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&quot;appToken&quot;</span>: WXPUSHER_TOKEN,</span><br><span class="line">        <span class="string">&quot;content&quot;</span>: content,</span><br><span class="line">        <span class="string">&quot;summary&quot;</span>: title,             <span class="comment"># 消息摘要（必填，否则推送列表里显示空白）</span></span><br><span class="line">        <span class="string">&quot;contentType&quot;</span>: <span class="number">1</span>,             <span class="comment"># 1=文本, 2=html, 3=markdown</span></span><br><span class="line">        <span class="string">&quot;topicIds&quot;</span>: [],               <span class="comment"># 主题ID，可留空</span></span><br><span class="line">        <span class="string">&quot;uids&quot;</span>: [<span class="string">&quot;your_uid&quot;</span>]          <span class="comment"># 目标用户UID，在公众号「我的」里查</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        r = requests.post(url, json=data, timeout=<span class="number">10</span>)</span><br><span class="line">        <span class="keyword">return</span> r.json().get(<span class="string">&quot;success&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;WxPusher 推送失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h3 id="PushPlus"><a href="#PushPlus" class="headerlink" title="PushPlus"></a>PushPlus</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">PUSHPLUS_TOKEN = <span class="string">&quot;your_token&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_pushplus</span>(<span class="params">title, content, template=<span class="string">&quot;html&quot;</span></span>):</span><br><span class="line">    url = <span class="string">&quot;http://www.pushplus.plus/send&quot;</span></span><br><span class="line">    data = &#123;</span><br><span class="line">        <span class="string">&quot;token&quot;</span>: PUSHPLUS_TOKEN,</span><br><span class="line">        <span class="string">&quot;title&quot;</span>: title,</span><br><span class="line">        <span class="string">&quot;content&quot;</span>: content,</span><br><span class="line">        <span class="string">&quot;template&quot;</span>: template           <span class="comment"># html / json / markdown</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        r = requests.post(url, json=data, timeout=<span class="number">10</span>)</span><br><span class="line">        <span class="keyword">return</span> r.json().get(<span class="string">&quot;code&quot;</span>) == <span class="number">200</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;PushPlus 推送失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="五、统一封装：notify-py"><a href="#五、统一封装：notify-py" class="headerlink" title="五、统一封装：notify.py"></a>五、统一封装：notify.py</h2><p>不同渠道接口不同，但策略代码只想关心「发条消息」。封装一个统一的 <code>notify</code>，支持渠道切换、节流、容错：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># notify.py</span></span><br><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Notifier</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, default_channel=<span class="string">&quot;serverchan&quot;</span></span>):</span><br><span class="line">        <span class="variable language_">self</span>.default_channel = default_channel</span><br><span class="line">        <span class="variable language_">self</span>._last = &#123;&#125;                <span class="comment"># (channel, key) -&gt; ts</span></span><br><span class="line">        <span class="variable language_">self</span>._lock = threading.Lock()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_throttle</span>(<span class="params">self, channel, key, cooldown=<span class="number">600</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;同一类消息 cooldown 秒内只发一次，避免刷屏&quot;&quot;&quot;</span></span><br><span class="line">        k = (channel, key)</span><br><span class="line">        now = time.time()</span><br><span class="line">        <span class="keyword">with</span> <span class="variable language_">self</span>._lock:</span><br><span class="line">            <span class="keyword">if</span> now - <span class="variable language_">self</span>._last.get(k, <span class="number">0</span>) &lt; cooldown:</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">            <span class="variable language_">self</span>._last[k] = now</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">send</span>(<span class="params">self, title, content=<span class="string">&quot;&quot;</span>, channel=<span class="literal">None</span>, key=<span class="literal">None</span>, cooldown=<span class="number">600</span></span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        发送消息</span></span><br><span class="line"><span class="string">        :param title: 标题</span></span><br><span class="line"><span class="string">        :param content: 内容</span></span><br><span class="line"><span class="string">        :param channel: 渠道，默认 self.default_channel</span></span><br><span class="line"><span class="string">        :param key: 节流键，默认用 title；同一 key 在 cooldown 内只发一次</span></span><br><span class="line"><span class="string">        :param cooldown: 节流秒数，默认 600 秒</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        channel = channel <span class="keyword">or</span> <span class="variable language_">self</span>.default_channel</span><br><span class="line">        key = key <span class="keyword">or</span> title</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> <span class="variable language_">self</span>._throttle(channel, key, cooldown):</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[notify] 节流命中，跳过: <span class="subst">&#123;title&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="keyword">if</span> channel == <span class="string">&quot;serverchan&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> send_serverchan(title, content)</span><br><span class="line">            <span class="keyword">elif</span> channel == <span class="string">&quot;wecom&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> send_wecom_text(<span class="string">f&quot;<span class="subst">&#123;title&#125;</span>\n<span class="subst">&#123;content&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">elif</span> channel == <span class="string">&quot;wecom_md&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> send_wecom_markdown(<span class="string">f&quot;## <span class="subst">&#123;title&#125;</span>\n<span class="subst">&#123;content&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">elif</span> channel == <span class="string">&quot;wxpusher&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> send_wxpusher(title, content)</span><br><span class="line">            <span class="keyword">elif</span> channel == <span class="string">&quot;pushplus&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> send_pushplus(title, content)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;[notify] 未知渠道: <span class="subst">&#123;channel&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="comment"># 告警本身失败不能影响策略</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[notify] 发送异常: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">notifier = Notifier(default_channel=<span class="string">&quot;serverchan&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">notify</span>(<span class="params">title, content=<span class="string">&quot;&quot;</span>, **kwargs</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;供策略调用的统一入口&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> notifier.send(title, content, **kwargs)</span><br></pre></td></tr></table></figure><blockquote><p>把 <code>notify.py</code> 放到 QMT 安装目录的 <code>python</code> 文件夹下，所有策略都能引用，路径配置见 <a href="../qmt-shared-code">公共代码的编写与引用</a>。</p></blockquote><h2 id="六、在-QMT-策略中集成"><a href="#六、在-QMT-策略中集成" class="headerlink" title="六、在 QMT 策略中集成"></a>六、在 QMT 策略中集成</h2><h3 id="示例-1：策略启动通知"><a href="#示例-1：策略启动通知" class="headerlink" title="示例 1：策略启动通知"></a>示例 1：策略启动通知</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> notify <span class="keyword">import</span> notify</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    C.set_account(account)</span><br><span class="line">    <span class="comment"># 开盘前推送一条，确认策略已加载</span></span><br><span class="line">    notify(<span class="string">&quot;QMT 策略启动&quot;</span>, <span class="string">f&quot;账号 <span class="subst">&#123;account&#125;</span> 策略已启动&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="示例-2：成交回调通知"><a href="#示例-2：成交回调通知" class="headerlink" title="示例 2：成交回调通知"></a>示例 2：成交回调通知</h3><p>成交是发通知的最佳时机——不是”下单了”就发，而是”真成交了”才发，避免被废单打扰。成交回调用法详见 <a href="../qmt-order-deal-callback">成交回调</a>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> notify <span class="keyword">import</span> notify</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">deal_callback</span>(<span class="params">C, dealInfo</span>):</span><br><span class="line">    code = dealInfo.m_strInstrumentID</span><br><span class="line">    <span class="keyword">if</span> code.startswith(<span class="string">&#x27;6&#x27;</span>):</span><br><span class="line">        code += <span class="string">&#x27;.SH&#x27;</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        code += <span class="string">&#x27;.SZ&#x27;</span></span><br><span class="line">    side = <span class="string">&#x27;买入&#x27;</span> <span class="keyword">if</span> dealInfo.m_nOffset == <span class="number">48</span> <span class="keyword">else</span> <span class="string">&#x27;卖出&#x27;</span></span><br><span class="line">    msg = <span class="string">f&quot;<span class="subst">&#123;side&#125;</span> <span class="subst">&#123;code&#125;</span>\n价格 <span class="subst">&#123;dealInfo.m_dPrice&#125;</span>\n数量 <span class="subst">&#123;dealInfo.m_nVolume&#125;</span>&quot;</span></span><br><span class="line">    notify(<span class="string">&quot;成交回报&quot;</span>, msg)</span><br></pre></td></tr></table></figure><h3 id="示例-3：异常巡检告警"><a href="#示例-3：异常巡检告警" class="headerlink" title="示例 3：异常巡检告警"></a>示例 3：异常巡检告警</h3><p>和 <a href="../qmt-monitoring-alert">心跳报警</a> 的巡检结合，发现异常立刻推微信：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">patrol</span>(<span class="params">C</span>):</span><br><span class="line">    problems = []</span><br><span class="line">    <span class="comment"># ... 巡检逻辑，发现异常追加到 problems ...</span></span><br><span class="line">    <span class="keyword">if</span> problems:</span><br><span class="line">        notify(<span class="string">&quot;QMT巡检异常&quot;</span>, <span class="string">&quot;\n&quot;</span>.join(problems),</span><br><span class="line">               channel=<span class="string">&quot;wecom_md&quot;</span>, key=<span class="string">&quot;patrol&quot;</span>, cooldown=<span class="number">600</span>)</span><br></pre></td></tr></table></figure><blockquote><p>这里 <code>key=&quot;patrol&quot;</code> 把所有巡检异常归并到同一个节流桶，10 分钟内不会因为同一个巡检任务刷屏。不同问题想分开告警，就给不同的 key。</p></blockquote><h3 id="示例-4：收盘日报"><a href="#示例-4：收盘日报" class="headerlink" title="示例 4：收盘日报"></a>示例 4：收盘日报</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    <span class="comment"># 每个交易日 15:05 推送日报</span></span><br><span class="line">    C.run_time(<span class="string">&#x27;daily_report&#x27;</span>, <span class="string">&#x27;1nDay&#x27;</span>, <span class="string">&#x27;20260101 15:05:00&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">daily_report</span>(<span class="params">C</span>):</span><br><span class="line">    acc = get_trade_detail_data(account, accountType, <span class="string">&#x27;account&#x27;</span>)[<span class="number">0</span>]</span><br><span class="line">    holdings = get_trade_detail_data(account, accountType, <span class="string">&#x27;position&#x27;</span>)</span><br><span class="line">    md = <span class="string">f&quot;## 收盘报告\n&gt; 账号 <span class="subst">&#123;account&#125;</span>\n\n&quot;</span></span><br><span class="line">    md += <span class="string">f&quot;- 可用资金: <span class="subst">&#123;acc.m_dAvailable:<span class="number">.2</span>f&#125;</span>\n&quot;</span></span><br><span class="line">    md += <span class="string">f&quot;- 持仓数: <span class="subst">&#123;<span class="built_in">len</span>(holdings)&#125;</span>\n\n&quot;</span></span><br><span class="line">    <span class="keyword">for</span> h <span class="keyword">in</span> holdings:</span><br><span class="line">        md += <span class="string">f&quot;- <span class="subst">&#123;h.m_strInstrumentID&#125;</span>: <span class="subst">&#123;h.m_nVolume&#125;</span>股 浮盈<span class="subst">&#123;h.m_dProfit:<span class="number">.2</span>f&#125;</span>\n&quot;</span></span><br><span class="line">    notify(<span class="string">&quot;收盘报告&quot;</span>, md, channel=<span class="string">&quot;wecom_md&quot;</span>, cooldown=<span class="number">0</span>)  <span class="comment"># 日报不节流</span></span><br></pre></td></tr></table></figure><blockquote><p><code>run_time</code> 定时任务的写法见 <a href="../qmt-daily-reset">每天代码重置与定时任务</a>。</p></blockquote><h2 id="七、常见坑"><a href="#七、常见坑" class="headerlink" title="七、常见坑"></a>七、常见坑</h2><ol><li><strong>QMT 内置 Python 缺 requests</strong>：QMT 自带的 Python 环境通常已包含 <code>requests</code>，但版本可能较旧。若提示 <code>No module named &#39;requests&#39;</code>，按 <a href="../qmt-install-python-lib">安装第三方库</a> 装一下，或用标准库 <code>urllib</code> 改写。</li><li><strong>超时阻塞策略</strong>：HTTP 请求默认会阻塞，务必传 <code>timeout=10</code>，并放在 <code>run_time</code> 任务或回调里发，别放 <code>handlebar</code> 高频路径。</li><li><strong>频率超限</strong>：Server酱免费版 5 条&#x2F;天，企业微信 20 条&#x2F;分钟。监控类告警务必节流，否则一天的额度几分钟就刷光。</li><li><strong>中文编码</strong>：JSON body 用 <code>json=</code> 传参会自动处理；用 <code>data=</code> 传 form 时注意 <code>requests</code> 会按 utf-8 编码，一般没问题，但日志里打印 <code>content</code> 别用 gbk 控制台，会报错。</li><li><strong>告警本身失败</strong>：所有推送函数都要 <code>try/except</code> 兜底，告警挂了不能拖垮策略。<code>notify</code> 已经做了这层保护。</li><li><strong>关键告警走多通道</strong>：账号掉线、重复下单风险这种关键告警，建议同时发 Server酱（个人微信）和企业微信群，避免单通道故障漏报。</li></ol><h2 id="八、和邮件方案的关系"><a href="#八、和邮件方案的关系" class="headerlink" title="八、和邮件方案的关系"></a>八、和邮件方案的关系</h2><p>邮件（<a href="../qmt-email-notification">邮件推送</a>）和微信不是二选一，而是互补：</p><ul><li><strong>微信</strong>：即时性强、阅读率高，适合异常告警、成交回报、关键事件。</li><li><strong>邮件</strong>：留档性好、可带附件、可发长报告，适合日报、周报、详细日志。</li></ul><p>推荐组合：<strong>实时事件走微信，日报兜底走邮件</strong>。<code>notify</code> 封装里再加一个 <code>email</code> 渠道，调用 <code>email_utils.send_qmt_email</code> 即可统一入口。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>把消息推到微信，QMT 策略就有了”会叫的watchdog”：</p><ul><li>个人单策略用 <strong>Server酱</strong>，多策略&#x2F;团队用 <strong>企业微信群机器人</strong>，需要一对多用 <strong>WxPusher&#x2F;PushPlus</strong>。</li><li>统一封装到 <code>notify.py</code>，支持渠道切换、节流、容错。</li><li>集成到 <code>init</code>（启动通知）、<code>deal_callback</code>（成交回报）、<code>patrol</code>（巡检告警）、<code>daily_report</code>（收盘日报）四个时机。</li><li>关键告警走多通道，实时走微信、留档走邮件。</li></ul><p>配合 <a href="../qmt-monitoring-alert">运行状态监控与心跳报警</a> 的心跳&#x2F;巡检&#x2F;watchdog体系，整套 QMT 运维闭环就齐了——出事手机能响，没事每天一报，安心睡觉。</p><hr><blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;概述&quot;&gt;&lt;a href=&quot;#概述&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="告警" scheme="https://invest.wtsolutions.cn/tags/%E5%91%8A%E8%AD%A6/"/>
    
    <category term="微信推送" scheme="https://invest.wtsolutions.cn/tags/%E5%BE%AE%E4%BF%A1%E6%8E%A8%E9%80%81/"/>
    
    <category term="server酱" scheme="https://invest.wtsolutions.cn/tags/server%E9%85%B1/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: 历史行情数据下载与本地缓存方案</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-history-data/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-history-data/</id>
    <published>2026-08-04T06:30:06.000Z</published>
    <updated>2026-08-12T01:48:07.537Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>写策略离不开历史数据：算指标要 K 线，做回测要序列，分析 tick 要分笔。但 QMT 的历史数据不是天然就躺在本地的——它需要你主动「下载」并「订阅」。很多新手第一次跑策略报「数据长度不足」或者拿到一堆空值，十有八九就是没下载历史数据，或者用错了取数函数。</p><p>本文把下载、订阅、取数、缓存四件事一次讲清楚。</p><h2 id="一、下载历史数据：download-history-data"><a href="#一、下载历史数据：download-history-data" class="headerlink" title="一、下载历史数据：download_history_data"></a>一、下载历史数据：download_history_data</h2><p>QMT 的历史数据是按需下载的。你不去下载，<code>get_history_data</code> &#x2F; <code>get_market_data_ex</code> 拿到的可能就是空或者很短的片段。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    stock = <span class="string">&#x27;600000.SH&#x27;</span></span><br><span class="line">    <span class="comment"># 下载日线历史数据，从2020-01-01到今天</span></span><br><span class="line">    ContextInfo.download_history_data(stock, <span class="string">&#x27;1d&#x27;</span>, <span class="string">&#x27;2020-01-01&#x27;</span>, <span class="string">&#x27;&#x27;</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ContextInfo.download_history_data(stockcode, period, start_time, end_time)</span><br></pre></td></tr></table></figure><ul><li><code>stockcode</code>：带后缀的代码，如 <code>&#39;600000.SH&#39;</code>；也可以传 <code>&#39;000001.SZ&#39;</code> 这种。</li><li><code>period</code>：周期，<code>&#39;1d&#39;</code> 日线、<code>&#39;1m&#39;</code> 分钟线、<code>&#39;tick&#39;</code> 分笔。</li><li><code>start_time</code> &#x2F; <code>end_time</code>：格式 <code>&#39;2020-01-01&#39;</code> 或 <code>&#39;20200101&#39;</code>，<code>end_time</code> 传空串表示到最新。</li></ul><h3 id="下载时机"><a href="#下载时机" class="headerlink" title="下载时机"></a>下载时机</h3><ul><li><strong>回测前</strong>：把回测区间内的数据一次性下载好，否则回测会因缺数据报错或拿空值。</li><li><strong>实盘 init 时</strong>：下载策略所需的历史窗口（比如 60 日均线就至少下载 60 个交易日）。</li><li><strong>多股票时</strong>：循环下载，但别在 <code>handlebar</code> 里下载，那会阻塞行情处理。下载放 <code>init</code> 或定时任务里。</li></ul><h3 id="批量下载的小技巧"><a href="#批量下载的小技巧" class="headerlink" title="批量下载的小技巧"></a>批量下载的小技巧</h3><p>下载是同步且较慢的操作，几百只股票一个个下会很卡。可以做成「下载进度可恢复」：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">download_batch</span>(<span class="params">C, stocks, period=<span class="string">&#x27;1d&#x27;</span>, start=<span class="string">&#x27;2020-01-01&#x27;</span></span>):</span><br><span class="line">    done = []</span><br><span class="line">    <span class="keyword">for</span> i, s <span class="keyword">in</span> <span class="built_in">enumerate</span>(stocks):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            C.download_history_data(s, period, start, <span class="string">&#x27;&#x27;</span>)</span><br><span class="line">            done.append(s)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;下载失败 <span class="subst">&#123;s&#125;</span>: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> i % <span class="number">50</span> == <span class="number">0</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;进度 <span class="subst">&#123;i&#125;</span>/<span class="subst">&#123;<span class="built_in">len</span>(stocks)&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> done</span><br></pre></td></tr></table></figure><h2 id="二、订阅行情：set-universe-vs-subscribe-quote"><a href="#二、订阅行情：set-universe-vs-subscribe-quote" class="headerlink" title="二、订阅行情：set_universe vs subscribe_quote"></a>二、订阅行情：set_universe vs subscribe_quote</h2><p>下载的是<strong>历史</strong>数据，实盘要拿<strong>实时</strong>行情还需要订阅。</p><h3 id="set-universe（订阅K线行情）"><a href="#set-universe（订阅K线行情）" class="headerlink" title="set_universe（订阅K线行情）"></a>set_universe（订阅K线行情）</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    C.set_universe([<span class="string">&#x27;600000.SH&#x27;</span>, <span class="string">&#x27;000001.SZ&#x27;</span>])</span><br></pre></td></tr></table></figure><p><code>set_universe</code> 订阅之后，<code>handlebar</code> 才会被这些品种的 K 线推动，<code>get_market_data_ex</code> 才能拿到实时值。这是绝大多数策略用的方式。</p><h3 id="subscribe-quote（订阅实时tick-盘口）"><a href="#subscribe-quote（订阅实时tick-盘口）" class="headerlink" title="subscribe_quote（订阅实时tick&#x2F;盘口）"></a>subscribe_quote（订阅实时tick&#x2F;盘口）</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    C.subscribe_quote(<span class="string">&#x27;600000.SH&#x27;</span>, <span class="string">&#x27;tick&#x27;</span>, count=<span class="number">10</span>)</span><br></pre></td></tr></table></figure><p>适合需要逐笔或盘口深度数据的策略。注意全市场订阅 tick（全推）数据量巨大，按需订阅即可。</p><blockquote><p>订阅和下载是两件事：下载管历史，订阅管实时。实盘策略通常两者都要。</p></blockquote><h2 id="三、取数：get-history-data-与-get-market-data-ex"><a href="#三、取数：get-history-data-与-get-market-data-ex" class="headerlink" title="三、取数：get_history_data 与 get_market_data_ex"></a>三、取数：get_history_data 与 get_market_data_ex</h2><h3 id="get-history-data（取单个品种的某个字段序列）"><a href="#get-history-data（取单个品种的某个字段序列）" class="headerlink" title="get_history_data（取单个品种的某个字段序列）"></a>get_history_data（取单个品种的某个字段序列）</h3><p>来自官方示例的写法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">data = C.get_history_data(<span class="number">30</span>, <span class="string">&#x27;1d&#x27;</span>, <span class="string">&#x27;close&#x27;</span>, dividend_type=<span class="string">&#x27;front_ratio&#x27;</span>)</span><br><span class="line">close_list = data[<span class="string">&#x27;600000.SH&#x27;</span>]   <span class="comment"># 长度30的收盘价序列</span></span><br></pre></td></tr></table></figure><ul><li>第一个参数：取多少根。</li><li>第二个：周期。</li><li>第三个：字段，<code>&#39;close&#39;</code>&#x2F;<code>&#39;open&#39;</code>&#x2F;<code>&#39;high&#39;</code>&#x2F;<code>&#39;low&#39;</code>&#x2F;<code>&#39;volume&#39;</code>&#x2F;<code>&#39;amount&#39;</code>。</li><li><code>dividend_type</code>：复权类型，详见 <a href="../qmt-dividend-type">复权数据怎么选</a>。</li></ul><h3 id="get-market-data-ex（多品种多字段的-DataFrame）"><a href="#get-market-data-ex（多品种多字段的-DataFrame）" class="headerlink" title="get_market_data_ex（多品种多字段的 DataFrame）"></a>get_market_data_ex（多品种多字段的 DataFrame）</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">bars = C.get_market_data_ex([<span class="string">&#x27;close&#x27;</span>, <span class="string">&#x27;volume&#x27;</span>], [<span class="string">&#x27;600000.SH&#x27;</span>, <span class="string">&#x27;000001.SZ&#x27;</span>],</span><br><span class="line">                            period=<span class="string">&#x27;1d&#x27;</span>, count=<span class="number">60</span>)</span><br><span class="line">df = bars[<span class="string">&#x27;600000.SH&#x27;</span>]   <span class="comment"># 一个DataFrame，含close、volume列</span></span><br></pre></td></tr></table></figure><p>适合一次取多只股票、多个字段、要 DataFrame 形态的场景。</p><h2 id="四、本地缓存：避免重复取数"><a href="#四、本地缓存：避免重复取数" class="headerlink" title="四、本地缓存：避免重复取数"></a>四、本地缓存：避免重复取数</h2><p><code>get_history_data</code> 每次调用都会走一次数据接口，在 <code>handlebar</code> 高频路径里反复取 60 日数据非常浪费。建议把算好的指标或取好的序列缓存起来，只在需要时刷新。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">a</span>(): <span class="keyword">pass</span></span><br><span class="line">A = a()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    A.cache = &#123;&#125;          <span class="comment"># stock -&gt; &#123;&#x27;data&#x27;:..., &#x27;barpos&#x27;:...&#125;</span></span><br><span class="line">    C.set_universe([<span class="string">&#x27;600000.SH&#x27;</span>])</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handlebar</span>(<span class="params">C</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> C.is_last_bar():</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    stock = <span class="string">&#x27;600000.SH&#x27;</span></span><br><span class="line">    barpos = C.barpos</span><br><span class="line">    <span class="comment"># 同一根bar只取一次数</span></span><br><span class="line">    <span class="keyword">if</span> A.cache.get(stock, &#123;&#125;).get(<span class="string">&#x27;barpos&#x27;</span>) != barpos:</span><br><span class="line">        close = C.get_history_data(<span class="number">60</span>, <span class="string">&#x27;1d&#x27;</span>, <span class="string">&#x27;close&#x27;</span>, dividend_type=<span class="string">&#x27;front_ratio&#x27;</span>)[stock]</span><br><span class="line">        A.cache[stock] = &#123;<span class="string">&#x27;data&#x27;</span>: close, <span class="string">&#x27;barpos&#x27;</span>: barpos&#125;</span><br><span class="line">    close = A.cache[stock][<span class="string">&#x27;data&#x27;</span>]</span><br><span class="line">    ma60 = <span class="built_in">sum</span>(close) / <span class="built_in">len</span>(close)</span><br><span class="line">    <span class="comment"># ...</span></span><br></pre></td></tr></table></figure><p>这种「按 barpos 缓存」的写法，保证一根 K 线内多次访问只取数一次，是实盘性能优化的关键。</p><h3 id="落地到本地文件-数据库"><a href="#落地到本地文件-数据库" class="headerlink" title="落地到本地文件&#x2F;数据库"></a>落地到本地文件&#x2F;数据库</h3><p>如果数据量更大（比如全市场日线、多年 tick），可以下载后落到本地 parquet&#x2F;csv 或 SQLite，下次直接读本地，不再依赖 QMT 接口：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">save_local</span>(<span class="params">stock, df, path=<span class="string">&#x27;./data/&#x27;</span></span>):</span><br><span class="line">    df.to_parquet(<span class="string">f&quot;<span class="subst">&#123;path&#125;</span><span class="subst">&#123;stock.replace(<span class="string">&#x27;.&#x27;</span>,<span class="string">&#x27;_&#x27;</span>)&#125;</span>.parquet&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">load_local</span>(<span class="params">stock, path=<span class="string">&#x27;./data/&#x27;</span></span>):</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">return</span> pd.read_parquet(<span class="string">f&quot;<span class="subst">&#123;path&#125;</span><span class="subst">&#123;stock.replace(<span class="string">&#x27;.&#x27;</span>,<span class="string">&#x27;_&#x27;</span>)&#125;</span>.parquet&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> FileNotFoundError:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br></pre></td></tr></table></figure><blockquote><p>把数据落本地后，配合 <a href="../qmt-shared-code">公共代码的编写与引用</a>，可以让多个策略共享同一份缓存数据。</p></blockquote><h2 id="五、常见坑"><a href="#五、常见坑" class="headerlink" title="五、常见坑"></a>五、常见坑</h2><ol><li><strong>没下载就拿空值</strong>：<code>get_history_data</code> 返回 None 或长度为 0，先检查 <code>download_history_data</code> 是否执行过。</li><li><strong>在 handlebar 里下载</strong>：会严重阻塞，下载只放 <code>init</code> 或定时任务。</li><li><strong>复权类型用错</strong>：算指标前后复权结果不同，详见 <a href="../qmt-dividend-type">复权数据怎么选</a>。</li><li><strong>新上市&#x2F;停牌数据不足</strong>：取数后要判断长度，不够就跳过（官方双均线示例就是这么做的）。</li><li><strong>全推 tick 撑爆内存</strong>：按需订阅，别无脑全推。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>历史数据的流程是：<strong>download（下载历史） → set_universe&#x2F;subscribe（订阅实时） → get_history_data&#x2F;get_market_data_ex（取数） → 缓存（按 barpos 或落本地）</strong>。把这四步顺序记牢，再配上按 barpos 的缓存，策略的数据层就稳了。</p><blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote><hr>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;概述&quot;&gt;&lt;a href=&quot;#概述&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="行情数据" scheme="https://invest.wtsolutions.cn/tags/%E8%A1%8C%E6%83%85%E6%95%B0%E6%8D%AE/"/>
    
    <category term="缓存" scheme="https://invest.wtsolutions.cn/tags/%E7%BC%93%E5%AD%98/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: 委托回调 order_callback 与成交回调 deal_callback 的正确用法</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-order-deal-callback/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-order-deal-callback/</id>
    <published>2026-08-03T01:30:06.000Z</published>
    <updated>2026-08-12T01:49:07.153Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>很多新手写 QMT 策略时，下单用的是 <code>passorder</code><a href="../qmt-passorder-guide">passorder用法</a>，但“怎么知道这单到底成了没”全靠下一次 <code>handlebar</code> 里去 <code>get_trade_detail_data</code> 轮询。轮询当然能用，但有延迟、又费资源，还容易在查不到委托的瞬间误判成“没下出去”导致重复下单。</p><p>更优雅的做法是用 QMT 提供的两个回调函数：<code>order_callback</code>（委托回调）和 <code>deal_callback</code>（成交回调）。本文讲清楚它们的触发时机、参数结构，以及怎么和 <code>passorder</code> 的 <code>userOrderId</code> 串起来做一个可靠的订单状态机。</p><h2 id="两个回调的触发时机"><a href="#两个回调的触发时机" class="headerlink" title="两个回调的触发时机"></a>两个回调的触发时机</h2><table><thead><tr><th>回调</th><th>触发时机</th><th>典型用途</th></tr></thead><tbody><tr><td><code>order_callback</code></td><td>委托被柜台接收（已报单）</td><td>确认“单子下出去了”，从待确认列表移除</td></tr><tr><td><code>deal_callback</code></td><td>委托部分或全部成交</td><td>确认“真成交了”，更新持仓、发通知</td></tr></tbody></table><p>一句话区分：<code>order_callback</code> 管的是“报单到达”，<code>deal_callback</code> 管的是“撮合成交”。一个委托可能触发一次 <code>order_callback</code>，但可能分多次 <code>deal_callback</code>（部分成交）。</p><h2 id="函数签名"><a href="#函数签名" class="headerlink" title="函数签名"></a>函数签名</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">order_callback</span>(<span class="params">ContextInfo, account, orderInfo</span>):</span><br><span class="line">    <span class="comment"># 委托回调</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">deal_callback</span>(<span class="params">ContextInfo, account, dealInfo</span>):</span><br><span class="line">    <span class="comment"># 成交回调</span></span><br><span class="line">    <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><p>注意：这两个函数名是 QMT 约定的，<strong>写对名字就会自动被调用</strong>，不需要你在 <code>init</code> 里注册。</p><h2 id="订单对象常用字段"><a href="#订单对象常用字段" class="headerlink" title="订单对象常用字段"></a>订单对象常用字段</h2><p><code>orderInfo</code> &#x2F; <code>dealInfo</code> 是 QMT 传进来的对象，常用属性：</p><table><thead><tr><th>属性</th><th>含义</th></tr></thead><tbody><tr><td><code>m_strInstrumentID</code></td><td>证券代码（不带后缀）</td></tr><tr><td><code>m_strExchangeID</code></td><td>交易所，如 <code>&#39;SH&#39;</code>、<code>&#39;SZ&#39;</code></td></tr><tr><td><code>m_strRemark</code></td><td>你下单时传的 <code>userOrderId</code>（备注）</td></tr><tr><td><code>m_nVolume</code> &#x2F; <code>m_nCanUseVolume</code></td><td>委托&#x2F;可用数量</td></tr><tr><td><code>m_dPrice</code></td><td>委托&#x2F;成交价格</td></tr></tbody></table><p>其中 <code>m_strRemark</code> 最关键——它是你和 <code>passorder</code> 之间的“暗号”。下单时写进去，回调时读出来，就能精确定位是哪一笔单子回来了。</p><blockquote><p>不同版本字段名可能略有差异，完整字段请参考 <a href="../qmt-knowledge-base">QMT 知识库文档</a>，本文用的是社区最常见的字段名。</p></blockquote><h2 id="用-userOrderId-把下单和回调串起来"><a href="#用-userOrderId-把下单和回调串起来" class="headerlink" title="用 userOrderId 把下单和回调串起来"></a>用 userOrderId 把下单和回调串起来</h2><p>下面是一个最小可用的“下单 → 委托确认 → 成交确认”状态机：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment">#encoding:gbk</span></span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">a</span>(): <span class="keyword">pass</span></span><br><span class="line">A = a()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    A.acct = account</span><br><span class="line">    A.acct_type = accountType</span><br><span class="line">    A.buy_code = <span class="number">23</span> <span class="keyword">if</span> A.acct_type == <span class="string">&#x27;STOCK&#x27;</span> <span class="keyword">else</span> <span class="number">33</span></span><br><span class="line">    <span class="comment"># 订单状态字典：remark -&gt; &#123;&#x27;status&#x27;: &#x27;pending&#x27;/&#x27;ordered&#x27;/&#x27;filled&#x27;, ...&#125;</span></span><br><span class="line">    A.orders = &#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">place_buy</span>(<span class="params">C, stock, vol, price</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;下单并登记到状态机&quot;&quot;&quot;</span></span><br><span class="line">    remark = <span class="string">f&quot;buy-<span class="subst">&#123;stock&#125;</span>-<span class="subst">&#123;datetime.datetime.now():%H%M%S%f&#125;</span>&quot;</span></span><br><span class="line">    passorder(A.buy_code, <span class="number">1101</span>, A.acct, stock, <span class="number">0</span>, price, vol,</span><br><span class="line">              <span class="string">&#x27;回调示例&#x27;</span>, <span class="number">1</span>, remark, C)</span><br><span class="line">    A.orders[remark] = &#123;</span><br><span class="line">        <span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;pending&#x27;</span>,   <span class="comment"># 已调用passorder，等柜台回报</span></span><br><span class="line">        <span class="string">&#x27;stock&#x27;</span>: stock,</span><br><span class="line">        <span class="string">&#x27;vol&#x27;</span>: vol,</span><br><span class="line">        <span class="string">&#x27;price&#x27;</span>: price,</span><br><span class="line">        <span class="string">&#x27;filled&#x27;</span>: <span class="number">0</span>,</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;已下单 <span class="subst">&#123;remark&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">order_callback</span>(<span class="params">C, acct, orderInfo</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;委托被柜台接收&quot;&quot;&quot;</span></span><br><span class="line">    remark = orderInfo.m_strRemark</span><br><span class="line">    <span class="keyword">if</span> remark <span class="keyword">in</span> A.orders:</span><br><span class="line">        A.orders[remark][<span class="string">&#x27;status&#x27;</span>] = <span class="string">&#x27;ordered&#x27;</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;委托确认 <span class="subst">&#123;remark&#125;</span> 数量<span class="subst">&#123;orderInfo.m_nVolume&#125;</span> @<span class="subst">&#123;orderInfo.m_dPrice&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">deal_callback</span>(<span class="params">C, acct, dealInfo</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;成交回报&quot;&quot;&quot;</span></span><br><span class="line">    remark = dealInfo.m_strRemark</span><br><span class="line">    <span class="keyword">if</span> remark <span class="keyword">in</span> A.orders:</span><br><span class="line">        o = A.orders[remark]</span><br><span class="line">        o[<span class="string">&#x27;filled&#x27;</span>] += dealInfo.m_nVolume</span><br><span class="line">        <span class="keyword">if</span> o[<span class="string">&#x27;filled&#x27;</span>] &gt;= o[<span class="string">&#x27;vol&#x27;</span>]:</span><br><span class="line">            o[<span class="string">&#x27;status&#x27;</span>] = <span class="string">&#x27;filled&#x27;</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;全部成交 <span class="subst">&#123;remark&#125;</span> 成交<span class="subst">&#123;dealInfo.m_nVolume&#125;</span>股 @<span class="subst">&#123;dealInfo.m_dPrice&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="comment"># 这里可以触发：发通知、更新目标持仓、释放下一次下单许可</span></span><br><span class="line">            <span class="comment"># send_notify(f&quot;&#123;remark&#125; 全部成交&quot;)</span></span><br></pre></td></tr></table></figure><h2 id="为什么这样写更可靠"><a href="#为什么这样写更可靠" class="headerlink" title="为什么这样写更可靠"></a>为什么这样写更可靠</h2><h3 id="1-不再误判“没下出去”"><a href="#1-不再误判“没下出去”" class="headerlink" title="1. 不再误判“没下出去”"></a>1. 不再误判“没下出去”</h3><p>轮询派最大的坑是：下单后立刻去查 <code>get_trade_detail_data(&#39;order&#39;)</code>，可能那一瞬间委托还没回报，查不到，于是以为没下出去又下一笔——超单。用 <code>order_callback</code> 等回报到了再改状态，从根上避免。</p><h3 id="2-部分成交也能正确累计"><a href="#2-部分成交也能正确累计" class="headerlink" title="2. 部分成交也能正确累计"></a>2. 部分成交也能正确累计</h3><p>一笔 1000 股的买单可能分 3 次 <code>deal_callback</code>（300 + 500 + 200）。上面代码用 <code>o[&#39;filled&#39;] += dealInfo.m_nVolume</code> 累加，只有累计等于委托量时才标记 <code>filled</code>，符合真实撮合过程。</p><h3 id="3-失败委托可识别"><a href="#3-失败委托可识别" class="headerlink" title="3. 失败委托可识别"></a>3. 失败委托可识别</h3><p>如果一个 <code>pending</code> 状态的订单长时间没有 <code>order_callback</code>，基本可以判定是废单（价格不合规、数量不对、柜台风控等）。可以用一个定时任务扫描超时的 <code>pending</code> 订单，触发告警：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    ...</span><br><span class="line">    C.run_time(<span class="string">&#x27;check_timeout&#x27;</span>, <span class="string">&#x27;30nSecond&#x27;</span>, <span class="string">&#x27;20260101 09:30:00&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">check_timeout</span>(<span class="params">C</span>):</span><br><span class="line">    now = datetime.datetime.now()</span><br><span class="line">    <span class="keyword">for</span> remark, o <span class="keyword">in</span> <span class="built_in">list</span>(A.orders.items()):</span><br><span class="line">        <span class="keyword">if</span> o[<span class="string">&#x27;status&#x27;</span>] == <span class="string">&#x27;pending&#x27;</span>:</span><br><span class="line">            age = (now - o.get(<span class="string">&#x27;ts&#x27;</span>, now)).total_seconds()</span><br><span class="line">            <span class="keyword">if</span> age &gt; <span class="number">60</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;警告：<span class="subst">&#123;remark&#125;</span> 超过60秒未确认，疑似废单&quot;</span>)</span><br><span class="line">                o[<span class="string">&#x27;status&#x27;</span>] = <span class="string">&#x27;rejected&#x27;</span></span><br><span class="line">                <span class="comment"># send_notify(f&quot;疑似废单 &#123;remark&#125;&quot;)</span></span><br></pre></td></tr></table></figure><blockquote><p>关于 <code>run_time</code> 定时任务的用法，参考 <a href="../qmt-daily-reset">每天代码重置与定时任务设置</a>。</p></blockquote><h2 id="配合通知推送到手机"><a href="#配合通知推送到手机" class="headerlink" title="配合通知推送到手机"></a>配合通知推送到手机</h2><p>成交回调是发通知的最佳时机——不是“下单了”就通知，而是“真成交了”才通知，避免被一堆废单打扰。把 <code>deal_callback</code> 里的 <code>send_notify</code> 接上邮件&#x2F;微信推送即可，具体实现见 <a href="../qmt-email-notification">QMT 与手机通信 - 邮件推送实现方法</a> 或 <a href="../qmt-wechat-notification">策略消息推送到微信的几种方案</a>。</p><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li><strong>回调里不要做重活</strong>：回调在 QMT 主线程触发，里面不要写耗时 IO（比如同步发邮件阻塞几秒），否则会拖慢整个行情&#x2F;交易处理。需要时把消息丢到一个队列，由定时任务慢慢发。</li><li><strong>回调里不要直接 <code>passorder</code></strong>：在 <code>deal_callback</code> 里立刻根据成交结果反手下另一笔是常见需求，但要确认账户状态、行情就绪，且做好防重入，否则容易连环下单。</li><li><strong>字段名以实测为准</strong>：不同券商版本的 QMT，<code>orderInfo</code> 字段名可能有细微差别，第一次用建议先 <code>print(dir(orderInfo))</code> 看一下实际属性。</li><li><strong>回测里回调行为不同</strong>：回测中 <code>deal_callback</code> 通常按 K 线撮合触发，频率和实盘完全不同，详见 <a href="../qmt-backtest-vs-live">QMT 回测与实盘的关键差异</a>。</li><li>order_callback和deal_callback中可能存在时间延迟，正常情况下是很快回报，但是有时候券商服务器可能是几个小时候才能 callback，所以建议自己增加判断是否真正下单成交，当然这种情况极少发生。</li><li>当系统断网重连之后，服务器可能会把当天的所有单子全部给你callback一遍，所以不能完全相信 callback 的准确性，需要自己增加判断是否真正下单成交。通常是需要自己建立一个小型数据库，记录下单状态，等成交回调来更新。如果 callback 中出现的单子在数据库里面已经显示完成状态，那么可能这个 callback 就是券商服务器重复推送了。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li><code>order_callback</code> &#x3D; 报单到达，<code>deal_callback</code> &#x3D; 撮合成交。</li><li>用 <code>passorder</code> 的 <code>userOrderId</code>（<code>m_strRemark</code>）做暗号，把下单和回调串成一个订单状态机。</li><li>状态机里区分 <code>pending / ordered / filled / rejected</code>，配合超时扫描，就能解决实盘最头疼的“重复下单”和“废单识别”问题。</li><li>回调里保持轻量，重活丢给定时任务，通知只在真正成交时发。</li></ul><p>把这套机制跑通，你的实盘策略才谈得上“可靠”二字。</p><blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote><hr>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;概述&quot;&gt;&lt;a href=&quot;#概述&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="策略" scheme="https://invest.wtsolutions.cn/tags/%E7%AD%96%E7%95%A5/"/>
    
    <category term="回调" scheme="https://invest.wtsolutions.cn/tags/%E5%9B%9E%E8%B0%83/"/>
    
    <category term="成交" scheme="https://invest.wtsolutions.cn/tags/%E6%88%90%E4%BA%A4/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: 运行状态监控与心跳报警</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-monitoring-alert/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-monitoring-alert/</id>
    <published>2026-08-02T01:40:06.000Z</published>
    <updated>2026-08-12T01:49:02.469Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>策略上线后最怕两件事：一是 QMT 挂了你不知道，二是策略还在”运行”但其实已经不工作（断开连接、行情不更新、下单报错被吞）。等你晚上看盘发现时，可能已经错过一整天。</p><p>本文给出一个轻量的「心跳 + 巡检 + 报警」方案，让 QMT 出问题第一时间推送到手机。和 <a href="../qmt-email-notification">邮件推送</a>、<a href="../qmt-auto-recovery">崩溃自动恢复</a> 配合，组成完整的运维闭环。</p><h2 id="一、监控什么"><a href="#一、监控什么" class="headerlink" title="一、监控什么"></a>一、监控什么</h2><table><thead><tr><th>监控项</th><th>含义</th><th>异常表现</th></tr></thead><tbody><tr><td>心跳</td><td>策略是否还在跑</td><td>心跳时间戳长期不更新</td></tr><tr><td>行情新鲜度</td><td>最新价是否还在变</td><td>最新bar时间停在很久以前</td></tr><tr><td>账号登录态</td><td>交易通道是否在线</td><td>get_trade_detail_data 报错或返回空</td></tr><tr><td>持仓异常</td><td>持仓是否合理</td><td>持仓为0但应有持仓、负持仓等</td></tr><tr><td>当日委托&#x2F;成交</td><td>今天有没有异常废单</td><td>pending 长时间不确认</td></tr></tbody></table><h2 id="二、心跳：最基础的存活检测"><a href="#二、心跳：最基础的存活检测" class="headerlink" title="二、心跳：最基础的存活检测"></a>二、心跳：最基础的存活检测</h2><p>思路：策略定时把”当前时间”写到文件&#x2F;数据库，外部（或另一个巡检任务）检查这个时间戳是否在更新。超过阈值就报警。</p><h3 id="策略端：定时写心跳"><a href="#策略端：定时写心跳" class="headerlink" title="策略端：定时写心跳"></a>策略端：定时写心跳</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment">#encoding:gbk</span></span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> date</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">a</span>(): <span class="keyword">pass</span></span><br><span class="line">A = a()</span><br><span class="line">A.heartbeat = <span class="string">&#x27;&#x27;</span>   <span class="comment"># 心跳时间戳，仅存内存</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    A.acct = account</span><br><span class="line">    A.acct_type = accountType</span><br><span class="line">    <span class="comment"># 每30秒写一次心跳</span></span><br><span class="line">    C.run_time(<span class="string">&#x27;heartbeat&#x27;</span>, <span class="string">&#x27;30nSecond&#x27;</span>, <span class="built_in">str</span>(date.today())+<span class="string">&#x27; 09:00:00&#x27;</span>)</span><br><span class="line">    <span class="comment"># 每2分钟巡检一次</span></span><br><span class="line">    C.run_time(<span class="string">&#x27;patrol&#x27;</span>, <span class="string">&#x27;60nSecond&#x27;</span>, <span class="built_in">str</span>(date.today())+<span class="string">&#x27; 09:00:00&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">heartbeat</span>(<span class="params">C</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;定时写心跳时间戳&quot;&quot;&quot;</span></span><br><span class="line">    A.heartbeat = datetime.datetime.now().strftime(<span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line">    <span class="comment"># 保存到文件/数据库</span></span><br><span class="line">    save(A.heartbeat)</span><br></pre></td></tr></table></figure><blockquote><p><code>run_time</code> 定时任务用法见 <a href="../qmt-daily-reset">每天代码重置与定时任务</a>。</p></blockquote><h2 id="三、巡检：在策略内部自检"><a href="#三、巡检：在策略内部自检" class="headerlink" title="三、巡检：在策略内部自检"></a>三、巡检：在策略内部自检</h2><p>光有心跳不够——策略可能还在跑，但行情断了或账号掉线了。需要在策略内定时做几项检查，发现异常就报警：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">patrol</span>(<span class="params">C</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;定时巡检，异常即告警&quot;&quot;&quot;</span></span><br><span class="line">    problems = []</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 1. 行情新鲜度：最新bar时间是否过旧</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        snap = C.get_market_data_ex([<span class="string">&#x27;last&#x27;</span>], [A.stock], period=<span class="string">&#x27;1d&#x27;</span>, count=<span class="number">1</span>)</span><br><span class="line">        last_bar_time = snap[A.stock].index[-<span class="number">1</span>]</span><br><span class="line">        <span class="comment"># 若非交易时段可放宽，交易时段内超过5分钟没更新视为异常</span></span><br><span class="line">        <span class="comment"># （判断交易时段见 qmt-is-now-a-trading-hour）</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        problems.append(<span class="string">f&quot;取行情失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. 账号登录态：查账户能查到说明在线</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        acc = get_trade_detail_data(A.acct, A.acct_type, <span class="string">&#x27;account&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(acc) == <span class="number">0</span>:</span><br><span class="line">            problems.append(<span class="string">f&quot;账号 <span class="subst">&#123;A.acct&#125;</span> 未登录或掉线&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        problems.append(<span class="string">f&quot;查账号异常: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 3. pending 订单超时（结合崩溃恢复的pending）</span></span><br><span class="line">    st = load(&#123;&#125;)</span><br><span class="line">    pending = st.get(<span class="string">&#x27;pending&#x27;</span>, &#123;&#125;)</span><br><span class="line">    <span class="comment"># 简单判断：pending太多/太久未确认</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(pending) &gt; <span class="number">5</span>:</span><br><span class="line">        problems.append(<span class="string">f&quot;未确认委托过多: <span class="subst">&#123;<span class="built_in">len</span>(pending)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> problems:</span><br><span class="line">        msg = <span class="string">&quot;\n&quot;</span>.join(problems)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[巡检异常] <span class="subst">&#123;msg&#125;</span>&quot;</span>)</span><br><span class="line">        notify(<span class="string">&quot;QMT巡检异常&quot;</span>, msg)</span><br></pre></td></tr></table></figure><h2 id="四、报警通道"><a href="#四、报警通道" class="headerlink" title="四、报警通道"></a>四、报警通道</h2><p>巡检发现异常，要能推到手机。最简单的是复用 <a href="../qmt-email-notification">邮件推送</a>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> email_utils <span class="keyword">import</span> send_qmt_email</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">notify</span>(<span class="params">subject, content</span>):</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        send_qmt_email(<span class="string">&quot;[QMT]&quot;</span> + subject, content)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;告警发送失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)  <span class="comment"># 告警本身失败不能影响策略</span></span><br></pre></td></tr></table></figure><p>除邮件外，还可选：</p><ul><li><strong>Server酱 &#x2F; Bark</strong>：HTTP 一个 GET 就能推到微信&#x2F;App，比邮件更快。</li><li><strong>钉钉 &#x2F; 企业微信机器人</strong>：适合多策略集中告警到一个群。</li><li><strong>短信</strong>：最紧急场景，但通常要付费。</li></ul><blockquote><p>以上几种微信推送通道的具体接入代码，见 <a href="../qmt-wechat-notification">策略消息推送到微信的几种方案</a>。</p></blockquote><blockquote><p>关键告警（账号掉线、重复下单风险）建议用即时性更好的渠道，邮件可作为兜底。</p></blockquote><h2 id="五、外部存活检测：防止策略整体卡死"><a href="#五、外部存活检测：防止策略整体卡死" class="headerlink" title="五、外部存活检测：防止策略整体卡死"></a>五、外部存活检测：防止策略整体卡死</h2><p>策略自己的心跳和巡检，在”策略进程还在”时才有效。如果整个策略卡死（死锁、QMT 假死），它就没法再写心跳了。所以需要一个<strong>独立于策略</strong>的外部检测：</p><p>用一个独立的定时任务（系统 crontab 或另一个极简策略）读取心跳文件，检查时间戳：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># watchdog.py —— 可由系统计划任务每分钟跑一次</span></span><br><span class="line"><span class="keyword">import</span> datetime, os, json</span><br><span class="line"><span class="keyword">from</span> email_utils <span class="keyword">import</span> send_qmt_email</span><br><span class="line"></span><br><span class="line">STATE = <span class="string">&#x27;./strategy_state.json&#x27;</span></span><br><span class="line">THRESHOLD = <span class="number">120</span>  <span class="comment"># 秒，超过2分钟没心跳就告警</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">check</span>():</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(STATE):</span><br><span class="line">        send_qmt_email(<span class="string">&quot;[QMT]心跳丢失&quot;</span>, <span class="string">&quot;找不到状态文件，策略可能未启动&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(STATE, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        st = json.load(f)</span><br><span class="line">    hb = st.get(<span class="string">&#x27;heartbeat&#x27;</span>, <span class="string">&#x27;&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> hb:</span><br><span class="line">        send_qmt_email(<span class="string">&quot;[QMT]心跳丢失&quot;</span>, <span class="string">&quot;无心跳记录&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    last = datetime.datetime.strptime(hb, <span class="string">&#x27;%Y-%m-%d %H:%M:%S&#x27;</span>)</span><br><span class="line">    age = (datetime.datetime.now() - last).total_seconds()</span><br><span class="line">    <span class="keyword">if</span> age &gt; THRESHOLD:</span><br><span class="line">        send_qmt_email(<span class="string">&quot;[QMT]心跳超时&quot;</span>, <span class="string">f&quot;上次心跳 <span class="subst">&#123;hb&#125;</span>，已超 <span class="subst">&#123;<span class="built_in">int</span>(age)&#125;</span> 秒&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    check()</span><br></pre></td></tr></table></figure><p>用 crontab 每分钟跑一次：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* * * * * cd /path/to/qmt/python &amp;&amp; python watchdog.py</span><br></pre></td></tr></table></figure><blockquote><p>这样哪怕 QMT 整体假死，外部看门狗也能发现心跳停了，第一时间告警。</p></blockquote><h2 id="六、一份巡检报告：每天收盘推送"><a href="#六、一份巡检报告：每天收盘推送" class="headerlink" title="六、一份巡检报告：每天收盘推送"></a>六、一份巡检报告：每天收盘推送</h2><p>除了异常告警，每天收盘后推送一份「日报」也很有用：今日成交、当前持仓、账号市值、心跳状态。让你不用开电脑也能知道策略今天干了啥：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    <span class="comment"># 每天15:05推送日报</span></span><br><span class="line">    C.run_time(<span class="string">&#x27;daily_report&#x27;</span>, <span class="string">&#x27;1nDay&#x27;</span>, <span class="string">&#x27;20260101 15:05:00&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">daily_report</span>(<span class="params">C</span>):</span><br><span class="line">    acc = get_trade_detail_data(A.acct, A.acct_type, <span class="string">&#x27;account&#x27;</span>)[<span class="number">0</span>]</span><br><span class="line">    holdings = get_trade_detail_data(A.acct, A.acct_type, <span class="string">&#x27;position&#x27;</span>)</span><br><span class="line">    lines = [<span class="string">f&quot;账号 <span class="subst">&#123;A.acct&#125;</span> 收盘报告&quot;</span>,</span><br><span class="line">             <span class="string">f&quot;可用资金: <span class="subst">&#123;acc.m_dAvailable&#125;</span>&quot;</span>,</span><br><span class="line">             <span class="string">f&quot;持仓数: <span class="subst">&#123;<span class="built_in">len</span>(holdings)&#125;</span>&quot;</span>]</span><br><span class="line">    <span class="keyword">for</span> h <span class="keyword">in</span> holdings:</span><br><span class="line">        code = h.m_strInstrumentID + <span class="string">&#x27;.&#x27;</span> + h.m_strExchangeID</span><br><span class="line">        lines.append(<span class="string">f&quot;  <span class="subst">&#123;code&#125;</span> <span class="subst">&#123;h.m_nVolume&#125;</span>股 浮盈<span class="subst">&#123;h.m_dProfit&#125;</span>&quot;</span>)</span><br><span class="line">    notify(<span class="string">&quot;收盘报告&quot;</span>, <span class="string">&quot;\n&quot;</span>.join(lines))</span><br></pre></td></tr></table></figure><h2 id="七、注意事项"><a href="#七、注意事项" class="headerlink" title="七、注意事项"></a>七、注意事项</h2><ol><li><strong>告警要节流</strong>：同一个异常别每 30 秒告警一次，会刷屏。给告警加去重&#x2F;冷却时间（同一类问题 10 分钟内只报一次）。</li><li><strong>告警本身别拖垮策略</strong>：发邮件&#x2F;HTTP 是阻塞 IO，放在 <code>run_time</code> 任务里，别放在 <code>handlebar</code> 高频路径；失败要 catch，不能因告警失败抛异常影响主逻辑。</li><li><strong>非交易时段静默</strong>：盘后、夜里的心跳超时多半是正常停盘，判断交易时段后再决定要不要告警，参考 <a href="../qmt-is-now-a-trading-hour">判断交易时段</a>。</li><li><strong>多策略分别心跳</strong>：每个策略写自己的心跳字段，看门狗统一检查，参考 <a href="../qmt-multi-strategy">多策略管理</a>。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>一个可靠的监控体系 &#x3D; <strong>策略内心跳 + 内部巡检 + 外部看门狗 + 报警通道 + 日报兜底</strong>。</p><ul><li>心跳保证”还活着”，巡检保证”活着且正常”，看门狗保证”心跳本身没卡死”。</li><li>异常用即时渠道，日报用邮件，都接到手机上。</li><li>告警要节流、要容错，别让监控本身成为新的故障源。</li></ul><p>把这套和 <a href="../qmt-auto-recovery">崩溃自动恢复</a> 一起部署，你的 QMT 实盘才真正算”无人值守也能睡个安稳觉”。</p><hr><blockquote><p>说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。</p></blockquote>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;说明：本文包含 AI 创作内容，请自行判断是否适用。文中包含的代码片段，切勿直接使用，需要根据实际情况修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;概述&quot;&gt;&lt;a href=&quot;#概述&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="监控" scheme="https://invest.wtsolutions.cn/tags/%E7%9B%91%E6%8E%A7/"/>
    
    <category term="心跳" scheme="https://invest.wtsolutions.cn/tags/%E5%BF%83%E8%B7%B3/"/>
    
    <category term="告警" scheme="https://invest.wtsolutions.cn/tags/%E5%91%8A%E8%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: 下单函数 passorder 参数详解与实战</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-passorder-guide/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-passorder-guide/</id>
    <published>2026-08-01T08:00:06.000Z</published>
    <updated>2026-08-12T01:49:11.088Z</updated>
    
    <content type="html"><![CDATA[<h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p><code>passorder</code> 是 QMT 中最核心的下单函数，几乎所有实盘策略最终都要通过它把信号变成真实的委托。但它的参数有 11 个，官方文档对每个参数的取值又多以代码表形式罗列，新手第一眼常常懵。</p><p>本文把 <code>passorder</code> 的每个参数拆开讲透，并给出股票、两融账户的常用取值，最后用一段可直接运行的实战代码串起来。</p><blockquote><p>完整的取值代码表（如期货、期权的 opType&#x2F;orderType）请以官方文档为准，可参考 <a href="../qmt-knowledge-base">QMT 知识库 &#x2F; XtQuant 使用文档 pdf</a>。</p></blockquote><h2 id="函数签名"><a href="#函数签名" class="headerlink" title="函数签名"></a>函数签名</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">passorder(opType, orderType, accountid, orderCode, prType, price, volume,</span><br><span class="line">          strategyName, quickOrder, userOrderId, ContextInfo)</span><br></pre></td></tr></table></figure><h2 id="参数逐个详解"><a href="#参数逐个详解" class="headerlink" title="参数逐个详解"></a>参数逐个详解</h2><h3 id="1-opType-——-买卖类型"><a href="#1-opType-——-买卖类型" class="headerlink" title="1. opType —— 买卖类型"></a>1. opType —— 买卖类型</h3><p>最常用的几个：</p><table><thead><tr><th>opType</th><th>含义</th><th>适用账户</th></tr></thead><tbody><tr><td>23</td><td>股票买入</td><td>STOCK 普通账户</td></tr><tr><td>24</td><td>股票卖出</td><td>STOCK 普通账户</td></tr></tbody></table><h3 id="2-orderType-——-委托类型"><a href="#2-orderType-——-委托类型" class="headerlink" title="2. orderType —— 委托类型"></a>2. orderType —— 委托类型</h3><ul><li><code>1101</code>：单边，股票普通买卖最常用，按股数委托</li></ul><p>做股票策略，无脑用 <code>1101</code> 即可；做期货期权再查阅官方文档对应类型。</p><h3 id="3-accountid-——-资金账号"><a href="#3-accountid-——-资金账号" class="headerlink" title="3. accountid —— 资金账号"></a>3. accountid —— 资金账号</h3><p>字符串，就是模型交易界面选择的账号，例如 <code>&#39;88888888&#39;</code>。一般直接用界面传进来的 <code>account</code> 变量。</p><h3 id="4-orderCode-——-证券代码"><a href="#4-orderCode-——-证券代码" class="headerlink" title="4. orderCode —— 证券代码"></a>4. orderCode —— 证券代码</h3><p>带交易所后缀的代码，格式 <code>&#39;代码.市场&#39;</code>：</p><ul><li>沪市：<code>&#39;600000.SH&#39;</code></li><li>深市：<code>&#39;000001.SZ&#39;</code></li><li>北交所：<code>&#39;430047.BJ&#39;</code></li></ul><p>注意：很多新手会漏掉后缀，导致报“找不到合约”之类的错误。</p><h3 id="5-prType-——-价格类型"><a href="#5-prType-——-价格类型" class="headerlink" title="5. prType —— 价格类型"></a>5. prType —— 价格类型</h3><table><thead><tr><th>prType</th><th>含义</th><th>price 参数怎么填</th></tr></thead><tbody><tr><td>11</td><td>限价委托</td><td>填具体的限价金额</td></tr></tbody></table><p>实战中最常用两种：<strong>限价单</strong>（<code>prType=11</code>，自己给价）和<strong>最新价单</strong>（<code>prType=14</code>，<code>price=-1</code>，跟盘口最新成交价走）。</p><h3 id="6-price-——-委托价格"><a href="#6-price-——-委托价格" class="headerlink" title="6. price —— 委托价格"></a>6. price —— 委托价格</h3><ul><li>限价单：填你想要的价格，例如 <code>10.55</code></li><li>市价&#x2F;最新价单：填 <code>-1</code>，由 <code>prType</code> 决定实际价格</li></ul><h3 id="7-volume-——-委托数量"><a href="#7-volume-——-委托数量" class="headerlink" title="7. volume —— 委托数量"></a>7. volume —— 委托数量</h3><p>A 股买入需为 100 的整数倍（1 手 &#x3D; 100 股），卖出不足 100 股的零股需单独处理。</p><h3 id="8-strategyName-——-策略名称"><a href="#8-strategyName-——-策略名称" class="headerlink" title="8. strategyName —— 策略名称"></a>8. strategyName —— 策略名称</h3><p>字符串，给委托打一个策略标签，方便在终端委托列表里区分多个策略的单子。</p><h3 id="9-quickOrder-——-快速下单"><a href="#9-quickOrder-——-快速下单" class="headerlink" title="9. quickOrder —— 快速下单"></a>9. quickOrder —— 快速下单</h3><ul><li><code>1</code>：快速通道（推荐，委托更快落地）</li><li><code>0</code>：普通流程</li></ul><p>样例策略里基本都用 <code>1</code>。</p><h3 id="10-userOrderId-——-自定义订单标识"><a href="#10-userOrderId-——-自定义订单标识" class="headerlink" title="10. userOrderId —— 自定义订单标识"></a>10. userOrderId —— 自定义订单标识</h3><p>非常关键的一个参数。它是一个字符串“备注”，会随委托一路传递。你在 <code>order_callback</code> &#x2F; <code>deal_callback</code> 里就是靠它把“哪一笔回来了”对上的。建议用“策略名 + 动作 + 时间”这种唯一可读的格式：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">msg = <span class="string">f&quot;双均线 <span class="subst">&#123;stock&#125;</span> 买入 <span class="subst">&#123;vol&#125;</span>股 <span class="subst">&#123;datetime.datetime.now():%H%M%S&#125;</span>&quot;</span></span><br></pre></td></tr></table></figure><p>具体怎么用回调匹配，看下一篇文章 <a href="../qmt-order-deal-callback">委托回调与成交回调的正确用法</a>。</p><h3 id="11-ContextInfo-——-上下文对象"><a href="#11-ContextInfo-——-上下文对象" class="headerlink" title="11. ContextInfo —— 上下文对象"></a>11. ContextInfo —— 上下文对象</h3><p>策略上下文，照传 <code>C</code> &#x2F; <code>ContextInfo</code> 即可。</p><h2 id="撤单"><a href="#撤单" class="headerlink" title="撤单"></a>撤单</h2><p>撤单用 <code>cancel</code> 函数，传入系统委托号 <code>m_strOrderSysID</code>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 撤掉某笔委托</span></span><br><span class="line">cancel(order_sysid, acct, acct_type)</span><br></pre></td></tr></table></figure><p><code>order_sysid</code> 可通过 <code>get_trade_detail_data(acct, acct_type, &#39;order&#39;)</code> 查到。</p><h2 id="常见错误与注意事项"><a href="#常见错误与注意事项" class="headerlink" title="常见错误与注意事项"></a>常见错误与注意事项</h2><ol><li><strong>代码漏后缀</strong>：<code>&#39;600000&#39;</code> 不行，必须 <code>&#39;600000.SH&#39;</code>。</li><li><strong>数量不是 100 整数倍</strong>：买入会被柜台风控驳回。</li><li><strong>没做防重复</strong>：<code>handlebar</code> 在盘中会被高频触发，下单后一定要登记“待确认”状态，等回调或查到委托后再放行下一笔，否则容易超单。这正是 <code>userOrderId</code> 存在的意义。</li><li><strong>市价单价格填错</strong>：<code>prType=14</code> 时 <code>price</code> 必须填 <code>-1</code>，填了正数反而可能被当成限价。</li><li><strong>涨跌停板</strong>：涨停板买入 &#x2F; 跌停板卖出基本不会成交，下单前最好用最新价对比涨跌停价做拦截。</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p><code>passorder</code> 看着参数多，拆开后其实就三件事：<strong>买卖谁（opType + orderCode）、用什么价（prType + price）、下多少（volume）</strong>，其余参数是账号、策略标签和订单标识。把 <code>userOrderId</code> 用好，配合回调，就能把“下单—确认—防重复”这套实盘必备的闭环跑通。</p><hr>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;概述&quot;&gt;&lt;a href=&quot;#概述&quot; class=&quot;headerlink&quot; title=&quot;概述&quot;&gt;&lt;/a&gt;概述&lt;/h2&gt;&lt;p&gt;&lt;code&gt;passorder&lt;/code&gt; 是 QMT</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="策略" scheme="https://invest.wtsolutions.cn/tags/%E7%AD%96%E7%95%A5/"/>
    
    <category term="下单" scheme="https://invest.wtsolutions.cn/tags/%E4%B8%8B%E5%8D%95/"/>
    
    <category term="passorder" scheme="https://invest.wtsolutions.cn/tags/passorder/"/>
    
  </entry>
  
  <entry>
    <title>网传 MiniQMT 将被关闭？事实核查与应对指南（2026 版）</title>
    <link href="https://invest.wtsolutions.cn/posts/miniqmt-termination/"/>
    <id>https://invest.wtsolutions.cn/posts/miniqmt-termination/</id>
    <published>2026-07-02T01:30:00.000Z</published>
    <updated>2026-08-16T07:08:01.086Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>一句话结论：<br><strong>MiniQMT 并没有被“官方宣布死刑”，但券商侧确实在收紧；新增已基本停发，存量大概率会在 1～2 个月内逐步清退。</strong></p></blockquote><hr><h2 id="一、到底发生了什么？"><a href="#一、到底发生了什么？" class="headerlink" title="一、到底发生了什么？"></a>一、到底发生了什么？</h2><p>近期圈内流传「MiniQMT 要被官方关闭」的说法，<strong>半真半假</strong>：</p><table><thead><tr><th>项目</th><th>现状</th></tr></thead><tbody><tr><td>是否全面禁止</td><td>❌ 否</td></tr><tr><td>是否影响 QMT 主程序</td><td>❌ 不影响</td></tr><tr><td>是否影响 MiniQMT（xtquant 独立模式）</td><td>✅ 是</td></tr><tr><td>是否已发生</td><td>✅ 多家券商已下发通知</td></tr></tbody></table><p>目前已核实的信息（截至 <strong>2026-07-01</strong>）：</p><ul><li>自 <strong>2026 年 7 月 6 日（下周一）</strong> 起，部分券商 <strong>新开 QMT 权限不再包含 MiniQMT（独立 &#x2F; 极简 &#x2F; xtquant）功能</strong>；</li><li><strong>存量客户目前仍可用</strong>，但券商明确表示将「后续专项通知」，业内普遍预期 <strong>1–2 个月内存量也将逐步关闭</strong>；</li><li>原因高度一致：<strong>MiniQMT 本地原生 Python 直连 API，容易被认定为“外接系统”</strong>，触碰合规红线。</li></ul><hr><h2 id="二、几个容易混淆的概念"><a href="#二、几个容易混淆的概念" class="headerlink" title="二、几个容易混淆的概念"></a>二、几个容易混淆的概念</h2><h3 id="❌-MiniQMT-≠-QMT-全部"><a href="#❌-MiniQMT-≠-QMT-全部" class="headerlink" title="❌ MiniQMT ≠ QMT 全部"></a>❌ MiniQMT ≠ QMT 全部</h3><ul><li><strong>MiniQMT（被收紧）</strong><br>本地原生 Python + <code>xtquant</code> 库，脱离客户端运行。</li><li><strong>QMT 主程序（不受影响）</strong><br>内置 Python 环境，策略运行在客户端沙箱内。</li></ul><h3 id="⚠️-目前尚无“官方红头文件”"><a href="#⚠️-目前尚无“官方红头文件”" class="headerlink" title="⚠️ 目前尚无“官方红头文件”"></a>⚠️ 目前尚无“官方红头文件”</h3><ul><li>目前信息源以 <strong>券商内部通知 + 量化自媒体</strong> 为主；</li><li>尚未看到 <strong>迅投（QMT 厂商）或证监会</strong> 的统一公告；</li><li>更准确的说法是：<strong>监管趋严 → 券商集体收紧 → MiniQMT 首当其冲</strong>。</li></ul><hr><h2 id="三、对普通量化玩家的影响"><a href="#三、对普通量化玩家的影响" class="headerlink" title="三、对普通量化玩家的影响"></a>三、对普通量化玩家的影响</h2><table><thead><tr><th>场景</th><th>影响程度</th></tr></thead><tbody><tr><td>只用 QMT 客户端写策略</td><td>🟢 无影响</td></tr><tr><td>本地 PyCharm &#x2F; VS Code + xtquant</td><td>🔴 高风险</td></tr><tr><td>多进程 &#x2F; 高频 &#x2F; C++ 扩展</td><td>🔴 基本无法绕开</td></tr><tr><td>简单定时选股 + 手动下单</td><td>🟡 可改用 QMT 内置</td></tr></tbody></table><hr><h2 id="四、如果你正在用-MiniQMT，建议这样应对"><a href="#四、如果你正在用-MiniQMT，建议这样应对" class="headerlink" title="四、如果你正在用 MiniQMT，建议这样应对"></a>四、如果你正在用 MiniQMT，建议这样应对</h2><h3 id="✅-方案一：迁移到大-QMT（最稳妥）"><a href="#✅-方案一：迁移到大-QMT（最稳妥）" class="headerlink" title="✅ 方案一：迁移到大 QMT（最稳妥）"></a>✅ 方案一：迁移到大 QMT（最稳妥）</h3><ul><li>把策略代码迁移到 <strong>QMT 内置 Python</strong>；</li><li>API 名称基本一致，但运行环境从本地 Python 改为客户端沙箱；</li><li>适合 <strong>中低频、不依赖复杂第三方库</strong> 的策略。</li><li>注意大QMT的api接口和MiniQMT的api接口有差异，需要根据实际情况调整。在迁移的时候，可以基于官方文档，或者我总结的pdf版本的官方文档<a href="../qmt-knowledge-base">网盘下载</a>，把这个pdf投喂给ai，让ai帮你分析出哪些接口需要调整。</li><li>使用<a href="../qmt-knowledge-skill">qmt-knowledge-skill</a>来由 ai 重写代码，协助迁移策略。</li></ul><h3 id="✅-方案二：信号中转（折中方案）"><a href="#✅-方案二：信号中转（折中方案）" class="headerlink" title="✅ 方案二：信号中转（折中方案）"></a>✅ 方案二：信号中转（折中方案）</h3><p>思路：<strong>本地算信号，QMT 只负责下单</strong>。</p><p>本地 Python（任意版本）<br>↓<br>文件 &#x2F; Redis &#x2F; MySQL<br>↓<br>QMT 内置 Python 读取<br>↓<br>下单</p><ul><li>本地可以继续用 NumPy &#x2F; Pandas &#x2F; PyTorch；</li><li>QMT 端只做最简单的读取 + 下单；</li><li><strong>不适合高频</strong>（延迟增加）。</li></ul><h3 id="✅-方案三：HTTP-桥接（最复杂）"><a href="#✅-方案三：HTTP-桥接（最复杂）" class="headerlink" title="✅ 方案三：HTTP 桥接（最复杂）"></a>✅ 方案三：HTTP 桥接（最复杂）</h3><p>思路：<strong>本地策略 → QMT 内置 Python 读取 + 下单</strong>。</p><ul><li>本地可以继续用 NumPy &#x2F; Pandas &#x2F; PyTorch；</li><li>QMT 端只做最简单的读取 + 下单；</li><li><strong>不适合高频</strong>（延迟增加）。</li></ul><p>参见 <a href="../qmt-miniqmt-bridge">qmt-miniqmt-bridge</a></p><h3 id="✅-方案四：消息通知-人工执行"><a href="#✅-方案四：消息通知-人工执行" class="headerlink" title="✅ 方案四：消息通知 + 人工执行"></a>✅ 方案四：消息通知 + 人工执行</h3><ul><li>本地策略 → 企业微信 &#x2F; 钉钉 &#x2F; 邮件（推送方案见 <a href="../qmt-wechat-notification">策略消息推送到微信的几种方案</a>）；</li><li>人工或半自动执行；</li><li>合规风险最低，但效率也最低。</li></ul><hr><h2 id="五、我个人的判断与建议"><a href="#五、我个人的判断与建议" class="headerlink" title="五、我个人的判断与建议"></a>五、我个人的判断与建议</h2><ol><li><strong>不要赌“还能再开一个券商囤权限”</strong><br>窗口正在关闭，且未来只会更严。</li><li><strong>优先评估迁移成本，而不是找绕过方法</strong><br>这轮监管态度非常明确。</li><li><strong>如果你打算长期做量化，建议同步了解：</strong><ul><li>券商机构柜台</li><li>托管机房 &#x2F; 合规量化产品</li><li>交易所 &#x2F; 协会的最新指引</li></ul></li></ol><hr><h2 id="六、给朋友们的建议"><a href="#六、给朋友们的建议" class="headerlink" title="六、给朋友们的建议"></a>六、给朋友们的建议</h2><p>如果你是：</p><ul><li><strong>学生 &#x2F; 爱好者</strong>：直接切 QMT 内置，别折腾绕路；参考<a href="../qmt-guide">qmt使用指南</a></li><li><strong>个人职业量化</strong>：尽快评估是否升级到机构&#x2F;产品账户；</li><li><strong>小团队</strong>：考虑集中策略到 1–2 个合规通道，减少维护成本。</li></ul><hr><p>📌 <strong>延伸阅读建议</strong>  </p><ul><li>各券商官网公告（以你开户券商为准）</li><li>迅投官方文档（QMT &#x2F; xtquant）</li><li>中证协 &#x2F; 交易所关于程序化交易的最新文件</li></ul><hr><p>我会持续跟进后续券商通知，并在博客更新。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;一句话结论：&lt;br&gt;&lt;strong&gt;MiniQMT 并没有被“官方宣布死刑”，但券商侧确实在收紧；新增已基本停发，存量大概率会在 1～2 个月内逐步清退。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="MiniQMT" scheme="https://invest.wtsolutions.cn/tags/MiniQMT/"/>
    
    <category term="QMT" scheme="https://invest.wtsolutions.cn/tags/QMT/"/>
    
    <category term="量化风控" scheme="https://invest.wtsolutions.cn/tags/%E9%87%8F%E5%8C%96%E9%A3%8E%E6%8E%A7/"/>
    
    <category term="实盘经验" scheme="https://invest.wtsolutions.cn/tags/%E5%AE%9E%E7%9B%98%E7%BB%8F%E9%AA%8C/"/>
    
  </entry>
  
  <entry>
    <title>Wise 香港 HKD 账户开设与收款指南 - 香港本地转账 - FPS免费，几分钟到账</title>
    <link href="https://invest.wtsolutions.cn/posts/wise-hong-kong-hkd-account-guide/"/>
    <id>https://invest.wtsolutions.cn/posts/wise-hong-kong-hkd-account-guide/</id>
    <published>2026-06-01T03:00:00.000Z</published>
    <updated>2026-08-13T00:45:35.166Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>Wise 的香港 HKD 账户是进行跨境收款的利器，特别是对于需要接收港币或从香港地区收款的用户来说。最吸引人的是，通过 Wise 香港账户收款（本地银行转账 FPS）<strong>完全免费</strong>，且到账速度极快，通常只需<strong>几分钟</strong>。本文将详细介绍如何开设和使用 Wise 香港 HKD 账户进行收款。</p><h2 id="为什么开设Wise，如何开设Wise账户？"><a href="#为什么开设Wise，如何开设Wise账户？" class="headerlink" title="为什么开设Wise，如何开设Wise账户？"></a>为什么开设Wise，如何开设Wise账户？</h2><p>参见我的博客文章：<a href="../wise-account-guide">Wise使用指南</a></p><h2 id="为什么选择-Wise-香港-HKD-账户？"><a href="#为什么选择-Wise-香港-HKD-账户？" class="headerlink" title="为什么选择 Wise 香港 HKD 账户？"></a>为什么选择 Wise 香港 HKD 账户？</h2><h3 id="手续费收款"><a href="#手续费收款" class="headerlink" title="手续费收款"></a>手续费收款</h3><p>与传统银行不同，Wise 香港 HKD 账户在接收本地银行转FPS 转过来的资金时<strong>不收取任何手续费</strong>：</p><ul><li>本地转账：FPS免费， （要求转账方必须是香港本地银行，采用 FPS 方式转账）</li></ul><h3 id="极速到账"><a href="#极速到账" class="headerlink" title="极速到账"></a>极速到账</h3><p>Wise 香港 HKD 账户的收款速度非常快：</p><ul><li><strong>香港本地FPS转账</strong>：通常几分钟内到账</li></ul><h3 id="多币种支持"><a href="#多币种支持" class="headerlink" title="多币种支持"></a>多币种支持</h3><p>虽然我们重点介绍 HKD 账户，但 Wise 支持多种币种：</p><ul><li>美元 (USD)</li><li>欧元 (EUR)</li><li>人民币（CNY）</li></ul><p>其中可以 通过 FPS 本地银行转 HKD 和 CNY。</p><h2 id="如何开设-Wise-香港-HKD-账户？"><a href="#如何开设-Wise-香港-HKD-账户？" class="headerlink" title="如何开设 Wise 香港 HKD 账户？"></a>如何开设 Wise 香港 HKD 账户？</h2><h3 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h3><ol><li>您需要有一个已完成实名认证的 Wise 账户</li><li>准备好您的身份证明文件（护照或身份证）</li></ol><h3 id="开设步骤"><a href="#开设步骤" class="headerlink" title="开设步骤"></a>开设步骤</h3><ol><li><p><strong>访问 Wise 官网并注册账户</strong></p><ul><li>官网：<a href="https://wise.com/invite/ahpc/f0epglc">https://wise.com/invite/ahpc/f0epglc</a></li></ul></li><li><p><strong>登录 Wise APP</strong></p><ul><li>打开 Wise 应用并登录您的账户</li><li>如果还没有账户，请先注册并完成实名认证</li></ul></li><li><p><strong>添加 HKD 账户</strong></p><ul><li>在首页点击”添加账户”或”获取账户详情”</li><li>选择”港币 (HKD)”作为币种</li><li>Wise 会自动为您生成香港 DBS 银行账户详情</li></ul></li><li><p><strong>查看账户信息</strong></p><ul><li>账户名称（您的拼音姓名）</li><li>账户号码</li><li>银行代码 (SWIFT&#x2F;BIC)</li><li>分行代码</li></ul></li></ol><h2 id="如何使用-Wise-香港-HKD-账户收款？"><a href="#如何使用-Wise-香港-HKD-账户收款？" class="headerlink" title="如何使用 Wise 香港 HKD 账户收款？"></a>如何使用 Wise 香港 HKD 账户收款？</h2><p>将您的 Wise HKD 账户信息提供给付款方：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">银行名称：DBS Bank (Hong Kong) Limited</span><br><span class="line">账户名称：ZHANG SAN (您的拼音姓名)</span><br><span class="line">账户号码：XXXXXXXX</span><br><span class="line">SWIFT/BIC：XXXX</span><br><span class="line">分行代码：XXX</span><br></pre></td></tr></table></figure><h2 id="收款流程详解"><a href="#收款流程详解" class="headerlink" title="收款流程详解"></a>收款流程详解</h2><h3 id="香港本地转账"><a href="#香港本地转账" class="headerlink" title="香港本地转账"></a>香港本地转账</h3><ol><li>付款方通过香港本地银行（如 HSBC、恒生银行等）向您的 Wise HKD 账户转账</li><li>资金通常在<strong>几分钟内</strong>到账</li><li>您会收到 Wise 的通知（有电子邮件通知）</li></ol><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><h3 id="账户名称格式"><a href="#账户名称格式" class="headerlink" title="账户名称格式"></a>账户名称格式</h3><p>确保您的账户名称是拼音格式，且姓在前名在后（仅限香港 HKD 账户）：</p><ul><li>正确：ZHANG SAN</li><li>正确：Zhang San</li><li>避免：SAN ZHANG（除非 Wise 账户显示如此）</li></ul><h3 id="资金提取"><a href="#资金提取" class="headerlink" title="资金提取"></a>资金提取</h3><p>收到的 HKD 资金可以：</p><ul><li>保留在 Wise 账户中</li><li>兑换成其他币种</li><li>转账到您的其他银行账户</li></ul><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="Q-开设香港-HKD-账户需要额外付费吗？"><a href="#Q-开设香港-HKD-账户需要额外付费吗？" class="headerlink" title="Q: 开设香港 HKD 账户需要额外付费吗？"></a>Q: 开设香港 HKD 账户需要额外付费吗？</h3><p>A: 不需要，开设和使用 Wise 账户完全免费。</p><h3 id="Q-收款真的是免费的吗？"><a href="#Q-收款真的是免费的吗？" class="headerlink" title="Q: 收款真的是免费的吗？"></a>Q: 收款真的是免费的吗？</h3><p>A: 是的，通过 FPS 方式接收本地银行转账进行收款，资金不收取任何手续费。</p><h3 id="Q-到账速度真的只有几分钟吗？"><a href="#Q-到账速度真的只有几分钟吗？" class="headerlink" title="Q: 到账速度真的只有几分钟吗？"></a>Q: 到账速度真的只有几分钟吗？</h3><p>A: 对于香港本地转账，通常确实只需要几分钟。</p><h3 id="Q-我可以用这个账户接收来自中国大陆的转账吗？"><a href="#Q-我可以用这个账户接收来自中国大陆的转账吗？" class="headerlink" title="Q: 我可以用这个账户接收来自中国大陆的转账吗？"></a>Q: 我可以用这个账户接收来自中国大陆的转账吗？</h3><p>A: 可以，但由于外汇管制，中国大陆个人向境外账户转账可能受到限制，而且会需要支付手续费。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Wise 香港 HKD 账户是跨境收款的绝佳选择：</p><ul><li><strong>零手续费</strong>：接收资金完全免费</li><li><strong>极速到账</strong>：香港本地转账几分钟到账</li><li><strong>便捷易用</strong>：支持多种收款方式，包括本地银行转账 FPS</li></ul><p>如果您经常需要接收港币或进行跨境收款，强烈建议开设 Wise 香港 HKD 账户。</p><p>希望本文对您有所帮助！如果您有任何问题，欢迎查看我们的其他相关文章。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;引言&quot;&gt;&lt;a href=&quot;#引言&quot; class=&quot;headerlink&quot; title=&quot;引言&quot;&gt;&lt;/a&gt;引言&lt;/h2&gt;&lt;p&gt;Wise 的香港 HKD 账户是进行跨境收款的利器，特别是对于需要接收港币或从香港地区收款的用户来说。最吸引人的是，通过 Wise</summary>
        
      
    
    
    
    <category term="wise" scheme="https://invest.wtsolutions.cn/categories/wise/"/>
    
    
    <category term="海外账户" scheme="https://invest.wtsolutions.cn/tags/%E6%B5%B7%E5%A4%96%E8%B4%A6%E6%88%B7/"/>
    
    <category term="Wise" scheme="https://invest.wtsolutions.cn/tags/Wise/"/>
    
    <category term="香港账户" scheme="https://invest.wtsolutions.cn/tags/%E9%A6%99%E6%B8%AF%E8%B4%A6%E6%88%B7/"/>
    
    <category term="HKD" scheme="https://invest.wtsolutions.cn/tags/HKD/"/>
    
    <category term="跨境收款" scheme="https://invest.wtsolutions.cn/tags/%E8%B7%A8%E5%A2%83%E6%94%B6%E6%AC%BE/"/>
    
  </entry>
  
  <entry>
    <title>Wise 收款姓名拼音顺序指南 - 姓在前还是名在前？</title>
    <link href="https://invest.wtsolutions.cn/posts/wise-chinese-name-pinyin-order/"/>
    <id>https://invest.wtsolutions.cn/posts/wise-chinese-name-pinyin-order/</id>
    <published>2026-06-01T02:00:00.000Z</published>
    <updated>2026-08-12T01:50:39.107Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>在使用 Wise 进行跨境收款时，中文姓名的拼音顺序是一个非常关键的问题。如果姓名顺序填写错误，可能会导致转账失败或延迟。本文将详细探讨这个问题。</p><h2 id="核心问题：姓在前还是名在前？"><a href="#核心问题：姓在前还是名在前？" class="headerlink" title="核心问题：姓在前还是名在前？"></a>核心问题：姓在前还是名在前？</h2><h3 id="Wise-开设的香港-DBS-账户（港币-HKD）"><a href="#Wise-开设的香港-DBS-账户（港币-HKD）" class="headerlink" title="Wise 开设的香港 DBS 账户（港币 HKD）"></a>Wise 开设的香港 DBS 账户（港币 HKD）</h3><p>根据实际测试，如果您使用的是 Wise 的港币账户（由 DBS 香港提供支持），<strong>拼音姓名应该是姓在前，名在后</strong>。</p><p><strong>示例：</strong></p><ul><li>中文姓名：张三</li><li>拼音格式：<strong>Zhang San</strong></li></ul><p>这种格式符合中文姓名的传统习惯，姓氏在前，名字在后。</p><h3 id="其他币种账户"><a href="#其他币种账户" class="headerlink" title="其他币种账户"></a>其他币种账户</h3><p>对于其他币种的账户，建议尝试<strong>名在前，姓在后</strong>的格式，这是国际上更常见的姓名顺序。</p><p><strong>示例：</strong></p><ul><li>中文姓名：张三</li><li>拼音格式：<strong>San Zhang</strong></li></ul><p>这种格式遵循西方姓名习惯，名字在前，姓氏在后。</p><h2 id="为什么姓名顺序如此重要？"><a href="#为什么姓名顺序如此重要？" class="headerlink" title="为什么姓名顺序如此重要？"></a>为什么姓名顺序如此重要？</h2><h3 id="银行系统要求"><a href="#银行系统要求" class="headerlink" title="银行系统要求"></a>银行系统要求</h3><p>不同国家和地区的银行系统对姓名格式有不同的要求：</p><ol><li><strong>香港银行</strong>：通常接受姓在前的格式（如 Zhang San）</li><li><strong>欧美银行</strong>：通常要求名在前的格式（如 San Zhang）</li><li><strong>系统兼容性</strong>：部分系统可能只识别特定格式的姓名</li></ol><h3 id="转账失败风险"><a href="#转账失败风险" class="headerlink" title="转账失败风险"></a>转账失败风险</h3><p>如果姓名格式不正确，可能会导致：</p><ul><li>转账被退回</li><li>资金延迟到账</li><li>需要额外的人工审核</li><li>产生不必要的手续费</li></ul><h2 id="建议做法"><a href="#建议做法" class="headerlink" title="建议做法"></a>建议做法</h2><h3 id="方法一：参考账户详情"><a href="#方法一：参考账户详情" class="headerlink" title="方法一：参考账户详情"></a>方法一：参考账户详情</h3><ol><li>登录 Wise APP 或网页</li><li>查看您的收款账户详情</li><li>注意账户名称的显示格式</li><li>按照显示的格式填写收款信息</li></ol><h3 id="方法二：咨询客服"><a href="#方法二：咨询客服" class="headerlink" title="方法二：咨询客服"></a>方法二：咨询客服</h3><p>如果您不确定正确的格式，可以联系 Wise 客服确认：</p><ol><li>在 Wise APP 中找到”帮助”</li><li>点击”联系我们”</li><li>选择电子邮件支持</li><li>询问您特定币种账户的姓名格式要求</li></ol><h3 id="方法三：测试转账"><a href="#方法三：测试转账" class="headerlink" title="方法三：测试转账"></a>方法三：测试转账</h3><p>您可以尝试进行一笔小额测试转账，确认格式正确后再进行大额转账。</p><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="Q-修改姓名后，需要重新设置收款账户吗？"><a href="#Q-修改姓名后，需要重新设置收款账户吗？" class="headerlink" title="Q: 修改姓名后，需要重新设置收款账户吗？"></a>Q: 修改姓名后，需要重新设置收款账户吗？</h3><p>A: 是的，如果您修改了账户姓名，建议重新检查并更新所有收款账户的信息。</p><h3 id="Q-姓名拼音是否需要大写？"><a href="#Q-姓名拼音是否需要大写？" class="headerlink" title="Q: 姓名拼音是否需要大写？"></a>Q: 姓名拼音是否需要大写？</h3><p>A: 通常首字母大写即可，如 “Zhang San” 或 “San Zhang”。</p><h3 id="Q-中间名如何处理？"><a href="#Q-中间名如何处理？" class="headerlink" title="Q: 中间名如何处理？"></a>Q: 中间名如何处理？</h3><p>A: 如果您有中间名，可以将其放在名字和姓氏之间，如 “Zhang Wei Ming” 或 “Wei Ming Zhang”，具体取决于账户要求。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>在使用 Wise 收款时，正确的姓名拼音顺序至关重要：</p><ul><li><strong>港币账户（DBS 香港）</strong>：推荐姓在前（Zhang San）</li><li><strong>其他币种账户</strong>：推荐名在前（San Zhang）</li></ul><p>最稳妥的方法是查看您账户详情中的姓名显示格式，并按照该格式填写收款信息。如果有任何疑问，建议直接联系 Wise 客服确认。</p><p>希望本文能帮助您顺利进行跨境收款！如果您有其他相关问题，欢迎查看我们的其他文章。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;引言&quot;&gt;&lt;a href=&quot;#引言&quot; class=&quot;headerlink&quot; title=&quot;引言&quot;&gt;&lt;/a&gt;引言&lt;/h2&gt;&lt;p&gt;在使用 Wise</summary>
        
      
    
    
    
    <category term="wise" scheme="https://invest.wtsolutions.cn/categories/wise/"/>
    
    
    <category term="海外账户" scheme="https://invest.wtsolutions.cn/tags/%E6%B5%B7%E5%A4%96%E8%B4%A6%E6%88%B7/"/>
    
    <category term="Wise" scheme="https://invest.wtsolutions.cn/tags/Wise/"/>
    
    <category term="跨境收款" scheme="https://invest.wtsolutions.cn/tags/%E8%B7%A8%E5%A2%83%E6%94%B6%E6%AC%BE/"/>
    
    <category term="姓名拼音" scheme="https://invest.wtsolutions.cn/tags/%E5%A7%93%E5%90%8D%E6%8B%BC%E9%9F%B3/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT交易终端小技巧-每天代码重置与定时任务设置</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-daily-reset/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-daily-reset/</id>
    <published>2026-05-26T06:26:06.000Z</published>
    <updated>2026-08-13T00:45:06.232Z</updated>
    
    <content type="html"><![CDATA[<h2 id="为什么需要每天代码重置"><a href="#为什么需要每天代码重置" class="headerlink" title="为什么需要每天代码重置"></a>为什么需要每天代码重置</h2><p>在QMT量化交易中，很多策略需要在每个交易日开始时进行初始化操作。这可能包括：</p><ul><li>重置每日统计变量（如当日成交量、最大回撤等）</li><li>重新计算每日参数（如当日目标仓位、阈值等）</li><li>清理前一交易日的数据缓存</li><li>初始化每日的交易状态标志</li></ul><p>如果不进行每日重置，可能会导致数据累积错误、状态混乱等问题，影响策略的正常运行。</p><h2 id="QMT的自动初始化机制"><a href="#QMT的自动初始化机制" class="headerlink" title="QMT的自动初始化机制"></a>QMT的自动初始化机制</h2><p>QMT提供了系统级的自动初始化功能，可以在系统设置中配置每天固定时间自动重启终端。但这种方式会导致整个终端重启，可能会影响正在运行的策略。</p><p>更好的做法是在策略代码中实现每日重置逻辑，这样可以更精细地控制初始化过程。</p><h2 id="实现每天执行一次的函数"><a href="#实现每天执行一次的函数" class="headerlink" title="实现每天执行一次的函数"></a>实现每天执行一次的函数</h2><h3 id="使用定时任务（推荐）"><a href="#使用定时任务（推荐）" class="headerlink" title="使用定时任务（推荐）"></a>使用定时任务（推荐）</h3><p>QMT支持使用<code>run_time</code>来设置定时任务，可以在指定时间执行函数。</p><p>run_time函数的具体使用参数和解释说明，可以参考<a href="../qmt-knowledge-base">官方文档（pdf 版本）</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime, date</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 设置每天9:25执行重置</span></span><br><span class="line">    ContextInfo.run_time(<span class="string">&#x27;daily_reset&#x27;</span>,<span class="string">&#x27;1nDay&#x27;</span>, <span class="built_in">str</span>(date.today())+ <span class="string">&#x27; 09:25:00&#x27;</span>)</span><br><span class="line">    <span class="comment"># 立即执行一次初始化</span></span><br><span class="line">    daily_reset(ContextInfo)</span><br><span class="line">    </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">daily_reset</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    ContextInfo.log(<span class="string">&quot;执行每日重置...&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 重置每日统计变量</span></span><br><span class="line">    ContextInfo.user_data[<span class="string">&#x27;daily_trades&#x27;</span>] = <span class="number">0</span></span><br><span class="line">    ContextInfo.user_data[<span class="string">&#x27;daily_volume&#x27;</span>] = <span class="number">0</span></span><br><span class="line">    ContextInfo.user_data[<span class="string">&#x27;daily_profit&#x27;</span>] = <span class="number">0</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 重置交易状态</span></span><br><span class="line">    ContextInfo.user_data[<span class="string">&#x27;has_opened_position&#x27;</span>] = <span class="literal">False</span></span><br><span class="line">    ContextInfo.user_data[<span class="string">&#x27;today_target_position&#x27;</span>] = &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 重新计算当日参数</span></span><br><span class="line">    calculate_daily_parameters(ContextInfo)</span><br><span class="line">    </span><br><span class="line">    ContextInfo.log(<span class="string">&quot;每日重置完成&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculate_daily_parameters</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 根据当日行情计算参数</span></span><br><span class="line">    <span class="comment"># 例如：根据开盘价调整目标仓位</span></span><br><span class="line">    ContextInfo.user_data[<span class="string">&#x27;today_target_position&#x27;</span>] = &#123;</span><br><span class="line">        <span class="string">&#x27;000001.SZ&#x27;</span>: <span class="number">0.1</span>,</span><br><span class="line">        <span class="string">&#x27;600000.SH&#x27;</span>: <span class="number">0.15</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handlebar</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 策略主逻辑</span></span><br><span class="line">    <span class="comment"># ...</span></span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><h3 id="1-避免重复重置"><a href="#1-避免重复重置" class="headerlink" title="1. 避免重复重置"></a>1. 避免重复重置</h3><p>使用日期判断或定时任务时，要确保每天只执行一次重置。</p><h3 id="2-处理节假日"><a href="#2-处理节假日" class="headerlink" title="2. 处理节假日"></a>2. 处理节假日</h3><p>如果使用固定时间的定时任务，需要考虑节假日的情况：<br>（如何判断当天是不是交易日，可以参考我的博客文章：<a href="../qmt-is-today-a-trading-day">讯投 QMT 使用小技巧 -如何判断今天是不是交易日</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">daily_reset</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 检查今天是否是交易日</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> is_trading_day():</span><br><span class="line">        ContextInfo.log(<span class="string">&quot;今日非交易日，跳过重置&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 正常重置逻辑</span></span><br><span class="line">    <span class="comment"># ...</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_trading_day</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;判断今天是否是交易日&quot;&quot;&quot;</span></span><br><span class="line">    today = datetime.date.today()</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 周末不是交易日</span></span><br><span class="line">    <span class="keyword">if</span> today.weekday() &gt;= <span class="number">5</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 可以添加节假日判断</span></span><br><span class="line">    holidays = [</span><br><span class="line">        datetime.date(<span class="number">2024</span>, <span class="number">1</span>, <span class="number">1</span>),  <span class="comment"># 元旦</span></span><br><span class="line">        datetime.date(<span class="number">2024</span>, <span class="number">2</span>, <span class="number">10</span>), <span class="comment"># 春节</span></span><br><span class="line">        <span class="comment"># ...</span></span><br><span class="line">    ]</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> today <span class="keyword">not</span> <span class="keyword">in</span> holidays</span><br></pre></td></tr></table></figure><h3 id="3-日志记录"><a href="#3-日志记录" class="headerlink" title="3. 日志记录"></a>3. 日志记录</h3><p>在重置函数中添加日志记录，方便排查问题：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">daily_reset</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    ContextInfo.log(<span class="string">f&quot;每日重置开始 - <span class="subst">&#123;datetime.datetime.now()&#125;</span>&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 重置逻辑</span></span><br><span class="line">        ContextInfo.user_data[<span class="string">&#x27;daily_trades&#x27;</span>] = <span class="number">0</span></span><br><span class="line">        ContextInfo.log(<span class="string">&quot;每日重置完成&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        ContextInfo.log(<span class="string">f&quot;每日重置失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="comment"># 发送错误通知</span></span><br><span class="line">        send_notification(<span class="string">f&quot;每日重置失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="4-发送通知到手机"><a href="#4-发送通知到手机" class="headerlink" title="4. 发送通知到手机"></a>4. 发送通知到手机</h3><p>每天重置完成了之后，可以发送邮件或其他提醒到手机上，具体参考我的博客文章<a href="../qmt-email-notification">QMT 与手机通信 - 邮件推送实现方法</a>，或用即时性更好的 <a href="../qmt-wechat-notification">策略消息推送到微信的几种方案</a>。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过设置每日重置函数，可以确保策略在每个交易日开始时都处于一个干净、已知的状态。这对于维护策略的稳定性和准确性非常重要。</p><p>推荐使用定时运行的函数方式设置定时任务，这样可以精确控制执行时间，避免在交易过程中频繁检查日期。</p><hr>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;为什么需要每天代码重置&quot;&gt;&lt;a href=&quot;#为什么需要每天代码重置&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="定时任务run_time" scheme="https://invest.wtsolutions.cn/tags/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1run-time/"/>
    
    <category term="每天重置" scheme="https://invest.wtsolutions.cn/tags/%E6%AF%8F%E5%A4%A9%E9%87%8D%E7%BD%AE/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
  </entry>
  
  <entry>
    <title>IBKR 盈透证券 新手指南 IBKR InteractiveBrokers for Beginner</title>
    <link href="https://invest.wtsolutions.cn/posts/ibkr-for-beginner/"/>
    <id>https://invest.wtsolutions.cn/posts/ibkr-for-beginner/</id>
    <published>2026-04-29T00:26:06.000Z</published>
    <updated>2026-08-11T06:36:23.735Z</updated>
    
    <content type="html"><![CDATA[<h2 id="软件工具"><a href="#软件工具" class="headerlink" title="软件工具"></a>软件工具</h2><p>IBKR有网页版，手机APP版，电脑桌面版等多个软件工具。</p><p>对于新手来说，手机APP和电脑网页版可能使用起来相对比较友好一些。我感觉电脑桌面版的那个软件设计哦，只适合于金融行业资深从业者。反正就挺难用的。</p><p>手机APP, 如果是苹果的，就直接在应用商店下载，如果是安卓的，但是你又不知道怎么下载, 你就打IBKR在上海的客服电话，他们会教你，上海客服给你的下载链接下载的APP可以在国内的网络环境下稳定的使用。</p><p>另外，IBKR也是有api可以提供使用的，懂编程的朋友也可以使用API进行程序化交易。</p><h2 id="券商佣金"><a href="#券商佣金" class="headerlink" title="券商佣金"></a>券商佣金</h2><p>对于小散来说，选阶梯式的会比较合适，一次交易，基本佣金基本是在0.35USD。</p><p>如果交易量大或者金额特别高的，估计也不会看我这个帖子，所以我就只介绍适合新手小散的佣金方式。</p><h2 id="T-0"><a href="#T-0" class="headerlink" title="T+0"></a>T+0</h2><p>美国股市并不是完全T+0，</p><p>对于资金量大于25000USD的day trader账户，是可以随便T+0交易的</p><p><s>2000~25000USD资金量的保证金账户，5个交易日内最多3次 T+0交易</s><br>2026年6月，SEC修改政策，将不再限制2000～25000USD资金量账户的保证金账户的日内交易限制了，具体的券商有18个月的时间来实时这个政策调整，所以一定要在6月之后，跟自己的券商确认一下是否已经调整了政策。</p><p>2026 年 8 月 11 日，有朋友反馈，IBKR 通知，Your Account Has Been Migrated to New Margin Standards。那么意味着 IBKR 在 8 月 11 日完成了对新政策的履行实施，具体通知内容及解释详见<a href="https://invest.wtsolutions.cn/posts/ibkr-pdt-to-imd-migration/">ibkr-pdt-to-imd-migration</a></p><p><del>小于2000USD的现金账户，就不建议你进行T+0交易了，需要等到资金交割之后才能再次交易</del></p><p><del>如果违规账户会被暂停90天。</del></p><p>简单来说，有钱的就充钱吧，充25000，成为day trader，能随便T+0。没那么多钱且是新手还是别随便T+0了。IBKR的手机APP在识别到你可能触发违规的时候，一般会弹出小窗口提醒你一下，需要注意！</p><h2 id="换汇"><a href="#换汇" class="headerlink" title="换汇"></a>换汇</h2><p>IBKR里面可以很方便的换汇，但换汇是有手续费的，最少2USD。据说IBKR的汇率是比较好的，但我也没有对比过。因为资金量很小的话，也不太需要在乎这个。</p><h2 id="入金速度"><a href="#入金速度" class="headerlink" title="入金速度"></a>入金速度</h2><p>如果采用银行转账的形式，转账后需要大概30分钟，一小时，才能显示到账户中，并不是实时到账的。其他的入金形式是不是能实时到账，我不确定，有知道的知友可以在评论区补充。另外，入金账户的名称和你的IBKR的账户名称要是同一个姓名，才能入金的，不能用别人的账户入金。</p><h2 id="入金账户"><a href="#入金账户" class="headerlink" title="入金账户"></a>入金账户</h2><p>内地账户不支持入金到IBKR， 需要海外（含香港）的账户入金。也可以用Wise入金，Wise现在支持使用中国身份证开户了，可以开美元港币等账户。<br>了解Wise: <a href="https://invest.wtsolutions.cn/posts/wise-account-guide/">wise-account-guide</a><br>前往开户：<a href="https://wise.com/invite/ahpc/f0epglc">https://wise.com/invite/ahpc/f0epglc</a></p><h2 id="出金"><a href="#出金" class="headerlink" title="出金"></a>出金</h2><p>每个月的第一笔出金是免费的，每个月从第二笔出金是要支付手续费了的。</p><h2 id="行情"><a href="#行情" class="headerlink" title="行情"></a>行情</h2><p>使用IBKR的任何客户端，看行情都是特别的不适应的。没有国人制作的APP看行情更舒服，可以用HK的或者SG的券商APP（FUTU,雪球,MOOMOO等）。</p><h2 id="股票收益增长计划"><a href="#股票收益增长计划" class="headerlink" title="股票收益增长计划"></a>股票收益增长计划</h2><p>这个就是当有人需要融券的时候，IBKR会找参与了股票收益计划的人，把券借给需要融券的人。借出的账户，可以收到利息。借出后，当你想卖股票的时候，完全不影响你卖出。</p><h2 id="利息"><a href="#利息" class="headerlink" title="利息"></a>利息</h2><p>入金后可能有一部分余额没有用于购买股票，以现金余额的形式在账户里面。</p><p>余额10000美金是没有利息的，高于10万美金的利息是能达到4.3%的。中间分了几档，利息介于0~4.3%之间。如果是小散户，估计可能也没有利息或者利息很少。</p><h2 id="夜盘交易"><a href="#夜盘交易" class="headerlink" title="夜盘交易"></a>夜盘交易</h2><p>IBKR支持夜盘美股交易，也就是除了美股正常的交易时间之外，大部分时间你也是可以交易股票和ETF的。</p><p>时间是美国ET时间晚上八点到第二天早晨的三点五十，大家可以相应换算北京时间，基本覆盖了A股交易的时间。</p><p>注意，并不是所有的交易产品都支持夜盘的，绝大部分散户操作的股票和ETF支持，在页面你可以看到夜盘按钮的就是支持的。另外，夜盘交易并没有正常交易时间段那么活跃，也就是流动性相对没那么好，所以交易价格可能和公允价值偏差较大。</p><h2 id="Bit币交易"><a href="#Bit币交易" class="headerlink" title="Bit币交易"></a>Bit币交易</h2><p>如果使用中国大陆身份进行开户的话，是不允许进行相关交易的。</p><h2 id="股市交易时间"><a href="#股市交易时间" class="headerlink" title="股市交易时间"></a>股市交易时间</h2><p>不同地区股市交易时间不同，如下均按照北京时间，只统计常规交易时间。像美股是有夜盘交易的，不含在如下所述的交易时间中（如果有错误，还请在评论区指正）</p><ul><li>中国沪深市场：周一至周五，上午9:30至11:30，下午1:00至3:00。</li><li>中国香港股市：周一至周五，早市9:30至12:00，午市1:00至4:00。</li><li>美国股市：夏令时21:30至次日4:00，冬令时22:30至次日5:00。</li><li>欧洲股市：夏令时15:00至23:30，冬令时16:00至次日0:30。</li><li>日本股市：周一至周五，上午8:00至下午2:00。</li><li>我国台湾股市：周一至周五，上午9:00至下午1:30。</li><li>伦敦证券交易所（英国）：周一至周五，16:00至次日00:30。</li><li>法兰克福证券交易所（德国）：周一至周五，15:00至次日03:00。</li><li>巴黎泛欧交易所（法国）：周一至周五，16:00至次日00:30。</li></ul><h2 id="交易品种"><a href="#交易品种" class="headerlink" title="交易品种"></a>交易品种</h2><ul><li>股票交易：包括美国、欧洲、亚洲等多个国家和地区的股票市场。</li><li>期权交易：提供多种期权交易策略。</li><li>期货和商品交易：涵盖能源、金属、农产品等多种期货合约。</li><li>外汇交易：提供主要和次要货币对的交易。</li><li>债券交易：包括政府债券、公司债券等。</li><li>基金和ETFs：提供广泛的共同基金和交易所交易基金。</li></ul><h2 id="保险"><a href="#保险" class="headerlink" title="保险"></a>保险</h2><p>IBKR证券账户中持有的现金根据SEC的客户保护法规15c3-3受到保护。</p><p>除IBKR的保护外，前$250,000美元现金享受SIPC保险覆盖。</p><h2 id="闲钱理财"><a href="#闲钱理财" class="headerlink" title="闲钱理财"></a>闲钱理财</h2><p>有时候账户有一些余额，放着没利息（仅限低于10000美元的余额），可以选择购买BIL，类似货币基金吧（不完全等同），可以每天涨一点点利息，但交易这个BIL也是正常需要缴纳手续费的。</p><h2 id="下单类型-美股和A股区别）"><a href="#下单类型-美股和A股区别）" class="headerlink" title="下单类型(美股和A股区别）"></a>下单类型(美股和A股区别）</h2><p>美股和A股在下单类型上存在一些差异，主要体现在市场规则和交易机制上。以下是主要区别：</p><ul><li>市价单（Market Order）</li></ul><p>美股：市价单按当前市场价格立即执行，成交速度快，但价格可能波动。</p><p>A股：A股也有市价单，但通常有价格限制（如涨跌停板），成交价不会超出当日涨跌幅范围。</p><ul><li>限价单（Limit Order）</li></ul><p>美股：限价单按指定价格或更优价格成交，未达到指定价格则不执行。</p><p>A股：A股的限价单类似，但受涨跌停板限制，超出范围的委托无效。</p><ul><li>止损单（Stop Order）</li></ul><p>美股：止损单在达到指定价格后转为市价单，常用于控制风险。</p><p>A股：A股没有直接的止损单，投资者需手动操作或使用条件单。</p><ul><li>止损限价单（Stop-Limit Order）</li></ul><p>美股：止损限价单在达到止损价后转为限价单，按指定或更优价格成交。</p><p>A股：A股无此订单类型，需手动操作。</p><ul><li>条件单（Conditional Order）</li></ul><p>美股：条件单在满足特定条件时触发，常用于复杂策略。</p><p>A股：部分券商提供类似功能，但不如美股普遍。</p><ul><li>订单有效期</li></ul><p>美股：订单有效期多样，包括当日有效、长期有效等。</p><p>A股：通常为当日有效，未成交的订单在收盘后自动撤销。</p><ul><li>最小交易单位</li></ul><p>美股：无固定最小交易单位，可交易一股。</p><p>A股：最小交易单位为100股（1手），科创板为200股。</p><ul><li>订单有效期</li></ul><p>美股：订单有效期多样，包括当日有效、长期有效等。</p><p>A股：通常为当日有效，未成交的订单在收盘后自动撤销。</p><h2 id="CRS税务信息交换"><a href="#CRS税务信息交换" class="headerlink" title="CRS税务信息交换"></a>CRS税务信息交换</h2><p>在美国运营的IBKR主体与国内没有CRS税务交换。（不敢100%确认哈，也是多处打听的消息）</p><p>在香港、英国等地运营的IBKR主体受运营国家法规要求，会产生CRS交换。</p><p>主要要看账户在哪个地方哪个营运主体开设的。</p><p>被交换的信息内容广泛，包括账户所有者的姓名、住址、税务识别号，以及账户号、年终余额或账户净值。此外，还可能包括在一个公历年度内取得的利息、股息收入以及出售金融资产产生的收入等。个人的金融账户基本都会被申报，如存款账户、托管账户（如股票账户）、投资实体股权、债权权益、具有现金价值的保险、年金账户等。</p><p>CRS的信息交换覆盖面极为广泛，几乎囊括了所有类型的金融服务提供商，如银行、券商、信托公司、基金管理公司等。</p><h2 id="美国ibkr开户"><a href="#美国ibkr开户" class="headerlink" title="美国ibkr开户"></a>美国ibkr开户</h2><p>可以通过在线开户的形式获取美国ibkr的账户，我的推荐链接，使用该推广链接开户，可获得最高1000美金的返利。<br><a href="https://ibkr.com/referral/he430">https://ibkr.com/referral/he430</a></p><p>最近听说，现在IBKR的开户政策也逐渐变严格了，开始要求居住在海外或者有海外居住权之类的要求了，大家尽早开户啦。</p><h2 id="账户类型介绍"><a href="#账户类型介绍" class="headerlink" title="账户类型介绍"></a>账户类型介绍</h2><p>IBKR提供多种账户类型，适合不同需求的投资者：</p><ul><li><p><strong>现金账户（Cash Account）</strong>：</p><ul><li>只能使用已存入的资金交易</li><li>不支持杠杆交易</li><li>适合保守型投资者和资金较少的新手</li><li>T+0交易限制严格（见前文T+0部分）</li></ul></li><li><p><strong>保证金账户（Margin Account）</strong>：</p><ul><li>可以使用券商提供的杠杆进行交易</li><li>支持更多交易策略（如卖空、期权等）</li><li>T+0交易限制较宽松（2000-25000美元资金量）</li><li>需要维持一定的保证金比例</li></ul></li><li><p><strong>专业交易者账户（Professional Account）</strong>：</p><ul><li>适合交易经验丰富的投资者</li><li>可以访问更多高级交易功能和工具</li><li>要求满足特定的交易经验和资金条件</li></ul></li><li><p><strong>联名账户（Joint Account）</strong>：</p><ul><li>适合夫妻或合作伙伴共同管理投资</li><li>分为联名生存者账户和联名租户账户等类型</li></ul></li></ul><h2 id="客户服务"><a href="#客户服务" class="headerlink" title="客户服务"></a>客户服务</h2><p>IBKR提供多种客户支持渠道：</p><ul><li><strong>在线客服</strong>：登录客户端后可与客服实时聊天</li><li><strong>电话支持</strong>：提供全球电话热线，支持多语言</li><li><strong>邮件支持</strong>：发送邮件至客服邮箱，通常24小时内回复</li><li><strong>帮助中心</strong>：丰富的FAQ和教程资源</li><li><strong>社区论坛</strong>：投资者交流经验和问题的平台</li></ul><p>中国客户可拨打上海客服电话。</p><h2 id="新手交易建议"><a href="#新手交易建议" class="headerlink" title="新手交易建议"></a>新手交易建议</h2><ul><li><p><strong>学习资源</strong>：</p><ul><li>IBKR官网教育中心（Traders’ Academy）</li><li>投资书籍和在线课程</li><li>金融新闻和分析报告</li></ul></li><li><p><strong>投资策略</strong>：</p><ul><li>分散投资，避免集中持有单一证券</li><li>长期投资为主，避免频繁交易</li><li>定期复盘，总结经验教训</li></ul></li><li><p><strong>风险管理</strong>：</p><ul><li>设定止损点，控制单笔交易风险</li><li>不要将全部资金投入高风险产品</li><li>保持良好的心态，避免情绪化交易</li></ul></li></ul><hr><p>希望这篇IBKR新手指南能帮助到你！如有任何问题或建议，欢迎在评论区留言。</p><p>2026&#x2F;08&#x2F;11 更新</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;软件工具&quot;&gt;&lt;a href=&quot;#软件工具&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="ibkr" scheme="https://invest.wtsolutions.cn/categories/ibkr/"/>
    
    
    <category term="ibkr" scheme="https://invest.wtsolutions.cn/tags/ibkr/"/>
    
    <category term="ibkr for beginner" scheme="https://invest.wtsolutions.cn/tags/ibkr-for-beginner/"/>
    
    <category term="盈透证券" scheme="https://invest.wtsolutions.cn/tags/%E7%9B%88%E9%80%8F%E8%AF%81%E5%88%B8/"/>
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
  </entry>
  
  <entry>
    <title>使用DeepSeek R1大模型编写迅投 QMT 的量化交易 Python 代码</title>
    <link href="https://invest.wtsolutions.cn/posts/write-qmt-code-with-deepseek/"/>
    <id>https://invest.wtsolutions.cn/posts/write-qmt-code-with-deepseek/</id>
    <published>2026-04-07T07:26:06.000Z</published>
    <updated>2026-08-12T01:50:58.394Z</updated>
    
    <content type="html"><![CDATA[<p>​随着人工智能技术的迅猛发展，利用AI工具提升工作效率已成为现代开发者的重要手段。</p><p>在使用deepseek官方网页生成迅投QMT代码的时候，deepseek给出的代码是xtquant代码，也就是miniqmt代码，并不是我们传统意义上说的大QMT可用的代码。</p><p>因此，我们需要自建一个知识库，让deepseek根据我的知识库里面的知识，去帮我生成大QMT可用的交易代码。</p><h2 id="一、建立迅投QMT的知识库"><a href="#一、建立迅投QMT的知识库" class="headerlink" title="一、建立迅投QMT的知识库"></a>一、建立迅投QMT的知识库</h2><p>建立迅投QMT的知识库的方法比较简单，我们就直接访问迅投QMT的官方网站，把网站上的网页内容打印成PDF文件，我这边有一个打印下来的PDF文件可以下载（注意我打印的日期是2026年2月5日，后续迅投网站可能会更新），大家也可以自己去网站上打印。</p><p>下载链接：<br><a href="https://pan.quark.cn/s/a68a9e9ce7d7">网盘链接</a></p><p><a href="https://pan.quark.cn/s/a68a9e9ce7d7">https://pan.quark.cn/s/a68a9e9ce7d7</a></p><p>关于我整理的知识库，详见我的博客文章 <a href="../qmt-knowledge-base">qmt-knowledge-base</a> </p><h2 id="二、利用腾讯ima-copilot建立与deepseek的知识库"><a href="#二、利用腾讯ima-copilot建立与deepseek的知识库" class="headerlink" title="二、利用腾讯ima.copilot建立与deepseek的知识库"></a>二、利用腾讯ima.copilot建立与deepseek的知识库</h2><h3 id="1、下载与安装-IMA-Copilot"><a href="#1、下载与安装-IMA-Copilot" class="headerlink" title="1、下载与安装 IMA.Copilot"></a>1、下载与安装 IMA.Copilot</h3><h3 id="2-导入PDF文件到个人知识库"><a href="#2-导入PDF文件到个人知识库" class="headerlink" title="2.   导入PDF文件到个人知识库"></a>2.   导入PDF文件到个人知识库</h3><ol><li>在 IMA.Copilot 中，点击左侧导航栏的“知识库”选项。</li><li>选择“导入文档”，上传你的迅投QMT PDF文件。</li><li>等待系统处理并索引文档内容。</li></ol><h2 id="三、使用-IMA-Copilot-编写量化交易-Python-代码"><a href="#三、使用-IMA-Copilot-编写量化交易-Python-代码" class="headerlink" title="三、使用 IMA.Copilot 编写量化交易 Python 代码"></a>三、使用 IMA.Copilot 编写量化交易 Python 代码</h2><p>在个人知识库页面，下面有一个输入窗口，可以在此处提问，此处提问可以是直接基于知识库知识来回答的。</p><p>举例说明：</p><blockquote><p>“请根据迅投QMT的PDF文档，编写一个计算股票移动平均线的Python函数。”</p></blockquote><p>IMA.Copilot 将结合 DeepSeek R1 大模型和你的知识库内容，自动生成相应的Python代码。以下就是deepseek给出的代码。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:gbk</span></span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculate_ma</span>(<span class="params">ContextInfo, stock_code, window_size</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    计算指定股票的移动平均线</span></span><br><span class="line"><span class="string">    :param ContextInfo: QMT上下文对象[1](@ref)</span></span><br><span class="line"><span class="string">    :param stock_code: 股票代码（格式：&#x27;000001.SZ&#x27;）[1](@ref)</span></span><br><span class="line"><span class="string">    :param window_size: 均线周期</span></span><br><span class="line"><span class="string">    :return: MA值（浮点数）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 获取本地收盘价数据</span></span><br><span class="line">    local_data = ContextInfo.get_market_data_ex(</span><br><span class="line">        [<span class="string">&#x27;close&#x27;</span>], </span><br><span class="line">        [stock_code],</span><br><span class="line">        period=<span class="string">&#x27;1d&#x27;</span>,</span><br><span class="line">        count=window_size,</span><br><span class="line">        subscribe=<span class="literal">False</span></span><br><span class="line">    )</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 提取收盘价列表</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        close_prices = local_data[stock_code][<span class="string">&#x27;close&#x27;</span>].values</span><br><span class="line">    <span class="keyword">except</span> KeyError:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;未找到股票<span class="subst">&#123;stock_code&#125;</span>的收盘数据&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 计算移动平均</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(close_prices) &gt;= window_size:</span><br><span class="line">        ma_value = np.mean(close_prices[-window_size:])</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">round</span>(ma_value, <span class="number">2</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;数据不足，当前数据量<span class="subst">&#123;<span class="built_in">len</span>(close_prices)&#125;</span>，需要<span class="subst">&#123;window_size&#125;</span>根K线&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用示例（在策略中调用）</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handlebar</span>(<span class="params">C</span>):</span><br><span class="line">    stock = <span class="string">&quot;600000.SH&quot;</span></span><br><span class="line">    ma10 = calculate_ma(C, stock, <span class="number">10</span>)  <span class="comment"># 计算10日均线</span></span><br><span class="line">    ma20 = calculate_ma(C, stock, <span class="number">20</span>)  <span class="comment"># 计算20日均线</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;stock&#125;</span> 10日均线：<span class="subst">&#123;ma10&#125;</span>，20日均线：<span class="subst">&#123;ma20&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">    <span class="comment"># 下载所需历史数据（建议在策略初始化时执行）</span></span><br><span class="line">    C.download_history_data(<span class="string">&quot;600000.SH&quot;</span>, <span class="string">&quot;1d&quot;</span>, <span class="string">&quot;&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br></pre></td></tr></table></figure><h2 id="四、检查测试"><a href="#四、检查测试" class="headerlink" title="四、检查测试"></a>四、检查测试</h2><p>生成的代码可能需要根据具体需求进行调整和优化。</p><blockquote><p>特别注意：AI生成的内容，不能保证是100%准确的，大家务必人工检查确认代码的正确性。</p></blockquote><p>通过本文的介绍，如何使用腾讯 IMA.Copilot 结合 DeepSeek R1 大模型，从个人知识库中的迅投QMT PDF文件编写量化交易的Python代码。这一流程不仅提高了代码编写的效率，还大大提升了代码的质量和准确性。</p><p>未来，随着AI技术的不断进步，我们有理由相信，量化交易将变得更加智能化和高效化。</p><p>​</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;​随着人工智能技术的迅猛发展，利用AI工具提升工作效率已成为现代开发者的重要手段。&lt;/p&gt;
&lt;p&gt;在使用deepseek官方网页生成迅投QMT代码的时候，deepseek给出的代码是xtquant代码，也就是miniqmt代码，并不是我们传统意义上说的大QMT可用的代码。&lt;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
    <category term="python" scheme="https://invest.wtsolutions.cn/tags/python/"/>
    
    <category term="量化交易" scheme="https://invest.wtsolutions.cn/tags/%E9%87%8F%E5%8C%96%E4%BA%A4%E6%98%93/"/>
    
    <category term="deepseek" scheme="https://invest.wtsolutions.cn/tags/deepseek/"/>
    
  </entry>
  
  <entry>
    <title>QMT 与手机通信 - 邮件推送实现方法</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-email-notification/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-email-notification/</id>
    <published>2026-04-07T03:00:00.000Z</published>
    <updated>2026-08-12T01:47:49.875Z</updated>
    
    <content type="html"><![CDATA[<h2 id="QMT-邮件推送的重要性"><a href="#QMT-邮件推送的重要性" class="headerlink" title="QMT 邮件推送的重要性"></a>QMT 邮件推送的重要性</h2><p>在使用 QMT 量化交易系统时，我们经常需要将交易信号、错误信息或系统状态及时通知到手机，以便及时处理异常情况。邮件推送是一种简单、可靠且免费的通信方式，通过 Python 的 SMTP 模块可以轻松实现。</p><h2 id="实现邮件推送的准备工作（发件邮箱）"><a href="#实现邮件推送的准备工作（发件邮箱）" class="headerlink" title="实现邮件推送的准备工作（发件邮箱）"></a>实现邮件推送的准备工作（发件邮箱）</h2><h3 id="步骤-1：选择合适的邮箱服务"><a href="#步骤-1：选择合适的邮箱服务" class="headerlink" title="步骤 1：选择合适的邮箱服务"></a>步骤 1：选择合适的邮箱服务</h3><p>推荐使用以下邮箱服务，它们都支持 SMTP 协议：</p><ul><li>Gmail</li><li>QQ 邮箱</li><li>163 邮箱</li><li>网易邮箱</li><li>企业邮箱</li></ul><h3 id="步骤-2：开启-SMTP-服务并获取授权码"><a href="#步骤-2：开启-SMTP-服务并获取授权码" class="headerlink" title="步骤 2：开启 SMTP 服务并获取授权码"></a>步骤 2：开启 SMTP 服务并获取授权码</h3><p>以 QQ 邮箱为例：</p><ol><li>登录 QQ 邮箱</li><li>点击 “设置” → “账户”</li><li>找到 “POP3&#x2F;IMAP&#x2F;SMTP&#x2F;Exchange&#x2F;CardDAV&#x2F;CalDAV 服务”</li><li>开启 “POP3&#x2F;SMTP 服务”</li><li>按照提示生成授权码（不是邮箱密码）</li><li>保存好授权码，后续会用到</li></ol><h2 id="实现邮件推送的准备工作（收件邮箱）"><a href="#实现邮件推送的准备工作（收件邮箱）" class="headerlink" title="实现邮件推送的准备工作（收件邮箱）"></a>实现邮件推送的准备工作（收件邮箱）</h2><p>选择一个收件邮箱还是很重要的，最好是当你邮箱有邮件收到的时候，手机上有提醒，比如你可以在手机上安装对应的app获取实时推送。</p><p>我这边用的是QQ邮件，然后微信绑定了QQ邮箱，当我的QQ邮箱收到了一个邮件的时候，微信就会收到一个提醒，说进来一封新邮件。类似微信消息，这个几乎是实时的。这只是我选用的方式，你选择适合自己的方法就好。</p><h2 id="Python-实现-SMTP-邮件发送"><a href="#Python-实现-SMTP-邮件发送" class="headerlink" title="Python 实现 SMTP 邮件发送"></a>Python 实现 SMTP 邮件发送</h2><h3 id="基本邮件发送代码"><a href="#基本邮件发送代码" class="headerlink" title="基本邮件发送代码"></a>基本邮件发送代码</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> smtplib</span><br><span class="line"><span class="keyword">from</span> email.mime.text <span class="keyword">import</span> MIMEText</span><br><span class="line"><span class="keyword">from</span> email.mime.multipart <span class="keyword">import</span> MIMEMultipart</span><br><span class="line"><span class="keyword">from</span> email.header <span class="keyword">import</span> Header</span><br><span class="line"></span><br><span class="line"><span class="comment"># 邮件配置</span></span><br><span class="line">SMTP_SERVER = <span class="string">&quot;smtp.qq.com&quot;</span>  <span class="comment"># SMTP 服务器地址</span></span><br><span class="line">SMTP_PORT = <span class="number">587</span>  <span class="comment"># SMTP 端口</span></span><br><span class="line">SENDER_EMAIL = <span class="string">&quot;your_qq_email@qq.com&quot;</span>  <span class="comment"># 发件人邮箱</span></span><br><span class="line">SENDER_PASSWORD = <span class="string">&quot;your_authorization_code&quot;</span>  <span class="comment"># 授权码（不是密码）</span></span><br><span class="line">RECEIVER_EMAIL = <span class="string">&quot;your_mobile_email@139.com&quot;</span>  <span class="comment"># 收件人邮箱（可以是手机邮箱）</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_email</span>(<span class="params">subject, content</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    发送邮件函数</span></span><br><span class="line"><span class="string">    :param subject: 邮件主题</span></span><br><span class="line"><span class="string">    :param content: 邮件内容</span></span><br><span class="line"><span class="string">    :return: 是否发送成功</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 创建邮件对象</span></span><br><span class="line">        message = MIMEMultipart()</span><br><span class="line">        message[<span class="string">&#x27;From&#x27;</span>] = Header(<span class="string">&quot;QMT 通知&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        message[<span class="string">&#x27;To&#x27;</span>] = Header(<span class="string">&quot;用户&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        message[<span class="string">&#x27;Subject&#x27;</span>] = Header(subject, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 添加邮件正文</span></span><br><span class="line">        message.attach(MIMEText(content, <span class="string">&#x27;plain&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 连接 SMTP 服务器并发送邮件</span></span><br><span class="line">        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)</span><br><span class="line">        server.starttls()  <span class="comment"># 开启 TLS 加密</span></span><br><span class="line">        server.login(SENDER_EMAIL, SENDER_PASSWORD)</span><br><span class="line">        server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string())</span><br><span class="line">        server.quit()</span><br><span class="line">        </span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;邮件发送成功&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;邮件发送失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试邮件发送</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    send_email(<span class="string">&quot;QMT 测试通知&quot;</span>, <span class="string">&quot;这是一封测试邮件，用于验证 QMT 邮件推送功能是否正常。&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="邮件发送函数封装"><a href="#邮件发送函数封装" class="headerlink" title="邮件发送函数封装"></a>邮件发送函数封装</h3><p>为了方便在 QMT 策略中使用，我们可以将邮件发送功能封装成一个独立的模块：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># email_utils.py</span></span><br><span class="line"><span class="keyword">import</span> smtplib</span><br><span class="line"><span class="keyword">from</span> email.mime.text <span class="keyword">import</span> MIMEText</span><br><span class="line"><span class="keyword">from</span> email.mime.multipart <span class="keyword">import</span> MIMEMultipart</span><br><span class="line"><span class="keyword">from</span> email.header <span class="keyword">import</span> Header</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">EmailSender</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, smtp_server, smtp_port, sender_email, sender_password, receiver_email</span>):</span><br><span class="line">        <span class="variable language_">self</span>.smtp_server = smtp_server</span><br><span class="line">        <span class="variable language_">self</span>.smtp_port = smtp_port</span><br><span class="line">        <span class="variable language_">self</span>.sender_email = sender_email</span><br><span class="line">        <span class="variable language_">self</span>.sender_password = sender_password</span><br><span class="line">        <span class="variable language_">self</span>.receiver_email = receiver_email</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">send</span>(<span class="params">self, subject, content</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        发送邮件</span></span><br><span class="line"><span class="string">        :param subject: 邮件主题</span></span><br><span class="line"><span class="string">        :param content: 邮件内容</span></span><br><span class="line"><span class="string">        :return: 是否发送成功</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            message = MIMEMultipart()</span><br><span class="line">            message[<span class="string">&#x27;From&#x27;</span>] = Header(<span class="string">&quot;QMT 通知&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">            message[<span class="string">&#x27;To&#x27;</span>] = Header(<span class="string">&quot;用户&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">            message[<span class="string">&#x27;Subject&#x27;</span>] = Header(subject, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">            </span><br><span class="line">            message.attach(MIMEText(content, <span class="string">&#x27;plain&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">            </span><br><span class="line">            server = smtplib.SMTP(<span class="variable language_">self</span>.smtp_server, <span class="variable language_">self</span>.smtp_port)</span><br><span class="line">            server.starttls()</span><br><span class="line">            server.login(<span class="variable language_">self</span>.sender_email, <span class="variable language_">self</span>.sender_password)</span><br><span class="line">            server.sendmail(<span class="variable language_">self</span>.sender_email, <span class="variable language_">self</span>.receiver_email, message.as_string())</span><br><span class="line">            server.quit()</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;邮件发送失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建全局邮件发送实例</span></span><br><span class="line">email_sender = EmailSender(</span><br><span class="line">    smtp_server=<span class="string">&quot;smtp.qq.com&quot;</span>,</span><br><span class="line">    smtp_port=<span class="number">587</span>,</span><br><span class="line">    sender_email=<span class="string">&quot;your_qq_email@qq.com&quot;</span>,</span><br><span class="line">    sender_password=<span class="string">&quot;your_authorization_code&quot;</span>,</span><br><span class="line">    receiver_email=<span class="string">&quot;your_mobile_email@139.com&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_qmt_email</span>(<span class="params">subject, content</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    发送 QMT 相关邮件</span></span><br><span class="line"><span class="string">    :param subject: 邮件主题</span></span><br><span class="line"><span class="string">    :param content: 邮件内容</span></span><br><span class="line"><span class="string">    :return: 是否发送成功</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> email_sender.send(subject, content)</span><br></pre></td></tr></table></figure><blockquote><p>封装后的email.utils.py应当与其他的策略的py文件放在同一个文件夹下，通常是在安装目录下的python文件夹。<br>参考<a href="../qmt-shared-code">qmt-shared-code</a>文件中详细的解释。</p></blockquote><h2 id="在-QMT-策略中集成邮件推送"><a href="#在-QMT-策略中集成邮件推送" class="headerlink" title="在 QMT 策略中集成邮件推送"></a>在 QMT 策略中集成邮件推送</h2><h3 id="示例-1：策略启动通知"><a href="#示例-1：策略启动通知" class="headerlink" title="示例 1：策略启动通知"></a>示例 1：策略启动通知</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> email_utils <span class="keyword">import</span> send_qmt_email</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 设置账号</span></span><br><span class="line">    ContextInfo.set_account(<span class="string">&quot;your_account&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 发送策略启动通知</span></span><br><span class="line">    subject = <span class="string">&quot;QMT 策略启动通知&quot;</span></span><br><span class="line">    content = <span class="string">&quot;策略已成功启动，开始运行。&quot;</span></span><br><span class="line">    send_qmt_email(subject, content)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle_bar</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 策略逻辑</span></span><br><span class="line">    <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h3 id="示例-2：交易信号通知"><a href="#示例-2：交易信号通知" class="headerlink" title="示例 2：交易信号通知"></a>示例 2：交易信号通知</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> email_utils <span class="keyword">import</span> send_qmt_email</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle_bar</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="comment"># 获取股票数据</span></span><br><span class="line">    code = <span class="string">&quot;600000.SH&quot;</span></span><br><span class="line">    price = ContextInfo.get_market_data([code], <span class="string">&quot;close&quot;</span>)[code]</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 交易信号判断</span></span><br><span class="line">    <span class="keyword">if</span> price &gt; <span class="number">10.0</span>:</span><br><span class="line">        <span class="comment"># 发送买入信号通知</span></span><br><span class="line">        subject = <span class="string">&quot;QMT 交易信号通知&quot;</span></span><br><span class="line">        content = <span class="string">f&quot;买入信号：<span class="subst">&#123;code&#125;</span> 当前价格：<span class="subst">&#123;price&#125;</span>\n建议：买入&quot;</span></span><br><span class="line">        send_qmt_email(subject, content)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 执行买入操作</span></span><br><span class="line">        <span class="comment"># ContextInfo.order(code, 100, &quot;buy&quot;)</span></span><br></pre></td></tr></table></figure><h3 id="示例-3：错误信息通知"><a href="#示例-3：错误信息通知" class="headerlink" title="示例 3：错误信息通知"></a>示例 3：错误信息通知</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> email_utils <span class="keyword">import</span> send_qmt_email</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle_bar</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 策略逻辑</span></span><br><span class="line">        code = <span class="string">&quot;600000.SH&quot;</span></span><br><span class="line">        price = ContextInfo.get_market_data([code], <span class="string">&quot;close&quot;</span>)[code]</span><br><span class="line">        <span class="comment"># 其他操作...</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="comment"># 发送错误通知</span></span><br><span class="line">        subject = <span class="string">&quot;QMT 策略错误通知&quot;</span></span><br><span class="line">        content = <span class="string">f&quot;策略运行出错：<span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>\n请及时检查。&quot;</span></span><br><span class="line">        send_qmt_email(subject, content)</span><br></pre></td></tr></table></figure><h2 id="高级功能：邮件模板和附件"><a href="#高级功能：邮件模板和附件" class="headerlink" title="高级功能：邮件模板和附件"></a>高级功能：邮件模板和附件</h2><h3 id="带-HTML-格式的邮件"><a href="#带-HTML-格式的邮件" class="headerlink" title="带 HTML 格式的邮件"></a>带 HTML 格式的邮件</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">send_html_email</span>(<span class="params">subject, html_content</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    发送 HTML 格式邮件</span></span><br><span class="line"><span class="string">    :param subject: 邮件主题</span></span><br><span class="line"><span class="string">    :param html_content: HTML 内容</span></span><br><span class="line"><span class="string">    :return: 是否发送成功</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        message = MIMEMultipart()</span><br><span class="line">        message[<span class="string">&#x27;From&#x27;</span>] = Header(<span class="string">&quot;QMT 通知&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        message[<span class="string">&#x27;To&#x27;</span>] = Header(<span class="string">&quot;用户&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        message[<span class="string">&#x27;Subject&#x27;</span>] = Header(subject, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">        message.attach(MIMEText(html_content, <span class="string">&#x27;html&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 发送邮件代码...</span></span><br><span class="line">        <span class="comment"># ...</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;邮件发送失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用示例</span></span><br><span class="line">html_content = <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">&lt;html&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">&lt;h2&gt;QMT 交易报告&lt;/h2&gt;</span></span><br><span class="line"><span class="string">&lt;p&gt;今日交易情况：&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;table border=&quot;1&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;tr&gt;</span></span><br><span class="line"><span class="string">    &lt;th&gt;股票代码&lt;/th&gt;</span></span><br><span class="line"><span class="string">    &lt;th&gt;交易类型&lt;/th&gt;</span></span><br><span class="line"><span class="string">    &lt;th&gt;价格&lt;/th&gt;</span></span><br><span class="line"><span class="string">    &lt;th&gt;数量&lt;/th&gt;</span></span><br><span class="line"><span class="string">  &lt;/tr&gt;</span></span><br><span class="line"><span class="string">  &lt;tr&gt;</span></span><br><span class="line"><span class="string">    &lt;td&gt;600000.SH&lt;/td&gt;</span></span><br><span class="line"><span class="string">    &lt;td&gt;买入&lt;/td&gt;</span></span><br><span class="line"><span class="string">    &lt;td&gt;10.5&lt;/td&gt;</span></span><br><span class="line"><span class="string">    &lt;td&gt;100&lt;/td&gt;</span></span><br><span class="line"><span class="string">  &lt;/tr&gt;</span></span><br><span class="line"><span class="string">&lt;/table&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line">send_html_email(<span class="string">&quot;QMT 交易报告&quot;</span>, html_content)</span><br></pre></td></tr></table></figure><h3 id="带附件的邮件"><a href="#带附件的邮件" class="headerlink" title="带附件的邮件"></a>带附件的邮件</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">send_email_with_attachment</span>(<span class="params">subject, content, attachment_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    发送带附件的邮件</span></span><br><span class="line"><span class="string">    :param subject: 邮件主题</span></span><br><span class="line"><span class="string">    :param content: 邮件内容</span></span><br><span class="line"><span class="string">    :param attachment_path: 附件路径</span></span><br><span class="line"><span class="string">    :return: 是否发送成功</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        message = MIMEMultipart()</span><br><span class="line">        message[<span class="string">&#x27;From&#x27;</span>] = Header(<span class="string">&quot;QMT 通知&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        message[<span class="string">&#x27;To&#x27;</span>] = Header(<span class="string">&quot;用户&quot;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        message[<span class="string">&#x27;Subject&#x27;</span>] = Header(subject, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 添加邮件正文</span></span><br><span class="line">        message.attach(MIMEText(content, <span class="string">&#x27;plain&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 添加附件</span></span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(attachment_path, <span class="string">&#x27;rb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            attachment = MIMEText(f.read(), <span class="string">&#x27;base64&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">            attachment[<span class="string">&#x27;Content-Type&#x27;</span>] = <span class="string">&#x27;application/octet-stream&#x27;</span></span><br><span class="line">            attachment[<span class="string">&#x27;Content-Disposition&#x27;</span>] = <span class="string">f&#x27;attachment; filename=&quot;<span class="subst">&#123;attachment_path.split(<span class="string">&quot;/&quot;</span>)[-<span class="number">1</span>]&#125;</span>&quot;&#x27;</span></span><br><span class="line">            message.attach(attachment)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 发送邮件代码...</span></span><br><span class="line">        <span class="comment"># ...</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;邮件发送失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="故障排除"><a href="#故障排除" class="headerlink" title="故障排除"></a>故障排除</h2><h3 id="常见问题及解决方案"><a href="#常见问题及解决方案" class="headerlink" title="常见问题及解决方案"></a>常见问题及解决方案</h3><ol><li><p><strong>SMTP 服务器连接失败</strong></p><ul><li>检查网络连接</li><li>确认 SMTP 服务器地址和端口是否正确</li><li>检查防火墙设置</li></ul></li><li><p><strong>认证失败</strong></p><ul><li>确认使用的是授权码而不是邮箱密码</li><li>确认授权码是否正确</li><li>检查邮箱账号是否被锁定</li></ul></li><li><p><strong>邮件被标记为垃圾邮件</strong></p><ul><li>优化邮件内容，避免使用垃圾邮件关键词</li><li>确保发件人信息完整</li><li>定期清理邮件发送记录</li></ul></li><li><p><strong>邮件发送延迟</strong></p><ul><li>检查网络状况</li><li>避免频繁发送邮件</li><li>考虑使用邮件队列</li></ul></li></ol><h2 id="最佳实践"><a href="#最佳实践" class="headerlink" title="最佳实践"></a>最佳实践</h2><ol><li><strong>合理设置邮件发送频率</strong>：避免频繁发送邮件，以免被邮箱服务提供商限制</li><li><strong>邮件内容简洁明了</strong>：重点突出，便于在手机上快速查看</li><li><strong>设置邮件主题前缀</strong>：如 “[QMT]”，便于识别和过滤</li><li><strong>定期测试邮件功能</strong>：确保在需要时能正常发送</li><li><strong>使用环境变量存储敏感信息</strong>：避免在代码中硬编码邮箱密码和授权码</li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过 Python 的 SMTP 模块，我们可以轻松实现 QMT 与手机的邮件通信，及时获取交易信号和系统状态。本文介绍了从邮箱设置到代码实现的完整流程，以及在 QMT 策略中的集成方法。</p><p>如果对即时性要求更高，可以把告警直接推送到微信，参考 <a href="../qmt-wechat-notification">策略消息推送到微信的几种方案</a>。邮件走留档，微信走实时，两者互补效果更好。</p><p>希望这篇文章对您有所帮助！如果您有任何问题或建议，欢迎在评论区留言。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;QMT-邮件推送的重要性&quot;&gt;&lt;a href=&quot;#QMT-邮件推送的重要性&quot; class=&quot;headerlink&quot; title=&quot;QMT 邮件推送的重要性&quot;&gt;&lt;/a&gt;QMT 邮件推送的重要性&lt;/h2&gt;&lt;p&gt;在使用 QMT</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="邮件推送" scheme="https://invest.wtsolutions.cn/tags/%E9%82%AE%E4%BB%B6%E6%8E%A8%E9%80%81/"/>
    
    <category term="python" scheme="https://invest.wtsolutions.cn/tags/python/"/>
    
    <category term="smtp" scheme="https://invest.wtsolutions.cn/tags/smtp/"/>
    
    <category term="手机通信" scheme="https://invest.wtsolutions.cn/tags/%E6%89%8B%E6%9C%BA%E9%80%9A%E4%BF%A1/"/>
    
  </entry>
  
  <entry>
    <title>Wise 账户名称修改指南 - 如何将中文名改为拼音</title>
    <link href="https://invest.wtsolutions.cn/posts/wise-change-name-to-pinyin/"/>
    <id>https://invest.wtsolutions.cn/posts/wise-change-name-to-pinyin/</id>
    <published>2026-04-07T02:00:00.000Z</published>
    <updated>2026-08-12T01:50:35.715Z</updated>
    
    <content type="html"><![CDATA[<h2 id="为什么需要修改-Wise-账户名称为拼音？"><a href="#为什么需要修改-Wise-账户名称为拼音？" class="headerlink" title="为什么需要修改 Wise 账户名称为拼音？"></a>为什么需要修改 Wise 账户名称为拼音？</h2><p>在使用中国身份证开设 Wise 账户时，系统会默认使用中文姓名。然而，在某些情况下，使用拼音名称可能会更方便：</p><ul><li><strong>避免系统兼容性问题</strong>：部分国际平台可能无法正确显示中文字符</li><li><strong>减少转账错误</strong>：使用拼音可以降低收款方系统识别错误的风险</li><li><strong>符合国际惯例</strong>：在国际金融交易中，拼音名称更符合标准格式</li><li><strong>与其他国际账户保持一致</strong>：如果您同时使用其他国际金融服务（如 IBKR 等），统一使用拼音名称可以减少混淆</li></ul><h2 id="如何修改-Wise-账户名称为拼音"><a href="#如何修改-Wise-账户名称为拼音" class="headerlink" title="如何修改 Wise 账户名称为拼音"></a>如何修改 Wise 账户名称为拼音</h2><h3 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h3><p>在修改账户名称之前，请确保：</p><ol><li>您已经完成了 Wise 账户的实名认证</li><li>您的账户状态正常，没有任何限制</li><li>您准备好<strong>护照</strong></li></ol><h3 id="修改步骤"><a href="#修改步骤" class="headerlink" title="修改步骤"></a>修改步骤</h3><ol><li>访问Wise APP</li><li>点击左上角的姓名和头像</li><li>找到“帮助”</li><li>点击最下方的联系我们</li><li>更新信息</li><li>选择其他</li><li>选择中文，然后电子邮件</li><li>说明情况：使用内地身份证开户，所以账户名称是中文名称，想要更改成拼音的名称。</li><li>邮件发送后，等待回复。</li><li>正常情况下会让你提供护照扫描件，你按照要求提供护照扫描件。</li><li>正常情况下等待1个工作日。</li></ol><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li><strong>修改频率限制</strong>：Wise 可能对账户名称修改有频率限制，请谨慎操作</li><li><strong>信息一致性</strong>：修改后的拼音名称应与您的身份证、护照信息一致</li><li><strong>影响范围</strong>：修改账户名称可能会影响您的银行账户关联、转账记录等，请确保您了解相关影响</li><li><strong>其他信息</strong>：除了姓名外，确保您的其他个人信息（如地址、联系方式等）也是准确的</li></ol><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="Q-修改姓名后，我的银行账户关联会受影响吗？"><a href="#Q-修改姓名后，我的银行账户关联会受影响吗？" class="headerlink" title="Q: 修改姓名后，我的银行账户关联会受影响吗？"></a>Q: 修改姓名后，我的银行账户关联会受影响吗？</h3><p>A: 可能会。如果您之前已经关联了银行账户，修改姓名后可能需要重新验证银行账户信息。 建议开启Wise账户后，就立刻开始准备修改名称为拼音。</p><h3 id="Q-可以多次修改账户名称吗？"><a href="#Q-可以多次修改账户名称吗？" class="headerlink" title="Q: 可以多次修改账户名称吗？"></a>Q: 可以多次修改账户名称吗？</h3><p>A: Wise 对账户名称修改有一定限制，建议在确认需要修改后再进行操作。</p><h3 id="Q-修改姓名需要付费吗？"><a href="#Q-修改姓名需要付费吗？" class="headerlink" title="Q: 修改姓名需要付费吗？"></a>Q: 修改姓名需要付费吗？</h3><p>A: 不需要，Wise 账户名称修改是免费的。</p><h3 id="Q-审核需要多长时间？"><a href="#Q-审核需要多长时间？" class="headerlink" title="Q: 审核需要多长时间？"></a>Q: 审核需要多长时间？</h3><p>A: 通常需要 1-3 个工作日，大概率是1个工作日就能完成。具体时间可能因个人情况而异。</p><h3 id="Q-使用-Wise-收款，拼音姓名是姓在前还是名在前？"><a href="#Q-使用-Wise-收款，拼音姓名是姓在前还是名在前？" class="headerlink" title="Q: 使用 Wise 收款，拼音姓名是姓在前还是名在前？"></a>Q: 使用 Wise 收款，拼音姓名是姓在前还是名在前？</h3><p>A: 亲测过，如果是 Wise 港币hkd账户，也就是 DBS 香港的账户，那么拼音姓名是姓在前。张三的拼音是“Zhang San”。其他币种的账户还没有测试过，可以尝试名在前，也就是“San Zhang”。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>将 Wise 账户名称修改为拼音是一个简单但重要的操作，可以帮助您更顺利地使用国际金融服务。按照上述步骤操作，您可以轻松完成姓名修改，享受更便捷的跨境金融体验。</p><p>如果您在修改过程中遇到任何问题，可以联系 Wise 客服寻求帮助。</p><p>希望这篇指南对您有所帮助！如果您有其他关于 Wise 账户的问题，欢迎查看我们的其他相关文章。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;为什么需要修改-Wise-账户名称为拼音？&quot;&gt;&lt;a href=&quot;#为什么需要修改-Wise-账户名称为拼音？&quot; class=&quot;headerlink&quot; title=&quot;为什么需要修改 Wise 账户名称为拼音？&quot;&gt;&lt;/a&gt;为什么需要修改 Wise</summary>
        
      
    
    
    
    <category term="wise" scheme="https://invest.wtsolutions.cn/categories/wise/"/>
    
    
    <category term="海外账户" scheme="https://invest.wtsolutions.cn/tags/%E6%B5%B7%E5%A4%96%E8%B4%A6%E6%88%B7/"/>
    
    <category term="Wise" scheme="https://invest.wtsolutions.cn/tags/Wise/"/>
    
    <category term="账户设置" scheme="https://invest.wtsolutions.cn/tags/%E8%B4%A6%E6%88%B7%E8%AE%BE%E7%BD%AE/"/>
    
    <category term="名称修改" scheme="https://invest.wtsolutions.cn/tags/%E5%90%8D%E7%A7%B0%E4%BF%AE%E6%94%B9/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT量化交易系统-如何正确安装Python库</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-install-python-lib/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-install-python-lib/</id>
    <published>2026-01-15T02:00:00.000Z</published>
    <updated>2026-08-12T01:48:16.772Z</updated>
    
    <content type="html"><![CDATA[<h2 id="迅投QMT中如何正确安装Python库"><a href="#迅投QMT中如何正确安装Python库" class="headerlink" title="迅投QMT中如何正确安装Python库"></a>迅投QMT中如何正确安装Python库</h2><p>在使用讯投QMT编写量化策略时，我们经常需要使用一些Python库来辅助开发。但是QMT的Python环境比较特殊，直接使用pip安装可能会遇到问题。下面介绍两种正确的安装方法：</p><h3 id="自带库"><a href="#自带库" class="headerlink" title="自带库"></a>自带库</h3><p>讯投自带了如下的Python库：</p><table><thead><tr><th>名称</th><th>说明</th></tr></thead><tbody><tr><td>NumPy</td><td>NumPy (Numeric Python) 提供了许多高级的数值编程工具，如：矩阵数据类型、矢量处理，以及精密的运算库。专为进行严格的数字处理而产生。</td></tr><tr><td>Pandas</td><td>Python Data Analysis Library 或 Pandas 是基于 NumPy 的一种工具，该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型，提供了高效地操作大型数据集所需的工具。Pandas 提供了大量能使我们快速便捷地处理数据的函数和方法。</td></tr><tr><td>Patsy</td><td>一个线性模型分析和构建工具库。</td></tr><tr><td>SciPy</td><td>SciPy 函数库在 NumPy 库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。</td></tr><tr><td>Statsmodels</td><td>Python 的统计建模和计量经济学工具包，包括一些描述统计、统计模型估计和推断。</td></tr><tr><td>TA_Lib</td><td>称作技术分析库，是一种广泛用在程序化交易中进行金融市场数据的技术分析的函数库。它提供了多种技术分析的函数，可以大大方便我们量化投资中编程工作，内容包括：多种指标，如 ADX, MACD, RSI, 布林轨道等；K 线形态识别，如黄昏之星，锤形线等等。</td></tr></tbody></table><h3 id="手动安装没有自带的库"><a href="#手动安装没有自带的库" class="headerlink" title="手动安装没有自带的库"></a>手动安装没有自带的库</h3><p>第三方库导入指引</p><ol><li><p>除迅投提供的标准 Python api 和集成的部分第三方库，用户也可自己在 Python 官网下载其他所需第三方库，使用方式如下：</p><ul><li><p>本地安装Python环境，下载python3.6，Python官网：<a href="https://www.python.org/downloads/release/python-360/">https://www.python.org/downloads/release/python-360/</a></p></li><li><p>安装位置：C:\Python36</p></li></ul></li><li><p>​新增环境变量：我的电脑–属性–高级系统设置–高级–环境变量—path：C:\Python36;C:\Python36\Scripts</p></li><li><p>安装第三方库</p><p> ​ - 执行 pip 更新命令 python -m pip install –upgrade pip</p><p> ​ - 安装三方库命令 pip install openpyxl -t E:\QMT交易端20962\bin.x64\Lib\site-packages<br> （具体安装位置根据个人电脑进行调整）</p></li><li><p>检查安装结果</p><p> ​ - 安装位置\bin.x64\Lib\site-packages检查安装库</p></li></ol><h2 id="安装第三方-Python-库报错"><a href="#安装第三方-Python-库报错" class="headerlink" title="安装第三方 Python 库报错"></a>安装第三方 Python 库报错</h2><p>问题描述：</p><p>“ImportError:Forbidden:Moduleopenpyxl not in whitelist!”</p><p>问题解答：</p><p>该报错是由于券商后台开启了 Python 库白名单，若您使用的是券商提供的QMT终端，请联系您的所属券商开通对应 Python 库白名单权限即可。</p><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ul><li>确保安装的库版本与QMT内置的Python 3.6兼容</li><li>不要在QMT运行时安装库，安装完成后请重启QMT</li><li>一些复杂的库（如TensorFlow）可能无法在QMT环境中正常运行</li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;迅投QMT中如何正确安装Python库&quot;&gt;&lt;a href=&quot;#迅投QMT中如何正确安装Python库&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="Python库" scheme="https://invest.wtsolutions.cn/tags/Python%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>无需出国！用中国身份证开设海外多币种账户 - Wise 开户指南</title>
    <link href="https://invest.wtsolutions.cn/posts/wise-account-guide/"/>
    <id>https://invest.wtsolutions.cn/posts/wise-account-guide/</id>
    <published>2025-12-23T01:00:00.000Z</published>
    <updated>2026-08-13T00:45:28.755Z</updated>
    
    <content type="html"><![CDATA[<h2 id="为什么需要一个海外多币种账户？"><a href="#为什么需要一个海外多币种账户？" class="headerlink" title="为什么需要一个海外多币种账户？"></a>为什么需要一个海外多币种账户？</h2><p>在全球化的今天，越来越多的人需要进行跨境交易：</p><ul><li>海外购物、海淘</li><li>跨境电商收款</li><li>海外投资（美股、港股等）IBKR等</li><li>出国留学、旅游</li><li>向海外亲友汇款</li></ul><p>然而，对于大多数人来说，前往国外开设银行账户并不现实。那么，有没有办法在国内使用中国身份证就能开设一个支持多种外币的海外账户呢？</p><h2 id="Wise-账户：国内身份证即可开设的海外多币种账户"><a href="#Wise-账户：国内身份证即可开设的海外多币种账户" class="headerlink" title="Wise 账户：国内身份证即可开设的海外多币种账户"></a>Wise 账户：国内身份证即可开设的海外多币种账户</h2><p>答案是肯定的！<strong>Wise</strong>（原 TransferWise）就是一个非常不错的选择。作为一家全球知名的金融科技公司，Wise 允许中国大陆用户使用居民身份证直接开设海外多币种账户。</p><h3 id="Wise-账户的优势"><a href="#Wise-账户的优势" class="headerlink" title="Wise 账户的优势"></a>Wise 账户的优势</h3><ol><li><p><strong>支持多种货币</strong></p><ul><li>美元（USD）</li><li>欧元（EUR）</li><li>港币（HKD）</li><li>英镑（GBP）</li><li>澳元（AUD）</li><li>加元（CAD）</li><li>日元（JPY）</li><li>新加坡元（SGD）</li><li>以及其他 50+ 种货币</li></ul></li><li><p><strong>开户便捷</strong></p><ul><li>仅需中国身份证</li><li>在线完成，无需前往银行</li><li>几分钟即可完成开户</li></ul></li><li><p><strong>费用透明</strong></p><ul><li>无月度管理费</li><li>转账费用透明，提前知晓费用</li></ul></li><li><p><strong>功能丰富</strong></p><ul><li>接收外币转账（如 PayPal、亚马逊等平台收款）</li><li>向海外汇款</li><li>支持绑定国际支付平台</li></ul></li></ol><h3 id="Wise-账户开户流程"><a href="#Wise-账户开户流程" class="headerlink" title="Wise 账户开户流程"></a>Wise 账户开户流程</h3><ol><li><p><strong>访问 Wise 官网</strong></p><ul><li>官网：<a href="https://wise.com/invite/ahpc/f0epglc">https://wise.com/invite/ahpc/f0epglc</a></li></ul></li><li><p><strong>注册账户</strong></p><ul><li>填写个人基本信息（姓名、邮箱、电话）</li><li>设置登录密码</li></ul></li><li><p><strong>身份验证</strong></p><ul><li>选择 “中国大陆” 作为居住国家</li><li>上传中国身份证正反面照片</li><li>完成人脸识别验证（部分用户可能需要）</li></ul></li><li><p><strong>选择账户类型</strong></p><ul><li>选择 “个人” 账户</li><li>填写职业和收入来源</li></ul></li><li><p><strong>激活账户</strong></p><ul><li>等待审核通过（通常几分钟内完成）</li><li>审核通过后，即可开始使用多币种账户</li></ul></li><li><p><strong>更改中文姓名成拼音</strong></p><ul><li>使用中国大陆身份证开户之后，会需要将中文姓名更改成拼音，这样才能方便收款，因为很多国外的银行并不支持中文姓名</li><li>具体的更改方法详见我的另外一个博客文章：<a href="../wise-change-name-to-pinyin">Wise 账户中文姓名更改</a></li></ul></li></ol><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ol><li><p><strong>入金限制</strong></p><ul><li>内地账户暂不支持直接使用人民币入金</li><li>需要通过其他方式（如外币转账）向 Wise 账户充值</li></ul></li><li><p><strong>使用场景</strong></p><ul><li>适合小额跨境交易</li><li>不适合大额资金存放</li><li>主要用于收款和付款，而非长期储蓄</li></ul></li><li><p><strong>费用说明</strong></p><ul><li>转账费用根据金额和币种而定</li><li>汇率采用中间汇率，无隐藏费用</li></ul></li></ol><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>如果你需要一个临时的海外账户进行收款付款，无法前往国外开户，那么 Wise 账户是一个非常不错的选择。仅需中国身份证，即可开设一个支持多种外币的海外账户，方便进行各种跨境交易。</p><p>无论是跨境电商收款、海外投资，还是出国留学、旅游，Wise 账户都能满足你的需求。其便捷的开户流程、透明的费用结构和丰富的功能，使其成为越来越多国内用户的选择。</p><p>如果你有跨境支付需求，不妨考虑开设一个 Wise 账户，体验便捷的全球金融服务！</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;为什么需要一个海外多币种账户？&quot;&gt;&lt;a href=&quot;#为什么需要一个海外多币种账户？&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="wise" scheme="https://invest.wtsolutions.cn/categories/wise/"/>
    
    
    <category term="海外账户" scheme="https://invest.wtsolutions.cn/tags/%E6%B5%B7%E5%A4%96%E8%B4%A6%E6%88%B7/"/>
    
    <category term="Wise" scheme="https://invest.wtsolutions.cn/tags/Wise/"/>
    
    <category term="跨境支付" scheme="https://invest.wtsolutions.cn/tags/%E8%B7%A8%E5%A2%83%E6%94%AF%E4%BB%98/"/>
    
    <category term="多币种" scheme="https://invest.wtsolutions.cn/tags/%E5%A4%9A%E5%B8%81%E7%A7%8D/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: 公共代码的编写与引用</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-shared-code/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-shared-code/</id>
    <published>2025-12-17T02:28:06.000Z</published>
    <updated>2025-12-17T09:18:27.920Z</updated>
    
    <content type="html"><![CDATA[<h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>在量化交易策略开发过程中，特别是使用讯投QMT平台时，我们经常会遇到多个策略需要使用相同函数或工具类的情况。如果每个策略都单独实现这些功能，不仅会导致代码冗余，还会增加维护成本——当需要修改某个功能时，必须在所有使用该功能的策略中逐一更新。</p><p>本文将详细介绍如何在 QMT 中，自行创建和使用共享公共代码库，实现函数的复用，提高开发效率和代码质量。</p><h2 id="共享公共代码的优势"><a href="#共享公共代码的优势" class="headerlink" title="共享公共代码的优势"></a>共享公共代码的优势</h2><h3 id="1-减少代码冗余"><a href="#1-减少代码冗余" class="headerlink" title="1. 减少代码冗余"></a>1. 减少代码冗余</h3><p>将多个策略中重复使用的代码（如数据处理函数、指标计算方法、风险控制模块等）提取到单独的共享文件中，可以显著减少代码总量，使策略代码更加简洁。</p><h3 id="2-提高维护效率"><a href="#2-提高维护效率" class="headerlink" title="2. 提高维护效率"></a>2. 提高维护效率</h3><p>当需要修改某个功能时，只需在共享文件中更新一次，所有引用该功能的策略都会自动使用最新版本，避免了遗漏和不一致。</p><h3 id="3-统一代码风格和逻辑"><a href="#3-统一代码风格和逻辑" class="headerlink" title="3. 统一代码风格和逻辑"></a>3. 统一代码风格和逻辑</h3><p>共享代码库可以确保所有策略使用相同的函数实现和逻辑，提高代码的一致性和可预测性。</p><h3 id="4-加速新策略开发"><a href="#4-加速新策略开发" class="headerlink" title="4. 加速新策略开发"></a>4. 加速新策略开发</h3><p>新策略可以直接引用已有的共享函数，无需从零开始编写常用功能，加快开发速度。</p><h2 id="实现共享代码的方法"><a href="#实现共享代码的方法" class="headerlink" title="实现共享代码的方法"></a>实现共享代码的方法</h2><h3 id="1-创建共享代码文件"><a href="#1-创建共享代码文件" class="headerlink" title="1. 创建共享代码文件"></a>1. 创建共享代码文件</h3><h4 id="步骤-1：确定共享代码目录"><a href="#步骤-1：确定共享代码目录" class="headerlink" title="步骤 1：确定共享代码目录"></a>步骤 1：确定共享代码目录</h4><p>在 QMT 的策略目录结构中，找到安装目录下面的<code>python</code>目录。这个目录也是所有策略存放的位置。</p><p>示例目录结构：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">QMT交易客户端/</span><br><span class="line">├── python/</span><br><span class="line">│   ├── __init__.py</span><br><span class="line">│   ├── utils.py        # 公共代码工具函数</span><br><span class="line">│   ├── strategy-1.py   # 策略实现</span><br><span class="line">│   └── strategy-2.py   # 策略实现</span><br></pre></td></tr></table></figure><h4 id="步骤-2：编写共享代码"><a href="#步骤-2：编写共享代码" class="headerlink" title="步骤 2：编写共享代码"></a>步骤 2：编写共享代码</h4><p>在共享目录中创建 Python 文件，并实现需要共享的函数。例如，在 <code>utils.py</code> 中实现数据处理函数：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># utils.py</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sayHello</span>():</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;Hello, QMT!&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">read_db</span>(<span class="params">data</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    从数据库读取数据</span></span><br><span class="line"><span class="string">    </span></span><br><span class="line"><span class="string">    参数：</span></span><br><span class="line"><span class="string">    data: str，数据库查询语句</span></span><br><span class="line"><span class="string">    </span></span><br><span class="line"><span class="string">    返回：</span></span><br><span class="line"><span class="string">    pd.DataFrame，查询结果</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line">    <span class="comment"># 假设 db_connection 是已建立的数据库连接对象</span></span><br><span class="line">    <span class="keyword">return</span> pd.read_sql(data, db_connection)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-在策略中引用共享代码"><a href="#2-在策略中引用共享代码" class="headerlink" title="2. 在策略中引用共享代码"></a>2. 在策略中引用共享代码</h3><h4 id="使用相对导入"><a href="#使用相对导入" class="headerlink" title="使用相对导入"></a>使用相对导入</h4><p>本方法中，策略文件和共享代码文件，在同一个文件夹<code>python</code>中。可以使用相对导入：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># strategy3.py</span></span><br><span class="line"><span class="keyword">from</span> utils <span class="keyword">import</span> sayHello</span><br><span class="line"><span class="keyword">from</span> utils <span class="keyword">import</span> read_db</span><br><span class="line"></span><br><span class="line"><span class="comment"># 策略逻辑...</span></span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><h3 id="1-QMT-特定环境考虑"><a href="#1-QMT-特定环境考虑" class="headerlink" title="1. QMT 特定环境考虑"></a>1. QMT 特定环境考虑</h3><p>在 QMT 平台中使用共享代码时，需要注意：</p><ul><li>确保共享目录在 QMT 的 Python 路径中</li><li>了解 QMT 的策略执行环境，避免使用平台不支持的模块或功能</li><li>注意策略之间的独立性，避免共享状态导致的策略相互影响</li></ul><h3 id="2-性能考虑"><a href="#2-性能考虑" class="headerlink" title="2. 性能考虑"></a>2. 性能考虑</h3><p>虽然共享代码可以提高开发效率，但也要注意性能问题：</p><ul><li>避免在高频策略中使用过于复杂的共享函数</li><li>对于计算密集型的共享函数，可以考虑使用更高效的实现方式（如使用 NumPy 代替纯 Python）</li></ul><h3 id="3-安全性考虑"><a href="#3-安全性考虑" class="headerlink" title="3. 安全性考虑"></a>3. 安全性考虑</h3><ul><li>不要在共享代码中硬编码敏感信息（如 API 密钥、账户信息等）</li><li>对共享代码进行适当的权限控制，避免未经授权的修改</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>在 QMT 策略开发中，合理使用共享代码可以显著提高开发效率和代码质量。通过创建专门的共享代码目录，将常用函数和类进行封装，并在策略中正确引用，我们可以实现代码的复用和统一管理。同时，遵循最佳实践和注意事项，可以确保共享代码的可靠性、性能和安全性。</p><p>采用本文介绍的方法，您可以构建一个高效、可维护的策略开发环境，让量化交易策略的开发和维护变得更加轻松。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;概述&quot;&gt;&lt;a href=&quot;#概述&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="策略" scheme="https://invest.wtsolutions.cn/tags/%E7%AD%96%E7%95%A5/"/>
    
    <category term="公共代码" scheme="https://invest.wtsolutions.cn/tags/%E5%85%AC%E5%85%B1%E4%BB%A3%E7%A0%81/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: trade client not found 无法找到trade client</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-trade-client-not-found/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-trade-client-not-found/</id>
    <published>2025-12-11T02:41:06.000Z</published>
    <updated>2026-08-12T01:50:21.646Z</updated>
    
    <content type="html"><![CDATA[<p>在QMT使用的过程中，我们有时会收到报错，trade client not found 无法找到trade client，我之前遇到这个情况的时候，qmt连续24小时运行，然后第二天的时候，会出现这类报错，导致qmt无法正常运行。</p><p>我目前没有找到非常有效的解决方案，我能做的就是， 在手机上收到报错提醒的时候，立刻人为干预，重新启动qmt，就可以正常运行了。我另外还做了尝试就是联系券商，让他们给我发一个最新版本的qmt安装程序，使用最新的版本，目前看这个问题在安装新版本之后解决了，但我也不确定是不是因为这个原因，但我会建议大家做一下这些尝试，看看有没有解决。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;在QMT使用的过程中，我们有时会收到报错，trade client not found 无法找到trade</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="报错" scheme="https://invest.wtsolutions.cn/tags/%E6%8A%A5%E9%94%99/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: 运行在云服务器时如何加密保护策略代码</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-strategy-code-protection/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-strategy-code-protection/</id>
    <published>2025-12-11T02:28:06.000Z</published>
    <updated>2026-08-12T01:50:06.051Z</updated>
    
    <content type="html"><![CDATA[<p>随着量化交易的普及，越来越多的投资者选择将讯投QMT的量化策略部署在云服务器上运行（有的券商支持，有的券商不支持）。这种方式不仅可以保证策略的24小时稳定运行，还能利用云服务器的高性能资源。然而，随之而来的一个重要问题是：如何保护自己辛苦编写的策略代码不被他人窃取或查看？</p><p>策略代码往往包含了投资者的核心交易思想和盈利逻辑，一旦泄露可能造成不可估量的损失。本文将介绍几种保护云服务器上QMT策略代码的有效方法，帮助您在享受云服务便利的同时，保障策略的安全性。</p><h2 id="代码加密保护"><a href="#代码加密保护" class="headerlink" title="代码加密保护"></a>代码加密保护</h2><p>代码加密是保护策略最直接有效的方法之一。通过加密处理，可以将可读的源代码转换为难以理解的形式，即使他人获得了文件，也无法轻易解读其中的逻辑。</p><h3 id="1-Python代码加密"><a href="#1-Python代码加密" class="headerlink" title="1. Python代码加密"></a>1. Python代码加密</h3><p>QMT的策略主要使用Python编写，我们可以使用以下工具对Python代码进行加密：</p><h4 id="PyInstaller打包加密"><a href="#PyInstaller打包加密" class="headerlink" title="PyInstaller打包加密"></a>PyInstaller打包加密</h4><p>PyInstaller可以将Python代码打包成可执行文件，隐藏原始代码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装PyInstaller</span></span><br><span class="line">pip install pyinstaller</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将策略文件打包成单文件可执行程序</span></span><br><span class="line">pyinstaller --onefile your_strategy.py</span><br></pre></td></tr></table></figure><p>打包完成后，会在dist目录下生成可执行文件，原始的.py代码不会被包含在其中。</p><h3 id="2-Python代码混淆"><a href="#2-Python代码混淆" class="headerlink" title="2. Python代码混淆"></a>2. Python代码混淆</h3><p>Python代码混淆工具可以将代码中的变量名、函数名等进行随机重命名，使代码难以理解，但这种方式并不是完全的安全，仅能提高阅读的难度。常用的混淆工具有：</p><ul><li>PyArmor</li><li>PyConfuse</li><li>PyObfuscate</li></ul><p>您可以根据自己的需求选择合适的工具进行混淆。</p><h3 id="3-QMT自带的策略加密功能"><a href="#3-QMT自带的策略加密功能" class="headerlink" title="3. QMT自带的策略加密功能"></a>3. QMT自带的策略加密功能</h3><p>部分版本的QMT提供了自带的策略加密功能，您可以在策略编辑界面中查找相关选项。使用官方提供的加密功能，通常可以更好地保证兼容性。</p><p>​</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;随着量化交易的普及，越来越多的投资者选择将讯投QMT的量化策略部署在云服务器上运行（有的券商支持，有的券商不支持）。这种方式不仅可以保证策略的24小时稳定运行，还能利用云服务器的高性能资源。然而，随之而来的一个重要问题是：如何保护自己辛苦编写的策略代码不被他人窃取或查看？&lt;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="策略" scheme="https://invest.wtsolutions.cn/tags/%E7%AD%96%E7%95%A5/"/>
    
    <category term="加密" scheme="https://invest.wtsolutions.cn/tags/%E5%8A%A0%E5%AF%86/"/>
    
  </entry>
  
  <entry>
    <title>讯投QMT使用小技巧: account未定义 account not defined</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-account-not-defined/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-account-not-defined/</id>
    <published>2025-12-11T02:18:06.000Z</published>
    <updated>2026-08-12T01:47:08.544Z</updated>
    
    <content type="html"><![CDATA[<p>最近有朋友问我，为什么在使用QMT自带的一些策略进行回测或时候，会提示错误，比如account未定义，account未找到或者account not defined。</p><p>通常提出这些问题的朋友都是QMT刚刚入门的，对代码还并不熟悉。</p><p>以迅投QMT自带策略-双均线实盘示例PY策略为例，代码部分（节选）中：</p><p>#encoding:gbk<br>import pandas as pd<br>import numpy as np<br>import datetime</p><p>“””<br>示例说明：双均线实盘策略，通过计算快慢双均线，在金叉时买入，死叉时做卖出<br>“””</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">a</span>():</span><br><span class="line"><span class="keyword">pass</span></span><br><span class="line">A = a() <span class="comment">#创建空的类的实例 用来保存委托状态 </span></span><br><span class="line"><span class="comment">#ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">A.stock= C.stockcode + <span class="string">&#x27;.&#x27;</span> + C.market <span class="comment">#品种为模型交易界面选择品种</span></span><br><span class="line">A.acct= account <span class="comment">#账号为模型交易界面选择账号</span></span><br></pre></td></tr></table></figure><p>​<br>其中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">A.acct = account</span><br></pre></td></tr></table></figure><p>出错就是在这一行。</p><p>account对于系统来说是没有定义的，不知道account具体是多少，所以系统会报错。</p><p>此处的account应该是你登录QMT软件的账号，你可以手动的把 account修改成你的实际账户，有的券商是纯数字，有的可能是带字母的，以券商提供给你的账户账号为准。</p><p>比如你的账户是888666333，那么你需要把account修改成带英文双引号的”888666333”，这样就可以了，修改后保存开启回测了。</p><p>​</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;最近有朋友问我，为什么在使用QMT自带的一些策略进行回测或时候，会提示错误，比如account未定义，account未找到或者account not</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="报错" scheme="https://invest.wtsolutions.cn/tags/%E6%8A%A5%E9%94%99/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT量化交易系统-开通量化交易系统账户</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-account-open/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-account-open/</id>
    <published>2025-12-10T02:36:06.000Z</published>
    <updated>2026-08-12T01:47:17.353Z</updated>
    
    <content type="html"><![CDATA[<h2 id="迅投QMT-开户-量化交易系统账户"><a href="#迅投QMT-开户-量化交易系统账户" class="headerlink" title="迅投QMT-开户-量化交易系统账户"></a>迅投QMT-开户-量化交易系统账户</h2><p>讯投QMT是一个量化交易系统，它提供了一个平台，让用户（比如散户）可以在上面进行量化交易&#x2F;程序化交易。</p><p>有一些证券公司的开户门槛很低，比如账户有十万元（可以先转入，开通qmt之后再转出），就可以开通讯投QMT的量化交易系统账户，他们也可以提供较低的佣金的证券账户（几乎是全市场最低的佣金）。如果有需要，可以通过下方微信与我联系。</p><h3 id="佣金"><a href="#佣金" class="headerlink" title="佣金"></a>佣金</h3><ul><li>股票 万0.854</li><li>两融 4%～5%</li><li>场内基金 万0.5</li><li>可转债 万0.5</li><li>港股通 万0.854</li><li>北交所 万3</li><li>国债逆回购 一折</li><li>期权 2元一张</li></ul><h3 id="开户福利"><a href="#开户福利" class="headerlink" title="开户福利"></a>开户福利</h3><ul><li>开户享受 6.66%利率理财</li><li>20万送level2行情</li><li>10万可开通讯投qmt，ptrade</li><li>19.30开启夜市委托</li></ul><h3 id="量化"><a href="#量化" class="headerlink" title="量化"></a>量化</h3><ul><li>大QMT，mini QMT， 恒生ptrade</li></ul><p>如果有需要，可以通过下方微信与我联系。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;迅投QMT-开户-量化交易系统账户&quot;&gt;&lt;a href=&quot;#迅投QMT-开户-量化交易系统账户&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="开通账户" scheme="https://invest.wtsolutions.cn/tags/%E5%BC%80%E9%80%9A%E8%B4%A6%E6%88%B7/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT量化交易系统-登录问题-无法登陆-由于目标计算机积极拒绝无法连接</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-can-not-login/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-can-not-login/</id>
    <published>2025-12-10T02:26:06.000Z</published>
    <updated>2026-08-12T01:47:25.508Z</updated>
    
    <content type="html"><![CDATA[<h2 id="迅投QMT登陆问题-无法登陆"><a href="#迅投QMT登陆问题-无法登陆" class="headerlink" title="迅投QMT登陆问题-无法登陆"></a>迅投QMT登陆问题-无法登陆</h2><p>如果你在登陆讯投QMT的时候，发现无法登陆，且提示由于目标计算机积极拒绝无法连接。</p><p>首先我们要重新尝试登陆，确认账号密码是否正确。</p><p>如果确认账号密码正确，但是仍然无法登陆，那么很可能是因为你是在周五收盘后、周六、周日尝试进行登陆的。很多的证券公司，他们会在这个时间段进行系统测试，导致系统无法正常登陆。可以等待到周日晚一点时间或者周一尝试登陆。针对这这种情况，有一个解决办法，只要你电脑设备能一直开机，QMT一直处于打开且保持登陆的状态，那么QMT软件就一直可以使用的，这样你就可以在周末的时候进行回测，改策略等等。</p><p>如果还是不行，则需要联系自己的客户经理反馈问题了。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;迅投QMT登陆问题-无法登陆&quot;&gt;&lt;a href=&quot;#迅投QMT登陆问题-无法登陆&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="登录问题" scheme="https://invest.wtsolutions.cn/tags/%E7%99%BB%E5%BD%95%E9%97%AE%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>讯投 QMT 使用小技巧：判断当前时段是交易/非交易/竞价/盘后等时间段</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-is-now-a-trading-hour/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-is-now-a-trading-hour/</id>
    <published>2025-04-02T15:26:06.000Z</published>
    <updated>2026-08-13T00:45:21.152Z</updated>
    
    <content type="html"><![CDATA[<h2 id="A股的交易时间段"><a href="#A股的交易时间段" class="headerlink" title="A股的交易时间段"></a>A股的交易时间段</h2><p>A股的交易时段分为<strong>开盘集合竞价、连续竞价（早盘、午盘）和收盘集合竞价</strong>三个阶段，具体时间如下：</p><h2 id="1-交易日安排"><a href="#1-交易日安排" class="headerlink" title="1. 交易日安排"></a><strong>1. 交易日安排</strong></h2><ul><li><strong>周一至周五</strong>（法定节假日除外）</li><li><strong>不交易</strong>：周末（周六、周日）和法定节假日（如春节、国庆节等）。</li></ul><hr><h2 id="2-交易时段明细"><a href="#2-交易时段明细" class="headerlink" title="2. 交易时段明细"></a><strong>2. 交易时段明细</strong></h2><table><thead><tr><th>时段</th><th>时间</th><th>备注</th></tr></thead><tbody><tr><td><strong>开盘集合竞价</strong></td><td>9:15 - 9:25</td><td>- 9:15-9:20：可<strong>申报或撤单</strong>。<br>- 9:20-9:25：可<strong>申报，不可撤单</strong>。</td></tr><tr><td><strong>早盘连续竞价</strong></td><td>9:30 - 11:30</td><td>正常交易时段，可自由买卖。</td></tr><tr><td><strong>午间休市</strong></td><td>11:30 - 13:00</td><td>不接受委托，未成交的订单仍有效。</td></tr><tr><td><strong>午盘连续竞价</strong></td><td>13:00 - 14:57</td><td>正常交易时段。</td></tr><tr><td><strong>收盘集合竞价</strong></td><td>14:57 - 15:00</td><td>可<strong>申报，不可撤单</strong>，以最大成交量撮合收盘价。</td></tr></tbody></table><hr><h2 id="3-其他规则"><a href="#3-其他规则" class="headerlink" title="3. 其他规则"></a><strong>3. 其他规则</strong></h2><ul><li><strong>科创板（688开头） &amp; 创业板（300开头）</strong>：  <ul><li>新增<strong>盘后固定价格交易</strong>（15:05-15:30），按当日收盘价成交（需手动挂单）。</li></ul></li><li><strong>大宗交易</strong>：  <ul><li>通常为15:00-15:30，需满足最低交易数量或金额门槛。</li></ul></li></ul><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a><strong>注意事项</strong></h2><ul><li><strong>非交易时段</strong>（如夜间）的委托单会被暂存，次日9:15进入系统。</li><li><strong>集合竞价</strong>的成交价格遵循“最大成交量”原则，所有交易按同一价格成交。</li></ul><h2 id="QMT中的函数判断"><a href="#QMT中的函数判断" class="headerlink" title="QMT中的函数判断"></a>QMT中的函数判断</h2><p>以下是一个 Python 函数，用于判断当前时间属于 A 股的哪个交易时段（包括科创板和创业板的盘后交易），如果不是交易时段则返回 <strong>“非交易时段”</strong>：  </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_a_share_trading_period</span>():</span><br><span class="line">    now = datetime.datetime.now()</span><br><span class="line">    current_time = now.time()</span><br><span class="line">    weekday = now.weekday()  <span class="comment"># 0-4 是周一到周五</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 检查是否为交易日（周一至周五，非节假日）</span></span><br><span class="line">    <span class="keyword">if</span> weekday &gt;= <span class="number">5</span>:  <span class="comment"># 周六、周日</span></span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;非交易时段（周末休市）&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 定义交易时段</span></span><br><span class="line">    trading_periods = [</span><br><span class="line">        &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;开盘集合竞价&quot;</span>, <span class="string">&quot;start&quot;</span>: <span class="string">&quot;09:15:00&quot;</span>, <span class="string">&quot;end&quot;</span>: <span class="string">&quot;09:25:00&quot;</span>, <span class="string">&quot;can_cancel&quot;</span>: <span class="literal">True</span>&#125;,</span><br><span class="line">        &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;早盘连续竞价&quot;</span>, <span class="string">&quot;start&quot;</span>: <span class="string">&quot;09:30:00&quot;</span>, <span class="string">&quot;end&quot;</span>: <span class="string">&quot;11:30:00&quot;</span>, <span class="string">&quot;can_cancel&quot;</span>: <span class="literal">True</span>&#125;,</span><br><span class="line">        &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;午间休市&quot;</span>, <span class="string">&quot;start&quot;</span>: <span class="string">&quot;11:30:00&quot;</span>, <span class="string">&quot;end&quot;</span>: <span class="string">&quot;13:00:00&quot;</span>, <span class="string">&quot;can_cancel&quot;</span>: <span class="literal">False</span>&#125;,</span><br><span class="line">        &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;午盘连续竞价&quot;</span>, <span class="string">&quot;start&quot;</span>: <span class="string">&quot;13:00:00&quot;</span>, <span class="string">&quot;end&quot;</span>: <span class="string">&quot;14:57:00&quot;</span>, <span class="string">&quot;can_cancel&quot;</span>: <span class="literal">True</span>&#125;,</span><br><span class="line">        &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;收盘集合竞价&quot;</span>, <span class="string">&quot;start&quot;</span>: <span class="string">&quot;14:57:00&quot;</span>, <span class="string">&quot;end&quot;</span>: <span class="string">&quot;15:00:00&quot;</span>, <span class="string">&quot;can_cancel&quot;</span>: <span class="literal">False</span>&#125;,</span><br><span class="line">    ]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 科创板和创业板的盘后交易（15:05-15:30）</span></span><br><span class="line">    kechuang_cyb_period = &#123;<span class="string">&quot;name&quot;</span>: <span class="string">&quot;科创/创业板盘后交易&quot;</span>, <span class="string">&quot;start&quot;</span>: <span class="string">&quot;15:05:00&quot;</span>, <span class="string">&quot;end&quot;</span>: <span class="string">&quot;15:30:00&quot;</span>, <span class="string">&quot;can_cancel&quot;</span>: <span class="literal">False</span>&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 检查当前是否在交易时段</span></span><br><span class="line">    <span class="keyword">for</span> period <span class="keyword">in</span> trading_periods:</span><br><span class="line">        start_time = datetime.datetime.strptime(period[<span class="string">&quot;start&quot;</span>], <span class="string">&quot;%H:%M:%S&quot;</span>).time()</span><br><span class="line">        end_time = datetime.datetime.strptime(period[<span class="string">&quot;end&quot;</span>], <span class="string">&quot;%H:%M:%S&quot;</span>).time()</span><br><span class="line">        <span class="keyword">if</span> start_time &lt;= current_time &lt;= end_time:</span><br><span class="line">            <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;period[<span class="string">&#x27;name&#x27;</span>]&#125;</span>（可撤单: <span class="subst">&#123;<span class="string">&#x27;是&#x27;</span> <span class="keyword">if</span> period[<span class="string">&#x27;can_cancel&#x27;</span>] <span class="keyword">else</span> <span class="string">&#x27;否&#x27;</span>&#125;</span>）&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 检查是否在科创/创业板盘后交易时段</span></span><br><span class="line">    kechuang_start = datetime.datetime.strptime(kechuang_cyb_period[<span class="string">&quot;start&quot;</span>], <span class="string">&quot;%H:%M:%S&quot;</span>).time()</span><br><span class="line">    kechuang_end = datetime.datetime.strptime(kechuang_cyb_period[<span class="string">&quot;end&quot;</span>], <span class="string">&quot;%H:%M:%S&quot;</span>).time()</span><br><span class="line">    <span class="keyword">if</span> kechuang_start &lt;= current_time &lt;= kechuang_end:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;kechuang_cyb_period[<span class="string">&#x27;name&#x27;</span>]&#125;</span>（按收盘价交易，不可撤单）&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 不在任何交易时段</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;非交易时段&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试</span></span><br><span class="line"><span class="built_in">print</span>(get_a_share_trading_period())</span><br></pre></td></tr></table></figure><h3 id="输出示例"><a href="#输出示例" class="headerlink" title="输出示例"></a><strong>输出示例</strong></h3><ul><li>如果当前时间是 <strong>09:20:00</strong>，返回：<br><code>开盘集合竞价（可撤单: 是）</code>  </li><li>如果当前时间是 <strong>12:30:00</strong>，返回：<br><code>午间休市（可撤单: 否）</code>  </li><li>如果当前时间是 <strong>15:15:00</strong>，返回：<br><code>科创/创业板盘后交易（按收盘价交易，不可撤单）</code>  </li><li>如果当前时间是 <strong>16:00:00</strong> 或周末，返回：<br><code>非交易时段</code></li></ul><h3 id="功能说明"><a href="#功能说明" class="headerlink" title="功能说明"></a><strong>功能说明</strong></h3><ol><li><strong>判断交易日</strong>：仅周一到周五有效，周末返回非交易时段。  </li><li><strong>标准交易时段</strong>：包括集合竞价、连续竞价和收盘竞价。  </li><li><strong>科创&#x2F;创业板盘后交易</strong>：15:05-15:30 额外判断。  </li><li><strong>撤单规则</strong>：集合竞价部分时段不可撤单（如 9:20-9:25）。</li></ol><p>如果需要进一步扩展（如节假日判断），当天是不是交易日，请阅读我们提供的另外一个讯投qmt使用小技巧： 如何判断今天是不是交易日 <a href="../qmt-is-today-a-trading-day">开始阅读</a>。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;A股的交易时间段&quot;&gt;&lt;a href=&quot;#A股的交易时间段&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="交易时段" scheme="https://invest.wtsolutions.cn/tags/%E4%BA%A4%E6%98%93%E6%97%B6%E6%AE%B5/"/>
    
  </entry>
  
  <entry>
    <title>讯投 QMT 使用小技巧 -如何判断今天是不是交易日</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-is-today-a-trading-day/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-is-today-a-trading-day/</id>
    <published>2025-04-02T14:26:06.000Z</published>
    <updated>2026-08-12T01:48:29.887Z</updated>
    
    <content type="html"><![CDATA[<p>在讯投QMT中判断今天是否为交易日</p><p>在讯投QMT平台中，你可以通过以下几种方法来判断当天是否为交易日：</p><h2 id="方法一：使用ContextInfo-get-trading-dates-函数"><a href="#方法一：使用ContextInfo-get-trading-dates-函数" class="headerlink" title="方法一：使用ContextInfo.get_trading_dates()函数"></a>方法一：使用ContextInfo.get_trading_dates()函数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">is_trading_day</span>():</span><br><span class="line">    <span class="comment"># 获取最近一段时间的交易日历</span></span><br><span class="line">    trading_dates = ContextInfo.get_trading_dates(<span class="string">&#x27;SH&#x27;</span>, <span class="number">0</span>, <span class="number">10</span>)  <span class="comment"># 获取从今天开始的10个交易日</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 获取当前日期</span></span><br><span class="line">    today = datetime.datetime.now().strftime(<span class="string">&#x27;%Y%m%d&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 判断今天是否在交易日列表中</span></span><br><span class="line">    <span class="keyword">return</span> today <span class="keyword">in</span> trading_dates</span><br></pre></td></tr></table></figure><h2 id="方法二：使用xtdata模块（如果可用）"><a href="#方法二：使用xtdata模块（如果可用）" class="headerlink" title="方法二：使用xtdata模块（如果可用）"></a>方法二：使用xtdata模块（如果可用）</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> xtdata</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_trading_day</span>():</span><br><span class="line">    <span class="comment"># 获取今天的日期</span></span><br><span class="line">    today = datetime.datetime.now().strftime(<span class="string">&#x27;%Y%m%d&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 查询上证指数的交易日历</span></span><br><span class="line">    trading_dates = xtdata.get_trading_dates(<span class="string">&#x27;SH&#x27;</span>, today, today)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">len</span>(trading_dates) &gt; <span class="number">0</span></span><br></pre></td></tr></table></figure><h2 id="方法三：使用系统时间函数"><a href="#方法三：使用系统时间函数" class="headerlink" title="方法三：使用系统时间函数"></a>方法三：使用系统时间函数</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">is_trading_day</span>():</span><br><span class="line">    <span class="comment"># 获取当前时间</span></span><br><span class="line">    now = datetime.datetime.now()</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 判断是否为工作日(周一到周五)</span></span><br><span class="line">    <span class="keyword">if</span> now.weekday() &gt;= <span class="number">5</span>:  <span class="comment"># 5=周六,6=周日</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 进一步检查是否是节假日(需要维护节假日表)</span></span><br><span class="line">    <span class="comment"># 这里可以添加你的节假日判断逻辑</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li>第一种方法是最可靠的，因为它直接从交易所获取交易日历</li><li>节假日需要特别处理，中国的节假日调休会导致非周末的工作日也可能不是交易日</li><li>建议在开盘前运行检查，因为有些函数在非交易时间可能返回不同结果</li><li>以上代码仅供参考，大家需要根据自己的实际情况判断这些代码是否满足自己的要求。</li></ol><p>你可以根据你的QMT版本和可用模块选择最适合的方法。第一种方法通常是首选，因为它直接查询交易所的交易日历。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;在讯投QMT中判断今天是否为交易日&lt;/p&gt;
&lt;p&gt;在讯投QMT平台中，你可以通过以下几种方法来判断当天是否为交易日：&lt;/p&gt;
&lt;h2 id=&quot;方法一：使用ContextInfo-get-trading-dates-函数&quot;&gt;&lt;a</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="交易日" scheme="https://invest.wtsolutions.cn/tags/%E4%BA%A4%E6%98%93%E6%97%A5/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT交易终端小技巧-为什么每天早晨QMT会退出登录/重新启动/自动初始化</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-restart-initialize/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-restart-initialize/</id>
    <published>2025-04-01T14:26:06.000Z</published>
    <updated>2026-08-12T01:49:17.816Z</updated>
    
    <content type="html"><![CDATA[<p>如果您的迅投QMT或者是券商QMT的交易终端，每天早晨8点9点会自动退出登录、自动重新启动或者自动初始化，通常是因为在<strong>系统设置</strong>里面，设置了在指定的时间自动初始化，如下图中的系统设置配置。</p><p><img src="/images/qmt_restart_settting.jpeg" alt="QMT系统设置界面-自动初始化设置"></p><p>如果我们不希望它自动初始化，就可以取消勾选这个选项。但，应确保在每个策略内，策略代码会把一些策略内的变量之类的，要每天初始化，以免当天交易的时候，还使用了上一个交易日的一些变量的数据。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;如果您的迅投QMT或者是券商QMT的交易终端，每天早晨8点9点会自动退出登录、自动重新启动或者自动初始化，通常是因为在&lt;strong&gt;系统设置&lt;/strong&gt;里面，设置了在指定的时间自动初始化，如下图中的系统设置配置。&lt;/p&gt;
&lt;p&gt;&lt;img</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
    <category term="初始化" scheme="https://invest.wtsolutions.cn/tags/%E5%88%9D%E5%A7%8B%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>如何低成本选择讯投QMT 的服务器/电脑，低成本运行？</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-low-cost-ops/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-low-cost-ops/</id>
    <published>2025-03-27T14:26:06.000Z</published>
    <updated>2026-08-12T01:48:55.051Z</updated>
    
    <content type="html"><![CDATA[<p>今天分享下，我目前使用的讯投QMT的情况，是通过某券商开通的QMT的函数交易权限，基本没有什么门槛，大家都可以开，能交易大A的股票和可转债。ETF期权的开通，门槛比较高，且审核也比较繁琐，所以没有开。</p><p>在讯投QMT上同时有四个策略在同时运行，使用的是大QMT，也就是原装的QMT，不是极简版的。对于交易产品行情的获取，关注的数量一般在几十只预先选定的产品，不会全市场的实时扫全场的数据。交易的频率应该在几分钟甚至更长时间，也只是简单的采用一些TALIB带的一些指标分析的函数，所以对硬件的要求并不高。</p><p>最开始我使用的是我自己的笔记本电脑，也用过一段时间的云服务器，最后还是选择了一台小主机独立的去运行QMT。</p><p>最开始用自己的笔记本电脑的时候，和我日常使用笔记本电脑感觉有冲突，QMT会弹出提醒，对我在电脑上干别的有影响。另外，还会担心在笔记本上使用比较消耗性能、网速的程序的时候，会影响到QMT。还有就是，笔记本电脑开的时间长了，风扇会一直转，比较烦，就放弃了在笔记本上使用的想法。</p><p>后来选了云服务器，趁着某大厂的云服务器迎新大折扣的时候买了一年，其实感觉整体还是挺不错的。系统选的是 win server 版本，自己安装了QMT和我自己需要的数据库，就这样跑了差不多一年。云数据库比较好的点是因为有人管理，所以会不用担心断电、断网这些事情，但不好的点是策略是放在别人家的机器上的，也不知道安不安全。后来一年快到期的时候，续费的时候价格翻了好多倍，羊毛不让薅了，就没有续费了。</p><p>找了自己家里面的之前买的 mini 主机，买的时候我记得是 800 多，国产品牌，升级到了 win11，配置了配置就放到一个角落里面，让他 24 小时自己运行了，没有连接显示器，只插了一根网线，把声卡、用不到的USB口什么的禁用了，功率比较低在六～七瓦，一个月电费几块钱。只是六日的时候，会关机让他休息，平时就一直开着。这样也用了一年了吧，没出过什么问题，家里的电源和网络也是非常的稳定。其实主要还是因为是新手，策略下的交易量没有那么大，不是分分钟几万的那种，所以硬件上就没有那么好。我看他们专职做量化的，硬件配置相当的高，甚至还有UPS不间断电源，网速也要最快的那种。</p><p>以上，是我作为一个小散，新手，非专业量化从业者的给QMT配硬件的思路，觉得适合的人可以参考，不适合的也根据自己的情况去配置。毕竟大家的策略不同，交易量不同，票票的大小不同，对硬件的要求会有很大的区别。我这个分享呢，可能更适合那些刚开始做程序化交易的朋友。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;今天分享下，我目前使用的讯投QMT的情况，是通过某券商开通的QMT的函数交易权限，基本没有什么门槛，大家都可以开，能交易大A的股票和可转债。ETF期权的开通，门槛比较高，且审核也比较繁琐，所以没有开。&lt;/p&gt;
&lt;p&gt;在讯投QMT上同时有四个策略在同时运行，使用的是大QMT，</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="讯投" scheme="https://invest.wtsolutions.cn/tags/%E8%AE%AF%E6%8A%95/"/>
    
    <category term="服务器" scheme="https://invest.wtsolutions.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT交易系统 延迟 委托/成交/持仓/账号信息延迟 get_trade_detail_data延迟</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-server-delay/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-server-delay/</id>
    <published>2025-02-25T14:26:06.000Z</published>
    <updated>2026-08-12T01:49:30.434Z</updated>
    
    <content type="html"><![CDATA[<p>很多朋友问过我，为什么感觉迅投的QMT有延迟：</p><ol><li>委托order数据延迟，order_callback() </li><li>成交deal数据延迟, deal_callback()</li><li>持仓position数据延迟, position_callback()</li><li>账号account数据延迟,  account_callback()</li></ol><h2 id="第一类原因："><a href="#第一类原因：" class="headerlink" title="第一类原因："></a>第一类原因：</h2><p><strong>官方给的提示如下：</strong></p><blockquote><p>委托&#x2F;成交&#x2F;持仓&#x2F;账号信息的更新, 是在客户端后台进行的, python策略中无法手动控制。</p></blockquote><p><strong>解释如下：</strong><br>python提供的取账号信息接口 get_trade_detail_data， 与四种交易回调函数（order_callback, deal_callback, position_callback等等）, 都是从客户端本地缓存中读取数据 &#x2F; 触发调用，不是调用时查询柜台再返回。</p><p>客户端本地缓存状态定期接收柜台推送刷新，有交易主推的柜台50ms一次，没有交易主推的柜台1-6秒一次。 </p><p>不能认为get_trade_detail_data查到的状态是与柜台完全一致的, 比如卖出委托后立刻查询, 不会查到对应委托, 可用资金也不会变多。</p><p>实盘策略需要设计盘中保存&#x2F;更新委托状态的机制。常见的做法是用全局变量字典保存委托状态, 给每一笔委托独立的投资备注作为字典的key，委托状态作为字典的value, 下单后默认设置为待报, 之后查到委托后更新状态。如果某品种股票存在待报状态委托, 暂停该品种后续报单, 防止发生超单的情况。(实现可以参考实盘示例7-调整至目标持仓Demo)</p><p><strong>简单来说：</strong><br>不同的券商下的QMT交易系统推送频率不同。从券商向你的QMT软件，有的券商50ms推送一次交易信息，有的是1-6秒才会推送一次信息。也就是说，你如果感觉到延迟，需要问你的券商，问他们所给你提供的QMT交易系统，是多久推送一次。如果是1-6秒，你肯定会感觉有延迟的。</p><p>推送之后，你的QMT软件，才会知道最新的信息，然后相应的给你各种callback。当然你自己使用get_trade_detail_data也是从你本地的QMT软件获取的信息，无法直接从券商那边直接获取信息，只能等券商那边给你的QMT软件推送最新的信息之后，你才能get到最新信息。</p><h2 id="第二类原因"><a href="#第二类原因" class="headerlink" title="第二类原因"></a>第二类原因</h2><p>就是你自己要在QMT软件右下角那块看行情&#x2F;交易连接的延迟，正常是ms级的延迟，如果你在连接行情&#x2F;交易服务器处就有很大的延迟，就可能是因为你的宽带连接质量不高，或者网速比较慢等原因。可以通过换成手机热点、换宽带等等各种方式排查一下，看看是不是用了其他的网络就能变好。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;很多朋友问过我，为什么感觉迅投的QMT有延迟：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;委托order数据延迟，order_callback() &lt;/li&gt;
&lt;li&gt;成交deal数据延迟, deal_callback()&lt;/li&gt;
&lt;li&gt;持仓position数据延迟,</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
    <category term="服务器" scheme="https://invest.wtsolutions.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT自带策略-双均线实盘示例PY策略-解读</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-strategy-mean-lines/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-strategy-mean-lines/</id>
    <published>2025-02-19T14:26:06.000Z</published>
    <updated>2026-08-12T01:50:15.219Z</updated>
    
    <content type="html"><![CDATA[<h2 id="首先po一下迅投QMT自带的策略，如下："><a href="#首先po一下迅投QMT自带的策略，如下：" class="headerlink" title="首先po一下迅投QMT自带的策略，如下："></a>首先po一下迅投QMT自带的策略，如下：</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment">#encoding:gbk</span></span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"> </span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">示例说明：双均线实盘策略，通过计算快慢双均线，在金叉时买入，死叉时做卖出</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">class</span> <span class="title class_">a</span>():</span><br><span class="line"><span class="keyword">pass</span></span><br><span class="line">A = a() <span class="comment">#创建空的类的实例 用来保存委托状态 </span></span><br><span class="line"><span class="comment">#ContextInfo对象在盘中每次handlebar调用前都会被深拷贝, 如果调用handlebar的分笔不是k线最后分笔 ContextInfo会被回退到深拷贝的内容 所以ContextInfo不能用来记录快速交易的信号</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">init</span>(<span class="params">C</span>):</span><br><span class="line">A.stock= C.stockcode + <span class="string">&#x27;.&#x27;</span> + C.market <span class="comment">#品种为模型交易界面选择品种</span></span><br><span class="line">A.acct= account <span class="comment">#账号为模型交易界面选择账号</span></span><br><span class="line">A.acct_type= accountType <span class="comment">#账号类型为模型交易界面选择账号</span></span><br><span class="line">A.amount = <span class="number">10000</span> <span class="comment">#单笔买入金额 触发买入信号后买入指定金额</span></span><br><span class="line">A.line1=<span class="number">17</span>   <span class="comment">#快线周期</span></span><br><span class="line">A.line2=<span class="number">27</span>   <span class="comment">#慢线周期</span></span><br><span class="line">A.waiting_list = [] <span class="comment">#未查到委托列表 存在未查到委托情况暂停后续报单 防止超单</span></span><br><span class="line">A.buy_code = <span class="number">23</span> <span class="keyword">if</span> A.acct_type == <span class="string">&#x27;STOCK&#x27;</span> <span class="keyword">else</span> <span class="number">33</span> <span class="comment">#买卖代码 区分股票 与 两融账号</span></span><br><span class="line">A.sell_code = <span class="number">24</span> <span class="keyword">if</span> A.acct_type == <span class="string">&#x27;STOCK&#x27;</span> <span class="keyword">else</span> <span class="number">34</span></span><br><span class="line"><span class="comment">#设置股票池 订阅品种行情</span></span><br><span class="line">C.set_universe([A.stock])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&#x27;双均线实盘示例<span class="subst">&#123;A.stock&#125;</span> <span class="subst">&#123;A.acct&#125;</span> <span class="subst">&#123;A.acct_type&#125;</span> 单笔买入金额<span class="subst">&#123;A.amount&#125;</span>&#x27;</span>)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handlebar</span>(<span class="params">C</span>):</span><br><span class="line"><span class="comment">#跳过历史k线</span></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> C.is_last_bar():</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">now = datetime.datetime.now()</span><br><span class="line">now_time = now.strftime(<span class="string">&#x27;%H%M%S&#x27;</span>)</span><br><span class="line"><span class="comment">#跳过非交易时间</span></span><br><span class="line"><span class="keyword">if</span> now_time &lt; <span class="string">&#x27;093000&#x27;</span> <span class="keyword">or</span> now_time &gt; <span class="string">&quot;150000&quot;</span>:</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">account = get_trade_detail_data(A.acct, A.acct_type, <span class="string">&#x27;account&#x27;</span>)</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(account)==<span class="number">0</span>:</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&#x27;账号<span class="subst">&#123;A.acct&#125;</span> 未登录 请检查&#x27;</span>)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">account = account[<span class="number">0</span>]</span><br><span class="line">available_cash = <span class="built_in">int</span>(account.m_dAvailable)</span><br><span class="line"><span class="comment">#如果有未查到委托 查询委托</span></span><br><span class="line"><span class="keyword">if</span> A.waiting_list:</span><br><span class="line">found_list = []</span><br><span class="line">orders = get_trade_detail_data(A.acct, A.acct_type, <span class="string">&#x27;order&#x27;</span>)</span><br><span class="line"><span class="keyword">for</span> order <span class="keyword">in</span> orders:</span><br><span class="line"><span class="keyword">if</span> order.m_strRemark <span class="keyword">in</span> A.waiting_list:</span><br><span class="line">found_list.append(order.m_strRemark)</span><br><span class="line">A.waiting_list = [i <span class="keyword">for</span> i <span class="keyword">in</span> A.waiting_list <span class="keyword">if</span> i <span class="keyword">not</span> <span class="keyword">in</span> found_list]</span><br><span class="line"><span class="keyword">if</span> A.waiting_list:</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;当前有未查到委托 <span class="subst">&#123;A.waiting_list&#125;</span> 暂停后续报单&quot;</span>)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">holdings = get_trade_detail_data(A.acct, A.acct_type, <span class="string">&#x27;position&#x27;</span>)</span><br><span class="line">holdings = &#123;i.m_strInstrumentID + <span class="string">&#x27;.&#x27;</span> + i.m_strExchangeID : i.m_nCanUseVolume <span class="keyword">for</span> i <span class="keyword">in</span> holdings&#125;</span><br><span class="line"><span class="comment">#获取行情数据</span></span><br><span class="line">data = C.get_history_data(<span class="built_in">max</span>(A.line1, A.line2)+<span class="number">1</span>, <span class="string">&#x27;1d&#x27;</span>, <span class="string">&#x27;close&#x27;</span>,dividend_type=<span class="string">&#x27;front_ratio&#x27;</span>)</span><br><span class="line">close_list = data[A.stock]</span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(close_list) &lt; <span class="built_in">max</span>(A.line1, A.line2)+<span class="number">1</span>:</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;行情长度不足(新上市或最近有停牌) 跳过运行&#x27;</span>)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">pre_line1 = np.mean(close_list[-A.line1-<span class="number">1</span>: -<span class="number">1</span>])</span><br><span class="line">pre_line2 = np.mean(close_list[-A.line2-<span class="number">1</span>: -<span class="number">1</span>])</span><br><span class="line">current_line1 = np.mean(close_list[-A.line1:])</span><br><span class="line">current_line2 = np.mean(close_list[-A.line2:])</span><br><span class="line"><span class="comment">#如果快线穿过慢线,则买入委托 当前无持仓 买入</span></span><br><span class="line">vol = <span class="built_in">int</span>(A.amount / close_list[-<span class="number">1</span>] / <span class="number">100</span>) * <span class="number">100</span> <span class="comment">#买入数量 向下取整到100的整数倍</span></span><br><span class="line"><span class="keyword">if</span> A.amount &lt; available_cash <span class="keyword">and</span> vol &gt;= <span class="number">100</span> <span class="keyword">and</span> A.stock <span class="keyword">not</span> <span class="keyword">in</span> holdings <span class="keyword">and</span> pre_line1 &lt; pre_line2 <span class="keyword">and</span> current_line1 &gt; current_line2:</span><br><span class="line"><span class="comment">#下单开仓 ，参数说明可搜索PY交易函数 passorder</span></span><br><span class="line">msg = <span class="string">f&quot;双均线实盘 <span class="subst">&#123;A.stock&#125;</span> 上穿均线 买入 <span class="subst">&#123;vol&#125;</span>股&quot;</span></span><br><span class="line">passorder(A.buy_code, <span class="number">1101</span>, A.acct, A.stock, <span class="number">14</span>, -<span class="number">1</span>, vol, <span class="string">&#x27;双均线实盘&#x27;</span>, <span class="number">1</span> , msg, C)</span><br><span class="line"><span class="built_in">print</span>(msg)</span><br><span class="line">A.waiting_list.append(msg)</span><br><span class="line"><span class="comment">#如果快线下穿慢线,则卖出委托</span></span><br><span class="line"><span class="keyword">if</span> A.stock <span class="keyword">in</span> holdings <span class="keyword">and</span> holdings[A.stock] &gt; <span class="number">0</span> <span class="keyword">and</span> pre_line1 &gt; pre_line2 <span class="keyword">and</span> current_line1 &lt; current_line2:</span><br><span class="line">msg = <span class="string">f&quot;双均线实盘 <span class="subst">&#123;A.stock&#125;</span> 下穿均线 卖出 <span class="subst">&#123;holdings[A.stock]&#125;</span>股&quot;</span></span><br><span class="line">passorder(A.sell_code, <span class="number">1101</span>, A.acct, A.stock, <span class="number">14</span>, -<span class="number">1</span>, holdings[A.stock], <span class="string">&#x27;双均线实盘&#x27;</span>, <span class="number">1</span> , msg, C)</span><br><span class="line"><span class="built_in">print</span>(msg)</span><br><span class="line">A.waiting_list.append(msg)</span><br></pre></td></tr></table></figure><h2 id="解读如下："><a href="#解读如下：" class="headerlink" title="解读如下："></a>解读如下：</h2><p>这个代码实现了一个基于双均线策略的量化交易系统。以下是代码的主要功能：</p><h3 id="1-策略概述"><a href="#1-策略概述" class="headerlink" title="1. 策略概述"></a>1. 策略概述</h3><p>双均线策略：该策略通过计算两个不同周期的移动平均线（快线和慢线），在快线从下方穿过慢线时（金叉）买入，在快线从上方穿过慢线时（死叉）卖出。</p><p>交易品种：代码中交易的品种是用户在模型交易界面选择的股票或融资融券品种。</p><p>交易账号：使用用户在模型交易界面选择的账号进行交易。</p><h3 id="2-代码结构"><a href="#2-代码结构" class="headerlink" title="2. 代码结构"></a>2. 代码结构</h3><p>init(C) 函数：初始化函数，设置交易品种、账号、交易金额、快慢线周期等参数，并订阅品种的行情数据。</p><p>handlebar(C) 函数：处理每个K线的函数，根据当前的市场行情和持仓情况，判断是否触发买入或卖出信号，并执行相应的交易操作。</p><h3 id="3-主要功能"><a href="#3-主要功能" class="headerlink" title="3. 主要功能"></a>3. 主要功能</h3><p>初始化：</p><p>设置交易品种、账号、交易金额、快慢线周期等参数。</p><p>订阅品种的行情数据。</p><p>行情数据处理：</p><p>获取历史收盘价数据，计算快线和慢线的移动平均值。</p><p>判断是否满足买入或卖出的条件。</p><p>交易执行：</p><p>买入条件：当快线从下方穿过慢线（金叉），且当前没有持仓时，执行买入操作。</p><p>卖出条件：当快线从上方穿过慢线（死叉），且当前有持仓时，执行卖出操作。</p><p>委托管理：</p><p>通过 A.waiting_list 管理未查到的委托，防止重复下单。</p><p>在每次交易后，将委托信息添加到 A.waiting_list 中，并在查询到委托后从列表中移除。</p><h3 id="4-交易逻辑"><a href="#4-交易逻辑" class="headerlink" title="4. 交易逻辑"></a>4. 交易逻辑</h3><p>买入逻辑：</p><p>检查账户可用资金是否足够。</p><p>计算买入数量（向下取整到100的整数倍）。</p><p>如果满足买入条件，执行买入操作，并记录委托信息。</p><p>卖出逻辑：</p><p>检查当前是否有持仓。</p><p>如果满足卖出条件，执行卖出操作，并记录委托信息。</p><h3 id="5-其他功能"><a href="#5-其他功能" class="headerlink" title="5. 其他功能"></a>5. 其他功能</h3><p>时间过滤：只在交易时间段（09:30:00 到 15:00:00）内执行交易逻辑。</p><p>历史K线过滤：跳过非最新的K线，只在最新的K线上执行交易逻辑。</p><p>委托查询：在每次交易前，查询是否有未查到的委托，防止重复下单。</p><h3 id="6-输出信息"><a href="#6-输出信息" class="headerlink" title="6. 输出信息"></a>6. 输出信息</h3><p>在初始化时，输出策略的基本信息（如交易品种、账号、交易金额等）。</p><p>在每次交易时，输出交易信息（如买入或卖出的股票数量、价格等）。</p><h3 id="7-依赖库"><a href="#7-依赖库" class="headerlink" title="7. 依赖库"></a>7. 依赖库</h3><p>pandas：用于数据处理。</p><p>numpy：用于计算移动平均线。</p><p>datetime：用于处理时间相关的操作。</p><p>总结<br>这个代码实现了一个基于双均线策略的量化交易系统，通过计算快慢均线的交叉点来判断买入和卖出的时机，并在满足条件时执行相应的交易操作。代码中还包含了委托管理、时间过滤、历史K线过滤等功能，以确保交易的准确性和安全性。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;首先po一下迅投QMT自带的策略，如下：&quot;&gt;&lt;a href=&quot;#首先po一下迅投QMT自带的策略，如下：&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
    <category term="策略" scheme="https://invest.wtsolutions.cn/tags/%E7%AD%96%E7%95%A5/"/>
    
    <category term="双均线" scheme="https://invest.wtsolutions.cn/tags/%E5%8F%8C%E5%9D%87%E7%BA%BF/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT量化交易系统-国债逆回购-闲钱理财</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-debt-reverse-repurchase/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-debt-reverse-repurchase/</id>
    <published>2025-02-12T15:26:06.000Z</published>
    <updated>2026-08-12T01:47:43.960Z</updated>
    
    <content type="html"><![CDATA[<h2 id="国债逆回购"><a href="#国债逆回购" class="headerlink" title="国债逆回购"></a>国债逆回购</h2><p>资金账户里面的闲钱，有时候我们希望可以购买国债逆回购。在QMT里面，我们可以通过代码定时实现国债逆回购。</p><h2 id="国债逆回购的代码"><a href="#国债逆回购的代码" class="headerlink" title="国债逆回购的代码"></a>国债逆回购的代码</h2><p>代码仅供参考，不构成投资建议，请谨慎操作。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">account = <span class="string">&#x27;xxxxx&#x27;</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">DRR</span>(<span class="params">ContextInfo</span>):</span><br><span class="line">afund = get_trade_detail_data(account,<span class="string">&#x27;stock&#x27;</span>,<span class="string">&#x27;account&#x27;</span>)[<span class="number">0</span>].m_dAvailable</span><br><span class="line">avolume = <span class="built_in">int</span>((afund )/<span class="number">1000</span>)*<span class="number">10</span></span><br><span class="line"><span class="keyword">if</span> avolume &gt;= <span class="number">10</span>:</span><br><span class="line">passorder(<span class="number">24</span>,<span class="number">1101</span>,account,<span class="string">&#x27;204001.SH&#x27;</span>,<span class="number">14</span>,-<span class="number">1</span>,avolume,<span class="string">&#x27;DRR&#x27;</span>,<span class="number">2</span>,<span class="string">&#x27;DRR&#x27;</span>,ContextInfo)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;DRR &#x27;</span> + <span class="built_in">str</span>(avolume) )</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&#x27;DRR skipped&#x27;</span>)</span><br></pre></td></tr></table></figure><p>如上定义了个DRR函数，通过定时函数，在盘中的14:57分运行。</p><p>2025.05.26更新：</p><p>这段代码中，使用的是对手价下单的，如果想要使用限价等其他形式，需要相应修改。<br>当采用对手价下单的时候，如果金额不多，通常在几万元的话，是可以立即成交的，如果金额多的话，考虑换其他下单类型。</p><p>本文更新于2025年5月26日</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;国债逆回购&quot;&gt;&lt;a href=&quot;#国债逆回购&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="量化策略" scheme="https://invest.wtsolutions.cn/tags/%E9%87%8F%E5%8C%96%E7%AD%96%E7%95%A5/"/>
    
    <category term="国债逆回购" scheme="https://invest.wtsolutions.cn/tags/%E5%9B%BD%E5%80%BA%E9%80%86%E5%9B%9E%E8%B4%AD/"/>
    
    <category term="闲钱理财" scheme="https://invest.wtsolutions.cn/tags/%E9%97%B2%E9%92%B1%E7%90%86%E8%B4%A2/"/>
    
  </entry>
  
  <entry>
    <title>迅投QMT量化交易系统服务器连接 中断与再连接</title>
    <link href="https://invest.wtsolutions.cn/posts/qmt-server-connection/"/>
    <id>https://invest.wtsolutions.cn/posts/qmt-server-connection/</id>
    <published>2025-02-11T14:26:06.000Z</published>
    <updated>2026-08-12T01:49:25.385Z</updated>
    
    <content type="html"><![CDATA[<h2 id="行情和交易服务器的中断和再连接"><a href="#行情和交易服务器的中断和再连接" class="headerlink" title="行情和交易服务器的中断和再连接"></a>行情和交易服务器的中断和再连接</h2><p>在QMT程序化交易系统的右下角，能看到两个标签【行情】【交易】，如果是绿色的，则代表行情和交易服务器是连接正常的，如果变成了红色，则代表那个服务器连接中断了。<br>如果是红色的，则需要用鼠标点击红色部分，会弹出一个服务器的选择窗口，你需要手动的进行相应的切换，直到右下角的标签变成了绿色的。</p><h2 id="服务器再连接"><a href="#服务器再连接" class="headerlink" title="服务器再连接"></a>服务器再连接</h2><p>需要注意的是，有的券商的再连接发生时，当前的所有的交易数据，券商会完全再给你推送一次，所有的成交回报，所有的下单回报等等，大家一定要特别注意，不能相信券商给你推送的交易回报, 它可能是重复发送的（如deal_callback等等）。这个问题在我之前的新手指南的帖子里面已经讲解了解决办法。大家可以通过本文章顶端的博客专栏连接，进入我的专栏，查看其他的QMT相关的文章。</p><h2 id="服务器中断的识别"><a href="#服务器中断的识别" class="headerlink" title="服务器中断的识别"></a>服务器中断的识别</h2><p>很多时候，我们的QMT程序化交易系统是24小时运行的，那么我们其实希望能够识别到当前【行情】【交易】服务器连接是否正常。我自己所采用的方法比较简单，就是设置一个定时函数，在盘前的一个时间去通过获取行情来判断是否存在服务器中断。如果判断中断了，则给我发送一个消息。当然如果我在设定的时间完全没有收到任何消息的话，则说明整个QMT程序存在不正常运行的状况，需要人工干预。</p><p>我使用的方法非常简单，就是在9点15运行如下代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">DailySettings</span>(<span class="params">ContextInfo</span>):</span><br><span class="line"><span class="keyword">if</span> getLastClose(<span class="string">&#x27;510300.SH&#x27;</span>,ContextInfo) != <span class="literal">False</span>:</span><br><span class="line">sendMsg(<span class="string">&quot;morning&quot;</span>)</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getLastClose</span>(<span class="params">stock, ContextInfo</span>):</span><br><span class="line">stockList = [stock]</span><br><span class="line">tick = ContextInfo.get_full_tick(stock_code = stockList)</span><br><span class="line"><span class="keyword">if</span> stock <span class="keyword">in</span> tick:</span><br><span class="line"><span class="keyword">if</span> <span class="string">&quot;lastClose&quot;</span> <span class="keyword">in</span> tick[stock]:</span><br><span class="line"><span class="keyword">return</span> tick[stock][<span class="string">&quot;lastClose&quot;</span>]</span><br><span class="line">sendMsg(<span class="string">&quot;行情数据可能存在问题&quot;</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>如果我收到了morning，则通常QMT行情服务器连接正常。<br>sendMsg函数，大家可以自定义，比如发送短信，发送邮件，发送飞书消息，自己能接收到就行。想直接推送到微信的，参考 <a href="../qmt-wechat-notification">策略消息推送到微信的几种方案</a>。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;行情和交易服务器的中断和再连接&quot;&gt;&lt;a href=&quot;#行情和交易服务器的中断和再连接&quot; class=&quot;headerlink&quot;</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="新手指南" scheme="https://invest.wtsolutions.cn/tags/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97/"/>
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="迅投" scheme="https://invest.wtsolutions.cn/tags/%E8%BF%85%E6%8A%95/"/>
    
    <category term="服务器" scheme="https://invest.wtsolutions.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>量化交易策略中如何判断当前MACD是否达到最小值</title>
    <link href="https://invest.wtsolutions.cn/posts/minimum-MACD/"/>
    <id>https://invest.wtsolutions.cn/posts/minimum-MACD/</id>
    <published>2025-02-06T15:26:06.000Z</published>
    <updated>2026-08-12T01:46:50.254Z</updated>
    
    <content type="html"><![CDATA[<p>我的一个量化交易策略中，涉及到使用技术指标MACD，我就问了deepseek：</p><blockquote><p>在量化交易策略中，计算MACD，如何判断MACD是不是达到的最小值</p></blockquote><p>下面是deepseek给我的答案，着实是惊喜到了我，所以分享出来给大家，仅供参考，不构成任何建议。</p><hr><p>在量化交易策略中，判断MACD是否达到最小值是一个关键步骤。MACD的最小值通常是指MACD柱状图（MACD Histogram）的局部最小值。以下是判断MACD是否达到最小值的几种方法：</p><h3 id="1-简单局部最小值判断"><a href="#1-简单局部最小值判断" class="headerlink" title="1.简单局部最小值判断"></a>1.简单局部最小值判断</h3><p>通过比较当前MACD柱状图值与前后一段时间内的值，判断是否达到局部最小值。</p><p>实现方法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">is_macd_min</span>(<span class="params">macd_histogram, current_index, window=<span class="number">5</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    判断当前MACD柱状图是否达到局部最小值</span></span><br><span class="line"><span class="string">    :param macd_histogram: MACD柱状图数据（Pandas Series）</span></span><br><span class="line"><span class="string">    :param current_index: 当前索引</span></span><br><span class="line"><span class="string">    :param window: 前后窗口大小</span></span><br><span class="line"><span class="string">    :return: True（是最小值）或 False（不是最小值）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 获取当前窗口范围</span></span><br><span class="line">    start_index = <span class="built_in">max</span>(<span class="number">0</span>, current_index - window)</span><br><span class="line">    end_index = <span class="built_in">min</span>(<span class="built_in">len</span>(macd_histogram) - <span class="number">1</span>, current_index + window)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 获取窗口内的MACD柱状图值</span></span><br><span class="line">    window_values = macd_histogram.iloc[start_index:end_index + <span class="number">1</span>]</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 判断当前值是否为窗口内的最小值</span></span><br><span class="line">    <span class="keyword">if</span> macd_histogram.iloc[current_index] == window_values.<span class="built_in">min</span>():</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>使用示例：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 假设 macd_histogram 是计算好的MACD柱状图数据</span></span><br><span class="line">current_index = <span class="built_in">len</span>(macd_histogram) - <span class="number">1</span>  <span class="comment"># 当前最新数据的索引</span></span><br><span class="line"><span class="keyword">if</span> is_macd_min(macd_histogram, current_index, window=<span class="number">5</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;MACD达到局部最小值，可以考虑买入&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="2-平滑处理后的最小值判断"><a href="#2-平滑处理后的最小值判断" class="headerlink" title="2. 平滑处理后的最小值判断"></a>2. 平滑处理后的最小值判断</h3><p>MACD柱状图可能会有较多噪声，导致局部最小值频繁出现。可以通过平滑处理（如移动平均）来减少噪声，再判断最小值。</p><p>实现方法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">smooth_macd_histogram</span>(<span class="params">macd_histogram, window=<span class="number">3</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    对MACD柱状图进行平滑处理</span></span><br><span class="line"><span class="string">    :param macd_histogram: MACD柱状图数据（Pandas Series）</span></span><br><span class="line"><span class="string">    :param window: 平滑窗口大小</span></span><br><span class="line"><span class="string">    :return: 平滑后的MACD柱状图</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> macd_histogram.rolling(window=window, min_periods=<span class="number">1</span>).mean()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 平滑处理</span></span><br><span class="line">smoothed_macd = smooth_macd_histogram(macd_histogram, window=<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 判断最小值</span></span><br><span class="line"><span class="keyword">if</span> is_macd_min(smoothed_macd, current_index, window=<span class="number">5</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;平滑后的MACD达到局部最小值，可以考虑买入&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="3-全局最小值判断"><a href="#3-全局最小值判断" class="headerlink" title="3. 全局最小值判断"></a>3. 全局最小值判断</h3><p>如果你希望判断MACD柱状图是否达到历史数据中的全局最小值，可以直接比较当前值与历史最小值。</p><p>实现方法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">is_macd_global_min</span>(<span class="params">macd_histogram, current_index</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    判断当前MACD柱状图是否达到全局最小值</span></span><br><span class="line"><span class="string">    :param macd_histogram: MACD柱状图数据（Pandas Series）</span></span><br><span class="line"><span class="string">    :param current_index: 当前索引</span></span><br><span class="line"><span class="string">    :return: True（是全局最小值）或 False（不是全局最小值）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> macd_histogram.iloc[current_index] == macd_histogram.<span class="built_in">min</span>():</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><p>使用示例：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> is_macd_global_min(macd_histogram, current_index):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;MACD达到全局最小值，可以考虑买入&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="4-结合趋势判断"><a href="#4-结合趋势判断" class="headerlink" title="4. 结合趋势判断"></a>4. 结合趋势判断</h3><p>MACD柱状图的最小值可能出现在下降趋势中，此时买入可能并不合适。可以结合MACD线的趋势（如MACD线是否开始拐头向上）来进一步确认。</p><p>实现方法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">is_macd_turning_up</span>(<span class="params">macd_line, current_index, window=<span class="number">3</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    判断MACD线是否开始拐头向上</span></span><br><span class="line"><span class="string">    :param macd_line: MACD线数据（Pandas Series）</span></span><br><span class="line"><span class="string">    :param current_index: 当前索引</span></span><br><span class="line"><span class="string">    :param window: 窗口大小</span></span><br><span class="line"><span class="string">    :return: True（拐头向上）或 False（未拐头向上）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> current_index &lt; window:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="comment"># 判断当前MACD线是否高于前几根</span></span><br><span class="line">    <span class="keyword">return</span> macd_line.iloc[current_index] &gt; macd_line.iloc[current_index - window]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 结合MACD最小值和趋势判断</span></span><br><span class="line"><span class="keyword">if</span> is_macd_min(macd_histogram, current_index, window=<span class="number">5</span>) <span class="keyword">and</span> is_macd_turning_up(macd_line, current_index, window=<span class="number">3</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;MACD达到局部最小值且趋势拐头向上，可以考虑买入&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="5-动态阈值判断"><a href="#5-动态阈值判断" class="headerlink" title="5. 动态阈值判断"></a>5. 动态阈值判断</h3><p>如果MACD柱状图的最小值波动较大，可以设置一个动态阈值（如历史最小值的某个百分比），当当前值低于该阈值时认为达到最小值。</p><p>实现方法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">is_macd_below_threshold</span>(<span class="params">macd_histogram, current_index, threshold_ratio=<span class="number">0.1</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    判断当前MACD柱状图是否低于动态阈值</span></span><br><span class="line"><span class="string">    :param macd_histogram: MACD柱状图数据（Pandas Series）</span></span><br><span class="line"><span class="string">    :param current_index: 当前索引</span></span><br><span class="line"><span class="string">    :param threshold_ratio: 阈值比例（例如历史最小值的10%）</span></span><br><span class="line"><span class="string">    :return: True（低于阈值）或 False（高于阈值）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    historical_min = macd_histogram.<span class="built_in">min</span>()</span><br><span class="line">    threshold = historical_min * (<span class="number">1</span> + threshold_ratio)</span><br><span class="line">    <span class="keyword">return</span> macd_histogram.iloc[current_index] &lt; threshold</span><br></pre></td></tr></table></figure><p>使用示例：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> is_macd_below_threshold(macd_histogram, current_index, threshold_ratio=<span class="number">0.1</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;MACD低于动态阈值，可以考虑买入&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>判断MACD是否达到最小值的方法有多种，具体选择哪种方法取决于你的策略需求：</p><ul><li>局部最小值：适合短期交易策略。</li><li>全局最小值：适合长期趋势判断。</li><li>平滑处理：减少噪声干扰。</li><li>结合趋势：提高信号的可靠性。</li><li>动态阈值：适应市场波动。</li></ul><p>在实际应用中，建议结合多种方法进行综合判断，并通过历史数据回测验证策略的有效性。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;我的一个量化交易策略中，涉及到使用技术指标MACD，我就问了deepseek：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在量化交易策略中，计算MACD，如何判断MACD是不是达到的最小值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面是deepseek给我的答案，着实是惊喜</summary>
        
      
    
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/categories/qmt/"/>
    
    
    <category term="qmt" scheme="https://invest.wtsolutions.cn/tags/qmt/"/>
    
    <category term="量化策略" scheme="https://invest.wtsolutions.cn/tags/%E9%87%8F%E5%8C%96%E7%AD%96%E7%95%A5/"/>
    
    <category term="MACD" scheme="https://invest.wtsolutions.cn/tags/MACD/"/>
    
    <category term="AI" scheme="https://invest.wtsolutions.cn/tags/AI/"/>
    
  </entry>
  
</feed>
