下载MetaTrader 5

使用分形绘制水平突破位

16 三月 2016, 11:57
Victor Chebotariov
0
541

分形

分形是比尔·威廉姆的交易策略的五大指标之一,可以发现高位或底位。向上分形的技术定义是至少五个连续的柱,在紧邻最高的最大值的前面和后面各有两个较低的最大值柱。另一面(五个连续的柱,在紧邻最低的最小值前面和后面各有两个较高的最小值柱)对应向下分形。分形有最高值和最低值,在图表上用箭头标记。

如果仔细观察图表,就会理解超过分形的水平通常趋于继续按照分形的方向运动。在上涨的市场中,这种超越说明多头市场继续存在,分形的低位是支撑位,一旦超越,将是多头市场终结的信号。在下跌趋势中,作用方式相同,只不过方向相反。在平淡的市场中使用该策略不会产生任何结果。



分形水平的指标

为了更加简单的确定最后的向上或向下分形的点位,我们可以编写一个简单的指标,使用水平线绘制这些点位。

利用“Expert Advisor Wizard”可以创建指标的主体。为此,我们应执行“文件 -> 创建”命令序列或按工具栏的 按钮。“Expert Advisor Wizard”将在屏幕上打开。

  • 第一步,应选择“自定义指标”。
  • 第二步,应指定名称、作者、链接和参数,因为将使用分形指标作为我们的指标,不会有任何可调整参数,所以仅指定名称、作者和链接。
  • 第三步,向导让我们指定显示自定义指标的参数。由于指标应显示在主图表上,我们不勾选“在单独窗口的指标”字段。另外,我们还要确定指数。我们将需要两个指数:一个用于向上分形水平,另一个用于向下分形水平。两个指数都有“线条”类型,我们为第一个指数选择蓝色,为第二个选择红色,然后按“完成”按钮。

程序体创建完成,应显示如下:

//+------------------------------------------------------------------+
//|                                                 FractalsLine.mq4 |
//|                             Copyright © 2006, Victor Chebotariov |
//|                                      http://www.chebotariov.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Victor Chebotariov"
#property link      "http://www.chebotariov.com/"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----

   
//----
   return(0);
  }
//+------------------------------------------------------------------+

现在只需要添加一小段代码,我们的指标就完成了。

我们需要:
1.为了计算当前图表上每个柱形的指标值,需要循环:

int i=Bars-counted_bars-1;
 
while(i>=0)
  {
   // Here we calculate the value of the indicator for each bar (i)
   i--;
  }

2.为了得到向上分形和向下分形值:

double upfrac_val=iFractals(NULL,0,MODE_UPPER,i+1);
double lofrac_val=iFractals(NULL,0,MODE_LOWER,i+1);

3.最为重要的是,为了记住最后分形的值,需要求助于全局变量:

if(upfrac_val>0)
  {
   GlobalVariableSet(Symbol()+Period()+"upfrac",upfrac_val);
  }
else if(lofrac_val>0)
  {
   GlobalVariableSet(Symbol()+Period()+"lofrac",lofrac_val);
  }


4.然后从全局变量读取数据,并传给我们的指数:

ExtMapBuffer1[i] = GlobalVariableGet(Symbol()+Period()+"upfrac");
ExtMapBuffer2[i] = GlobalVariableGet(Symbol()+Period()+"lofrac");

指标的可用状态呈现如下:

//+------------------------------------------------------------------+
//|                                                 FractalsLine.mq4 |
//|                             Copyright © 2006, Victor Chebotariov |
//|                                      http://www.chebotariov.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Victor Chebotariov"
#property link      "http://www.chebotariov.com/"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   int i=Bars-counted_bars-1;
 
   while(i>=0)
     {
      double upfrac_val=iFractals(NULL,0,MODE_UPPER,i+1);
      double lofrac_val=iFractals(NULL,0,MODE_LOWER,i+1);
      if(upfrac_val>0)
        {
         GlobalVariableSet(Symbol()+Period()+"upfrac",upfrac_val);
        }
      else if(lofrac_val>0)
        {
         GlobalVariableSet(Symbol()+Period()+"lofrac",lofrac_val);
        }
      ExtMapBuffer1[i] = GlobalVariableGet(Symbol()+Period()+"upfrac");
      ExtMapBuffer2[i] = GlobalVariableGet(Symbol()+Period()+"lofrac");
      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

然后对其编译,执行菜单命令“文件 -> 编译”或按下工具栏的 按钮。

新创建的指标可以添加至图表。



实际应用

在第一个示例中,分形水平在上涨市场中将 StopLoss 线移动至红线以下会很有用。在下跌的市场中应该保持 StopLoss 在蓝线以上。按照该方式,可以在 StopLoss 和市场之间确保安全明智的距离。

例如,进入市场(见图表,标记 1)时止损位于蓝线以上(标记 2),如果突破红线(标记 3),移动 StopLoss(标记 4),如果出现新的突破(标记 5),类似的移动 StopLoss(标记 6)。如果突破蓝线(标记 7),则进行平仓。

为了使用 FractalsLine 作为追踪止损,我们向 EA 添加两小段代码:

从 FractalsLine 指标获得数据:

double FLU = iCustom(NULL,0,"FractalsLine",0,0); // Blue fractal line
double FLL = iCustom(NULL,0,"FractalsLine",1,0); // Red fractal line

基于 FractalsLine 指标指标获得数据:
if(Close[0]>FLU) //Trailing-stop for the long positions
  {
   if(OrderStopLoss()<FLL-3*Point || OrderStopLoss()==0)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),FLL-3*Point,OrderTakeProfit(),0,Green);
      return(0);
     }
  }


