Как проверить, выбран ли ордер - страница 9

 
Vinin:


Я ни к кому конкретно и не обращался.

Но Вы видимо правильно сделали, что приняли на свой счет.

Дураком Вас назвать не могу, но то что Вы глухой - это точно.

Вы не слышите других. Это я не про свои реплики, а про те советы что Вам давали.

Вы когда-нибудь писали интероперабельные программы?

То, о чём спрашивает Ant_TL и есть "интероперабельность", но на MQL это не реализуемо.

 
PapaYozh:

Вы когда-нибудь писали интероперабельные программы?

То, о чём спрашивает Ant_TL и есть "интероперабельность", но на MQL это не реализуемо.


Реализовать не сложно. И решение в принципе есть. Лень дальше читать
 
Подобное решение может быть жизнеспособно для закрытых позиций, которые уже не изменятся. А для открытых - не стоит делать
 
Vinin:

Реализовать не сложно. И решение в принципе есть. Лень дальше читать

Вы не сможете выполнять опереции с ордерами и при этом гарантированно не затронуть окружение.

Про GetLastError() уже было сказано, Вы не сможете восстановить код, который должна была бы вернуть функция GetLastError()

 
PapaYozh:

Вы не сможете выполнять опереции с ордерами и при этом гарантированно не затронуть окружение.

Про GetLastError() уже было сказано, Вы не сможете восстановить код, который должна была бы вернуть функция GetLastError(). 


При желании можно, просто будет своя функция ( я про  GetLastError())
 

Так может выглядеть решение - обертка OrderSelect() - MySelect() для использования в функциях, перебирающих ордера по индексу

 

int last_select=0; // ставим где-нибудь перед init и start

 

// ...... код программы 

 

bool MySelect(int i,int mode=MODE_TRADES){ // Выбор нужного нам ордера - возвращает True, если ордер выбран и принадлежит советнику, False иначе
   if(OrderSelect(i,SELECT_BY_POS,mode)){
      last_select=OrderTicket();
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
         return(true);
      else
         return(false);
   }
   return(false);
}

bool TickSelect(int tick){ // Выбор ордера напрямую по тикету
   if(OrderSelect(tick,SELECT_BY_TICKET))
      last_select=tick;
   else
      return(false);
   return(true);
}

void SomeFunc(){ // Шаблон функции, которая может нарушить выбор ордеров и соответственно нарушить логику работы программы, если не позаботиться о сохранности текущего выбора ордера
   int tick=last_select;
  
   // ... производим нужные действия
  
   if(tick>0)
      TickSelect(tick);
}

 
Ant_TL:

Не может, если в программе вы сами не изменяете это состояние.

Предполагалось, что состояние ордера поменялось с MODE_TRADES на MODE_HISTORY. Причем ваш советник ничего с ордером не делал. Это тот же ордер, или уже другой?

 
Mislaid:

Предполагалось, что состояние ордера поменялось с MODE_TRADES на MODE_HISTORY. Причем ваш советник ничего с ордером не делал. Это тот же ордер, или уже другой?

Это тот же ордер

 
Чё-то я не вижу проблемы. А сыр-бор разведён... Вам нужно в одной главной функции А() выбирать ордер, а в другой функции В(), вызываемой из главной функции А(), обрабатывать выбранный в ф-ции А() ордер. И в функции В() нужно точно знать - выбран ли всё ещё ордер... Ну так передавайте в функцию В() тикет ордера, выбранного в функции А(). В функции В() можно проверить из какого списка выбран ордер и уже дальше решать куда ехать и что возвращать обратно в функцию А()...
 
Ant_TL:

Так может выглядеть решение - обертка OrderSelect() - MySelect() для использования в функциях, перебирающих ордера по индексу

 

int last_select=0; // ставим где-нибудь перед init и start

 

// ...... код программы 

 

bool MySelect(int i,int mode=MODE_TRADES){ // Выбор нужного нам ордера - возвращает True, если ордер выбран и принадлежит советнику, False иначе
   if(OrderSelect(i,SELECT_BY_POS,mode)){
      last_select=OrderTicket();
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
         return(true);
      else
         return(false);
   }
   return(false);
}

bool TickSelect(int tick){ // Выбор ордера напрямую по тикету
   if(OrderSelect(tick,SELECT_BY_TICKET))
      last_select=tick;
   else
      return(false);
   return(true);
}

void SomeFunc(){ // Шаблон функции, которая может нарушить выбор ордеров и соответственно нарушить логику работы программы, если не позаботиться о сохранности текущего выбора ордера
   int tick=last_select;
  
   // ... производим нужные действия
  
   if(tick>0)
      TickSelect(tick);
}

Давайте теперь представим что произойдёт с переменной last_select после перезапуска терминала (свет противные дядьки вырубили)
Причина обращения: