Конструкция для OrderSend() - страница 2

 
Ренат, спасибо за ответ.
Функция OrderSend в любом случае завершится. В сетевом протоколе (и в его независимом диспетчере) есть жесткие ограничения на время проведения операций и таймауты. Если заявка не может быть выполнена из-за сетевых проблем, то операция будет прервана с кодом ошибки.

Правильно ли считсть, что независимый диспетчер находится в клиентском МТ?
Можно ли узнать подробнее о жёстких ограничениях? Насколько они жёсткие?

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

Как бы мне не промахнуться с кодом торгового модуля..
 
Функция OrderSend в любом случае завершится. В сетевом протоколе (и в его независимом диспетчере) есть жесткие ограничения на время проведения операций и таймауты. Если заявка не может быть выполнена из-за сетевых проблем, то операция будет прервана с кодом ошибки.
А если представить следующее: ордер на сервере ставится, связь нарушается, OrderSend не получает информации и прерывается по времени с кодом ошибки. Таким образом операция фактически исполнена, но возвращён код ошибки и, следовательно, при восстановлении связи возникает риск установки лишнего ордера. Можно ли как-то распознать такую ситуацию?

Если связь порвана в конце торговой операции, то есть только один способ - ждать некоторое время и проверять - появился какой-то новый ордер в списке или нет.
 
Правильно ли считать, что независимый диспетчер находится в клиентском МТ?

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

Про ограничения рассказывать не буду - это внутреннее дело нашего сетевого протокола.
 
Renat писал:
Если связь порвана в конце торговой операции, то есть только один способ - ждать некоторое время и проверять - появился какой-то новый ордер в списке или нет.
Спасибо. К сожалению понятие "некоторое время" плохо поддаётся формализации. Насколько я понимаю, нужна конструкция типа: "Если OrderSend() вернула ошибку связи, не повторять операцию до успешной синхронизации списка ордеров терминала с сервером". Тогда возникают новые вопросы:
Какие ошибки несут риск прерывания торговой операции? Вероятно ERR_NO_CONNECTION, ERR_SERVER_BUSY, возможно какие-то ещё(ERR_BROKER_BUSY например)?
Как определить, состоялась ли успешная синхронизация списка ордеров? Годится ли для этого функция IsConnected( ) ?

Или как?
 
При таймауте возвращается ошибка 128 - ERR_TRADE_TIMEOUT.
Во всех других случаях можно быть увереным, что торговая операция не прошла.
Функция IsConnected возвращает состояние основного соединения, по которому производится подкачка данных. Для торговых функций устанавливается дополнительное временное соединение.
 
При таймауте возвращается ошибка 128 - ERR_TRADE_TIMEOUT.
Во всех других случаях можно быть увереным, что торговая операция не прошла.
Спасибо, всё ясно.
Функция IsConnected возвращает состояние основного соединения, по которому производится подкачка данных. Для торговых функций устанавливается дополнительное временное соединение.
А принудительную синхронизацию видимо выполнить тоже нельзя (раз Вы об этом не сказали)?
 
Renat, Slawa,
спасибо, кое-что прояснилось.
К сожалению, трудно составить полную картину по обрывочным сведениям.
Но кое-что важное всё же прозвучало. Может, этого и окажется достаточно для первой редакции. А там посмотрим.
 
Видимо тема себя исчерпала, как автор ветки позволю себе небольшое резюме. Видимо можно выделить три вида советников: советник для тестера - максимальная скорость, минимальная обработка ошибок; советник для демо - разумная перестраховка, небольшое число ошибочных сделок можно отфильтровать вручную; советник для реальной торговли - максимальная степень перестраховки, в принципе даже один неправильно поставленный или не снятый ордер может убить депозит. Так вот, мои сомнения в жизнеспособности третьего вида отнюдь не развеялись.

Большое спасибо Renatу и Slawе. Понимаю, что определённая сдержанность с их стороны имеет вполне веские причины. Не совсем понимаю причины отсутствия в MQL возможности обновления списка ордеров в терминале - это всё равно достаточно часто происходит, и можно представить себе, например, какой-нибудь параметр в торговых функциях, типа OP_REFRESH. Впрочем, кажется я беру на себя лишние заботы.

Напоследок ещё раз о делении экспертов на виды. Интересно, никто не пытался систематизировать особенности написания экспертов в зависимости от целевого назначения?
 
Напоследок ещё раз о делении экспертов на виды. Интересно, никто не пытался систематизировать особенности написания экспертов в зависимости от целевого назначения?

Систематизировать, пожалуй, нет. А вот облегчить себе жизнь - это да! На данный момент у меня есть два самых ходовых шаблона советников. Я их выкладывал на пауке в теме "Разработка универсального советника". Эти шаблоны предназначены для быстрого стряпания советников для тестирования на истории. Обработка ошибок никакая. А для реала я сделал библиотеку функций, из которой беру нужные функции путём копирования и просто заменяю ими аналогичные в оттестированном на истории советнике. Т.е. для реала специально готовлю утяжелённую версию советника. Но до "реального" реала :-) дело пока не доходило. Все советники для реала крутятся и проходят отбор на демо. Поэтому и библиотека функций для реала постоянно дорабатывается.
 
Не совсем понимаю причины отсутствия в MQL возможности обновления списка ордеров в терминале

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

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