if(Close[0]<FLL) //Trailing-stop for the short positions
  {
   if(OrderStopLoss()>FLL+(Ask-Bid+3)*Point || OrderStopLoss()==0)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),FLL+(Ask-Bid+3)*Point,OrderTakeProfit(),0,Red);
      return(0);
     }
  }


将基于 FractalsLine 指标的追踪止损植入 MACD 样本智能交易系统得到积极的结果。可以从对比试验看出。


标准 MACD 样本试验

交易品种 EURUSD(欧元 vs 美元)
期段 1 Час (H1) 2008.01.02 12:00 - 2008.06.30 23:00 (2008.01.01 - 2008.07.01)
模型 每次价格变动(基于所有可用最少时间范围的最精确方法)
参数 TakeProfit=50; Lots=0.1; TrailingStop=30; MACDOpenLevel=3; MACDCloseLevel=2; MATrendPeriod=26;
测试中的柱 4059 建模的价格变动 1224016 建模质量 90.00%
错误匹配的图表错误 1
初始存入 10000.00
总净利润 182.00 毛利 1339.00 毛损 -1157.00
获利系数 1.16 预期收益 3.79
绝对亏损 697.00 最大亏损 827.00 (8.16%) 相对亏损 8.16% (827.00)
总交易次数 48 空头头寸(% 获利) 28 (82.14%) 多头头寸(% 获利) 20 (85.00%)
获利交易次数(总交易次数的 %) 40 (83.33%) 亏损交易次数(总交易次数的 %) 8 (16.67%)
最大 获利交易 50.00 亏损交易 -492.00
平均 获利交易 33.48 亏损交易 -144.63
最大 连续获利次数(获利金额) 14 (546.00) 连续亏损次数(亏损金额) 3 (-350.00)
最大 连续收益金额(获利次数) 546.00 (14) 连续亏损金额(亏损次数) -492.00 (1)
平均 连续获利次数 7 连续亏损 1

 



具有基于 FractalsLine 指标的追踪止损的 MACD 样本的测试

交易品种 EURUSD(欧元 vs 美元)
期段 1 小时 (H1) 2008.01.02 12:00 - 2008.06.30 23:00 (2008.01.01 - 2008.07.01)
模型 每次价格变动(基于所有可用最少时间范围的最精确方法)
测试中的柱 4059 建模的价格变动 1224016 建模质量 90.00%
错误匹配的图表错误 1
初始存入 10000.00
总净利润 334.00 毛利 1211.00 毛损 -877.00
获利系数 1.38 预期收益 5.14
绝对亏损 211.00 最大亏损 277.00 (2.75%) 相对亏损 2.75% (277.00)
总交易次数 65 空头头寸(% 获利) 41 (41.46%) 多头头寸(% 获利) 24 (62.50%)
获利交易次数(总交易次数的 %) 32 (49.23%) 亏损交易次数(总交易次数的 %) 33 (50.77%)
最大 获利交易 50.00 亏损交易 -102.00
平均 获利交易 37.84 亏损交易 -26.58
最大 连续获利次数(获利金额) 3 (150.00) 连续亏损次数(亏损金额) 4 (-168.00)
最大 连续收益金额(获利次数) 150.00 (3) 连续亏损金额(亏损次数) -168.00 (4)
平均 连续获利次数 2 连续亏损 2

 



总结

上述的测试显示使用 FractalsLine 后,获利性增长,同时亏损下降。

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/1435

附加的文件 |
FractalsLine.mq4 (2.28 KB)
StrategyTester.zip (33.25 KB)
在指标中添加声音提醒 在指标中添加声音提醒

如何为日常使用创建"语音"指标。

什么是马丁格尔? 什么是马丁格尔?

人们使用马丁格尔赌博策略进行交易或者滥用尖峰和类似方法时所出现的各种错觉的简短描述。

群集指标在嘉盛市场中的实际应用 群集指标在嘉盛市场中的实际应用

群集指标是一系列将货币对分成独立的货币的指标。指标允许跟踪相对货币波动,确定形成新的货币趋势的潜能,接收交易信号,以及跟踪中期和长期仓位。

突破策略测试程序在测试对冲 EA 时的限制 突破策略测试程序在测试对冲 EA 时的限制

一种使用策略测试程序测试对冲 Expert Advisor 的思路。