EaCode小胖李 发表于 2022-12-23 15:30:13

TotalBreakEven()为多个同向订单设置整体保本,常用于马丁EA

函数名称
void TotalBreakEven(string SymbolX,int OrderTypeX,int MagicX,int BreakevenStartX,int BreakevenX)
函数介绍


为同方向的订单设置一个整体保本止损。不同与我发布的BreakEven()函数,BreakEven()是为单独的每个订单设置保本损,不同订单的保本损位置是不同的。

而TotalBreakEven()是为同向订单设置一个整体的保本损,比例为马丁EA,设置一个整体保本损。那所有的订单的止损价格是相同的。

TotalBreakEven()函数在使用时,需要依赖其他函数,我一并放到了下面的函数定义中。你们使用的时候把函数定义中的,多个函数定义均放到你代码的最下方即可。
//举例:为所有的多单设置一个10微点的总体保本损
TotalBreakEven(Symbol(),OP_BUY,MAGIC,500,10);

参数介绍

SymbolX:需要设置保本的品种,一般设置当前品种即可。也就是Symbol();
OrderTypeX:订单的方向,0代表多单,1代表空单
MagicX:订单的魔术码,你的EA的魔术码是多少,这里填上即可。
BreakevenStartX:开启保本的盈利点数(pips),当该方向订单总体盈利多少点时设定保本。
BreakevenX:保本的点数,一般设置0即可。如果你想多保本一些点数,可以设置一个大于0的整数数值。

函数定义

注意:本人发布的函数均为实战开发所用,低价或免费发布并不赚钱,仅限懂编程的朋友使用,不提供指导,因为人工成本巨贵,感谢朋友们海涵。void TotalBreakEven(string SymbolX,int OrderTypeX,int MagicX,int BreakevenStartX,int BreakevenX)
{
   if(OrderTypeX==OP_BUY||OrderTypeX==-1)
      if(MarketInfo(SymbolX,MODE_BID)>CostPrice(SymbolX,OP_BUY,MagicX)+BreakevenStartX*MarketInfo(SymbolX,MODE_POINT) && CostPrice(SymbolX,OP_BUY,MagicX)!=0)
      {
         //Print("大于点数");
         if(LastStoploss(SymbolX,OP_BUY,MagicX)<CostPrice(SymbolX,OP_BUY,MagicX)+BreakevenX*MarketInfo(SymbolX,MODE_POINT))
            ModifyByPrice(SymbolX,OP_BUY,CostPrice(SymbolX,OP_BUY,MagicX)+BreakevenX*MarketInfo(SymbolX,MODE_POINT),0,MagicX);
      }
   if(OrderTypeX==OP_SELL||OrderTypeX==-1)
      if(MarketInfo(SymbolX,MODE_ASK)<CostPrice(SymbolX,OP_SELL,MagicX)-BreakevenStartX*MarketInfo(SymbolX,MODE_POINT))
      {
         //Print("大于点数");
         if(LastStoploss(SymbolX,OP_SELL,MagicX)>CostPrice(SymbolX,OP_SELL,MagicX)-BreakevenX*MarketInfo(SymbolX,MODE_POINT))
            ModifyByPrice(SymbolX,OP_SELL,CostPrice(SymbolX,OP_SELL,MagicX)-BreakevenX*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]
查看完整版本: TotalBreakEven()为多个同向订单设置整体保本,常用于马丁EA