手工图表和交易工具包(第一部分)。 准备:结构描述和助手类(基础篇)
📘

手工图表和交易工具包(第一部分)。 准备:结构描述和助手类(基础篇)

第 1/3 篇

先把结构和助手类铺好

做手工图表和交易工具包,第一步不是画对象,而是把底层结构描述和助手类先定义清楚。没有这层,后面每次拖拽、重绘都要重写一堆重复逻辑,MT5 里很容易把图表事件搞成一团乱麻。 本系列基于 MT5 环境,原文发布于 2020-09-29,截至统计时有 3803 次查看、17 条讨论,说明这类可复用手工标注工具在长期交易者里需求稳定。 建议开 MT5 新建一个 EA 或脚本工程,先写一个轻量助手类接管 ChartID、时间轴与价格轴的映射,再向外暴露几个最小接口:取鼠标坐标、转价格、注册对象。这样后面几篇接具体图形才不会返工。

◍ 为什么我只用手工图形做价格行为分析

我是手工交易者,看图表时尽量不碰复杂公式和指标,只做纯图形分析。这样做最大的好处是灵活:波动放大或收敛时,我能直接切时间帧,入场前就对接下来可能的价格行为有预期。 具体落地上,我主要堆趋势线的组合——草叉、扇形、水平线来回切。为了省去重复拖线的动作,我写了一套 MT5 工具,一键就能把这几类线快速铺到图上。 外汇和贵金属波动受事件驱动明显,纯图形判断只是概率倾向,不代表方向必然成立,实操仍要控仓位。这套工具现在开放给社区,你装上去第一件事应该是开 EURUSD 的 H1 验证草叉角度是否贴合近期摆动。

「把键盘变成图表操作快捷键」

做这套工具的初衷很直接:用键盘快捷键替代鼠标重复操作,把交易者最高频的图表动作压缩成一两个按键。比如按 H 画一条水平线,按 i 画一条垂直线——i 的字形本身就像竖直方向,记忆成本几乎为零。 可落地的任务清单包括:从图表任意点拉出固定长度(非无限)的水平线段;在距起点指定距离处生成垂直线;用组合键切换时间框架并重新排列图层;在最近极限点自动绘制斐波那契扇形、趋势线(长度可设为端点距离的倍数,也可转成射线);以及标准、Schiff、反向 Schiff 等多种安德鲁草叉,用于快速趋势判定。 外汇与贵金属市场波动剧烈、杠杆风险高,这类工具只解决操作效率,不替代交易决策。极值点顺序(左/右两侧柱线数量)和草叉参数都应支持自定义,否则在震荡行情里容易画错基准。 技术实现上,MQL5 的 OnChartEvent 能捕获击键、鼠标移动、对象增删等事件,因此我把功能写成一个包含文件(include),用类做分组,首个版本不引入继承或工厂模式,只做扁平集合,并尽量让同一套类在 MQL4 与 MQL5 下都能编译运行。

库文件落在哪几个 mqh

这套快捷键函数库由五个相互关联的文件组成,全部塞在 Include 目录下的 Shortcuts 文件夹里。 具体文件名分别是 GlobalVariables.mqh、Graphics.mqh、Mouse.mqh、Shortcuts.mqh 和 Utilites.mqh,开 MT5 在 MetaEditor 里导航到 Include\Shortcuts 就能直接看到这五个文件。

◍ 快捷键库的主入口怎么挂到EA上

