微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过排除最后一个订单来修改多个目标利润?

如何解决如何通过排除最后一个订单来修改多个目标利润?

我创建了这个 Modify Take Profit 函数,但这将计算所有订单总数。 如何删除最后一个订单?希望它计算没有最后一个订单的平均价格

void ModifyTakeProfit()
{
   double point=MarketInfo(OrderSymbol(),MODE_POINT);
   double tp1,tp2,bbep,bsize; tp1=0;tp2=0;bbep=0;bsize=0;
   for (int i=OrdersTotal()-1; i>=0; i--) 
   { 
      if(OrderSelect(i,SELECT_BY_POS,MODE_TradES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==OrderMagicNumber())
      {
         if(OrderType()==OP_BUY)
         {
            tp1=OrderTakeProfit();
            bbep += OrderOpenPrice()*OrderLots(); 
            bsize+= OrderLots();
         }
      }      
   }
   if (bbep>0) 
   { 
      bbep/=bsize; 
      tp1=bbep + TakeProfit*point;
      if(TakeProfit!=0)
         tp1=normalizeDouble(tp1,(int)MarketInfo(OrderSymbol(),MODE_DIGITS));
      else 
         tp1=0;
   }
   for (int i=OrdersTotal()-1; i>=0; i--)
   { 
      if(OrderSelect(i,MODE_TradES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==OrderMagicNumber())
      {
         if(OrderType()==OP_BUY)
         {
            tp2=OrderTakeProfit();
            if(tp1!=tp2)
            {   
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp1,Blue))
                  Print ("Error: ",GetLastError());
            }
         }
      }      
   }
}

enter image description here

解决方法

您的最后一个订单将位于第一个位置 (FIFO) - 因此只需将您的 for 循环调整为循环到 1 而不是 0 的下限。

void ModifyTakeProfit()
{
   double point=MarketInfo(OrderSymbol(),MODE_POINT);
   double tp1,tp2,bbep,bsize; tp1=0;tp2=0;bbep=0;bsize=0;
   for (int i=OrdersTotal()-1; i>=1; i--) 
   { 
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==OrderMagicNumber())
      {
         if(OrderType()==OP_BUY)
         {
            tp1=OrderTakeProfit();
            bbep += OrderOpenPrice()*OrderLots(); 
            bsize+= OrderLots();
         }
      }      
   }
   if (bbep>0) 
   { 
      bbep/=bsize; 
      tp1=bbep + TakeProfit*point;
      if(TakeProfit!=0)
         tp1=NormalizeDouble(tp1,(int)MarketInfo(OrderSymbol(),MODE_DIGITS));
      else 
         tp1=0;
   }
   for (int i=OrdersTotal()-1; i>=1; i--)
   { 
      if(OrderSelect(i,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==OrderMagicNumber())
      {
         if(OrderType()==OP_BUY)
         {
            tp2=OrderTakeProfit();
            if(tp1!=tp2)
            {   
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp1,Blue))
                  Print ("Error: ",GetLastError());
            }
         }
      }      
   }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。