English Русский Español Deutsch 日本語 Português
preview
解构客户端交易策略的示例

解构客户端交易策略的示例

MetaTrader 5示例 | 14 三月 2025, 08:31
562 0
Artyom Trishkin
Artyom Trishkin

目录


概述

20 世纪 90 年代初,技术分析师 Steve Nison 开发的日本蜡烛图和蜡烛图形态被引入西方金融市场。从那时起,对交易者来说,蜡烛图形态的了解就变得与应用经典技术分析的能力一样重要。

一段时间以来,客户端的 EA 目录中出现了一个新的 Free Robots 文件夹:


该文件夹包含 28 个 EA - 交易策略的示例,可供您独立学习和应用策略中规定的原则进行自己的开发。Free Robots 文件夹中介绍的交易策略是根据指标信号支持的蜡烛图形态进行交易的 EA。

为了确认蜡烛图形态信号,需要使用四个振荡器指标之一的值:CCI MFIRSI随机振荡指标。因此,我们展示了 7 个基于蜡烛图形态进行交易的 EA 以供研究(每个 EA 有两种形态 - 一种用于多头仓位,一种用于空头仓位),并且每个 EA 都以四份副本的形式呈现 - 根据确认指标的数量。


交易策略概览

每种交易策略都使用两种类似的形态,只是方向和名称不同:

1.三黑鸦三白兵


三白兵:买入形态 — 3 根连续的白色蜡烛,且烛体大小足够。用作下行(看跌)趋势可能逆转的信号。

三黑鸦:卖出形态 — 3 根连续的黑色蜡烛,且烛体大小足够。用作上行(看涨)趋势可能逆转的信号。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • BlackCrows WhiteSoldiers CCI.mq5 — 基于三白兵三黑鸦形态的 EA,通过 CCI 指标确认信号。
  • BlackCrows WhiteSoldiers MFI.mq5 — 基于三白兵三黑鸦形态的 EA,通过 MFI 指标确认信号。
  • BlackCrows WhiteSoldiers RSI.mq5 — 基于三白兵三黑鸦形态的 EA,通过 RSI 指标确认信号。
  • BlackCrows WhiteSoldiers Stoch.mq5 — 基于三白兵三黑鸦形态的 EA,通过随机振荡指标确认信号。

2.多空吞噬


多头吞噬:买入形态 在下降趋势中,当一根看跌烛形后跟随着一根看涨烛形,而看涨烛形的主体完全吞没了看跌烛形的主体时,就会发生“多头吞噬”。这是下行(看跌)趋势可能逆转的信号。

空头吞噬:卖出形态 在上涨趋势中,当一根看涨烛形后跟随着一根看跌烛形,而看跌烛形的主体完全吞没了看涨烛形的主体时,就会发生“空头吞噬”。这是上升(看涨)趋势可能出现逆转的信号。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • BullishBearish Engulfing CCI.mq5 — 基于多头吞噬和空头吞噬形态的 EA,通过 CCI 指标确认信号。
  • BullishBearish Engulfing MFI.mq5 — 基于多头吞噬和空头吞噬形态的 EA,通过 MFI 指标确认信号。
  • BullishBearish Engulfing RSI.mq5 — 基于多头吞噬和空头吞噬形态的 EA,通过 RSI 指标确认信号。
  • BullishBearish Engulfing Stoch.mq5 — 基于多头吞噬和空头吞噬形态的 EA,通过随机振荡指标确认信号。


3.多空孕育线


多头孕育线:买入形态 在下降趋势中,当一根长看跌烛形后跟一根看涨烛形且其主体完全包含在看跌烛形的主体内时,就会出现“多头孕育线”形态。这是下行(看跌)趋势可能逆转的信号。

