WholeTrailStopLoss2()为同方向的订单设置整体的移动止损,可设置移动止损步长
函数名称WholeTrailStopLoss2(string SymbolX,int OrderTypeX,int MagicX,int TrailSLStartX,int TrailSLX,int TrailStepX)
函数介绍
可以为同方向的订单设置整体的移动止损,与上个函数TrailStopLoss()不同的是。TrailStopLoss()是为每一个订单设置跟踪止损,不同订单有着自己的跟踪止损。
WholeTrailStopLoss2()是为同方向订单设置整体的移动止损,一般在马丁策略的常见。你的马丁策略加了很多单后,你不希望很快就止盈了,想设置一个整体的移动止损。那这个函数就可以实现。
WholeTrailStopLoss2()与WholeTrailStopLoss()的不同是,WholeTrailStopLoss2()可以设置止损移动时的步长,其余用法时相同的。
WholeTrailStopLoss2()函数功能的实现需要依赖其他的函数,这些函数的定义,我一并放到了帖子的最下方。
//举例:当多单平均盈利500点后,为其设置一个100点的移动止损,止损每变化10点移动一次
WholeTrailStopLoss2(Symbol(),OP_BUY,MAGIC,500,100,10);
参数介绍
SymbolX:需要设置跟踪止损的品种,一般设置当前品种即可。也就是Symbol();
OrderTypeX:订单的方向,0代表多单,1代表空单
MagicX:订单的魔术码,你的EA的魔术码是多少,这里填上即可。
TrailSLStartX:开启跟踪止损的盈利点数(pips),当指定方向订单平均盈利多少点时开启跟踪止损。
TrailSLX:跟踪止损的点数,可以设置一个大于0的整数数值。
TrailStepX:移动止损的步长,价格至少变动多少点移动一次。设置移动步长,可以减少订单的过多修改。
函数定义
注意:本人发布的函数均为实战开发所用,低价或免费发布并不赚钱,仅限懂编程的朋友使用,不提供指导,因为人工成本巨贵,感谢朋友们海涵。void WholeTrailStopLoss2(string SymbolX,int OrderTypeX,int MagicX,int TrailSLStartX,int TrailSLX,int TrailStepX)
{
if(OrderTypeX==OP_BUY||OrderTypeX==-1)
if(MarketInfo(SymbolX,MODE_BID)>CostPrice(SymbolX,OP_BUY,MagicX)+TrailSLStartX*MarketInfo(SymbolX,MODE_POINT))
if(LastStoploss(SymbolX,OP_BUY,MagicX)<MarketInfo(SymbolX,MODE_BID)-TrailSLX*MarketInfo(SymbolX,MODE_POINT)-TrailStepX*MarketInfo(SymbolX,MODE_POINT) && LastStoploss(SymbolX,OP_BUY,MagicX)!=0)
ModifyByPrice(SymbolX,OP_BUY,MarketInfo(SymbolX,MODE_BID)-TrailSLX*MarketInfo(SymbolX,MODE_POINT),0,MagicX);
if(OrderTypeX==OP_SELL||OrderTypeX==-1)
if(MarketInfo(SymbolX,MODE_ASK)<CostPrice(SymbolX,OP_SELL,MagicX)-TrailSLStartX*MarketInfo(SymbolX,MODE_POINT))
if(LastStoploss(SymbolX,OP_SELL,MagicX)>MarketInfo(SymbolX,MODE_ASK)+TrailSLX*MarketInfo(SymbolX,MODE_POINT)+TrailStepX*MarketInfo(SymbolX,MODE_POINT) && LastStoploss(SymbolX,OP_SELL,MagicX)!=0)
ModifyByPrice(SymbolX,OP_SELL,MarketInfo(SymbolX,MODE_ASK)+TrailSLX*MarketInfo(SymbolX,MODE_POINT),0,MagicX);
}
double CostPrice(string SymbolX,int OrderTypeX,int MagicX)
{
double PriceSum=0;
double OrderSum=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
if((OrderSymbol()==SymbolX ||SymbolX=="-1")&&
(OrderMagicNumber()==MagicX ||
MagicX==-1)&&(OrderType()==OrderTypeX || OrderTypeX==-1))
{
PriceSum+=OrderOpenPrice()*OrderLots();
OrderSum+=OrderLots();
}
}
if(PriceSum!=0)
return(NormalizeDouble(PriceSum/OrderSum,MarketInfo(SymbolX,MODE_DIGITS)));
else
return(0);
}
double LastStoploss(string SymbolX,int OrderTypeX,int MagicX)
{
double LastStoploss=0;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i, SELECT_BY_POS))
if((OrderSymbol()==SymbolX||
SymbolX=="-1")&&(OrderMagicNumber()==MagicX||MagicX==-1)&&(OrderType()==OrderTypeX||OrderTypeX==-1))
{
LastStoploss=OrderStopLoss();
break;
}
return(LastStoploss);
}
void ModifyByPrice(string SymbolX,int OrderTypeX,double StopLossX,double TakeProfitX,int MagicX)
{
if(StopLossX>=0)
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
if((OrderSymbol()==SymbolX||
SymbolX=="-1")&&(OrderMagicNumber()==MagicX||MagicX==-1)&&(OrderType()==OrderTypeX||OrderTypeX==-1))
if(NormalizeDouble(StopLossX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS))!=OrderStopLoss())
if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(StopLossX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),OrderTakeProfit(),0,Yellow))
Print(GetLastError());
}
if(TakeProfitX>=0)
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
if((OrderSymbol()==SymbolX||
SymbolX=="-1")&&(OrderMagicNumber()==MagicX||MagicX==-1)&&(OrderType()==OrderTypeX||OrderTypeX==-1))
if(OrderTakeProfit()!=NormalizeDouble(TakeProfitX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(TakeProfitX,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),0,Yellow))
Print(GetLastError());
}
页:
[1]