📘

「MT5 客户端策略示例的拆解入口」

「MT5 客户端策略示例的拆解入口」

MetaTrader 5 客户端里内置的策略示例,是理解平台运行逻辑最直接的样本。2025 年 3 月 14 日发布的这组解构材料,累计浏览 1169 次、评论 15 条,说明基础架构类内容在实战交易者中仍有稳定需求。 这类示例通常按「概览 → 一般逻辑 → 运行流程图 → 函数列表 → 结论」的链路展开。先看清策略在做什么,再追它怎么触发,最后落回代码函数,才不会一上来就被 EA 结构劝退。 外汇与贵金属品种波动受杠杆和流动性影响,直接用示例逻辑上真实账户前,务必在策略测试器用历史数据跑一遍。MT5 自带的示例只是骨架,真要落地得自己补风控与品种特性。

蜡烛图 EA 的目录与确认逻辑

Steve Nison 在上世纪 90 年代初把日本蜡烛图体系带进西方市场,此后读图能力就成了和经典技术分析同等重要的基本功。MT5 客户端 EA 目录里新增的 Free Robots 文件夹,直接放了 28 个示例 EA,核心思路都是用指标信号去确认蜡烛图形态后再进场。 这批 EA 里可供研究的共 7 个策略,每个都拆成多头和空头两种形态,再按确认指标套四份副本。确认环节只认四个振荡器之一:CCI、MFI、RSI 或随机振荡指标。 也就是说,同一套蜡烛图形态规则,会因为挂了不同数量的确认指标而生成不同版本的 EA。想验证的话,打开 MT5 的 Free Robots 文件夹数一下,28 = 7 形态对 × 4 指标副本,这个等式本身就能当第一步核对。

◍ 反转形态与28个EA的确认逻辑

价格行为里这套反转形态共覆盖七类:三白兵/三黑鸦、多空吞噬、多空孕育线、多空相逢线、刺透线/乌云盖顶、锤子线/上吊线、晨昏星及十字星变体。每一类都对应一对方向相反的形态,只在趋势末端给出可能的逆转倾向,而非确定性翻转。 每类形态都配了四个EA版本,分别用 CCI、MFI、RSI、随机振荡指标做信号确认。7类乘4种指标,合计28个EA,结构统一,只是过滤条件不同。 进场阈值直接卡在极端区:CCI 最后完成柱小于 -50 做多、大于 50 做空;MFI 与 RSI 分别是 <40 多 / >60 空;随机信号线 <30 多 / >70 空。外汇与贵金属杠杆高,这些阈值只是概率过滤,实盘仍可能连续打损。 平仓不看形态,只看指标穿线:比如 CCI 向下穿过 80 或 -80 平多,向上穿过 -80 或 80 平空;RSI 穿 70/30 同理。把这套表输进 MT5 策略测试器,逐个EA跑 EURUSD H1,能直接比对哪类形态配哪个指标在样本内更抗衰。

「EA 内部信号量与四段式执行链」

在 MT5 代码编辑器里打开这类 EA,最先撞见的是一组全局声明的标志与变量:ExtSignalOpen 管开仓方向(1 买、-1 卖、0 无),ExtSignalClose 管平仓(2 平多、-2 平空、0 无),其余如 ExtPatternDetected、ExtConfirmed、ExtCloseByTime 等本质都是信号量,用来在 OnInit 初始化、在 OnTick 里驱动行为。文本类变量(ExtPatternInfo、ExtDirection)只负责往日志里吐描述,不参与决策。 OnTick 的执行被切成四段:先 CheckState 判新柱与形态确认,再 PositionOpen 开仓,然后 CloseBySignal 平仓,最后 CloseByTime 处理超时仓。这种串行结构意味着同一根 Tick 内最多走完一整轮状态机,不会跨阶段乱跳。 函数层给了可直接验证的落点。比如 BarsHold() 返回开仓到当前的柱数,PositionExpiredByTimeExist() 拿这个值和设置里的柱数上限比;CheckPattern() 先搜空方形态再搜多方,任一侧命中就置 ExtPatternDetected=true 并回 true。把这几个函数单独拖进脚本跑,能立刻看出形态识别在哪一向更容易触发。 外汇与贵金属杠杆高,这类基于形态+指标确认的逻辑只提供概率性信号,实盘前务必在策略测试器用历史数据回放四阶段流转。

把示例EA改成自己的模板

