EaCode小胖李 发表于 2022-12-23 16:56:44

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]
查看完整版本: WholeTrailStopLoss2()为同方向的订单设置整体的移动止损,可设置移动止损步长