使用分形绘制水平突破位
分形
分形是比尔·威廉姆的交易策略的五大指标之一,可以发现高位或底位。向上分形的技术定义是至少五个连续的柱,在紧邻最高的最大值的前面和后面各有两个较低的最大值柱。另一面(五个连续的柱,在紧邻最低的最小值前面和后面各有两个较高的最小值柱)对应向下分形。分形有最高值和最低值,在图表上用箭头标记。
如果仔细观察图表,就会理解超过分形的水平通常趋于继续按照分形的方向运动。在上涨的市场中,这种超越说明多头市场继续存在,分形的低位是支撑位,一旦超越,将是多头市场终结的信号。在下跌趋势中,作用方式相同,只不过方向相反。在平淡的市场中使用该策略不会产生任何结果。
分形水平的指标
为了更加简单的确定最后的向上或向下分形的点位,我们可以编写一个简单的指标,使用水平线绘制这些点位。
利用“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