使用分形绘制水平突破位

Victor Chebotariov | 16 三月, 2016

分形

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

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



分形水平的指标

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

利用“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 后,获利性增长,同时亏损下降。