【问题标题】:EA with OrderModify that modifys all open orders带有 OrderModify 的 EA,可修改所有未结订单
【发布时间】:2021-05-29 08:21:23
【问题描述】:

编辑: 此问题是由缺少 {} 引起的。 if(OrderComment() == myTradeID)and 下还有很多代码,该行应该在 {}



所以我正在构建一个 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


    【解决方案1】:

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

    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));
          }
       }
    }
    

    【讨论】:

    • 我的问题是每笔交易都是用相同的机器人和相同的魔法进行的。我正在通过 emal 接收信号。我收到一封看起来像这样的电子邮件。 5 月 28 日,晚上 9:05 – EUR/GBP – 空头头寸 – 从 0.8655 – 调整 – 从 0.8645 到 0.8605 止损,目标:未平仓。 (S/T) Trade ID: R'(IFR) IO2WPO0F9265,因为它是一个电子邮件服务,我在 Outlook 中有一个 VB 脚本,将电子邮件的相对值存储在 3 个不同的文件中。打开/调整和关闭。
    • 我的 EA 然后从这些文件中读取数据,然后根据评论中存储的 tradingID 打开调整或关闭订单。我知道这不是最好的解决方案,但到目前为止,这就是我得到的。
    • 我将使用完整的 EA 代码更新邮件问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2011-08-08
    • 2015-09-20
    相关资源
    最近更新 更多