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

 
yaaarik777:
Я только учусь, пытаюсь пользоваться справочником, но понимаю что получается какой-то бред, хочется увидеть на примере как это сделать.
почитайте эту статью, будет полезным https://www.mql5.com/ru/articles/1399
События в МetaТrader 4
События в МetaТrader 4
  • 2006.05.29
  • Andrey Khatimlianskii
  • www.mql5.com
Статья посвящена программному отслеживанию событий в терминале МetaТrader 4, таких как открытие, закрытие и модификация ордеров, и рассчитана на пользователя, обладающего базовыми навыками работы с терминалом и программирования на MQL 4.
 
yaaarik777:

Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.

Ситуация такая:

выставляем 2 отложенных ордера в разных направлениях, как только срабатывает один из них, то другой удаляется и больше не выставляется.

Буду очень благодарен за помощь.

Спасибо. 

Что-то типа того

   for(int pos=OrdersTotal()-1,ticket=0,trade=0;pos!=-1;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderType()>1)//Если найденный ордер отложенный
        {
         ticket=OrderTicket();//Запомним его тикет
        }
      else//Если ордер не отложенный
        {
         trade=1;//Запомним,что есть открытая позиция
        }
      if(ticket!=0 && trade==1)//И если известен отложенный и открыта позиция
        {
         int OD=OrderDelete(ticket);//Удаляем отложенный
        }
     }


 

 
Nikolay Gaylis:
"Продолжим искать"-надо убрать!
На форуме можео редактировать свои посты самому. Всё, что вы написали отдельными постами выше, можно уместить в один.
 
Vitalie Postolache:
На форуме можео редактировать свои посты самому. Всё, что вы написали отдельными постами выше, можно уместить в один.
спасибо!
 

Здравствуйте! Ввел трал тейкпрофита по следующему алгоритму:

 if(total>0)
      {for (int i=OrdersTotal()-1; i>=0; i--)
       if(OrderSelect(i,SELECT_BY_POS)==true)      
            {                                          
            if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY) 
              {
               RefreshRates();
               if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
                {
                 УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
                 МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
                }
              }
            }
       }

но почему-то не срабатывает временнОе ограничение, и бывает так, что, если позиция не закрылась в текущем таймфрейме, то тралит  и в следующем при соблюдении условий.

Что у меня не так в последнем if()? 

 
владимир:

Здравствуйте! Ввел трал тейкпрофита по следующему алгоритму:

 if(total>0)
      {for (int i=OrdersTotal()-1; i>=0; i--)
       if(OrderSelect(i,SELECT_BY_POS)==true)      
            {                                          
            if(OrderMagicNumber()==magic && OrderSymbol()==asset && OrderType()==OP_BUY) 
              {
               RefreshRates();
               if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=(OrderOpenTime()+3600))
                {
                 УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
                 МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
                }
              }
            }
       }

но почему-то не срабатывает временнОе ограничение, и бывает так, что, если позиция не закрылась в текущем таймфрейме, то тралит  и в следующем при соблюдении условий.

Что у меня не так в последнем if()? 

Ну не знаю, не вижу пока беглым взглядом что там не так. Убрал лишнюю проверку на количество ордеров (она в условиях цикла уже есть) и добавил проверку на оба типа позиций (Buy и Sell)

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Там, где // условия трала и модификации, вставьте Print() со значениями переменных времени и поглядите что в журнале будет писать.

 
Artyom Trishkin:

Ну не знаю, не вижу пока беглым взглядом что там не так. Убрал лишнюю проверку на количество ордеров (она в условиях цикла уже есть) и добавил проверку на оба типа позиций (Buy и Sell)

//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--) {
   if(OrderSelect(i,SELECT_BY_POS)) {
      if(OrderType()>OP_SELL) continue;
      if(OrderMagicNumber()==magic && OrderSymbol()==asset) {
         if(TimeCurrent()>OrderOpenTime() && TimeCurrent()<=OrderOpenTime()+PeriodSeconds(PERIOD_H1)) {
            // УСЛОВИЕ ТРАЛА ТЭЙКПРОФИТА;
            // МОДИФИКАЦИЯ ОРДЕРА НА НОВЫЙ ТЭЙКПРОФИТ;
            }
         }
      }
   }
//+------------------------------------------------------------------+

Там, где // условия трала и модификации, вставьте Print() со значениями переменных времени и поглядите что в журнале будет писать.

Для СЕЛЛ у меня другие условия трала, поэтому я показал только БАЙ.

" со значениями переменных времени"  - имеется в виду TimeCurrent()? Извините, если Вас это удивляет - я в программировании ноль с минусом.

И вот это не понял -  OrderType()>OP_SELL. Почему >?  Тип операции OP_SELL  имеет значение = 1, а OP_BUY = 0. Следовательно, д.быть <= ? Спасибо.

 
владимир:

Для СЕЛЛ у меня другие условия трала, поэтому я показал только БАЙ.

" со значениями переменных времени"  - имеется в виду TimeCurrent()? Извините, если Вас это удивляет - я в программировании ноль с минусом.

И вот это не понял -  OrderType()>OP_SELL. Почему >?  Тип операции OP_SELL  имеет значение = 1, а OP_BUY = 0. Следовательно, д.быть <= ? Спасибо.

Если тип больше, чем 1, то перейти на следующую  итерацию цикла.
 

Приветствую. Подскажите, пожалста, почему при вот такой записи

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);} 

сплошняком выдает ошибки

: invalid ticket for OrderDelete function

: OrderDelete error 4051

по справочнику это 

Недопустимое значение параметра функции 

хотя параметры, вроде, такие-же.  

Хотя если убрать условие и оставить только

OrderDelete(ticketD);

OrderDelete(ticketUP); 

то удаляет успешно (но надо то по условию). Что я делаю не так?

 
spoiltboy:

Приветствую. Подскажите, пожалста, почему при вот такой записи

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);} 

сплошняком выдает ошибки

: invalid ticket for OrderDelete function

: OrderDelete error 4051

по справочнику это 

Недопустимое значение параметра функции 

хотя параметры, вроде, такие-же.  

Хотя если убрать условие и оставить только

OrderDelete(ticketD);

OrderDelete(ticketUP); 

то удаляет успешно (но надо то по условию). Что я делаю не так?

Ошибка где-то выше по коду, в районе  выбора ордера.