首页 > 解决方案 > 带有 OrderModify 的 EA,可修改所有未结订单

问题描述

编辑:这个问题是由缺少 {} 引起的。 if(OrderComment() == myTradeID)并且该行下的大量代码应该在 {} 内



所以我正在构建一个 EA,它从计算机上的一个文件中读取,该文件包含一个字符串,其中包含关于什么类型的订单(NewOrder、AdjustOrder 或 CancelOrder)的信息。

void AdjustTradeOrder(string myType,string mySymbole,string myTradeID,int myPosition,double myEntry,double myStopLoss,double myTakeProfit)

我遇到的问题是,在 EA 下方的代码中,有时只是更改了正确的订单,但有时它会更改所有未结订单,这是一个大问题。

我正在尝试检查 myTradeID 是否与所选订单 ID 上的评论相同,然后才应该修改订单。但有时它会修改所有订单。

知道为什么吗?

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void AdjustTradeOrder(string myType,string mySymbole,string myTradeID,int myPosition,double 
myEntry,double myStopLoss,double myTakeProfit)
{

if(commentOnOpenOrders(myTradeID) && !commentOnOpenHistory(myTradeID))
 {
  //--- get minimum stop level
  double minstoplevel=MarketInfo(mySymbole,MODE_STOPLEVEL);
  double price=MarketInfo(mySymbole,MODE_ASK); ;
  double minilot = MarketInfo(mySymbole,MODE_MINLOT);

  color orderColor;
  if(myPosition==0)
    {
     orderColor = clrGreen;
    }
  else
    {
     orderColor = clrRed;
    }

  //+------------------------------------------------------------------+
  int PositionIndex;    //  <-- this variable is the index used for the loop
  int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
  TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

  for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
    {
     //Print("----------> AdjustTradeOrder       Part 3");
     if(! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES))
        continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
     if(OrderComment() == myTradeID)

        Print(myEntry + " ;" + myTakeProfit + " ;" + myTakeProfit);
     if(myEntry==0 && myTakeProfit==0 && myStopLoss>0)
        // MODIFT ONLY SL
       {
        Print("-----> ONLY SL");
        if(! OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor))
           Print("[ONLY SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
        else
           Print("[ONLY SL] - OrderSend placed successfully");
        deleteFile_AdjustTrade(fileName_Adjusted);

       }
     else
        if(myEntry>0 && myTakeProfit==0 && myStopLoss>0)
           // MODIFT ENTY & SL
          {
           Print("-----> MODIFT ENTY & SL");
           if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor))
              Print("[MODIFT ENTY & SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
           else
              Print("[MODIFT ENTY & SL] - OrderSend placed successfully");
           deleteFile_AdjustTrade(fileName_Adjusted);
          }
        else
           if(myEntry>0 && myTakeProfit==0 && myStopLoss==0)
              // MODIFT ONLY ENTY
             {
              Print("-----> MODIFT ONLY ENTY");
              if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),OrderTakeProfit(),0,orderColor))
                 Print("[MODIFT ONLY ENTY] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
              else
                 Print("[MODIFT ONLY ENTY] - OrderSend placed successfully");
              deleteFile_AdjustTrade(fileName_Adjusted);
             }
           else
              if(myEntry>0 && myTakeProfit>0 && myStopLoss==0)
                 // MODIFT ENTY & TP
                {
                 Print("-----> MODIFT ENTY & TP");
                 if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
                    Print("[MODIFT ENTY & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
                 else
                    Print("[MODIFT ENTY & TP] - OrderSend placed successfully");
                 deleteFile_AdjustTrade(fileName_Adjusted);
                }
              else
                 if(myEntry==0 && myTakeProfit>0 && myStopLoss==0)
                    // MODIFT ONLY TP
                   {
                    Print("-----> ONLY Modify TAKEPROFIT");
                    if(! OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
                       Print("[ONLY Modify TAKEPROFIT] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
                    else
                       Print("[ONLY Modify TAKEPROFIT] - OrderSend placed successfully");
                    deleteFile_AdjustTrade(fileName_Adjusted);
                   }
                 else
                    if(myEntry>0 && myTakeProfit>0 && myStopLoss>0)
                       // MODIFT ALL
                      {
                       Print("-----> MODIFT ALL");
                       if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
                          Print("[MODIFT AL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
                       else
                          Print("[MODIFT AL] - OrderSend placed successfully");
                       deleteFile_AdjustTrade(fileName_Adjusted);
                      }
     if(myEntry==0 && myTakeProfit>0 && myStopLoss>0)
        // MODIFT SL & TP
       {
        Print("-----> MODIFT SL & TP");
        if(! OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
           Print("[MODIFT SL & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
        else
           Print("[MODIFT SL & TP] - OrderSend placed successfully");
        deleteFile_AdjustTrade(fileName_Adjusted);
       }
     else
       {
        Print("-----> Don't Know What whent wrong.");
        Print(
           "myType = "+myType   + ";"+
           "mySymbole = "+mySymbole   + ";"+
           "myTradeID = "+myTradeID   + ";"+
           "myPosition = "+IntegerToString(myPosition)   + ";"+
           "myEntry = "+DoubleToStr(myEntry)   + ";"+
           "myStopLoss = "+DoubleToStr(myStopLoss)   + ";"+
           "myTakeProfit = "+DoubleToStr(myTakeProfit)
        );
       }
    }
  //+------------------------------------------------------------------+
 }
else
 {
  //Print("TradeID Already exists = "+myTradeID);
 }
}

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

标签: mql4

解决方案


您永远不应该使用comment参数OrderSend()来存储任何关键信息。它如果经常被您的经纪人覆盖或附加,因此被认为非常不可靠。

magic number参数专门用于过滤交易,这是您应该使用的。

如果无法访问完整的 EA,就很难更正您的代码,但以下内容应该对您有所帮助。

void AdjustTradeOrder(string myType,string mySymbole,int magicNumber,int myPosition,double myEntry,double myStopLoss,double myTakeProfit)
{
   //--- get minimum stop level
   double minstoplevel=MarketInfo(mySymbole,MODE_STOPLEVEL);
   double price=MarketInfo(mySymbole,MODE_ASK); ;
   double minilot = MarketInfo(mySymbole,MODE_MINLOT);

   color orderColor;
   if(myPosition==0) orderColor = clrGreen;
   else orderColor = clrRed;

   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      //Print("----------> AdjustTradeOrder       Part 3");
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex

      if(OrderSymbol()!=Symbol()) continue; // Not the correct order symbol
      if(OrderMagicNumber()!=magicNumber) continue; // Not the correct magic number

      Print(DoubleToStr(myEntry, Digits) + " ;" + DoubleToStr(myTakeProfit, Digits) + " ;" + DoubleToStr(myTakeProfit, Digits));
      if(myEntry==0 && myTakeProfit==0 && myStopLoss>0)
      {
         // MODIFT ONLY SL
         Print("-----> ONLY SL");
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor)) Print("[ONLY SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[ONLY SL] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      else 
      if(myEntry>0 && myTakeProfit==0 && myStopLoss>0)
      {
         // MODIFT ENTY & SL
         Print("-----> MODIFT ENTY & SL");
         if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor)) Print("[MODIFT ENTY & SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[MODIFT ENTY & SL] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      else
      if(myEntry>0 && myTakeProfit==0 && myStopLoss==0)
      {
         // MODIFT ONLY ENTY
         Print("-----> MODIFT ONLY ENTY");
         if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),OrderTakeProfit(),0,orderColor)) Print("[MODIFT ONLY ENTY] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[MODIFT ONLY ENTY] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      else
      if(myEntry>0 && myTakeProfit>0 && myStopLoss==0)
      {
         // MODIFT ENTY & TP
         Print("-----> MODIFT ENTY & TP");
         if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT ENTY & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[MODIFT ENTY & TP] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      else
      if(myEntry==0 && myTakeProfit>0 && myStopLoss==0)
      {
         // MODIFT ONLY TP
         Print("-----> ONLY Modify TAKEPROFIT");
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[ONLY Modify TAKEPROFIT] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[ONLY Modify TAKEPROFIT] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      else
      if(myEntry>0 && myTakeProfit>0 && myStopLoss>0)
      {
         // MODIFT ALL
         Print("-----> MODIFT ALL");
         if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT AL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[MODIFT AL] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      if(myEntry==0 && myTakeProfit>0 && myStopLoss>0)
      {
         // MODIFT SL & TP
         Print("-----> MODIFT SL & TP");
         if(! OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT SL & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
         else Print("[MODIFT SL & TP] - OrderSend placed successfully");
         deleteFile_AdjustTrade(fileName_Adjusted);
      }
      else
      {
         Print("-----> Don't Know What whent wrong.");
         Print("myType = "+myType   + ";"+
               "mySymbole = "+mySymbole   + ";"+
               "myMagicNo = "+IntegerToString(magicNumber)   + ";"+
               "myPosition = "+IntegerToString(myPosition)   + ";"+
               "myEntry = "+DoubleToStr(myEntry)   + ";"+
               "myStopLoss = "+DoubleToStr(myStopLoss)   + ";"+
               "myTakeProfit = "+DoubleToStr(myTakeProfit));
      }
   }
}

推荐阅读