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

 
В принципе - да, но "указатель" придется заводить свой. подумайте насчет моего предложения с функцией, мне кажется это универсальное решение. конечно возникает вопрос о скорости такого кода, но это видимо вопрос третий.
 
FAQ:
В принципе - да, но "указатель" придется заводить свой. подумайте насчет моего предложения с функцией, мне кажется это универсальное решение. конечно возникает вопрос о скорости такого кода, но это видимо вопрос третий.

 Спасибо, всегда рад конструктивной беседе.

 
Ant_TL:

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

Если Вы загнали значение функции в переменную, то да. Если нет, то эта функция является глобальной и может измениться при первом же вызове.
 
Ant_TL:

 Спасибо, всегда рад конструктивной беседе.


  На здоровье. просто не делайте поспешных выводов.
 
Roger:
Если Вы загнали значение функции в переменную, то да. Если нет, то эта функция является глобальной и может измениться при первом же вызове.

 Немного не понял. Я имел в виду следующую ситуацию: мы вызываем из функции А() в модуле основной программы библиотечную функцию Б() которая например просто выбирает первый ордер в списке (допустим, что ордер априори имеется):

void B(){

   OrderSelect(0,SELECT_BY_POS);

Когда после вызова этой функции управление вернется из библиотеки в основной модуль, если вызвать в нем функцию OrderTicket() или любую другую функцию, рассчитанную на то, что ордер был заранее выбран, мы получим как раз ту же самую ошибку 4105. Но если до вызова функции Б в основном модуле уже был выбран некоторый другой ордер, то он останется выбранным не зависимо от нового Select в библиотеке, потому что текущий выбранный ордер как я понимаю уникален только в пределах модуля.

А вот если мы такую же функцию Б вызываем из функции А основного модуля, то ордер, выбранный в функции А до вызова Б изменится на ордер 0 (т.е. текущий выбранный ордер после возврата из функции Б будет ордер 0, не зависимо от того, какой был текущий выбранный ордер до вызова Б)

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

 
Ant_TL:

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


мысль ваша ясна..

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

в свое время я также ушел от этого, т.к. все это добро приводило к постоянным ошибкам.. поэтому все что нужно советник должен вычислять по месту, тем более что времени на это мало уходит.. нужно получить тикет последнего открытого ордера - получи, нужно использовать свойства полученного ордера, будьте добры OrderSelect() и все замечательно, отсюда, конечно следует усложнение алгоритма работы советника, т.е. советник в любой момент времени должен "понимать" в каком состоянии находится торговая тактика, и действовать сообразно этому состоянию, независимо ото того что происходит с электричеством и другими работающими советниками в терминале..

Ant_TL:

Когда после вызова этой функции управление вернется из библиотеки в основной модуль, если вызвать в нем функцию OrderTicket() или любую другую функцию, рассчитанную на то, что ордер был заранее выбран, мы получим как раз ту же самую ошибку 4105. Но если до вызова функции Б в основном модуле уже был выбран некоторый другой ордер, то он останется выбранным не зависимо от нового Select в библиотеке, потому что текущий выбранный ордер как я понимаю уникален только в пределах модуля.

это проверено так работает, или вы так думаете, что так работает ?


по мне так нет никакого разделения на модули и библиотеки.. после компиляции код работает как единая конструкция..


где бы ни был вызван OrderSelect() везде будет возвращаться один и тот же OrderTicket() последнего селекнутого ордера..

по-моему так должно работать..

 
keekkenen:
 

это проверено так работает, или вы так думаете, что так работает ?

по мне так нет никакого разделения на модули и библиотеки.. после компиляции код работает как единая конструкция..

где бы ни был вызван OrderSelect() везде будет возвращаться один и тот же OrderTicket() последнего селекнутого ордера..

по-моему так должно работать..

 Проверено, что ордер выбранный в библиотеке не является выбранным ордером при возврате в основной модуль. Исходя из этого по логике вещей выбранным ордером при возврате должен быть последний выбранный ордер в основном модуле, хотя конкретно это я пока не проверял.

Я эту проблему для себя решил созданием оберток на библиотечные функции во включаемом библиотечном файле mqh по типу такого:

bool GetOrder(int a=0){
   return(OrderSelect(_GetOrder(a),SELECT_BY_TICKET));
}

Да и кстати параметры по умолчанию тоже нельзя передавать в библиотечные функции, что также отражено в этом примере.

Здесь _GetOrder(int a) - сама библиотечная функция, находящая и возвращающая какой-то ордер. Вызов функции из библиотеки происходит с явным указанием параметра "а", в функции-обертке он по умолчанию равен 0, плюс к этому возвращенный тикет в обертке выбирается заново уже в основном программном модуле, т.к. его выбор в библиотечной функции не дойдет до "получателя".

 

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

ПыСы. Зачем Вы еще оборачиваете эту функцию в дополнительную, совершенно лишнюю функцию? 

ПыПыСЫ. Совет - создайте статическую целую переменную, передавайте ей значение ордера после открытия, она не изменится, пока сами не пожелаете, и будет точно выполнять Вами задуманное. 

 
Ant_TL:

 Проверено, что ордер выбранный в библиотеке не является выбранным ордером при возврате в основной модуль. Исходя из этого по логике вещей выбранным ордером при возврате должен быть последний выбранный ордер в основном модуле, хотя конкретно это я пока не проверял.

А это утверждение требует уточнения: утверждение верно, если мы говорим ТОЛЬКО о модуле (библиотеке) компилируемом (*.mg4-библиотеки из папки libraries). Для модулей, являющихся частью основного скомпилировнного файла (библиотеки *.mgh), такое утвержджение НЕВЕРНО!
 
TarasBY:
А это утверждение требует уточнения: утверждение верно, если мы говорим ТОЛЬКО о модуле (библиотеке) компилируемом (*.mg4-библиотеки из папки libraries). Для модулей, являющихся частью основного скомпилировнного файла (библиотеки *.mgh), такое утвержджение НЕВЕРНО!

 MQH это не отдельный модуль, а вставка в основной модуль, находящаяся в другом файле. Так что конечно речь идет об отдельной .ex4 библиотеке