欢迎来到魔牛财经

当前位置:首页 > 外汇 > 外汇新闻 > EA开发--移动止损函数

EA开发--移动止损函数

2018-03-19 22:02:59 来源:

MT4\MT5可操作分析外汇、期货、股票,现我使用的平台已经接入期货,喜欢的朋友一起研究学习,探讨研究可私信我!


我们在交易过程中常常希望利润能够随着行情多增长些,固定止盈在大行情中显得死板,早早就把交易获利出场,让我们瞪着眼看着利润在奔跑,到这波行情结束时,一对比咱的利润只是这波行情的5%不到,多好的机会就这样看着他溜走了,那是一个恨啊。这种时候,移动止损就派上大用处了。移动止损也是交易中常用的函数,这里强调一下,为什么叫“移动止损”,因为函数修改的是止损价格,所以叫“移动止损”,但实际产生的效果并不是订单亏损后止损,而是获利后随着行情变化不断增加盈利。

一般情况下,移动止损使用一定间隔点数来计算,比如:持有订单为sell单(卖单),当行情继续下跌时,现价与订单开单价之间的距离达到200点启动移动止损,止损位置设定为大于现价100点,这样行情持续下跌,止损位置也跟着下跌,始终保持100点的间隔距离。也就增加了该订单的利润空间。

EA开发--移动止损函数

但这样固定的间隔点数设置也有弊端,间隔设置太小,一回调就止损出场了,利润没多少。间隔太大,行情小,价格没达到间隔位置回调了,本该有的盈利没止损变亏损了。这样我们更希望止损位置能够更适应行情变化 ,我们希望启动移动止损时,间隔不要太大,止损位不要太高,后续随着行情发展,继而增大止损位比例。上述例子中:间隔200点启动移动止损时,止损位为sell单开价格以下30点位置,让现价的活动空间大点,但这个止损位置暂时不变,避免小小的波动就止损了。当行情继续下跌,间隔到了600点时,现价与止损价之间已经有了570点的空间,这时我们修改止损位置增加到sell单开价格以下300点,依次类推,既保留现价的活动空间又保证了利润的增长。那么,在判断行情中,我们用计算来判断什么时候修改止损位置,而不是设置多个固定点执行,这样动态执行更简便易用。

下面我们看看一个移动止损的函数


//--移动止损动态计数止损间隔

//--jiange=间隔点数(达到点数启动移损);--dianshu=初始移损百分比;--magic=订单指定码;--combuy和comsell为买订单和卖订单注释;--com1=读取注释长度的起始位置;

bool yisun_dt(int jiange,int dianshu,int magic,string combuy,string comsell,int com1)

{

bool y=false;

double buy=0;

double sell=0;

double ys_bl=dianshu*0.01;

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

{

if(dianshu>0)

{

if(OrderType()==0 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic && StringSubstr(OrderComment(),com1,com1+StringLen(combuy))==combuy)

{

if(Bid-OrderOpenPrice()>=Point*jiange)

{

if(OrderStopLoss()==0)

{

buy=OrderOpenPrice()+(Bid-OrderOpenPrice())*ys_bl;

}

if(OrderStopLoss()>0 && Bid-OrderStopLoss()<Point*jiange)

{

buy=OrderOpenPrice()+(Bid-OrderOpenPrice())*ys_bl;

}

if(OrderStopLoss()>0 && Bid-OrderStopLoss()>Point*jiange)

{

buy=OrderOpenPrice()+((Bid-OrderOpenPrice())*ys_bl)+((Bid-OrderStopLoss())-Point*jiange)*0.8;

}

if(OrderStopLoss()<buy || OrderStopLoss()==0)

{

y=OrderModify(OrderTicket(),OrderOpenPrice(),buy,OrderTakeProfit(),0,Red);

}

Comment((OrderStopLoss()-OrderOpenPrice())*Point);

}

}

if(OrderType()==1 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic && StringSubstr(OrderComment(),com1,com1+StringLen(comsell))==comsell)

{

if(OrderOpenPrice()-Ask>=Point*jiange)

{

if(OrderStopLoss()==0)

{

sell=OrderOpenPrice()-(OrderOpenPrice()-Ask)*ys_bl;

}

if(OrderStopLoss()>0 && OrderStopLoss()-Ask<Point*jiange)

{

sell=OrderOpenPrice()-(OrderOpenPrice()-Ask)*ys_bl;

}

if(OrderStopLoss()>0 && OrderStopLoss()-Ask>Point*jiange)

{

sell=OrderOpenPrice()-((OrderOpenPrice()-Ask)*ys_bl)-(OrderStopLoss()-Ask-Point*jiange)*0.8;

}

if(OrderStopLoss()>sell || OrderStopLoss()==0)

{

y=OrderModify(OrderTicket(),OrderOpenPrice(),sell,OrderTakeProfit(),0,Green);

}

}

}

}

if(dianshu==0 && OrderStopLoss()>0)

{

if(OrderType()==0 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic && StringSubstr(OrderComment(),com1,com1+StringLen(combuy))==combuy)

{

y=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),0,Red);

}

if(OrderType()==1 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic && StringSubstr(OrderComment(),com1,com1+StringLen(comsell))==comsell)

{

y=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),0,Green);

}

}

}

}

return(y);

}


在主程序OnTick()里调用

int jiange_0=200;//预定义变量,间隔点数为200;

int beilv=20;//移动止损位置为间隔的20%;该变量设置为0且已经有了止损价时,表示删除止损价;

void OnTick()

{

bool y=false;

//---初始移动止损时,现价与开价格之间达到200点,止损价格位置为开价格盈利40点位置,随后根据行情变化会增加止损位空间

y=yisun_dt(jiange_0,beilv,0,Symbol()+"buy",Symbol()+"sell",0);

}

该函数初始止损位置不大,随着行情发展会逐步增大。


EA开发--移动止损函数

MT4\MT5可操作分析外汇、期货、股票,现我使用的平台已经接入期货,喜欢的朋友一起研究学习,探讨研究可私信我!

信息标题: EA开发--移动止损函数

链接地址: http://www.moniu.com/waihui-whxw/350328

版权声明:《EA开发--移动止损函数》的著作权归原作者所有,仅供学习参考,转载或引用时请保留版权信息

Copyright © 魔牛财经 www.moniu.com 版权所有
京ICP备12019688号-5
实时行情 手机版