MT4构建和开发跨平台网格EA

发布日期:2019-01-01 10:00:00


经常访问该网站的用户非常清楚, MQL5是开发自定义EA交易的最佳选择,不幸, 并非所有经纪人都允许创建MetaTrader 5帐户。 只需将您当前使用的经纪人绑定在一起即可,您也可以切换到将来仅提供MetaTrader 4的经纪商,您将如何处理在这种情况下开发的所有MQL5 EA交易?您是否将花费大量时间对它们进行修改以适应MQL4?也许,开发可以同时在MetaTrader 5和MetaTrader 4中使用的EA是否更合理?

条件编译将使我们能够开发可在MetaTrader 4和MetaTrader 5中使用的EA。该应用程序的语法如下:

#如果def __MQL5__       // MQL5代码    #其他 
      // MQL4代码    #万一  

这样,如果在MQL4和MQL5中实现了不同的功能,然后,我们将以两种方式实现它条件编译使您可以选择特定语言所必需的选项。

在开始EA开发之前,让我们描述网格交易策略的基础。

限价单是通过某些步骤而不是单个价格设置的。换一种说法,第一个限价单设置为高于当前价格一定距离,第二个极限价格设置为与第一个极限价格相同的距离,等等。订单数量和申请步骤不同,

  • 趋势上采购订单应高于当前价格,卖单应低于当前价格;
  • 在合并期间,卖单应高于当前价格,采购订单应低于当前价格。
  • 如果您不使用止损并获利,所有空缺职位,不管是盈利还是亏损,将会存在直到整体利润达到一定水平。之后,不受价格影响的所有未结头寸和限价单将被关闭。并设置一个新的网格。

    如果您使用止损并获利,然后获得利润,因为当价格向一个方向移动时,头寸的亏损被总利润所弥补。

    我们已经描述了上面最简单的网格的工作原理,您可以提供自己的选项来更改未结订单的方向, 增加了以相同价格开立多个订单的功能, 添加指标和其他网格。

    事实上,认为价格迟早会朝一个方向移动时会达到利润,即使最初的开门方向错误,这似乎是合理的。假设一开始,价格已经过调整,触发了两个命令,之后,价格开始向相反(主要趋势)方向移动。在这些情况下,迟早, 将以正确的方向打开两个或多个订单,一段时间后,我们的初始亏损将变成利润。

    我们将从模板开始开发EA,这将使我们立即看到将涉及哪些标准MQL函数。

    #属性 版权 “ Klymenko Roman(needtome @ icloud。com)” #属性 链接      “ https:// www。mql5。com / en / users / needtome” #属性    “ 1。00“ #属性 严格 // + ------------------------------------------------------------------ + // | EA交易初始化功能                                   | // + ------------------------------------------------------------------ + 整型 初始化()
      { //-    //-    返回INIT_SUCCEEDED);
      } // + ------------------------------------------------------------------ + // | EA交易初始化功能                            ?     | // + ------------------------------------------------------------------ + 虚空 OnDeinitconst 整型 原因)
      {
      } // + ------------------------------------------------------------------ + // | EA交易分时功能                                             | // + ------------------------------------------------------------------ + 虚空 OnTick()
      {
      } 虚空 OnChartEventconst 整型 ID,         //事件ID                      const &lparam,   //长整数的事件参数                    const &dparam, //双精度浮点类型的事件参数                    const &sparam) //字符串类型的事件参数     {
       }
    

    我们需要 OnChartEvent() 响应点击按钮的功能,下一个,我们将实现关闭所有按钮为了在达到所需利润或您只想停止EA时手动关闭所有交易代码头寸和订单。

    在任何EA中,最重要的功能可能就是下订单的能力。第一个问题在这里等着我们。在MQL5和MQL4中,订单的设置方式非常不同。为了以某种方式统一此功能,我们必须开发一个自定义功能来下订单。

    在MQL4中,订单类型由整型类型变量指定,在MQL5中使用ENUM_ORDER_TYPE枚举,MQL4中没有这样的枚举。因此,为了结合这两种方法,我们应该创建一个自定义枚举来设置订单类型。因此,我们将来将创建的功能将不依赖于MQL版本:

    枚举 TypeOfPos{
       MY_BUY,
       MY_SELL,
       MY_BUYSTOP,
       MY_BUYLIMIT,
       MY_SELLSTOP,
       MY_SELLLIMIT,
    }; 
    

    //发送订单的功能 布尔 pdxSendOrder(TypeOfPos mytype, 价钱, sl tp 卷, 乌龙 职位=0 评论= sym =){    //检查传入的值    如果(!StringLen(符号)){       sym =_符号;    }    整型 curDigits =(整型SymbolInfoInteger(符号, SYMBOL_DIGITS);    如果(sl>0){       sl =标准化Double(sl,curDigits);    }    如果(TP>0){       tp =标准化Double(TP,curDigits);    }    如果(价钱>0){       价格=标准化Double(价钱,curDigits);    }       #如果def __MQL5__       ENUM_TRADE_REQUEST_ACTIONS 动作=TRADE_ACTION_DEAL;       ENUM_ORDER_TYPE 类型=ORDER_TYPE_BUY;       开关(我的风格){          案件 MY_BUY:             动作=TRADE_ACTION_DEAL;             类型=ORDER_TYPE_BUY;             打破;          案件 MY_BUYSTOP:             动作=TRADE_ACTION_PENDING;             类型=ORDER_TYPE_BUY_STOP;             打破;          案件 MY_BUYLIMIT:             动作=TRADE_ACTION_PENDING;             类型=ORDER_TYPE_BUY_LIMIT;             打破;          案件 我的卖出:             动作=TRADE_ACTION_DEAL;             类型=ORDER_TYPE_SELL;             打破;          案件 MY_SELLSTOP:             动作=TRADE_ACTION_PENDING;             类型=ORDER_TYPE_SELL_STOP;             打破;          案件 MY_SELLLIMIT:             动作=TRADE_ACTION_PENDING;             类型=ORDER_TYPE_SELL_LIMIT;             打破;       }              MqlTradeRequest 要求       MqlTradeResult 结果       零内存(要求);              要求。行动=行动;       要求。sl = sl;       要求。tp = tp;       要求。symbol = sym;       如果(位置>0){          要求。position = position;       }       如果StringLen(评论)){          要求。评论=评论;       }       如果(行动!=TRADE_ACTION_SLTP){          如果(价钱>0){             要求。价格=价格;          }          如果(卷>0){             要求。体积=体积;          }          要求。类型=类型;          要求。magic = EA_Magic;          开关(useORDER_FILLING_RETURN){             案件 FOK:                要求。type_filling =ORDER_FILLING_FOK;                打破;             案件 返回:                要求。type_filling =ORDER_FILLING_RETURN;                打破;             案件 国际奥委会:                要求。type_filling =ORDER_FILLING_IOC;                打破;          }          要求。偏差=100;       }       如果订单发送(要求,结果)){          如果(结果。retcode ==10009 || 结果。retcode ==10008){             返回 真正;          }其他{             msgErr(GetLastError(), 结果。retcode);          }       }    #其他       整型 类型=OP_BUY;       开关(我的风格){          案件 MY_BUY:             类型=OP_BUY;             打破;          案件 MY_BUYSTOP:             类型=OP_BUYSTOP;             打破;          案件 MY_BUYLIMIT:             类型=OP_BUYLIMIT;             打破;          案件 我的卖出:             类型=OP_SELL;             打破;          案件 MY_SELLSTOP:             类型=OP_SELLSTOP;             打破;          案件 MY_SELLLIMIT:             类型=OP_SELLLIMIT;             打破;       }       if订单发送(符号, 类型, 卷, 价钱, 100, sl tp 评论, EA_Magic, 0)<0){          msgErr(GetLastError());       }其他{          返回 真正;       }       #万一    返回 ; }

    输入参数. 之后,使用条件编译来定义当前的MQL版本,并根据其规则设置顺序。过量 useORDER_FILLING_RETURN 输入参数用于MQL5,有了它的帮助我们根据代理支持的模式配置订单执行模式。因为 useORDER_FILLING_RETURN 输入参数仅对于MQL5 EA是必需的,再次使用条件编译将其添加:

    #ifdef __MQL5__    枚举 填充类型 //执行方式      {
          好的,// ORDER_FILLING_FOK       返回,// ORDER_FILLING_RETURN       国际奥委会// ORDER_FILLING_IOC      }; 
       输入 填充类型  useORDER_FILLING_RETURN =确定; //执行方式 #万一  

    如果未在EA设置中设置此参数,然后MT4建立EA平台,并且交易品种上已激活的任何头寸都被视为属于EA,这样,EA完全控制了它们。

    显示错误. 如果订单设置成功, 刚回来 真正.除此以外,将适当的错误代码传递给 msgErr() 功能,为了进一步分析和显示可理解的错误消息。此功能显示包含详细错误描述的本地化消息,在此处提供完整的代码是没有意义的,所以我只展示其中一些:

    虚空 msgErr(整型 呃, int retcode =0){
        curErr =;
       开关(呃){
          案件 1:
             curErr = langs。err1;
             打破; //      案例N: //         curErr = langs。错误 //         打破;       默认:
             curErr = langs。err0 +“:”+() 呃;
       }
       if(重新编码>0){
          curErr + =;
          开关(重新编码){
             案件 10004:
                curErr + = langs。retcode10004;
                打破; //         案例N: //            curErr + = langs。retcodeN; //            打破;       }
       }
       
       警报(curErr);
    }
    

    在线客服

    QQ客服
    QQ:
    1148561923
    扫码联系