空头孕育线:卖出形态 在上涨趋势中,当一根长看涨烛形后跟一根看跌烛形且其主体完全包含在看涨烛形的主体内时,就会出现“空头孕育线”形态。这是上升(看涨)趋势可能出现逆转的信号。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • BullishBearish Harami CCI.mq5 — 基于多头孕育线和空头孕育线形态的 EA,通过 CCI 指标确认信号。
  • BullishBearish Harami MFI.mq5 — 基于多头孕育线和空头孕育线形态的 EA,通过 MFI 指标确认信号。
  • BullishBearish Harami RSI.mq5 — 基于多头孕育线和空头孕育线形态的 EA,通过 RSI 指标确认信号。
  • BullishBearish Harami Stoch.mq5 — 基于多头孕育线和空头孕育线形态的 EA,通过随机振荡指标确认信号。


4.多空相逢线


多头相逢线:买入形态 “多头相逢线”是由具有相同(或非常接近)收盘价的看跌烛形和看涨烛形组合而成。两根烛形的主体长度均大于平均值。这是下行(看跌)趋势可能逆转的信号。

空头相逢线:卖出形态 “空头相逢线”是具有相同(或非常接近)收盘价的看涨烛形和看跌烛形的组合。两根烛形的主体长度均大于平均值。这是上升(看涨)趋势可能出现逆转的信号。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • BullishBearish MeetingLines CCI.mq5 — 基于多头相逢线和空头相逢线形态的 EA,通过 CCI 指标确认信号。
  • BullishBearish MeetingLines MFI.mq5 — 基于多头相逢线和空头相逢线形态的 EA,通过 MFI 指标确认信号。
  • BullishBearish MeetingLines RSI.mq5 — 基于多头相逢线和空头相逢线形态的 EA,通过 RSI 指标确认信号。
  • BullishBearish MeetingLines Stoch.mq5 — 基于多头相逢线和空头相逢线形态的 EA,通过随机振荡指标确认信号。


5.乌云盖顶和刺透线


刺透线:买入形态 “刺透线”是看跌烛形和看涨烛形的组合。它是乌云盖顶形态的相反类似形态。首先,有一根大黑烛形,第二根烛形的开盘价较低(低于前一根烛形的最低价),收盘价高于第一根烛形的中部。这是下行(看跌)趋势可能逆转的信号。

乌云盖顶:卖出形态 “乌云盖顶”是看涨烛形和看跌烛形的组合。首先,有一根大白烛形,下一根烛形的开盘价较高(高于之前的最高价),收盘价低于第一根烛形的中间价。这是少数几个考虑到高低价格的情况之一。这是上升(看涨)趋势可能出现逆转的信号。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • DarkCloud PiercingLine CCI.mq5 — 基于刺透线和乌云盖顶的 EA,通过 CCI 指标确认信号。
  • DarkCloud PiercingLine MFI.mq5 — 基于刺透线和乌云盖顶的 EA,通过 MFI 指标确认信号。
  • DarkCloud PiercingLine RSI.mq5 — 基于刺透线和乌云盖顶的 EA,通过 RSI 指标确认信号。
  • DarkCloud PiercingLine Stoch.mq5 — 基于刺透线和乌云盖顶的 EA,通过随机振荡指标确认信号。


6.上吊线和锤子线


锤子线:买入形态 “锤子线”形态是一种在下降趋势后出现的具有较小主体和较长下影线的烛形。锤子线是熊市即将结束的强烈信号。

上吊线:卖出形态 ”上吊线”形态是一种在上升趋势后出现的具有较小主体和较长下影线的烛形。上吊线预示着上升趋势的结束。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • HangingMan Hammer CCI.mq5 — 基于锤子线和上吊线形态的 EA,通过 CCI 指标确认信号。
  • HangingMan Hammer MFI.mq5 — 基于锤子线和上吊线形态的 EA,通过 MFI 指标确认信号。
  • HangingMan Hammer RSI.mq5 — 基于锤子线和上吊线形态的 EA,通过 RSI 指标确认信号。
  • HangingMan Hammer Stoch.mq5 — 基于锤子线和上吊线形态的 EA,通过随机振荡指标确认信号。


7.晨昏十字星 


晨星:买入形态 “晨星”由三根蜡烛组成,出现在下降趋势中:
1.一根长黑色烛形后面跟着一根小实体(颜色无所谓)的蜡烛,且该小实体与黑色烛形的实体不相交。
2.第二根蜡烛的主体较小,意味着市场已从下降趋势转为多头和空头的力量平衡。
3.此形态的第三根烛形是看涨烛形。它的主体通常不与第二根蜡烛的主体相交,并且收盘价位于第一根(看跌)烛形的主体内。
该形态是下行(看跌)趋势可能逆转的信号。

早晨十字星:买入形态 “早晨十字星”是晨星形态的一个特例。在这种情况下,该形态的第二根蜡烛具有相同的开盘价和收盘价。换句话说,它没有实体。该形态是下行(看跌)趋势可能逆转的信号。

黄昏之星:卖出形态 “黄昏之星”也由三根蜡烛组成,出现在上升趋势中:
1.一根长白色烛形后面跟着一根小烛体(颜色无所谓),且小烛体与白色烛形的主体不相交。
2.第二根烛形的主体较小,意味着市场已从上升趋势转为多头和空头的力量平衡。
3.该形态的第三根蜡烛是黑色烛形,其主体通常不与第二根烛形的主体相交,收盘价位于第一根(看涨)蜡烛的主体内部。
该形态是上升(看涨)趋势可能逆转的信号。

黄昏十字星:卖出模式 “黄昏十字星”是黄昏之星形态的一个特例。在这种情况下,该形态的第二根蜡烛具有相同的开盘价和收盘价。换句话说,它没有实体。该形态是下行(看跌)趋势可能逆转的信号。

根据上面描述的蜡烛图形态,终端提供了四种训练 EA:

  • MorningEvening StarDoji CCI.mq5 — 基于晨星 (早晨十字星) 和黄昏星 (黄昏十字星) 形态的 EA,通过 CCI 指标确认信号。
  • MorningEvening StarDoji MFI.mq5 — 基于晨星 (早晨十字星) 和黄昏星 (黄昏十字星) 形态的 EA,通过 MFI 指标确认信号。
  • MorningEvening StarDoji RSI.mq5 — 基于晨星 (早晨十字星) 和黄昏星 (黄昏十字星) 形态的 EA,通过 RSI 指标确认信号。
  • MorningEvening StarDoji Stoch.mq5 — 基于晨星 (早晨十字星) 和黄昏星 (黄昏十字星) 形态的 EA,通过随机振荡指标确认信号。


EA 中使用的所有指标均用于确认进入多头或空头仓位(如果蜡烛图形态发出对应信号),并根据指标信号平仓。

下表展示了用于确认仓位进入和平仓的指标值:

指标
买入
卖出
 CCI
CCI (1)<-50 — 最后一个完成柱上的 CCI 指标值小于 -50
CCI (1)>50 — 最后一个完成柱上的 CCI 指标值大于 50
 MFI
MFI(1)<40 — 最后一个完成柱的 MFI 指标值小于 40
MFI(1)>60 — 最后一个完成柱的 MFI 指标值大于 60
 RSI
RSI(1)<40 — 最后一个完成柱上的 RSI 指标值小于 40
RSI(1)>60 — 最后一个完成柱上的 RSI 指标值大于 60
 随机振荡指标
随机信号 (1) < 30 — 最后一个完成柱上的随机信号线值小于 30
随机信号 (1) > 70 — 最后一个完成柱上的随机信号线值大于 70

当指标值跨越极端区域边界时,即进入或退出超买或超卖区域,就会出现平仓技术指标信号。

指标
平多头头寸
 平空头头寸
 CCI
CCI 指标向下穿过 80 或 -80 水平
CCI 指标向上穿过 -80 或 80 水平
 MFI
MFI 指标向下穿过 70 或 30 水平
MFI 指标向上穿过 30 或 70 水平
 RSI
RSI 指标向下穿过 70 或 30 水平
RSI 指标向上穿过 30 或 70 水平
 随机振荡指标
随机指标信号线向下穿过 80 或 20 水平
随机指标信号线向上穿过 20 或 80 水平

一个单独的 EA 作用于一对相反方向的烛形形态,并以四种版本的确认指标呈现。

因此,我们有 7 * 4 = 28 个不同的 EA,按照单一结构进行组织。让我们使用流程图来探讨所有 EA 的统一逻辑。


一般逻辑

如果您在代码编辑器中打开任何提到的 EA 并研究其代码,您将看到一个简单的结构:


EA 的逻辑基于全局级别声明的标志和变量:

  • ExtSignalOpen — 仓位开启信号。1 — 买入, -1 — 卖出, 0 — 无信号,
  • ExtSignalClose — 平仓信号。2 — 平多头,-2 — 平空头,0 — 无信号,
  • ExtPatternInfo — 当前找到的形态的文本描述,
  • ExtDirection — 开仓方向。文字描述,
  • ExtPatternDetected — 发现形态标志 ( true / false ),
  • ExtConfirmed — 指标确认的形态信号标志 ( true / false ),
  • ExtCloseByTime — 表示需要根据持仓时间关闭的标志( true / false ),
  • ExtCheckPassed — 成功数据获取标志 ( true / false )。
    全局设置的标志本质上是用于定义 EA 行为逻辑的信号量。文本变量接收的是用于在日志中显示数据的值。
    EA 逻辑是连续的,由 OnInit() 处理函数中的标志初始化块和 OnTick() 处理函数中的四个处理阶段组成。
    • 第 1 阶段 — 检查新柱并更新环境和标志状态,
    • 第 2阶段 — 开仓,
    • 第 3 阶段 — 平仓,
    • 第 4 阶段 — 仓位有效期结束后平仓。

    我们来探讨一下 EA 的操作逻辑。

    EA 运行逻辑流程图


    流程图显示了 EA 工作的四个阶段:

    第 1 阶段:

    • 检查是否有新柱形。
      如果是新柱形,请检查当前状态:
      • 检查烛形是否形成形态。
      • 如果发现形态,请使用指标检查模式信号确认。
      • 如果确认了形态信号,则在日志中显示有关发现的形态的信息并设置开仓标志。

    第 2 阶段:

    • 如果有开仓信号而该仓位不存在,则在日志中显示有关该信号的消息并开仓。
    • 若仓位开启,则重置仓位开启标志。

    第 3 阶段:

    • 如果有平仓信号且存在这样的仓位,则在日志中打印有关平仓信号的消息并平仓。
    • 若无持仓,就重置平仓标志。

    第 4 阶段:

    • 如果在有效期到期后有平仓信号且存在这样的仓位,则以到期的有效期来平仓。
    • 若无持仓,则重置标志。


    函数列表

    让我们来看看 EA 函数列表及其简要说明:

    CheckState() — 检查环境状态:

    • 如果未找到形态,则返回 false
    • 如果在使用指标确认形态时收到错误,则返回 false
    • 如果指标信号没有确认该形态,则重置开仓标志。
    • 如果我们想在仓位有效期结束后设置平仓,则需要设置相应的标志。

    PositionOpen() — 开仓:

    • 交易环境数据已更新。
    • 根据信号和相应的仓位类型,止损和止盈价格会根据开盘价和服务器限制调整为可接受的值。
    • 开启仓位。
    • 如果未开仓,则在日志中报告错误并返回 false
    • 开启成功则返回 true

    CloseBySignal() — 根据信号平仓:

    • 如果没有平仓信号,则从函数返回。
    • 需要平仓的仓位类型由信号方向决定。
    • 所有由信号方向决定类型的 EA 开仓均已关闭。

    CloseByTime() — 关闭有效期已到期的仓位:

    • 如果没有 EA 开仓,则从函数返回。
    • 所有已过期的 EA 开仓位均已关闭。

    PositionExist() — 返回信号方向的仓位标志:

    • 确定与信号方向对应的仓位类型。
    • 返回由信号方向决定类型的 EA 开仓标志。

    PositionExpiredByTimeExist() — 返回已过期仓位的标志:

    • 定义了仓位有效期的柱数。
    • 如果仓位有效期超出设置中指定的柱数,则返回仓位的标志。

    BarsHold() — 返回持仓有效期柱数:

    • 确定并返回仓位开仓时间和当前服务器时间之间的柱数。

    Open()、Close()、Low()、High() — 根据索引返回相应柱的价格:

    • 从指定的柱中请求相应的价格。
    • 如果没有获取价格,则会设置错误标志。
    • 返回获取的价格。

    MidPoint()、MidOpenClose() 和 AvgBody() 返回计算的平均价格。

    CheckPattern() — 检查形态是否存在:

    • 形态搜索算法在空头方向上执行。
    • 如果找到了形态,则设置找到的形态的标志并返回 true
    • 形态搜索算法在多头方向上执行。
    • 如果找到形态,则设置找到形态的标志,并且返回 true
    • 如果未找到任何形态,则返回一个错误标志,可以在获取价格的函数中将其设置为 false

    CheckConfirmation() — 检查并返回指标信号确认的形态信号的标志。

    CheckCloseSignal() — 根据指标值检查平仓信号的条件。如果信号存在,则设置平仓标志。


    结论

    Experts\Free Robots 文件夹中的所有 28 个 EA 都遵循相同的逻辑。它们之间的唯一区别在于搜索烛形形态的算法以及从四个指标接收数据来确认形态信号。因此,这些 EA 中的任何一个都可以用作创建其他 EA 的模板,这些 EA 可以在其他烛形形态上运行并从其他指标接收形态确认。为此,我们需要做的就是改变在 CheckState() 函数中调用的 CheckPattern () 函数中搜索多头和空头方向形态的逻辑,该函数在 EA 操作的第一阶段中访问:

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

    为了更改确认指标,我们只需将 CCI 等指定的指标属性替换为输入参数中必要的属性:

    //--- Input parameters
    input int  InpAverBodyPeriod=12;    // period for calculating average candlestick size
    input int  InpPeriodCCI     =37;    // CCI period
    input ENUM_APPLIED_PRICE InpPrice=PRICE_CLOSE; // price type

    在 OnInit() 处理函数中,将创建 CCI 的代码块替换为创建另一个指标的代码块:

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

    接下来,在确认信号的 CheckConfirmation() 函数中以及通过指标信号平仓的 CheckCloseSignal() 函数中,使用具有确认多头和空头方向形态所需值的新指标数据

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


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

    因此,这些 EA 代表了创建和测试自定义算法的良好模板,用于检查各种烛形形态并通过几乎任何合适的指标进行确认。

    本文由MetaQuotes Ltd译自俄文
    原文地址: https://www.mql5.com/ru/articles/15479

    使用MQL5中的动态时间规整进行模式识别 使用MQL5中的动态时间规整进行模式识别
    在本文中,我们探讨了动态时间规整(Dynamic Time Warping,DTW)作为识别金融时间序列中预测模式的一种方法。我们将深入了解其工作原理,并在纯MQL5语言中展示其实现方法。
    MQL5集成:Python MQL5集成:Python
    Python是一种广为人知且流行的语言,具有许多功能,尤其是在金融、数据科学、人工智能和机器学习领域。Python也是一种强大的工具,可以在交易中发挥作用。MQL5允许我们将这种强大的语言作为集成工具,以高效地实现我们的目标。在本文中,我们将在了解一些Python的基本信息后,分享如何在MQL5中使用Python作为集成工具。
    交易中的神经网络:时间序列的分段线性表示 交易中的神经网络:时间序列的分段线性表示
    这篇文章与我以前发表的有些不同。在本文中,我们将谈谈时间序列的另类表示。时间序列的分段线性表示是一种利用涵盖小间隔的线性函数逼近时间序列的方法。
    从基础到中级:变量 (III): 从基础到中级:变量 (III):
    今天,我们将学习如何使用预定义的 MQL5 语言变量和常量。此外,我们将分析另一种特殊类型的变量:函数。知道如何正确使用这些变量可能意味着一个有效的应用程序和一个无效的应用程序之间的区别。为了理解这里介绍的内容,有必要理解前几篇文章中讨论的材料。