设为首页 收藏本站 切换语言

MT5向导建立交易系统__总览及解析部分代码  

| 发表于 2022-12-27 17:44:27 | 显示全部楼层 |复制链接
© 本贴为 xxtz 原创/首发,严禁抄袭!
用MT5向导建立交易系统好处多多,操作简单,但后面的代码原理异常复杂,了解原理应该对更好的建立放心的交易系统有好处。这里做的是学习笔记,非计算机科班出身,只是爱好编程,所以记录有出入,请善意指出。

通过"Expert Advisor (generate)"产生的交易策略主要通过选择3模块,均存放在“\<client_terminal_directory>\MQL5\Include\Expert\”文件夹下:1.交易信号(Trade Signals),目前系统自带20个,2.移动止损(Trailing),3.资金管理(Money Management)来建立EA。这3个模块选择,是通过向导的3个相对应的页面选择完成的。
向导点击完成后,相应的代码自动产生了。向导产生的EA代码包括如下几个部分,不同交易信号算法有差异代码细节处会有不同,但大体结构差不多。如下以AMAsignals建立的EA为例,该EA设置了两个交易进出场条件,根据资金余额确定下单手数,固定止损。
1. 描述程序的proberties: copyright;link;version.,是向导的第一步的输入信息。
  1. //+------------------------------------------------------------------+
  2. //|                                                                       wizardAMA.mq5 |
  3. //|                                                                                           xxtz |
  4. //|                                                                                                  |
  5. //+------------------------------------------------------------------+
  6. #property copyright "xxtz"
  7. #property link      ""
  8. #property version   "1.00"
  9. //+--------------------------------
复制代码
2. 包含文件:
  1. //+------------------------------------------------------------------+
  2. //| Include                                                                                      |
  3. //+------------------------------------------------------------------+
  4. #include <Expert\Expert.mqh>
  5. //--- available signals
  6. #include <Expert\Signal\SignalAMA.mqh>
  7. //--- available trailing
  8. #include <Expert\Trailing\TrailingFixedPips.mqh>
  9. //--- available money management
  10. #include <Expert\Money\MoneyFixedRisk.mqh>
  11. //+-------------------------------------------
复制代码
3.EA的参数输入,这是在向导(下一步)的第二、三、四步输入的信息。
  1. //+------------------------------------------------------------------+
  2. //| Inputs                                                                                        |
  3. //+------------------------------------------------------------------+
  4. //--- inputs for expert
  5. input string             Expert_Title                  ="wizardAMA"; // Document name
  6. ulong                    Expert_MagicNumber            =6964;        //
  7. bool                     Expert_EveryTick              =false;       //
  8. //--- inputs for main signal
  9. input int                Signal_ThresholdOpen          =10;          // Signal threshold value to open [0...100]
  10. input int                Signal_ThresholdClose         =10;          // Signal threshold value to close [0...100]
  11. input double             Signal_PriceLevel             =0.0;         // Price level to execute a deal
  12. input double             Signal_StopLevel              =50.0;        // Stop Loss level (in points)
  13. input double             Signal_TakeLevel              =50.0;        // Take Profit level (in points)
  14. input int                Signal_Expiration             =4;           // Expiration of pending orders (in bars)
  15. input int                Signal_0_AMA_PeriodMA         =10;          // Adaptive Moving Average(10,...) Period of averaging
  16. input int                Signal_0_AMA_PeriodFast       =2;           // Adaptive Moving Average(10,...) Period of fast EMA
  17. input int                Signal_0_AMA_PeriodSlow       =30;          // Adaptive Moving Average(10,...) Period of slow EMA
  18. input int                Signal_0_AMA_Shift            =0;           // Adaptive Moving Average(10,...) Time shift
  19. input ENUM_APPLIED_PRICE Signal_0_AMA_Applied          =PRICE_CLOSE; // Adaptive Moving Average(10,...) Prices series
  20. input double             Signal_0_AMA_Weight           =1.0;         // Adaptive Moving Average(10,...) Weight [0...1.0]
  21. input int                Signal_1_AMA_PeriodMA         =20;          // Adaptive Moving Average(20,...) Period of averaging
  22. input int                Signal_1_AMA_PeriodFast       =2;           // Adaptive Moving Average(20,...) Period of fast EMA
  23. input int                Signal_1_AMA_PeriodSlow       =30;          // Adaptive Moving Average(20,...) Period of slow EMA
  24. input int                Signal_1_AMA_Shift            =0;           // Adaptive Moving Average(20,...) Time shift
  25. input ENUM_APPLIED_PRICE Signal_1_AMA_Applied          =PRICE_CLOSE; // Adaptive Moving Average(20,...) Prices series
  26. input double             Signal_1_AMA_Weight           =1.0;         // Adaptive Moving Average(20,...) Weight [0...1.0]
  27. //--- inputs for trailing
  28. input int                Trailing_FixedPips_StopLevel  =300;         // Stop Loss trailing level (in points)
  29. input int                Trailing_FixedPips_ProfitLevel=500;         // Take Profit trailing level (in points)
  30. //--- inputs for money
  31. input double             Money_FixRisk_Percent         =10.0;        // Risk percentage
复制代码
其中前3行(Expert_Title, Expert_MagicNumber and Expert_EveryTick)所有向导产生的EA都是有的。
Expert_MagicNumber:会用在trade requests的参数中(就是下单时候要用到)。
Expert_EveryTick: 设置EA工作模式,如果是true, 会在每个新tick进来都调用句柄函数(检查交易条件,执行交易,仓位的移动止损止盈),他会响应程序最后的OnTick事件产生作用。
//--- inputs for main signal  这个部分是CsignalAMA类实例化时用到的参数。这块是入场核心,未来看是否有时间单篇详解Signal。
//--- inputs for trailing         这个部分是CTrailingStopFixedPips类实例化时用到的参数。移动到指定距离修改止盈和止损位置。
//--- inputs for money         这个部分是执行CMoneyFixedRisk类,重载其父类CExpertMoney一些方法【CheckOpenLong,CheckOpenShort,CheckClose】,CMoneyFixedRisk考虑即将下单如果止损后的资金余额的百分比的下单手数[使用了算法loss=OrderCalcProfit(trade_operation,symbol,1.0,price_open=指定的价格一般根据多空是ASK或BID,price_close=sl,profit),然后lot=MathFloor(m_account.Balance()*m_percent/loss/100.0/stepvol)*stepvol]。换句话说,手数是满足,这单止损后,账户资金还可以同样的单子再损100/risk个单子。
4.声明ExtExper对象,它是CExpert类的实例化。
  1. //+------------------------------------------------------------------+
  2. //| Global expert object                                                                 |
  3. //+------------------------------------------------------------------+
  4. CExpert ExtExpert;
复制代码
ExtExper对象包含了CExpertSignal(trade signals的基类),CExpertMoney(资金和风险管理的基类),CExpertTrailing(仓位的移动的基类)。 该类还包含CExpertTrade(交易),CSymbolnfo(交易品种信息),CAccountInfo(账户的信息),CPositionInfo(已开仓仓位信息),CorderInfo(挂单信息),CIndicators(内置指标的信息)。

5.为了给EA设置参数,需要给对应的类创建实例,在ExExpert类中给创建的对象指定引用。
下面就是在int OnInit()种初始化和配置ExExperts类对象。
5.1.使用了Init方法,对symbol,timeframe,everytick调用方式(是-不加入时间周期,否-加入时间周期),EA的ID(magic),3位或5位小数的位数digits_adjust=10倍调整(m_adjusted_point=m_symbol.Point()*digits_adjust)等。
  1. int OnInit()
  2.   {
  3. //--- Initializing expert
  4.    if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
  5.      {
  6.       //--- failed
  7.       printf(__FUNCTION__+": error initializing expert");
  8.       ExtExpert.Deinit();
  9.       return(INIT_FAILED);
  10.      }
复制代码
,该阶段也创建了私有类的对象用作signals,trailing and money management对象如下。

   //--- trading objects
   CExpertTrade     *m_trade;                    // trading object
   CExpertSignal    *m_signal;                   // trading signals object
   CExpertMoney     *m_money;                    // money manager object
   CExpertTrailing  *m_trailing;                 // trailing stops object
   bool              m_check_volume;             // check and decrease trading volume before OrderSend
5.2创建和配置信号Signal(白话就是 进出场条件)对象属性,系统自带20个signal,也可以自己编写signal。
  1. //--- Creating signal
  2.    CExpertSignal *signal=new CExpertSignal;
  3.    if(signal==NULL)
  4.      {
  5.       //--- failed
  6.       printf(__FUNCTION__+": error creating signal");
  7.       ExtExpert.Deinit();
  8.       return(INIT_FAILED);
  9.      }
  10. //---
  11.    ExtExpert.InitSignal(signal);
  12.    signal.ThresholdOpen(Signal_ThresholdOpen);
  13.    signal.ThresholdClose(Signal_ThresholdClose);
  14.    signal.PriceLevel(Signal_PriceLevel);
  15.    signal.StopLevel(Signal_StopLevel);
  16.    signal.TakeLevel(Signal_TakeLevel);
  17.    signal.Expiration(Signal_Expiration);
  18. //--- Creating filter CSignalAMA
  19.    CSignalAMA *filter0=new CSignalAMA;
  20.    if(filter0==NULL)
  21.      {
  22.       //--- failed
  23.       printf(__FUNCTION__+": error creating filter0");
  24.       ExtExpert.Deinit();
  25.       return(INIT_FAILED);
  26.      }
  27.    signal.AddFilter(filter0);
  28. //--- Set filter parameters
  29.    filter0.PeriodMA(Signal_0_AMA_PeriodMA);
  30.    filter0.PeriodFast(Signal_0_AMA_PeriodFast);
  31.    filter0.PeriodSlow(Signal_0_AMA_PeriodSlow);
  32.    filter0.Shift(Signal_0_AMA_Shift);
  33.    filter0.Applied(Signal_0_AMA_Applied);
  34.    filter0.Weight(Signal_0_AMA_Weight);
  35. //--- Creating filter CSignalAMA
  36.    CSignalAMA *filter1=new CSignalAMA;
  37.    if(filter1==NULL)
  38.      {
  39.       //--- failed
  40.       printf(__FUNCTION__+": error creating filter1");
  41.       ExtExpert.Deinit();
  42.       return(INIT_FAILED);
  43.      }
  44.    signal.AddFilter(filter1);
  45. //--- Set filter parameters
  46.    filter1.PeriodMA(Signal_1_AMA_PeriodMA);
  47.    filter1.PeriodFast(Signal_1_AMA_PeriodFast);
  48.    filter1.PeriodSlow(Signal_1_AMA_PeriodSlow);
  49.    filter1.Shift(Signal_1_AMA_Shift);
  50.    filter1.Applied(Signal_1_AMA_Applied);
  51.    filter1.Weight(Signal_1_AMA_Weight);
复制代码
配置信号对象:

  5.2.1  创建信号对象(New CExpertSignal)和设置该对象的参数(如ExExpert.InitSignal(signal); signal.ThresholdOpen(Signal_ThresholdeOpen);等等);
  5.2.2  创建交易信号模块(白话就是 具体的进出场条件,这里有2个,分别是filter0和filter1)(如CSignalAMA *filter0=new CSignalAMA;)并将其加入CExpertSingal类实例总(如signal.AddFilter(filter0););
  5.2.3  设置信号模块的参数(白话就是 具体的进出场条件要用到什么指标呢,比如这里要用均线,设置均线周期个数等等)(如filter0.PeriodMA(Signal_0_AMA_PeriodMA);)

5.3 创建和配置仓位的移动trailing属性(trailing白话就是  随着价格变化,移动止盈或移动止损的变化调整),MT5自带选项有:根据固定点数FixedPips,均线MA,抛物线ParabolicSAR设置移动属性,也可以None不设移动属性,
5.3.1 创建trailing对象
  1. //--- Creation of trailing object
  2.    CTrailingFixedPips *trailing=new CTrailingFixedPips;
  3.    if(trailing==NULL)
  4.      {
  5.       //--- failed
  6.       printf(__FUNCTION__+": error creating trailing");
  7.       ExtExpert.Deinit();
  8.       return(INIT_FAILED);
  9.      }
复制代码
5.3.2 将创建的trailing对象加入expert,通过ExtExpert.InitTrailing方法设置了magic,everytick,该方法里也有调用其父类ExpertBase的Init方法,其设置了symbol,adjust_point,period等
  1. //--- Add trailing to expert (will be deleted automatically))
  2.    if(!ExtExpert.InitTrailing(trailing))
  3.      {
  4.       //--- failed
  5.       printf(__FUNCTION__+": error initializing trailing");
  6.       ExtExpert.Deinit();
  7.       return(INIT_FAILED);
  8.      }
复制代码
5.3.2 设置trailing对象参数
  1. //--- Set trailing parameters
  2.    trailing.StopLevel(Trailing_FixedPips_StopLevel);
  3.    trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
复制代码
5.4 创建和配置资金风险管理对象(白话就是  下单手数如何确定),步骤同上。系统自带选项有:FixedLot固定手数,FixMargin固定权益(觉得只是不带杠杆才可能采用这个),FixedRisk固定余额百分比,SizeOptimized根据历史单优化下单手数,None最小下单手数。
5.4.1 创建该对象
  1. //--- Creation of money object
  2.    CMoneyFixedRisk *money=new CMoneyFixedRisk;
  3.    if(money==NULL)
  4.      {
  5.       //--- failed
  6.       printf(__FUNCTION__+": error creating money");
  7.       ExtExpert.Deinit();
  8.       return(INIT_FAILED);
  9.      }
复制代码
5.4.2 将该对象加入Expert中
  1. //--- Add money to expert (will be deleted automatically))
  2.    if(!ExtExpert.InitMoney(money))
  3.      {
  4.       //--- failed
  5.       printf(__FUNCTION__+": error initializing money");
  6.       ExtExpert.Deinit();
  7.       return(INIT_FAILED);
  8.      }
复制代码
5.4.3 设置该对象的参数
  1. //--- Set money parameters
  2.    money.Percent(Money_FixRisk_Percent);
  3. //--- Check all trading objects parameters
  4.    if(!ExtExpert.ValidationSettings())
  5.      {
  6.       //--- failed
  7.       ExtExpert.Deinit();
  8.       return(INIT_FAILED);
  9.      }
  10. //--- Tuning of all necessary indicators
复制代码
5.5 初始化类中使用的所有指标。
在上面的交易信号,移动管理,资金风险管理对象初始化后, ExExpert调用InitIndicators成员函数,它初始化之前初始化对象需要使用的指标,获取需要的时间序列数据(检查价格时间序列(开高收低)和其他时间序列(时间、成交量等))
  1. //--- Tuning of all necessary indicators
  2.    if(!ExtExpert.InitIndicators())
  3.      {
  4.       //--- failed
  5.       printf(__FUNCTION__+": error initializing indicators");
  6.       ExtExpert.Deinit();
  7.       return(INIT_FAILED);
  8.      }
  9. //--- ok
  10.    return(INIT_SUCCEEDED);
复制代码
6. 在 OnDeinit, OnTick, OnTrade and OnTimer 时间句柄总调用相应的ExExpert类中的相应方法实现有关功能。OnTick会处理对于新报价事件出现后,我们之前有关设置Expert_EveryTick工作模式的这儿起作用了,OnTrade会处理订单,仓位等的变化,我们之前有关设置trade检查多空仓位,trailing设置,risk决定的手数等这儿起作用了。 一般编写EA代码,这里是重头戏,但是这里代码多少看,却是最简单的地方了。
  1. //+------------------------------------------------------------------+
  2. //| Deinitialization function of the expert                                     |
  3. //+------------------------------------------------------------------+
  4. void OnDeinit(const int reason)
  5.   {
  6.    ExtExpert.Deinit();
  7.   }
  8. //+------------------------------------------------------------------+
  9. //| "Tick" event handler function                                                   |
  10. //+------------------------------------------------------------------+
  11. void OnTick()
  12.   {
  13.    ExtExpert.OnTick();
  14.   }
  15. //+------------------------------------------------------------------+
  16. //| "Trade" event handler function                                                 |
  17. //+------------------------------------------------------------------+
  18. void OnTrade()
  19.   {
  20.    ExtExpert.OnTrade();
  21.   }
  22. //+------------------------------------------------------------------+
  23. //| "Timer" event handler function                                                |
  24. //+------------------------------------------------------------------+
  25. void OnTimer()
  26.   {
  27.    ExtExpert.OnTimer();
  28.   }
复制代码

至此,MT5向导代码初步解析完成了,可见向导产生的代码与我们一般手工编写的代码有很大的不同,不符合一般习惯思维方式,但它更加模块化,理论上效率应该更高,熟练后维护更加方便。
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论10

daerwushen
DD
| 发表于 2022-12-27 18:46:58 | 显示全部楼层
头文件能发一下吗
举报

点赞 评论 使用道具

xxtz
DDD
 楼主 | 发表于 2022-12-27 19:13:23 | 显示全部楼层
daerwushen 发表于 2022-12-27 18:46
头文件能发一下吗

文中包括了程序的所有了
举报

点赞 评论 使用道具

daerbushen
DD
| 发表于 2022-12-27 21:00:40 | 显示全部楼层
感谢分享啊
举报

点赞 评论 使用道具

daerwushen
DD
| 发表于 2022-12-27 23:14:25 | 显示全部楼层
xxtz 发表于 2022-12-27 19:13
文中包括了程序的所有了

哦哦哦好的
举报

点赞 评论 使用道具

daerbushen
DD
| 发表于 2022-12-29 09:30:12 | 显示全部楼层
很详细啊
举报

点赞 评论 使用道具

dongxu64
DDD
| 发表于 2022-12-30 09:07:26 | 显示全部楼层
介绍的很详细
举报

点赞 评论 使用道具

qwe963258
DDD
| 发表于 2023-1-1 12:28:52 | 显示全部楼层
太专业了 要慢慢研究一下
举报

点赞 评论 使用道具

simonqian
DD
| 发表于 2023-1-13 17:59:39 | 显示全部楼层
太详细了,牛逼
举报

点赞 评论 使用道具

ken138888
B
| 发表于 2023-1-14 07:02:57 | 显示全部楼层
请问有零基础的教程吗?
举报

点赞 评论 使用道具

xxtz
DDD
 楼主 | 发表于 2023-1-14 14:45:47 | 显示全部楼层
ken138888 发表于 2023-1-14 07:02
请问有零基础的教程吗?

是我自己整理的
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

天眼云VPS
简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)