
使用分形绘制水平突破位
分形
分形是比尔·威廉姆的交易策略的五大指标之一,可以发现高位或底位。向上分形的技术定义是至少五个连续的柱,在紧邻最高的最大值的前面和后面各有两个较低的最大值柱。另一面(五个连续的柱,在紧邻最低的最小值前面和后面各有两个较高的最小值柱)对应向下分形。分形有最高值和最低值,在图表上用箭头标记。
如果仔细观察图表,就会理解超过分形的水平通常趋于继续按照分形的方向运动。在上涨的市场中,这种超越说明多头市场继续存在,分形的低位是支撑位,一旦超越,将是多头市场终结的信号。在下跌趋势中,作用方式相同,只不过方向相反。在平淡的市场中使用该策略不会产生任何结果。
分形水平的指标
为了更加简单的确定最后的向上或向下分形的点位,我们可以编写一个简单的指标,使用水平线绘制这些点位。
利用“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
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); } }
标准 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 Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/1435
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.

