Почему не модифицируется ордер? - страница 2

 
Alexandr Kambolin:

Все чудесатее и чудесатее...

Установил пару флагов и пару фигурных скобок чтобы быть уверенным в исполнении цикла. Один флаг печатает номер ордера сразу после его выбора, а второй печатает номер этого ордера перед началом его модификации. Вот кусок измененного кода:

 Получил следующую картину в журнале ошибок:

 

 т.е. в цикле каким то образом происходит подмена выбранного ордера на предыдущий....

Может у кого есть мысли по этому поводу?  

int tiketB=OrderModify...

Может всё-таки bool

И может стоит передавать туда OrderStopLoss(), а не обнулять?
 
Поменяйте тип: bool tiketB=OrderModify...
 

Да, Вы правы, исправил на bool, но видимо не это было причиной, т.к. в цикле по прежнему подменяется ордер №2 на ордер №3, что видно по скриншоту из журнала ошибок.

Вот исправленный код:

//+------------------------------------------------------------------+
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
      if (orders[6]>0)  //Если есть открытые ордера
         {bool tiket1;
         if (orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
           {
            for (int i = OrdersTotal() - 1; i >= 0; i--)
               {tiket1=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
                 { Print ("Выбираем Ордер №= ", OrderTicket());
                  {if (tiket1==true)
                     {
                     if (OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType() == OP_BUY)
                        {Print ("Выбранный Ордер №= ", OrderTicket());
                        if (OrderTakeProfit()!=ND(Sr_Cena(OP_BUY)+take_profit))
                           {Print ("Выбранный в цикл модификации Ордер №= ", OrderTicket(), " Модифицировать до ", DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8));
                           Print ("Для модификации Выбираем Ордер №= ", OrderTicket()," Цена открытия ордера", DoubleToString(OrderOpenPrice(),8));
                           bool tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,ND(Sr_Cena(OP_BUY)+take_profit),0);
                           if (tiketB==false) Print (GetLastError()," OrderTicket= ",OrderTicket(), " TP= ", DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8), " Ордер ТР= ", DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString((OrderTakeProfit()-ND(Sr_Cena(OP_BUY)+take_profit))*1000000,8) );
                           Print("Флаг прохождения= ОК");
                           }
                        }
                      }
                   }
                  }
                }
            }
          }
        flag_new_order=false;    

Скрин журнала ошибок:


 

 

Попробовал изменить способ перебора ордеров в цикле. 

Ранее перебирал с конца, теперь с начала.

Картина ошибок изменилась, но ордер так и подменяется.

 

 
Alexandr Kambolin:

Попробовал изменить способ перебора ордеров в цикле. 

Ранее перебирал с конца, теперь с начала.

Картина ошибок изменилась, но ордер так и подменяется.

 

Фигурных скобок как-то многовато. А воообще, есть же готовые функции модификации, зачем изобретать велосипед заново, да с треугольными колесами?
 
Vitalie Postolache:
Фигурных скобок как-то многовато. А воообще, есть же готовые функции модификации, зачем изобретать велосипед заново, да с треугольными колесами?
Посоветуйте, пожалуйста, готовую функцию. Насчёт скобок-поставил специально, чтобы быть уверенным что не происходит перескакивание. Сейчас уберу лишние и продемонстрирую. 
 
Alexandr Kambolin:
Посоветуйте, пожалуйста, готовую функцию. Насчёт скобок-поставил специально, чтобы быть уверенным что не происходит перескакивание. Сейчас уберу лишние и продемонстрирую. 
//+------------------------------------------------------------------+
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
   if(orders[6]>0) //Если есть открытые ордера
     {
      if(orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
        {
         for(int i=OrdersTotal()-1; i>=0; i--)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
              {
               Print("Выбираем Ордер №= ",OrderTicket());
               if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
                 {
                  Print("Выбранный Ордер №= ",OrderTicket());
                  if(OrderTakeProfit()!=ND(Sr_Cena(OP_BUY)+take_profit))
                    {
                     Print("Выбранный в цикл модификации Ордер №= ",OrderTicket()," Модифицировать до ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8));
                     Print("Для модификации Выбираем Ордер №= ",OrderTicket()," Цена открытия ордера",DoubleToString(OrderOpenPrice(),8));
                     bool tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,ND(Sr_Cena(OP_BUY)+take_profit),0);
                     if(tiketB==false) Print(GetLastError()," OrderTicket= ",OrderTicket()," TP= ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8)," Ордер ТР= ",DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString((OrderTakeProfit()-ND(Sr_Cena(OP_BUY)+take_profit))*1000000,8));
                     Print("Флаг прохождения= ОК");
                    }
                 }
              }
           }
        }
     }
   flag_new_order=false;
Пробуй , как то так.
 
Alekseu Fedotov:
//+------------------------------------------------------------------+
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+
   if(orders[6]>0) //Если есть открытые ордера
     {
      if(orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
        {
         for(int i=OrdersTotal()-1; i>=0; i--)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
              {
               Print("Выбираем Ордер №= ",OrderTicket());
               if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
                 {
                  Print("Выбранный Ордер №= ",OrderTicket());
                  if(OrderTakeProfit()!=ND(Sr_Cena(OP_BUY)+take_profit))
                    {
                     Print("Выбранный в цикл модификации Ордер №= ",OrderTicket()," Модифицировать до ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8));
                     Print("Для модификации Выбираем Ордер №= ",OrderTicket()," Цена открытия ордера",DoubleToString(OrderOpenPrice(),8));
                     bool tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,ND(Sr_Cena(OP_BUY)+take_profit),0);
                     if(tiketB==false) Print(GetLastError()," OrderTicket= ",OrderTicket()," TP= ",DoubleToString(ND(Sr_Cena(OP_BUY)+take_profit),8)," Ордер ТР= ",DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString((OrderTakeProfit()-ND(Sr_Cena(OP_BUY)+take_profit))*1000000,8));
                     Print("Флаг прохождения= ОК");
                    }
                 }
              }
           }
        }
     }
   flag_new_order=false;
Пробуй , как то так.

Не получается. В цикле все равно происходит подмена Ордера №2 на уже модифицированный Ордер №3

Вот скрин: 

 

Методом проб и ошибок сам нашел решение. По сути логики в решении не увидел, сделал интуитивно и все заработало.

Если гуру найдут в чем была проблема - пишите, мне интересно почему ранее не работало. 

Если кому интересно, то вот итог этого несчастного куска кода: 

//+------------------------------------------------------------------+
// Выставляем усредняющий тейкпрофит
//+------------------------------------------------------------------+

   if(orders[6]>0) //Если есть открытые ордера
     {
      if(orders[0]>0 && flag_new_order==true)//Если ордера BUY и открыт усредняющий ордер
        {
         bool tiketB;
         double new_TP=ND(Sr_Cena(OP_BUY)+take_profit);
         for(int i=OrdersTotal()-1; i>=0; i--)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
              {
               Print("Выбираем Ордер №= ",OrderTicket());
               if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderTakeProfit()!=new_TP)
                 {
                  Print("Выбранный в цикл модификации Ордер №= ",OrderTicket()," Модифицировать до ",DoubleToString(new_TP,8));
                  Print("Для модификации Выбираем Ордер №= ",OrderTicket()," Цена открытия ордера",DoubleToString(OrderOpenPrice(),8));
                  tiketB=OrderModify(OrderTicket(),OrderOpenPrice(),0,new_TP,0);
                  if(tiketB==false) Print(GetLastError()," OrderTicket= ",OrderTicket()," TP= ",DoubleToString(new_TP,8)," Ордер ТР= ",DoubleToString(OrderTakeProfit(),8)," Разница= ",DoubleToString(((OrderTakeProfit()-new_TP)*1000000)));
                  Print("Флаг прохождения= ОК");
                 }
              }
           }
        }
     }
   flag_new_order=false;
  

Вот скрин журнала: