根据支撑位、阻力位和和价格行为确定交易策略

MICHAEL JANUS | 27 八月, 2015

目录


引言

本文涵盖一种适用于任何外汇、股票、商品市场的交易方法,以及基于此方法的可用于EA的MQL4实例代码。

价格行为和确定支撑及阻力位是该系统的关键组成部分。入市完全取决于这两部分因素。参照价格及如何高效的选择将在本文中予以阐述。MQL4实例包括最小化风险参数。这是通过将出场和止损位设置的离入场价格相对接近来实现的。

这样带来了一项额外的好处,那就是无论账户规模大小都能允许更高的交易量。最后,对确定目标收益的选项进行讨论,并附上能够在各种条件下获利退出的MQL代码。


1. 检测支撑位和阻力位

如果你查看任何时间框架下任何市场的价格图表,你会发现两个基于永恒市场特性的两个事实。其中一个事实是在任何时候,市场价格都不会在一个地方呆很久。只要给予足够的时间,市场价格必将有显著的变化。图表上显示的任何价格都可以作为参考标准。

然而,某一特定的价格与其他价格相比更有参考价值。我们将很快对其进行研究。上述第二项事实就是任何图表都会在到达某一特定的价格水平后,市场趋势将完全逆转。通常来说,市场会反复到达这些价格,之后不久就会转换方向。这些就是几乎所有交易者都耳熟能详的支撑位和阻力位。支撑位是指一旦价格触及就不会下降的价格水平。阻力位是指一旦价格触及就无法上升的价格水平。

也被称为顶和底,这些价格水平传递的信息是(至此)一旦市场走到此处那么价格将会在此附近反转。支撑位和阻力位是很好的价格参考水平,因为它们意味着高概率的新趋势开始的价格水平。其他价格,如两个相关支撑和阻力水平的中间价格也是很好的参考标准。我们将这类价格作为中间点。

价格图表中的任何一部分都可以用水平线标出,并以相应的支撑位、阻力位和中间价格作为参考。举一个例子如下图1所示。

图1. 支撑位、阻力位和中间点

图1. 支撑位、阻力位和中间点

底部紫色线条表示支撑位在1.09838。最顶部的红色线条表示阻力位为1.10257。

大约位于两者之间的中间处有一黑色线条,中间位在1.10048。准确确定处于支撑位或是阻力位主要依靠主观判断,会随着你自身对于出入场时机的判断不同而不同。你也许想在特定的价格或者特定价格附近开仓。又或者准确的入市价格对你也许并不重要,一个宽泛的价格区间内就已经足够。这一切都取决于你的个人交易习惯和利润目标。

因此,支撑位和阻力位参考点之间的举例可能会有很大的不同。他们只是确定合适交易条件的参照物。

图 2. 支撑位和阻力位价格范围区间

图 2. 支撑位和阻力位价格范围区间

图2 展示了一分钟图表下的四种支撑位和阻力位的价格范围。

某些范围比较宽而另一些范围比较窄。综上所述,价格水平是依靠主观划分的,但很明显他们发生在短期趋势的顶部和底部(和中间)。

图3到图6是1分钟图下较长和较短时间周期的支撑位和阻力位实例。

图3-4 代表牛市,而图5-6代表熊市。

图 3长时间的牛市

图 3. 长时间的牛市


图 4. 短时间的熊市

图 4. 短时间的熊市


图 5. 长时间的熊市

图 5. 长时间的熊市


图 6. 短时间的熊市

图 6. 短时间的熊市


在这些价格水平区域预示这特定的价格运动类型。当这些类型的价格行为在图表上出现时,交易时机就会到来。


2. 根据价格行为识别高胜率策略

多种双K线模式预示着高胜率的交易时机。在此介绍三种模式。这些模式的出现在价格接近支撑位和阻力位水平的时候,可以作为入市的参考依据。需要提醒的是,从现在起呈现的每一个例子都是基于1分钟K线的。用这个时间周期是因为,我们的系统要实现更为精确的入场点以及能将止损放在较小的范围内。

下面三种模式,每一个都包含两个1分钟K线。当其中一种模式在参考价格水平(支撑位、阻力位或中间位)出现时,那么将在下一个(第三个)1分钟K线的开盘价精准入场。在介绍完这三种模式后将给出例子。

第一种模式,模式1由一个下引线长于实体的K线和一个收盘价高于第一个K线的两跟K线组成。引线为一根直线,它代表实体之上最高价和开盘/收盘价之间的价格范围,或者实体之下最低价和开盘/收盘价之间的范围。“十字星”K线即包含在第一种K线模式中。

图 7. 牛市模式 1

图 7. 牛市模式 1


图 8. 熊市模式 1

图 8. 熊市模式 1

图7显示了一种牛市模式,图8显示了一种熊市模式。

这些模式类似“锤子”K线模式,但是并不像十字星模式那样具像,它可以包含任何上升下降的K线组合。

图 9 显示了始于这类型模式的牛市趋势。

图 9. 牛市趋势

图 9. 牛市趋势


第二种模式,模式2由两根K线组成,第二根蜡K线实体的长度几乎和第一根的相等。

两根K线的开盘价和收盘价也几乎一样。需要注意的是两根K线的实体长度以及相应的开盘收盘价格不一定要完全相等。这个模式的例子,熊市模式如图10所示,牛市模式如图11所示。

这些模式被称为“镊子”。图12显示了一个始于镊子模式的熊市趋势。

图 10. 熊市模式 2

图 10. 熊市模式 2


图 11. 牛市模式 2

图 11. 牛市模式 2


图 12. 熊市趋势

图 12. 熊市趋势

最后一种模式,模式3是更为普遍的一种。它可以由几乎任何一种K线类型开始,而后一根K线收盘价完全超越前一根。图13代表牛市模式,图14代表熊市模式。

图15就是以此类模式开始的牛市。

图 13. 牛市模式3

图 13. 牛市模式3


图 14. 熊市模式3

图 14. 熊市模式3


图 15. 牛市趋势

图 15. 牛市趋势

当你看到1分钟图表上有上述三种模式之一时,在决定此刻入场前你还要考虑另外一个因素。

那就是入场价格和附近支撑或阻力位参考价格之间的距离。如果入场价距离参考价格太远,就不要轻易开仓,不管价格运动模式是怎样的。

如前所述,真正的入场点是在下一个1分钟K线开盘之时。换句话说,2根K线形成一种价格模式,在第三根K线开仓。在开盘价时下市价单。这些会在后面MQL4代码部分阐述。显然,因为价格运动模式是这类交易策略的关键因素,因此我们总是使用市价单来入场。而不会采用挂单。


3. 识别价格行为模式的MQL4代码

至此此交易系统的原理已经得到阐述,下面介绍实现代码。

下面的代码块能够被基于价格运动和支撑/阻力水平的EA所使用。首先要定义变量。最近1分钟K线的开盘价,最高价,最低价以及收盘价。当前和前两个1分钟K线的这四个价格都会用到。通过iOpen()iHigh()iLow()iClose()实现。

因为要检测完整的双K线模式,那么早于当前K线2分钟的将是模式中的首根(例如,图7左边的K线)。在此介绍三种模式。1分钟后形成的下一个K线将被标记为Candle2(图7右边的K线)。

当前K线将被标记为Candle3,在Candle2的右侧。因为监控实时价格运行情况,因此EA将在当前和前两根K线上实施运作。

double O1=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,2),4);

上述代码定义Candle1的开盘时间。

因为这个变量不是整数,因此使用double类型。“O1”代表此模式下第一根K线的开盘价。iOpen()中使用Symbol() 作为第一个参数,因此EA能够在任何货币对的图表上运行。

"PERIOD_M1" 代表1分钟时间框架,最后一个参数2定义相对当前K线的偏移。偏移0代表当前K线,1代表倒数第一根K线,2代表倒数第二根K线。

相应的,O1, H1, L1和C1分别代表Candle1的开,高,低和收盘价。O2, H2, L2, C2, 和 O3, H3, L3, C3分别代表Candles 2和3的相应价格。

下面的代表是这些变量定义的例子。

//---- Candle1 OHLC
double O1=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,2),4);
double H1=NormalizeDouble(iHigh(Symbol(),PERIOD_M1,2),4);
double L1=NormalizeDouble(iLow(Symbol(),PERIOD_M1,2),4);
double C1=NormalizeDouble(iClose(Symbol(),PERIOD_M1,2),4);
//---- Candle2 OHLC
double O2=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,1),4);
double H2=NormalizeDouble(iHigh(Symbol(),PERIOD_M1,1),4);
double L2=NormalizeDouble(iLow(Symbol(),PERIOD_M1,1),4);
double C2=NormalizeDouble(iClose(Symbol(),PERIOD_M1,1),4);
//---- Candle3 OHLC
double O3=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,0),4);
double H3=NormalizeDouble(iHigh(Symbol(),PERIOD_M1,0),4);
double L3=NormalizeDouble(iLow(Symbol(),PERIOD_M1,0),4);
double C3=NormalizeDouble(iClose(Symbol(),PERIOD_M1,0),4);

判断条件将在下面描述。条件句将定义三种主要的双K线模式之一的产生。

例如前述和图7显示的模式1,将在如下判断句为真时产生。

if(C1 >= O1 && L1 < O1 && ((O1-L1)>(C1-O1)) && C2 >= O2 && C2 > H1 && L2 > L1)

此模式要求留个条件同时满足。首先, C1>=O1,意味着Candle1必须是上升K线,或者开盘价等于收盘价。L1<O1意味着Candle1的最低价必须比开盘价低。下一个条件是要Candle1的开盘和最低价之间的距离必须比收盘和开盘价之间的距离大。就是说Candle1的下影线必须比其实体长。

第四相条件和Candle2相关,要求它的收盘价大于等于它的开盘价。C2>H1意味着Candle2收盘价高于Candle1的最高价。最后,Candle2的最低价必须高于Candle1的最低价。

如果模式1产生时所有这些条件满足,下面的代码将下一个市价买单。

交易量为0.1手,容许滑点5pips,止损10pips,止盈50pips。

 //---- 模式 1 - 牛市 
 if(C1 >= O1 && L1 < O1 && ((O1-L1)>(C1-O1)) && C2 >= O2 && C2 > H1 && L2 > L1)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+50*Point);
   return;
  }

同样的,要做卖单,条件将转变为熊市模式,类似图8。同样,OrderSend()函数的参数也将做相应调整。

这个代码将下一个类似上述的订单,只是方向相反。

 //---- 模式 1 - 熊市
 if(C1 <= O1 && H1 > O1 && ((H1-O1)>(O1-C1)) && C2 <= O2 && C2 < L1 && H2 < H1)
  { 
   OrderSend(Symbol(),OP_SELL,0.1,Bid,5,Ask+10*Point,Ask-50*Point);
   return;
  }

当模式2和模式3产生时,类似的代码也将被用于下市价单。

牛市模式2(镊型)形成条件如下:

 //---- 模式 2 - 牛市
 if(C1 < O1 && C2 > O2 && ((O1-C1)>(H1-O1)) && ((O1-C1)>(C1-L1)) && ((C2-O2)>(H2-C2)) && ((C2-O2)>(O2-L2)) && O2 <= C1 && O2 >= L1 && C2 >= O1 && C2 <= H1)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+50*Point);
   return;
  }

熊市模式2的代码如下:

 //---- Pattern 2 - bearish
 if(C1 > O1 && C2 < O2 && ((C1-O1)>(H1-C1)) && ((C1-O1)>(O1-L1)) && ((O2-C2)>(H2-O2)) && ((O2-C2)>(C2-L2)) && O2 >= C1 && O2 <= H1 && C2 <= O1 && C2 >= L1)
  { 
   OrderSend(Symbol(),OP_SELL,0.1,Bid,5,Ask+10*Point,Ask-50*Point)
   return;
  }

最后,模式3分别有如下牛市和熊市条件:

 //---- 模式 3 - 牛市
 if(C1 > O1 && ((C2-O2)>=(H2-C2)) && C2 > O2 && C2 > C1)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+50*Point);
   return;
  }

 //---- 模式 3 - 熊市
 if(C1 < O1 && ((O2-C2)>=(C2-L2)) && C2 < O2 && C2 < C1)
  { 
   OrderSend(Symbol(),OP_SELL,0.1,Bid,5,Ask+10*Point,Ask-50*Point)
   return;
  }
订单的某些参数,如止损和止赢,也可以用变量代替,而不是向例子中那样设置为精确的值。


4. 结合支撑位/阻力位和价格行为

现在是时候将价格行为模式和支撑阻力位参考水平检测代码结合起来了。

EA将监测市场达到一个特定的价格水平。一但达到这一水平,将检测价格行为模式1-3。可能所有这三种模式,牛市或熊市或仅仅一种或者其中的几个模式。下面的代码使用两个额外的变量来检测市场达到某一个特定的价格,此处为EURUSD 1.09000

在这个例子中,EURUSD在1.09000之下时代码激活进行交易。

double ref=1.09000;
int refhit=0;

if(O2 < ref && C3 >= ref)
  {
   refhit=1;
   return;
  } 

变量ref代表被监测的参考价格水平(支撑,阻力或者中位)。另一个变量refhit,描述当前市场状态,是否已经达到参考价格水平或者。Refhit是一个整数,值为0或1。默认值为0,它代表参考价格尚未达到。

下面的条件满足时,市场触碰参考水平的情况如果发生,变量将被置1。这两个变量现在将被添加到前面描述价格行为的代码中。

以EURUSD的例子来看,价格超过1.09000时牛市模式3将被检测出来。

下面就是修改后的模式3代码:

  if(refhit==1 && C1 > O1 && ((C2-O2)>=(H2-C2)) && C2 > O2 && C2 > C1 && C1 > ref && C2 > ref)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+50*Point);
   return;
  }

第一个附加条件,refhit==1,代表市场达到或者超过由ref变量设定的价格,在此为1.09000。记住在达到这个水平前,市场在1.09000之下进行交易。最后两个新的条件是要求两根模式3的K线的收盘价高于ref变量值1.09000。

最后,图16显示了EURUSD分别在短期支撑位1.07660和阻力位1.07841之间范围内交易的情况。

图16. EURUSD

图16. EURUSD

在图的最右侧,你可以发现市场几乎在这两个水平中间运行。

一个做多信号在支撑位1.07660附近被检测到。因为市场并不总是精确的达到支撑和阻力位价格,因此通常使用近似价格作为参考水平。

在这里即为1.07690,支撑位上方3个pips。使用模式1到3来识别牛市行情。

//----- 变量定义 ------------------
//---- Candle1 OHLC
double O1=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,2),4);
double H1=NormalizeDouble(iHigh(Symbol(),PERIOD_M1,2),4);
double L1=NormalizeDouble(iLow(Symbol(),PERIOD_M1,2),4);
double C1=NormalizeDouble(iClose(Symbol(),PERIOD_M1,2),4);
//---- Candle2 OHLC
double O2=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,1),4);
double H2=NormalizeDouble(iHigh(Symbol(),PERIOD_M1,1),4);
double L2=NormalizeDouble(iLow(Symbol(),PERIOD_M1,1),4);
double C2=NormalizeDouble(iClose(Symbol(),PERIOD_M1,1),4);
//---- Candle3 OHLC
double O3=NormalizeDouble(iOpen(Symbol(),PERIOD_M1,0),4);
double H3=NormalizeDouble(iHigh(Symbol(),PERIOD_M1,0),4);
double L3=NormalizeDouble(iLow(Symbol(),PERIOD_M1,0),4);
double C3=NormalizeDouble(iClose(Symbol(),PERIOD_M1,0),4);

double ref=1.07690;
int refhit=0;
//-----------------------------------------

int start()
 {
 //---- 参考价格检测
 if(O2 < ref && C3>=ref)
  {
   refhit=1;
   return;
  } 
 //--- 模式 1 - 牛市 
 if(refhit==1 && C1 >= O1 && L1 < O1 && ((O1-L1)>(C1-O1)) && C2 >= O2 && C2 > H1 && L2 > L1 && C1 > ref && C2 > ref)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+100*Point);
   return;
  }
 //--- 模式 2 - 牛市
 if(refhit==1 && C1 < O1 && C2 > O2 && ((O1-C1)>(H1-O1)) && ((O1-C1)>(C1-L1)) && ((C2-O2)>(H2-C2)) && ((C2-O2)>(O2-L2)) && O2 <= C1 && O2 >= L1 && C2 >= O1 && C2 <= H1 && C1 > ref && C2 > ref)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+100*Point);
   return;
  }
 //--- 模式 3 - 牛市
 if(refhit==1 && C1 > O1 && ((C2-O2)>=(H2-C2)) && C2 > O2 && C2 > C1 && C1 > ref && C2 > ref)
  { 
   OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-10*Point,Bid+100*Point);
   return;
  }
 //---
return;
}

图 17. EURUSD 反转

图 17. EURUSD 反转


图 18. EURUSD 入场

图 18. EURUSD 入场


图 19. EURUSD 出场

图 19. EURUSD 出场

牛市模式的所有代码模块要求市场达到1.07690之下且K线1和2的收盘价都高于它。

同时,止赢目标在前例的基础上翻倍。图 17 显示市场确实转向下行并且直接跌破1.07690,达到1.07670后又反转向上。这使得refhit的值变为1。

反转向上后不久,牛市模式3形成了。这里就是市价买单入场的位置,开仓价格在1.07740,如图18所示。(Candle 3的开盘价卖价Bid为1.07720。允许存在5pips的滑点,订单在1.07740成交)从这里开始,市场启动了一次强有力的上升趋势,如图19。止损价从未触及,持仓在1.08740止盈出场。


结论

从本文介绍的例子中可以看到,组合使用价格行为模式和支撑阻力水平检测能够极为有效的确定交易策略。

文章中所包含的和用于说明的MQL4代码显然只是部分,不能直接作为EA使用。这些代码样例是用于实现完整EA的代码模块。文章的主要目的是阐释交易策略背后的原理。其他价格行为模式也可以用程序来描述,用于入场和出场。祝你的交易生涯一切顺利。