Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1718

 
// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   if(OrderTakeProfit() > 0)
                   {
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          if(OrderTakeProfit() > TP3)
                          {
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Помогите разобраться. Смысл этой функции такой, что при наличии открытых ордеров на продажу и открытии ордера на покупку модифицировать ТП ордеров на продажу. Но модификация происходит только одного первого ордера, а потом выдаёт ошибку OrderModify ERROR 1

 
Snajper007 #:

Помогите разобраться. Смысл этой функции такой, что при наличии открытых ордеров на продажу и открытии ордера на покупку модифицировать ТП ордеров на продажу. Но модификация происходит только одного первого ордера, а потом выдаёт ошибку OrderModify ERROR 1

В данном случает просто удаляется ТейкПрофит

ERROR 1 - ERR_NO_RESULT  Нет ошибки, но результат неизвестен

 
MakarFX #:

В данном случает просто удаляется ТейкПрофит

ERROR 1 - ERR_NO_RESULT  Нет ошибки, но результат неизвестен

Почему из двух ордеров, на одном он удаляется, а на другом нет?
 
Snajper007 #:
Почему из двух ордеров, на одном он удаляется, а на другом нет?

Удаляется, только если OrderTakeProfit() > 0

т.е. сделка в плюсе

 
MakarFX #:

Удаляется, только если OrderTakeProfit() > 0

т.е. сделка в плюсе

Переделал код.

// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   
                   
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
Тоже самое. Есть 2 ордера на продажу с усреднённым ТП. При открытии ордера на покупку у обоих этих ордеров ТП должен удаляться. Но удаляется он только у первого ордера, а второй так и остаётся с усреднённым ТП.
 
MakarFX #:

Удаляется, только если OrderTakeProfit() > 0

т.е. сделка в плюсе

 если  OrderTakeProfit() > 0 это не означает что сделка в плюсе.. Это просто означает, что на позицию установлен тейкпрофит..

 
Snajper007 #:

Переделал код.

Тоже самое. Есть 2 ордера на продажу с усреднённым ТП. При открытии ордера на покупку у обоих этих ордеров ТП должен удаляться. Но удаляется он только у первого ордера, а второй так и остаётся с усреднённым ТП.

 У вас просто все в перемешку.. 

Сначала вы выделили ордер 

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

Но потом вызываете функцию 

CountBuy1()

Которая скорее всего меняет выделение.. И получается каша.. Отделите мух от котлет и все заработает.. 

 
Nikolay Ivanov #:

 У вас просто все в перемешку.. 

Сначала вы выделили ордер 

Но потом вызываете функцию 

Которая скорее всего меняет выделение.. И получается каша.. Отделите мух от котлет и все заработает.. 

Спасибо! Убрал функцию, стало работать нормально.
 
Nikolay Ivanov #:

 если  OrderTakeProfit() > 0 это не означает что сделка в плюсе.. Это просто означает, что на позицию установлен тейкпрофит..

Ты прав, я перепутал с OrderProfit()
 

Ещё вопрос возник. Вот функция расчёта средней цены:

//Средний тейкпрофит для ордеров Sell
double SR_CENA_SELL()
{
double     sr_cena_sell = 0;
if(CountSell() > 1)
      {
   double     lot_price_Sell = 0;
   double     sum_lot_Sell_1  = 0;
         for (int pos=0; pos < OrdersTotal(); pos++)
           if( OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderMagicNumber() == MN || OrderMagicNumber() == 0)
              {
                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
                  {
                    lot_price_Sell += NormalizeDouble(OrderOpenPrice()* OrderLots(), Digits);
                    sum_lot_Sell_1   += OrderLots();
                    sr_cena_sell = NormalizeDouble(lot_price_Sell/sum_lot_Sell_1, Digits);
                    
                  }
              }
           }
           
      }
   return(sr_cena_sell);
 }
Почему то пересчёт идёт через раз. Т.е. открылся 2й ордер на продажу, функция выдала среднюю цену. Но когда открывается 3й ордер, функция выдаёт и предыдущее значение и новое (через принт в журнале смотрел), а в итоге остаётся предыдущее. Что не так сделал?
Причина обращения: