MQL5向导 - 基于价格交叉移动平均线并由ADX确认的交易信号 - MetaTrader 5EA
- 显示:
- 3688
- 等级:
- 已发布:
- 2013.10.01 13:18
- 已更新:
- 2016.11.22 07:33
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
MQL5 向导 允许自动创建EA 交易代码。详细信息参考 使用MQL5 向导快速创建EA交易。
这里我们考察基于价格交叉移动平均线指标并由ADX指标确认的策略。(当使用MQL5 向导自动创建EA 交易时)将该策略命名为“基于价格交叉移动平均线并由ADX确认的信号” 。
交易信号:
- •买入:上一结束柱子的收盘价高于移动平均线,移动平均线在当前和最近结束的柱子上上升。
- •卖出:上一结束柱的收盘价低于移动平均线,移动平均线在当前和最近结束的柱子上下降。
- •为了过滤虚假信号,它检查趋势斜率(ADX>ADXmin)并通过Directional Movement Indexes检查趋势方向(DI+ and DI-)。
图1. 基于价格交叉移动平均线并由ADX确认的交易信号
交易信号
交易策略在CSignalADX_MA类实现, 它有一些受保护的方法可简化对指标和价格的访问:
double PlusADX(int ind) // 返回某柱上DI+线的值 double MainADX(int ind) // 返回某柱上主线的值 double MinusADX(int ind) // 返回某柱上DI-线的值 double EMA(int ind) // 返回某柱上指数移动平均线的值 double Close(int ind) // 返回某柱上收盘价 double StateADX(int ind) // 返回某柱上DI+和DI-线的差值 double StateEMA(int ind) // 如指数移动平均数增加,返回正数;如指数移动平均数减少,返回负数 double StateClose(int ind) // 返回收盘价和移动平均线的差值
1. 多头开仓
多头开仓的条件:
- StateEMA(0)<0 и StateEMA(1)>0: moving average increases on the current and last completed bar;
- StateClose(1)>0: 上一结束柱子的收盘价高于移动平均线;
- MainADX(0)>minimum_ADX: 当前柱子上的ADX值高于指定的最小的值(检查趋势强度);;
- StateADX(0)>0: 当前柱子上的DI+高于DI-。
//+------------------------------------------------------------------+ //| 检查多头开仓的条件 (买入) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- 条件1:移动平均线在当前和前面结束柱子上上升 bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 条件2:前一结束柱子上的收盘价高于移动平均线 bool Buy_Condition_2=(StateClose(1)>0); //--- 条件3:当前柱子上的ADX值高于指定的最小值(趋势阈值) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 当前柱子上的DI+值大于DI-值 bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- 检查所有条件 return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. 多头平仓
多头平仓的条件:
- StateEMA(0)<0 и StateEMA(1)<0: moving average decreases on the current and last completed bar;
- StateClose(1)<0: the closing price of the completed bar is lower than moving average;
- MainADX(0)>minimum_ADX: 当前柱子上的ADX值高于指定的最小的值(检查趋势强度);;
- StateADX(0)<0: 当前柱子上的DI-高于DI+。
//+------------------------------------------------------------------+ //| 检查多头平仓的条件 | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- 条件1:移动平均线在当前和前面结束柱子上上升 bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //---条件2:前一结束柱子上的收盘价低于移动平均线 bool Sell_Condition_2=(StateClose(1)<0); //--- 条件3:当前柱子上的ADX值高于指定的最小值(趋势阈值) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 当前柱子上的DI+值大于DI-值 bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- 检查所有条件 return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. 空头开仓
空头开仓的条件和多头平仓的条件一样。
//+------------------------------------------------------------------+ //| 检查空头开仓的条件(卖出) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- 条件1:移动平均线在当前和前面结束柱子上下降 bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 条件2:前一结束柱子上的收盘价低于移动平均线 bool Sell_Condition_2=(StateClose(1)<0); //--- 条件3:当前柱子上的ADX值高于指定的最小值(趋势阈值) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 当前柱子上的DI-值大于DI+值 bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- checking of all conditions return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. 空头平仓
空头平仓的条件和多头开仓的条件一样。
//+------------------------------------------------------------------+ //| 检查空头平仓的条件 | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- 条件1:移动平均线在当前和前面结束柱子上上升 bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 条件2:前一结束柱子上的收盘价高于移动平均线 bool Buy_Condition_2=(StateClose(1)>0); //--- 条件3:当前柱子上的ADX值高于指定的最小值(趋势阈值) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4:当前柱子上的DI+值大于DI-值 bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- 检查所有条件 return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
使用MQL5向导创造EA 交易
要基于该策略创建交易程序,你需要在 MQL5向导的 "快速创建EA交易" 选项 "中选择信号属性为" Signals based on price crossover with MA confirmed by ADX":
图2. 在MQL5 向导中选择“Signals based on price crossover with MA confirmed by ADX”
接下来你必须指定所需要的 移动止损 算法和 货币风险管理系统。EA 交易代码将被自动创建,你可以对它编译然后在MetaTrader 5客户端的策略测试中对其测试。
测试结果
让我们来考察EA交易在历史数据(EURUSD H1,自定义时段:1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900)上的回归测试。
在创建EA 交易时,我们使用了固定交易量 (固定交易手数, 0.1),未使用移动止损算法 (不使用移动)。
图3. 基于价格交叉移动平均线并由ADX确认的EA交易的历史回归测试结果
附件:定义CSignal3EMA 类 的Signal3EMA.mqh文件位于 terminal_data_folder\MQL5\Include\Expert\Signal文件夹中.
文件 ma_crossover_adx.mq5 包含了由MQL5向导创建的EA交易代码。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/258
基于三条移动平均线的交易信号 被考虑. 基于该策略的EA交易的代码可以被MQL5向导自动生成
MQL5向导 - 基于价格交叉移动平均线指标的交易信号基于价格交叉移动平均线指标的交易信号(CSignalMA来自MQL5标准库)被考虑. 基于该策略的EA交易的代码可以被MQL5向导自动生成
基于两条指数平滑移动平均线交叉的交易信号 被考虑。基于该策略的EA交易的代码可以被MQL5向导自动生成
MQL5向导 - 基于MACD指标主线和信号线交叉的交易信号基于MACD指标主线和信号线交叉的交易信号(CSignalMACD来自MQL5标准库)被考虑。基于该策略的EA交易的代码可以被MQL5向导自动生成