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

 
вообще-то про ошибку речь идет в самом первом посте, в отличие от топикстартера у меня все ходы записаны, т.е. пишу только о том , что проверено
 
keekkenen:
неважно что вы там думаете про то как писать код, главное, чтобы код правильно работал, вместо того чтобы привести свой код и спросить где неправильно сопли размазываем.. еще раз замечу, что не бывает ошибки 4105, если тикет правильный

То, что вы говорите, не соответствует действительности, так как ошибка 4105 возникает при вызове функций, передавать тикет в которые не нужно.

Например, при вызове OrderTicket() в случае, если вызова OrderSelect() до вызова OrderTicket() не происходило - это именно обсуждаемая в этой ветке ситуация. 

 

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

то есть сохранение последнего выбранного ордера для каждой функции своего  

 
FAQ:

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

то есть сохранение последнего выбранного ордера для каждой функции своего  

 Если вложенных функций с контролем последнего выбранного ордера несколько - т.е. из одной вызывается другая, из другой третья, то каждая функция сохраняет выбор ордера на момент её вызова и возвращает выбор в это состояние при возврате, если я правильно понял вопрос. Но это уже относится к действительно сильно навороченным решениям. Обычно более одного уровня вложенности вряд ли будет. Главное - контроль окружения каждой из таких функций, чтобы вызов этой функции не мог привести к логическим ошибкам из-за сброса предыдущего выбора ордера. Это нужно исключительно для сервисных функций, которые могут вызываться из основного цикла перебора ордеров и при этом сами перебирать ордера с целью подсчета чего-либо.

 

Кстати, похоже, если сервисная функция в библиотеке - то сохранять "указатель" (выбор ордера) не нужно, так ведь? Так как у основного советника и у библиотеки свой "указатель", т.е. ордер, выбранный в библиотеке, не будет выбранным в советнике и наоборот.

Это похоже на идеальное решение проблемы, если обе функции А и Б не располагаются в пределах одного модуля

 

Идеология : вынести функцию выбора ордера (одна на всех) с необходимыми фильтрами во вне (все равно в каждой функции вы где то (скорее всего в самом начале этот ордер должны выбрать))

int OrdersTicket(filters, int function_id, bool new = false){static int tickets[functions count];int ticket = -1;
   if(!new){
      if(OrderSelect(tickets[function_id],SELECT_BY_TICKET)){return(OrderTicket());}
   }
   // Выбор и возврат тикета ордера с нужными фильтрами
   return(ticket);
}

которая будет гарантированно возвращать тикет ранее выбранного ордера (в этой функции) , либо производить новый поиск с заданными фильтрами

в этом случае конструкция  ticket = OrdersTicket(); будет работать безупречно.

 
Ant_TL:

То, что вы говорите, не соответствует действительности, так как ошибка 4105 возникает при вызове функций, передавать тикет в которые не нужно.

Например, при вызове OrderTicket() в случае, если вызова OrderSelect() до вызова OrderTicket() не происходило - это именно обсуждаемая в этой ветке ситуация. 


а откуда вы тикет берете из настроек советника, внешнего файла - откуда ?

если так то да, ошибка будет, т.к. факт вызова OrderSelect() остается при старте на последующих тиках (в тестере так по крайней мере),..

 
Ant_TL:

Кстати, похоже, если сервисная функция в библиотеке - то сохранять "указатель" (выбор ордера) не нужно, так ведь? Так как у основного советника и у библиотеки свой "указатель", т.е. ордер, выбранный в библиотеке, не будет выбранным в советнике и наоборот.

Это похоже на идеальное решение проблемы, если обе функции А и Б не располагаются в пределах одного модуля


  Тут все зависит от степени глобальности внешней переменной.
 
Ant_TL:

Кстати, похоже, если сервисная функция в библиотеке - то сохранять "указатель" (выбор ордера) не нужно, так ведь? Так как у основного советника и у библиотеки свой "указатель", т.е. ордер, выбранный в библиотеке, не будет выбранным в советнике и наоборот.

Это похоже на идеальное решение проблемы, если обе функции А и Б не располагаются в пределах одного модуля


Я пас. Больше ни чем не могу помочь. Вокруг да около без меня!!!
 
FAQ:

  Тут все зависит от степени глобальности внешней переменной.

Конкретно в том, что "указатель" - состояние текущего выбора ордера - является глобальным в пределах модуля, т.е. для библиотеки этот указатель один, а для модуля программы другой. Значит, если функция А в программе выбирает некоторый ордер в цикле, а затем вызывает вспомогательную функцию Б из библиотеки, то даже если Б выбирает в процессе своей работы другой ордер, выбор ордера в функции А при возврате не должен нарушиться. Но если обе функции находятся в пределах модуля, то при возврате из функции Б нужно - или до и после вызова Б в самой функции А, или в функции Б при начале и по завершению её работы - запоминать и восстанавливать текущий выбор ордера, чтобы логика работы функции А в этом месте не нарушалась.

Причина обращения: