最新的改革(基础篇)
📘

最新的改革(基础篇)

第 1/3 篇

MT5 一次被低估的版本迭代

  • 年 1 月 6 日 12:54,MetaTrader 5 推送了一轮平台改革更新,相关示例帖在站内获得 2065 次查看、16 条互动,发布者为 Roman Zamozhnyy。

这轮更新在当年并未引起太多散户关注,但从后续 EA 架构演进看,它埋下了若干接口层面的改动,直接影响后来多品种回测与自定义指标加载效率。 若你手头有 2013 年前后写的老 mq5 脚本,建议开 MT5 历史版本对照跑一遍,看编译告警是否新增——这是验证该次改革实际边界的最快办法。

◍ 把时间轴关掉,先看价格本身

MT5 里默认的三种价格工具——柱、蜡烛、折线,底层都是时间图表。但圈内做投机的另一派更常用非时间相关的画法:Renko、Kagi、新三值线,以及点数图(P&F)。 这里不争论哪种算法更优,只把时间变量拿掉,让注意力回到价格变动本身。建议配合图表算法读一本入门书:Thomas J. Dorsey 的《点数图:预测和跟踪市场价格的基本应用》。 做离线图表对比时,Bull's-Eye Broker 是接受度最高的软件,能试用 21 天,测试期还会给新版。在线资源里 StockCharts 的点数图最全,但只覆盖证券交易所,没有外汇品种。 为验证后面脚本的输出,会用 Bull's-Eye Broker 和 StockCharts 生成黄金期货、轻质原油期货、S&P 500 CFD 的图表;EURUSD 因 StockCharts 限制,只用 Bull's-Eye Broker 单独画一张做对照。外汇与贵金属杠杆高、波动剧烈,对照结论仅作算法验证,不代表任何方向研判。

「点数图怎么把报价压成X和O」

点数图只认两个参数:格尺寸(box size)和转向格数(reversal)。格尺寸是价格最小变动的整数倍,小于它的波动直接忽略;转向格数决定反方向要走多少格才另起一列。外汇和贵金属波动快,这两个值设错就会把噪声当趋势,实盘前务必在MT5里先用历史数据试画。 算法上假设图表只用最高-最低价,且“最高”向下取整(MathFloor)、“最低”向上取整(MathCeil)。以轻原油为例,格尺寸$1、转向3格:2月13日最高100.86取为100、最低99.08取为100;到2月17日XO最高到103,相比首值100多出3格,第一列确定为X,从100画4个X到103。 方向判定之后,若当前列是X,只看本柱XO最高是否较当前价多出一个格尺寸,是就加X;若没增长,再看XO最低是否比XO最高低了转向格数(上例即≤100),是就在右侧从102向下画O列。O列规则完全镜像。新O列永远从前一X列最高右下一格起笔,新X列永远从前一O列最低右上一格起笔——这是手绘和点脚本都容易漏的一点。 传统点数图的支撑阻力线固定45度。第一列是X,阻力线从第一列最高上一格向右下;第一列是O,支撑线从最低下一格向右上。线触到价格后就找前一趋势线同侧的最小图表值,低一格起笔继续画,保证新线更靠右。这套规则决定了为什么点数图过滤假突破的概率倾向高于普通折线。 脚本留了几个实用开关:按当前品种或市场报价全品种出图、选时间表(M1画1-3点、日线画100点更合理)、以点设格尺寸、设转向格数、显示变动字符数、限历史深度、输出纯文本或BMP,以及新手向的自动格尺寸。输入参数图决定结果落盘位置:图像去 MQL5\Images,文本去 MQL5\Files。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                                  Point&Figure text charts |
class=class="str">"cmt">//|                                                                  BSD Lic. class="num">2012, Roman Rich |
class=class="str">"cmt">//|                                                                  http://www.FXRays.info |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property        copyright "Roman Rich"
class="macro">#class="kw">property        link      "http:class=class="str">"cmt">//www.FXRays.info"
class="macro">#class="kw">property        version   "class="num">1.00"
class="macro">#class="kw">property        script_show_inputs
class="macro">#include         "cIntBMP.mqh"                                                    class=class="str">"cmt">// Include the file containing cIntBMP class
input class="type">bool      mw=true;                                                        class=class="str">"cmt">// All MarketWatch?
input ENUM_TIMEFRAMES  tf=PERIOD_M1;                                            class=class="str">"cmt">// Time frame
input class="type">long      box=class="num">2;                                                          class=class="str">"cmt">// Box size in pips(class="num">0 - auto)

点数图绘制的输入参数与绘图类骨架

做点数图(P&F)自动绘图时,先要把框数、反转框数、成交量字符数、历史深度这些变量用枚举收口,避免在 MT5 输入面板上出现乱填。下面这段声明把图表高度框数限定在 10/25/50/100,反转框数限定在 2~7,成交量字符数限定在 10/25/50,历史深度用 15000/50000/100000/1000000 四档切换。 默认配置里 count=c50 即图表画 50 框高,reverse=Five 代表 5 框反转(外汇与贵金属属高风险品种,5 框反转在 XAUUSD 上可能过滤掉较多噪声但也容易滞后),vd=v10 用 10 字符表达量能,depth=Little 只取 15000 根以内历史。 pic=true 控制是否输出图像文件,cellsize=10 是每个格子 10 像素——这两个值直接决定 bmp 出图尺寸,想看清 EURUSD 的细微形态可把 cellsize 调到 14 左右验证。 真正落笔的是 cIntBMPEx 这个类,它继承 cIntBMP,只扩了矩形、柱、横竖线、带色绘柱和竖排文字六个方法。你开 MT5 新建 EA 把这段抄进去,就能在 OnCalculate 里直接调 Rectangle/Bar 画格子,不用自己再写像素级 API。

MQL5 / C++
enum                cChoice{c10=class="num">10,c25=class="num">25,c50=class="num">50,c100=class="num">100};
input cChoice        count=c50;                                                        class=class="str">"cmt">// Chart height in boxes for autocharting
enum                rChoice{Two=class="num">2,Three,Four,Five,Six,Seven};
input rChoice        reverse=Five;                                                     class=class="str">"cmt">// Number of boxes for reversal
enum                vChoice{v10=class="num">10,v25=class="num">25,v50=class="num">50};
input vChoice        vd=v10;                                                           class=class="str">"cmt">// Characters for displaying volumes
enum                dChoice{Little=class="num">15000,Middle=class="num">50000,Many=class="num">100000,Extremely=class="num">1000000};
input dChoice        depth=Little;                                                     class=class="str">"cmt">// History depth
input class="type">bool           pic=true;                                                         class=class="str">"cmt">// Image file?
input class="type">int            cellsize=class="num">10;                                                      class=class="str">"cmt">// Cell size in pixels
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| cIntBMP class descendant                                                            |
class=class="str">"cmt">//+------------------------------------------------------------------+
class cIntBMPEx : class="kw">public cIntBMP
  {
class="kw">public:
   class="type">void                Rectangle(class="type">int aX1,class="type">int aY1,class="type">int aSizeX,class="type">int aSizeY,class="type">int aColor);
   class="type">void                Bar(class="type">int aX1,class="type">int aY1,class="type">int aSizeX,class="type">int aSizeY,class="type">int aColor);
   class="type">void                LineH(class="type">int aX1,class="type">int aY1,class="type">int aSizeX,class="type">int aColor);
   class="type">void                LineV(class="type">int aX1,class="type">int aY1,class="type">int aSizeY,class="type">int aColor);
   class="type">void                DrawBar(class="type">int aX1,class="type">int aY1,class="type">int aX2,class="type">int aY2,class="type">int aColor);
   class="type">void                TypeTextV(class="type">int aX,class="type">int aY,class="type">class="kw">string aText,class="type">int aColor);
  };

◍ 位图掩码数组的硬写法和字节排布

在 MT5 自定义指标里做字形或图标叠加时,常会直接声明一个定长 uchar 数组当掩码。下面这段就是 192 字节的掩码表,前 24 字节里混着 217、210、241 这类非 255 值,说明左上角区域是“有内容”的像素,而靠后的连续 255 则是透明留白。 直接把掩码写死在代码里有个现实好处:脱离外部资源文件,指标拷贝给别台机器也不会丢图。代价是可读性差,调一个像素得数到第几个字节,所以建议只在小型 16x12 或 24x8 点阵里这么干。 外汇与贵金属图表叠加这类自绘元素时波动剧烈,硬掩码不会自动适配高 DPI,缩放后边缘可能发虚,实盘前最好在 MT5 里切到不同分辨率验证一次。

MQL5 / C++
cIntBMPEx bmp;    class=class="str">"cmt">// cIntBMPEx class instance
class="type">uchar Mask_O[class="num">192]= class=class="str">"cmt">// The naughts
  {
   class="num">217,class="num">210,class="num">241,class="num">111,class="num">87,class="num">201,class="num">124,class="num">102,class="num">206,class="num">165,class="num">150,class="num">221,class="num">237,class="num">234,class="num">248,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,
   class="num">73,class="num">42,class="num">187,class="num">137,class="num">117,class="num">211,class="num">201,class="num">192,class="num">235,class="num">140,class="num">120,class="num">212,class="num">60,class="num">27,class="num">182,class="num">178,class="num">165,class="num">226,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,
   class="num">40,class="num">3,class="num">174,class="num">250,class="num">249,class="num">253,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">229,class="num">225,class="num">245,class="num">83,class="num">54,class="num">190,class="num">152,class="num">135,class="num">216,class="num">255,class="num">255,class="num">255,
   class="num">68,class="num">36,class="num">185,class="num">229,class="num">225,class="num">245,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">247,class="num">246,class="num">252,class="num">78,class="num">48,class="num">188,class="num">201,class="num">192,class="num">235,
   class="num">140,class="num">120,class="num">212,class="num">145,class="num">126,class="num">214,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">188,class="num">177,class="num">230,class="num">124,class="num">102,class="num">206,
   class="num">237,class="num">234,class="num">248,class="num">58,class="num">24,class="num">181,class="num">209,class="num">201,class="num">238,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">168,class="num">153,class="num">222,class="num">124,class="num">102,class="num">206,
   class="num">255,class="num">255,class="num">255,class="num">199,class="num">189,class="num">234,class="num">63,class="num">30,class="num">183,class="num">186,class="num">174,class="num">229,class="num">247,class="num">246,class="num">252,class="num">204,class="num">195,class="num">236,class="num">60,class="num">27,class="num">182,class="num">204,class="num">195,class="num">236,

「十字掩码数组的位图拼法」

上面那段 uchar Mask_X[192] 是给自定义指标画十字标记用的位图掩码,注释里直接写了 The crosses,说明它管的是图表上交叉信号的像素透叠。 数组长度 192 字节,按每行 24 个数值排了 8 行,对应一个 24×8 的单色掩码块;值 255 代表完全透明不画,值 0 附近(如 0、9、15)是实心点,中间值如 189、195 是半透叠加,用来勾十字边。 在 MT5 里这类掩码通常配合 ResourceRead 或 ObjectSetXXX 做像素级绘制,你直接把这段贴进 EA 的全局数组,再在 OnCalculate 里用 CustomRates 或 Canvas 接口调用,就能在 K 线交点处看到自定义十字。 外汇与贵金属波动剧烈,这类标记只作视觉辅助,信号出现后价格可能反向,实盘前请在策略测试器用历史数据验证掩码对齐是否偏移。

MQL5 / C++
class="type">uchar Mask_X[class="num">192]= class=class="str">"cmt">// The crosses
  {
  class="num">254,class="num">252,class="num">252,class="num">189,class="num">51,class="num">51,class="num">236,class="num">195,class="num">195,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">235,class="num">192,class="num">192,class="num">248,class="num">234,class="num">234,class="num">255,class="num">255,class="num">255,
  class="num">255,class="num">255,class="num">255,class="num">202,class="num">90,class="num">90,class="num">184,class="num">33,class="num">33,class="num">251,class="num">243,class="num">243,class="num">212,class="num">120,class="num">120,class="num">173,class="num">0,class="num">0,class="num">173,class="num">0,class="num">0,class="num">255,class="num">255,class="num">255,
  class="num">255,class="num">255,class="num">255,class="num">254,class="num">252,class="num">252,class="num">195,class="num">69,class="num">69,class="num">192,class="num">60,class="num">60,class="num">178,class="num">15,class="num">15,class="num">233,class="num">186,class="num">186,class="num">253,class="num">249,class="num">249,class="num">255,class="num">255,class="num">255,
  class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">241,class="num">210,class="num">210,class="num">173,class="num">0,class="num">0,class="num">209,class="num">111,class="num">111,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,
  class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">205,class="num">99,class="num">99,class="num">192,class="num">60,class="num">60,class="num">181,class="num">24,class="num">24,class="num">241,class="num">210,class="num">210,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,class="num">255,
  class="num">255,class="num">255,class="num">255,class="num">249,class="num">237,class="num">237,class="num">176,class="num">9,class="num">9,class="num">241,class="num">213,class="num">213,class="num">226,class="num">165,class="num">165,class="num">189,class="num">51,class="num">51,class="num">254,class="num">252,class="num">252,class="num">255,class="num">255,class="num">255,

常见问题

核心是重做了离线图表的渲染逻辑,把时间轴从默认视图里抽离,强迫你先盯价格结构而非时钟。打开品种页关掉时间轴就能直观体会。
按设定点数阈值把连续报价压缩:向上破阈值画 X,向下破画 O,不达阈值就忽略。在输入参数里设好 BoxSize 即可跑通。
小布会基于近期波动特征给出该品种点数图箱位建议与噪声预警,打开对应品种页的 AIGC 诊断即可看到,不用自己手调参数试错。
硬写是为了固定字节排布、避免运行时计算开销,尤其十字掩码需按位拼接。直接抄骨架里的数组比动态生成更稳定。
BoxSize 取该品种近期平均波幅的 1/3 到 1/2 较稳,Reverse 通常等于 BoxSize。先用历史回看验证再上实盘,外汇贵金属高风险需轻仓测。