MT5 的 Experts\Free Robots 目录下自带 28 个 EA,它们底层逻辑完全一致,差异只在两处:搜索烛形形态的算法,以及从四个指标取数做信号确认。这意味着任意一个都能当母版,改两三个函数就能跑别的形态或换指标。 要换形态,进 CheckState() 调用的 CheckPattern() 里改多头/空头判定即可。下面这段是母版里检测“三乌鸦”的片段,逻辑很直白:连续三根阴线且实体大于近一根平均实体,且中点逐根下移才发 SELL。 换确认指标也不用碰主循环。OnInit() 里把建 CCI 的代码块换成别的指标,再把 CheckConfirmation() 和 CheckCloseSignal() 里读 CCI 值的位置改成新指标的多空阈值就行。外汇和贵金属波动大、杠杆高,这类改完的 EA 先用策略测试器跑历史,实盘前务必清楚爆仓风险。 这些 EA 本质就是教你搭自定义算法的脚手架:挂任意形态 + 几乎任意指标确认,都能快速拼出来验证想法。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Returns true in case of successful pattern check                  |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">bool CheckPattern()
  {
   ExtPatternDetected=class="kw">false;
class=class="str">"cmt">//--- check if there is a pattern
   ExtSignalOpen=SIGNAL_NOT;
   ExtPatternInfo="\r\nPattern not detected";
   ExtDirection="";
class=class="str">"cmt">//--- check class="num">3 Black Crows
   if((Open(class="num">3)-Close(class="num">3)>AvgBody(class="num">1)) && class=class="str">"cmt">// class="type">long black
      (Open(class="num">2)-Close(class="num">2)>AvgBody(class="num">1)) &&
      (Open(class="num">1)-Close(class="num">1)>AvgBody(class="num">1)) &&
      (MidPoint(class="num">2)<MidPoint(class="num">3))      && class=class="str">"cmt">// lower midpoints
      (MidPoint(class="num">1)<MidPoint(class="num">2)))
     {
      ExtPatternDetected=true;
      ExtSignalOpen=SIGNAL_SELL;
      ExtPatternInfo="\r\n3 Black Crows detected";
      ExtDirection="Sell";
      class="kw">return(true);
     }
class=class="str">"cmt">//--- check class="num">3 White Soldiers
   if((Close(class="num">3)-Open(class="num">3)>AvgBody(class="num">1)) && class=class="str">"cmt">// class="type">long white
      (Close(class="num">2)-Open(class="num">2)>AvgBody(class="num">1)) &&
      (Close(class="num">1)-Open(class="num">1)>AvgBody(class="num">1)) &&

◍ 用 CCI 给三兵形态加一道滤网

三白兵之类的形态识别只是第一步,实盘里裸形态假突破不少,所以这段逻辑在 OnInit 里先挂了一个 CCI 句柄:周期写死 37、价格取 PRICE_CLOSE,句柄拿不到就直接 INIT_FAILED 退出。 确认函数 CheckConfirmation 只在形态已经触发时才工作;它读 CCI(1) 的上一根值,若返回 EMPTY_VALUE 就判检查失败。买信号要求 CCI 低于 -50,卖信号要求高于 50,满足条件才把 ExtConfirmed 置真,并在信息串后追加确认标记。 把阈值从 ±50 调到 ±100 会显著减少信号量但提高过滤强度;外汇与贵金属波动大、滑点不可控,这类确认仅提高概率,不消除高风险。开 MT5 把 InpPeriodCCI 改成 37 跑一遍 EURUSD 小时图,能看到三兵+CCI 双条件同时亮起的频次明显低于单形态。

MQL5 / C++
class="kw">input class="type">int   InpAverBodyPeriod=class="num">12;     class=class="str">"cmt">// period for calculating average candlestick size
class="kw">input class="type">int   InpPeriodCCI      =class="num">37;     class=class="str">"cmt">// CCI period
class="kw">input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; class=class="str">"cmt">// price type

class="type">int OnInit()
  {
   Print("InpSL=", InpSL);
   Print("InpTP=", InpTP);
class=class="str">"cmt">//--- set parameters for trading operations
   ExtTrade.SetDeviationInPoints(InpSlippage);      class=class="str">"cmt">// slippage
   ExtTrade.SetExpertMagicNumber(InpMagicNumber); class=class="str">"cmt">// Expert Advisor ID
   ExtTrade.LogLevel(LOG_LEVEL_ERRORS);            class=class="str">"cmt">// logging level
   ExtAvgBodyPeriod=InpAverBodyPeriod;
class=class="str">"cmt">//--- indicator initialization
   ExtIndicatorHandle=iCCI(_Symbol, _Period, InpPeriodCCI, InpPrice);
   if(ExtIndicatorHandle==INVALID_HANDLE)
     {
      Print("Error creating CCI indicator");
      class="kw">return(INIT_FAILED);
     }
class=class="str">"cmt">//--- OK
   class="kw">return(INIT_SUCCEEDED);
  }

class="type">bool CheckConfirmation()
  {
   ExtConfirmed=class="kw">false;
class=class="str">"cmt">//--- if there is no pattern, do not search for confirmation
   if(!ExtPatternDetected)
      class="kw">return(true);
class=class="str">"cmt">//--- get the value of the stochastic indicator to confirm the signal
   class="type">class="kw">double signal=CCI(class="num">1);
   if(signal==EMPTY_VALUE)
     {
      class=class="str">"cmt">//--- failed to get indicator value, check failed
      class="kw">return(class="kw">false);
     }
class=class="str">"cmt">//--- check the Buy signal
   if(ExtSignalOpen==SIGNAL_BUY && (signal<-class="num">50))
     {
      ExtConfirmed=true;
      ExtPatternInfo+="\r\n   Confirmed: CCI<-class="num">50";
     }
class=class="str">"cmt">//--- check the Sell signal
   if(ExtSignalOpen==SIGNAL_SELL && (signal>class="num">50))
     {
      ExtConfirmed=true;

「收束」

平仓判定函数把 CCI 的穿越阈值钉在 ±80,用前一根(1)与再前一根(2)的棒线数值做交叉比对。多头平仓条件是 CCI(1)<80 且 CCI(2)>80,或 CCI(1)<-80 且 CCI(2)>-80;空头平仓逻辑对称反转。 若开仓信号 ExtSignalOpen 非空,函数直接返回不扫平仓条件,避免同根 K 线自相矛盾。外汇与贵金属杠杆高,CCI 假突破在亚盘流动性稀薄时概率偏大,实盘前先在 MT5 策略测试器用 2020—2023 年 XAUUSD 的 M15 跑一遍穿越计数。 把这套检查挂进 EA 的 OnTick,能省掉人工盯 CCI 窗口的精力,但参数 80 不是圣杯,欧元兑美元可能要调到 100 才少些噪音。

MQL5 / C++
class="type">bool CheckCloseSignal()
  {
  ExtSignalClose=class="kw">false;
class=class="str">"cmt">//--- if there is a signal to enter the market, do not check the signal to close
  if(ExtSignalOpen!=SIGNAL_NOT)
    class="kw">return(true);
class=class="str">"cmt">//--- check if there is a signal to close a class="type">long position
  if(((CCI(class="num">1)<class="num">80) && (CCI(class="num">2)>class="num">80)) || ((CCI(class="num">1)<-class="num">80) && (CCI(class="num">2)>-class="num">80)))
    {
    class=class="str">"cmt">//--- there is a signal to close a class="type">long position
    ExtSignalClose=CLOSE_LONG;
    ExtDirection="Long";
    }
class=class="str">"cmt">//--- check if there is a signal to close a class="type">class="kw">short position
  if(((CCI(class="num">1)>-class="num">80) && (CCI(class="num">2)<-class="num">80)) || ((CCI(class="num">1)>class="num">80) && (CCI(class="num">2)<class="num">80)))
    {
    class=class="str">"cmt">//--- there is a signal to close a class="type">class="kw">short position
    ExtSignalClose=CLOSE_SHORT;
    ExtDirection="Short";
    }
class=class="str">"cmt">//--- successful completion of the check
  class="kw">return(true);
  }

常见问题

打开终端自带策略示例目录,里面有按形态分类的EA文件夹,直接复制对应文件即可改。
内部用信号量累加多根K线条件,必须连续满足四段式执行链才下单,单根形态不触发。
小布可读取你的品种页自动跑一遍示例逻辑并标出信号密度,你只看结论不用手动翻代码。
在信号量判断前插一行CCI阈值判断,超买超卖区直接跳过,其余执行链原样保留。
把通用确认逻辑抽成模板函数,新形态只填形态条件,避免重复写四段式执行链。