818期货学习网 > 外汇知识 > 顺势而为:外汇交易中的道氏理论 >
2014-10-04 17:10 来源:818期货学习网
汉斯方法基本上是建立在本课第一节我们介绍的时间规律第一条的基础上,这种方法与英镑择时交易法类似,目的是跟随日内主力交易者的行动方向,但是随着采用这种方法的人数的增加,这种方法可能需要一些参数改变才能保持效率。国际上著名的趋势突破系统汉斯策略引起了广泛的关注,已经发展更新了多种版本,当初也引起了国人的关注,但草草研究的结果认为程序跑不通或者亏损就把它盖棺定论“枪毙”了。但是,国外仍然持续研究发展它,版本从V1.0到V9.0,测试报告也从几个月到几年,甚至有从1999年至今的测试报告。
汉斯交易系统专门用于欧元兑美元以及英镑兑美元的日内交易,每个货币基本上有两次交易,分别处于两个时区波幅突破之后。具体的汉斯交易系统规则如下:
(1)进场规则。
每日17:00,找到英镑兑美元和欧元兑美元今日13:00~17:00的最高价和最低价,下单Buy Stop和SellStop;每日21:00,找到英镑兑美兀和欧兀兑美兀今日17:00~21:00的最高价和最低价,下单Buy Stop和Sell Stop。其中Buy Stop =最高价+5点,Sell Stop=最低价-5点。
(2)出场规则。
EUR/USD的出场:止盈=Buy Stop+80,止损=Buy Stop-50;止盈=Sell Stop-80;止损=Sell Stop+50;有30点浮动利润时将止损移至开仓价位。
GBP/USD的出场:止盈=Buy Stop+120;止损=Buy Stop-70;止盈=Sell Stop-120,止损=Sell Stop+70;有40点浮动利润时将止损移至开仓价位。
(3)辅助规则。
每日早7:00,平掉手上所有单子;如果交易者已经在某个方向上建立起了相应的头寸,并处于持仓过程中,但汇价却突破了另外一边,这时候你就应该平仓并反向建仓。当你最初持仓的止损处于区间内,则汇价会先触及止损再突破另外一边;当你最初持仓的止损处于区间之外,则汇价会先触及另外一边,这时候就不用等到止损触及了,应该在触及另外一边的时候就平掉最初的仓位并建立起相反的头寸。
汉斯策略最初是由Hans Van Der Helm开发出来的,现在得到了欧美外汇界的高度关注,并不断有新的版本公布,其绩效不断上升,我们这里将其中一个版本的MQL源码给出,你可以自行研究,我们的下载网站也会提供某些版本的汉斯指标和智能交易系统供你使用。
下面第一个源码是汉斯智能交易系统(EA)檣标系统,第二个源码是汉斯指标系统,指标系统需要肉眼观察和判断,智能交易系统则可以自动交易,不过后者不能完全遵照系统最初设计的原意。
//+ +
//|Hansl23MV22|
//| Copyright ? 2009, Dina|
//|
//+ +
#property copyright“Copyright ? 2009,Dina”
//Normalize times
if (EOD==24) EOD=0;
if (FridayClosing==0) FridayClosing=24;
//Setup comment
string Text=“Hans123”+ Symbol();
//Setup orders
if(Hour()==Startl && Minute ()<10){
MN=1;
SetOrders(Text,MN);
}
if(Hour()==Start2 && Minute()<10 && FirstSessionOnly==0){
MN=2;
SetOrders(Text,MN);
}
if(Hour()==Start2 && Minute()<10 && FirstSessionOnly==0){
MN==2;
SetOrders(Text,MN);
}
//Manage opened orders
for(i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Text){
//close open positions at EOD
if(Hour()==EOD||(DayOfWeek()>=5 && Hour() ==FridayClosing-1 && Minute() >=50)){
switch(OrderType()){
case OP_BUY:OrderClose (OrderTicket(),OrderLots(),Bid,3,Red);
break;
case OP_BUY:OrderClose (OrderTicket(),OrderLots(),Bid,3,Red);
case OP_SELL:OrderClose (OrderTicket(),OrderLots(),Ask,3,Red);
break;
default:OrderDelete (OrderTicket());
break;
}
Sleep (10000);
}
else{
//move at BE if profit>BE
if (TrailingStop==0){
if (OrderType()==OP_BUY){
if (High[0]-OrderOpenPrice()>=BreakEven*Point && OrderStopLoss()<OrderOpenPrice()){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTake Profit(),0,Green);
Sleep (10000);
}
}
if (OrderType()==OP_SELL){
if (OrderOpenPrice()-Low[0]>=BreakEven*Point && OrderStopLoss()>OrderOpenPrice()){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
Sleep (10000);
}
}
}
//use trailing stop else
else{
if (OrderType()==OP一BUY){
if (High[0]-OrderStopLoss()>TrailingStop*Point){
OrderModify (OrderTicket(),OrderOpenPrice(),High[0]-TrailingStop*Point,OrderTakeProfit (),0,Green);
Sleep(10000);
}
}
if (OrderType()==OP_SELL){
if(OrderStopLoss()-Low[0]>TrailingStop*Point){
OrderModify(OrderTicket(),OrderOpenPrice(),Low[0]+ TrailingStop*Point,OrderTakeProfit (),0,Green);
Sleep (10000);
}
}
}
}
}
}
return (0);
}
//+ +
void SetOrders (string Text,int MN){
int i,Ticket,Bought,Sold;
double EntryLong,EntryShort,SLLong,SLShort,TPLong,TPShort;
//Determine range
Entry Long
=iHigh(NULL,60,Highest(NULL,60,MODE_HIGH,Length,1))+(Pips/*+Marketlnfo(Symbol(),MODE_SPREAD)*/)*Point;
EntryShort=iLow(NULL,60,Lowest(NULL,60,MODE_LOW,Length,1))-Pips*Point;
SLLong=MathMax(EntryLong-StopLoss*Point,EntryShort);
SLShort=MathMin(EntryShort+StopLoss*Point,Entry Long);
TPLong=EntryLong+TakeProfit*Point;
TPShort=EntryShort-TakeProfit*Point;
//Send orders
for (i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Text && OrderMagicNumber()==MN){
if(OrderType()==0P_BUYSTOP||OrderType()==OP_BUY)Bought++;
if(OrderType()==OP_SELLSTOP||OrderType()==OP_SELL)Sold++;
}
}
if(Bought==0){//no buy order
Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,EntryLong,3,SLLong,TPLong,Text,MN,0,Blue);
if(Ticket<0 high="" 0="">=EntryLong)
Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,SLLong,TPLong,Text,MN,0,Blue);
Sleep (10000);
}
if(Sold==0){ //no sell order
Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,EntryShort,3,SLShort,TPShort,Text,MN,0,Magenta);
if(Ticket<0 && Low[0]<=EntryShort)
Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SLShort,TPShort,Text,MN,0,Magenta);
Sleep (10000);
}
//Check orders
for(i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderComment()==Text && OrderMagicNumber()==MN) {
if(OrderType()==OP_BUYSTOP &&(MathAbs(OrderOpenPrice()-EntryLong)>Point
|| MathAbs(OrderStopLoss()-TPLong) >Point ||
MathAbs(OrderTakeProfit()-TPLong)>Point))
OrderModify(OrderTicket(),EntryLong,SLLong,TPLong,0,Blue);
if(OrderType()==OP_SELLSTOP && (MathAbs(OrderOpenPrice()-EntryShort) >Point
|| MathAbs (OrderStopLoss()-SLShort)>Point ||
MathAbs(OrderTakeProfit()-TPShort) >Point))
OrderModify(OrderTicket(),EntryShort,SLShort,TPShort,0,Magenta);
© Copyright 2014 818期货学习网 All Rights Reserved. 浙ICP备14000419号-1