MQL5 向导 - 基于 早晨之星 / 黄昏之星形态的交易信号 + MFI - MetaTrader 5EA
- 显示:
- 3559
- 等级:
- 已发布:
- 2013.10.21 15:57
- 已更新:
- 2016.11.22 07:33
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
MQL5 向导 可创建现成的交易程序,此程序基于客户端附带的 标准类库 (参见 在 MQL5 向导中创建现成交易程序 具体内容)。它可以快速验证您的交易想法,所有您需要做的就是创建您自己的交易信号类。这个类的结构及用例可参阅文章 MQL5 向导:如何创建交易信号模块。
通常做法如下:交易信号子类由 CExpertSignal衍生出来,之后,必须用您自己的方法重写类中的 LongCondition() 和 ShortCondition() 虚方法。
有本书 "Strategies of best traders(交易者最佳策略)" (俄语版),书中论述了许多交易策略,我们将注意力集中在反转 K 线形态上,并用 Stochastic, CCI, MFI 和 RSI 振荡指标来确认。
最佳途径是创建分离的子类,此类由 CExpertSignal 中衍生,用于检查 K 线的形态结构。用于验证 K 线形态生成的交易信号,写一个 CCandlePattern 的衍生子类就足够了,并加入必要的特性(如,振荡指标确认)。
此处我们讨论的信号,基于 "早晨之星 / 黄昏之星" ("早晨十字星 / 黄昏十字星") 反转 K 线形态,确认则依赖 MFI 指标。这个交易信号模块基于 CCandlePattern 类,这是一个利用 K 线形态创建交易信号的简单例子。
1. 1."早晨之星" 和 "黄昏之星" 反转 K 线形态
1.1. 早晨之星
这个形态表明下降趋势的反转, 它由三根 K 线组成 (图例. 1)。在一根长阴之后,紧随一根实体长度很短的 K 线(阴线或阳线不重要),且整个短实体部分都低于长阴线实体。实体部分较短,说明多空力量均衡,市场趋势即将变化。
第三根 K 线为阳线,其实体部分,不能与第二根的实体部分有重叠,且收盘价在第一根阴线的实体部分内。完整形态如图例 1。
如果第二根 K 线看上去像十字星,则形态称为 "早晨十字星"。
图例. 1. "早晨之星" 和 "早晨十字星" 形态
识别 "早晨之星" 形态已经在 CCandlePattern 类的 CheckPatternMorningStar() 方法中实现:
//+------------------------------------------------------------------+ //| Check formation of the "Morning Star" pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternMorningStar() { //--- 早晨之星 if((Open(3)-Close(3)>AvgBody(1)) && // 阴线,实体大于平均值 (MathAbs(Close(2)-Open(2))<AvgBody(1)*0.5) && // 第二根线实体很短 (低于平均实体长度的一半) (Close(2)<Close(3)) && // 第二根收盘价低于第一根的收盘价 (Open(2)<Open(3)) && // 第二根开盘价低于第一根的开盘价 (Close(1)>MidOpenClose(3))) // 最后一根完整K线的收盘价高于第一根的中心 return(true); //--- return(false); } //+------------------------------------------------------------------+ //| Check formation of the "Morning Doji Star" pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternMorningDoji() { //--- 早晨十字星 if((Open(3)-Close(3)>AvgBody(1)) && // 阴线,实体大于平均值 (AvgBody(2)<AvgBody(1)*0.1) && // 第二根线实体极短 (十字星) (Close(2)<Close(3)) && // 第二根收盘价低于第一根的收盘价 (Open(2)<Open(3)) && // 第二根开盘价低于第一根的开盘价 (Open(1)>Close(2)) && // 最后一根完整K线有跳空高开缺口 (Close(1)>Close(2))) // 最后一根完整K线的收盘价高于第二根 return(true); //--- return(false); }
此 CCandlePattern 类的 CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) 和 CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) 方法用于检查 "早晨之星" 和 "早晨十字星" 形态的形状。
1.2. 黄昏之星
这个形态表明上升趋势的反转, 它由三根 K 线组成 (图例. 2)。在一根长阳之后,紧随一根实体长度很短的 K 线(阴线或阳线不重要),且整个短实体部分都高于长阳线实体。实体部分较短,说明多空力量均衡,市场趋势即将变化。
第三根 K 线为阴线,其实体部分,不能与第二根的实体部分有重叠,且收盘价在第一根阳线的实体部分内。完整形态如图例 2。
如果第二根 K 线看上去像十字星,则形态称为 "黄昏十字星"。
图例. 2. "黄昏之星" 和 "黄昏十字星" 形态
这里有一些方法用于识别 "黄昏之星" 和 "黄昏十字星" 形态:
//+------------------------------------------------------------------+ //| Check formation of the "Evening Star" pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternEveningStar() { //--- 黄昏之星 if((Close(3)-Open(3)>AvgBody(1)) && // 阳线且实体部分大于平均值 (MathAbs(Close(2)-Open(2))<AvgBody(1)*0.5) && // 第二根线实体长度较短 (小于平均值一半) (Close(2)>Close(3)) && // 第二根收盘价高于第一根收盘价 (Open(2)>Open(3)) && // 第二根开盘价高于第一根开盘价 (Close(1)<MidOpenClose(3))) // 最后一根完整 K 线的收盘价低于第一根的中心 return(true); //--- return(false); } //+------------------------------------------------------------------+ //| Check formation of the "Evening Doji Star" pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternEveningDoji() { //--- 黄昏十字星 if((Close(3)-Open(3)>AvgBody(1)) && // 阳线且实体部分大于平均值 (AvgBody(2)<AvgBody(1)*0.1) && // 第二根线实体长度极短 (十字星) (Close(2)>Close(3)) && // 第二根收盘价高于第一根收盘价 (Open(2)>Open(3)) && // 第二根开盘价高于第一根开盘价 (Open(1)<Close(2)) && // 最后一根完整 K 线跳空低开缺口 (Close(1)<Close(2))) // 最后一根完整 K 线的收盘价低于第二根 return(true); //--- return(false); }
此 CCandlePattern 类的 CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) 和 CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) 方法用于检查 "黄昏之星" 和 "黄昏十字星" 形态的形状。
2. MFI 指标确认交易信号
采用交易信号来开多单或空单,必须用 MFI 指标来确认。MFI 指标的数值必须低于 40 (对于多单) 或大于 60 (对于空单)。
已建仓位的平仓同样依靠 MFI 指标。可分 2 种情况完成:
- 如果 MFI 已经到达反向临界水平 (70 为多单 ,以及 30 为空单)
- 如果反转信号未被确认 (当 MFI 指标到达如下水平:30 为多单,以及 70 为空单)
图例 3. "黄昏之星" 形态,由 MFI 指标确认
- int CMS_ES_MFI::LongCondition() - 检测开多单条件 (返回 80) 以及平空仓 (返回 40);
- int CMS_ES_MFI::ShortCondition() - 检测开空单条件 (返回 80) 以及平多仓 (返回 40)。
2.1. 开多单/平空仓
//+------------------------------------------------------------------+ //| Checks conditions for entry and exit from market | //| 1) Market entry (open long position, result=80) | //| 2) Market exit (close short position, result=40) | //+------------------------------------------------------------------+ int CMS_ES_MFI::LongCondition() { int result=0; //--- idx 可用于检测交易程序工作模式 //--- idx=0 - EA 在每个即时价格都检查交易条件 //--- idx=1 - EA 仅在每个新柱线建立时检查交易条件 int idx =StartIndex(); //--- 检查开多单条件 //--- 早晨之星形态形状及 MFI<40 if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (MFI(1)<40)) result=80; //--- 检查平空仓条件 //--- 信号线交叉超买/超卖 (上穿 30, 上穿 70) if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) result=40; //--- 返回结果 return(result); }
2.2. 开空单/平多仓
这个 "黄昏之星" 形态的形状必须由 MFI 指标确认: MFI(1)>60 (最后完整的 MFI 指标数值必须大于 60)。
多单必须被平仓如果 MFI 指标已经向上穿越临界水平 (70 或 30)。
//+------------------------------------------------------------------+ //| Checks conditions for entry and exit from market | //| 1) Market entry (open short position, result=80) | //| 2) Market exit (close long position, result=40) | //+------------------------------------------------------------------+ int CMS_ES_MFI::ShortCondition() { int result=0; //--- idx 可用于检测交易程序工作模式 //--- idx=0 - EA 在每个即时价格都检查交易条件 //--- idx=1 - EA 仅在每个新柱线建立时检查交易条件 int idx =StartIndex(); //--- 检查开空单条件 //--- 黄昏之星形态及 MFI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (MFI(1)>60)) result=80; //--- 检查平多仓条件 //--- 信号线交叉超买/超卖 (上穿 70, 下穿 30) if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30))) result=40; //--- 返回结果 return(result); }
2.3. 使用 MQL5 向导创建交易程序
这个 CMS_ES_MFI 类没有包含在标准类库中,若要使用它,必须下载 ams_es_mfi.mqh 文件(参见附件)并且保存至 客户端目录\MQL5\Include\Expert\Signal\MySignals。同样处理 acandlepatterns.mqh 文件。重启 MetaEditor 代码编辑器之后,您就可以在 MQL5 向导中使用它们了。
为创建交易程序,启动 MQL5 向导:
图例. 4. 使用 MQL5 向导创建交易程序
为交易程序起个特别名称:
图例. 5. 交易程序的一般属性
之后我们要选择交易信号将会使用的模块。
图例. 6. 交易程序的信号属性
在我们的案例中,我们仅使用交易信号的一个模块。
加入 "基于 早晨之星 / 黄昏之星 信号,由 MFI 指标确认" 信号模块:
图例. 7. 交易程序的信号属性
交易信号模块被加入:
图例. 8. 交易程序的信号属性
您可以选择任何移动属性,但是我们选择 "不使用移动止损":
图例. 9. 交易程序的移动属性
关注资金管理属性,我们将使用 "固定手数交易":
图例. 10. 交易程序的资金管理属性
通过点击 "完成" 按钮,我们将会得到生成的交易程序代码,名为 Expert_AMS_ES_MFI.mq5,它会被保存在 客户端目录\MQL5\Experts\。
交易程序生成的省缺输入参数:
//--- 主信号线输入参数 input int Signal_ThresholdOpen =10; // 开单信号阀值 [0...100] input int Signal_ThresholdClose =10; // 平单信号阀值 [0...100] input double Signal_PriceLevel =0.0; // 执行订单价位 input double Signal_StopLevel =50.0; // 止损位 (点数) input double Signal_TakeLevel =50.0; // 止盈位 (点数)
必须替换为:
//--- 主信号线输入参数 input int Signal_ThresholdOpen =40; // 开单信号阀值 [0...100] input int Signal_ThresholdClose =20; // 平单信号阀值 [0...100] input double Signal_PriceLevel =0.0; // 执行订单价位 input double Signal_StopLevel =0.0; // 止损位 (点数) input double Signal_TakeLevel =0.0; // 止盈位 (点数)
这个 Signal_ThresholdOpen/Signal_ThresholdClose 输入参数允许设置特殊的开、平单阀值。
在交易信号类 LongCondition() 和 ShortCondition() 方法的代码中,我们有固定的阀值:
- 开单: 80;
- 平仓: 40。
由 MQL5 向导生成的交易程序使用交易信号模块的 "投票数" 来决定开、平单。主模块(作为容器,它由所有添加模块组成)的表决功能也被使用,但它的 LongCondition() 和 ShortCondition() 方法永远返回 0。
这个主模块的投票结果也被用于对 "投票数" 进行平均。在我们的例子中我们已有: 主模块 + 1 个交易信号模块,所以我们在设置阀值时,将此事实加入。因为这个事实,用于开、平单的阀值必须设为 40=(0+80)/2 和 20=(0+40)/2。
Signal_StopLevel 和 Signal_TakeLevel 输入参数的值设为 0,它意味着无需止盈、止损,仅当平仓条件为真时才会平仓。
2.4. 历史回测结果
我们来讨论交易程序基于历史数据的回测 (EURUSD H1, 测试周期: 2010.01.01-2011.03.16, PeriodMFI=49, MA_period=3)。
创建交易程序时我们采用固定手数 (固定交易手数, 0.1), 移动止损算法未采用 (不使用移动止损)。
图例. 11. 交易程序的测试结果,基于 早晨之星 / 黄昏之星 + MFI
最佳输入参数集合可借助 MetaTrader 5 客户端的 策略测试员 发现。
由 MQL5 向导创建的交易程序代码,附加在 expert_ams_es_mfi.mq5。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/323
本节讨论基于蜡烛图模式 "乌云盖顶(Dark Cloud Cover)/刺穿线(PiercingLine) " 并由Market Facilitation Index (MFI)指标确认的交易信号。基于该策略的EA交易的代码可以被MQL5向导自动生成
MQL5 向导 - 基于乌云盖顶/刺穿线和CCI的交易信号。本节讨论基于蜡烛图模式 "乌云盖顶(Dark Cloud Cover)/刺穿线(PiercingLine) " 并由Commodity Channel Index (CCI) 指标确认的交易信号。基于该策略的EA交易的代码可以被MQL5向导自动生成
基于 早晨之星 / 黄昏之星形态的交易信号,由 Relative Strength Index (RSI - 相对强度指数) 指标确认。基于此交易策略的交易程序代码可使用 MQL5 向导自动生成。
演示_BitmapOffset (OBJPROP_XOFFSET 和 OBJPROP_YOFFSET)如果您在某个时刻需要显示图像的一部分,并且隐藏其它部分,您可以使用移动窗口来指定图像的可视区域。