快捷键逻辑的核心载体是 Shortcuts.mqh,EA 只需 include 这一个头文件,其余辅助模块(全局变量、鼠标、工具、绘图)都会在文件开头被一并引入。类 CShortcuts 只暴露两个接口:默认构造函数里打开图表鼠标移动事件,OnChartEvent 则接管所有按键与鼠标消息。 文件末尾会生成一个全局实例 shortcuts,EA 主体的 OnChartEvent 里直接调它就能把事件路由给库。实际接入只要两行:#include "Shortcuts.mqh" 加 shortcuts.OnChartEvent(id,lparam,dparam,sparam); 之后编译通过即可在图上画线、响应热键。 外汇与贵金属品种波动剧烈、杠杆风险高,这类图表交互脚本仅用于提升操作效率,不改变任何仓位风险属性,实盘前请在策略测试器里先跑通事件响应。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                                 Shortcuts.mqh |
class=class="str">"cmt">//|                     Copyright class="num">2020, MetaQuotes Software Corp. |
class=class="str">"cmt">//|                     [MQL5官方文档] |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Copyright class="num">2020, MetaQuotes Software Corp."
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#include "GlobalVariables.mqh"
class="macro">#include "Mouse.mqh"
class="macro">#include "Utilites.mqh"
class="macro">#include "Graphics.mqh"
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| The main control class of the program. It should be connected    |
class=class="str">"cmt">//| to the Expert Advisor                                             |
class=class="str">"cmt">//+------------------------------------------------------------------+
class CShortcuts
  {
class="kw">private:
   CGraphics         m_graphics;   class=class="str">"cmt">// Object for drawing m_graphics
class="kw">public:
                     CShortcuts();
   class="type">void              OnChartEvent(class="kw">const class="type">int id,
                                  class="kw">const class="type">long &lparam,
                                  class="kw">const class="type">class="kw">double &dparam,
                                  class="kw">const class="type">class="kw">string &sparam);
  };
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Default constructor                                              |
class=class="str">"cmt">//+------------------------------------------------------------------+
CShortcuts::CShortcuts(class="type">void)
  {
   ChartSetInteger(class="num">0,CHART_EVENT_MOUSE_MOVE,true);
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Event handling function                                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void CShortcuts::OnChartEvent(
   class="kw">const class="type">int id,
   class="kw">const class="type">long &lparam,
   class="kw">const class="type">class="kw">double &dparam,
   class="kw">const class="type">class="kw">string &sparam
)
  {
class=class="str">"cmt">//---

「把快捷键事件接进主EA的图表回调」

想让自定义快捷键在实盘里真正响应,光写类还不够,得把它挂到主EA的图表事件流上。上面这段就是把 CShortcuts 实例塞进 OnChartEvent,每一次键鼠动作都会先过一遍 shortcuts.OnChartEvent。 具体做法是在主文件里 include 那个 Shortcuts.mqh,声明一个全局的 CShortcuts shortcuts; 对象,然后在 OnChartEvent 函数体内第一行调用 shortcuts.OnChartEvent(id,lparam,dparam,sparam)。这样键盘和鼠标事件的描述逻辑就全收口到类里了。 你可以直接把这段抄进自己的EA框架,编译后按几下热键,MT5 专家日志里若没报错就说明通道通了。外汇和贵金属波动快、杠杆高,这类辅助脚本只管交互效率,不替你做任何方向判断。

MQL5 / C++
class=class="str">"cmt">// This will contain the description of the events related to keystrokes
class=class="str">"cmt">// and mouse movements
class=class="str">"cmt">//  ...
}
}
CShortcuts shortcuts;
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| The main Expert(file "Shortcuts-Main-Expert.mq5")                |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#include <Shortcuts\Shortcuts.mqh>
class=class="str">"cmt">// ...
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| The ChartEvent function                                            |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnChartEvent(class="kw">const class="type">int id,
                class="kw">const class="type">long &lparam,
                class="kw">const class="type">class="kw">double &dparam,
                class="kw">const class="type">class="kw">string &sparam)
  {
class=class="str">"cmt">//---
   shortcuts.OnChartEvent(id,lparam,dparam,sparam);
  }

常见问题

手工图形能直接反映你肉眼确认的关键位和形态,不被算法过度拟合;先把结构描述和助手类铺好,后续挂快捷键就能高效重画和调整。
核心是把快捷键库的主入口挂到EA上,并让快捷键事件接进主EA的图表回调;库文件主要落在几个mqh里,分开管结构和输入更清晰。
小布可替你跑这套结构初始化和快捷键绑定流程,打开对应品种页就能直接调用,你把精力放在形态判断上。
先定义图形结构描述和基础助手类,明确坐标、类型、状态字段;这样主EA接图表回调时可以直接读写,不用现改底层。
多半是主入口没正确挂到EA,或回调里没把按键码映射到具体画图动作;先查挂接处和事件分支是否漏了图表ID。