Изучаем и пишем вместе на MQL5 - страница 17

 
Yedelkin:

Вопрос про функцию Sleep(). Правильно ли я понимаю, что использование этой функции в эксперте приостанавливает выполнение только этого эксперта и передаёт ресурсы процессора (ядра) следующим задачам из списка задач этого ядра? Иными словами, правильно ли, что функция Sleep() не тормозит сам поток, в котором обрабатывается эксперт, а работает в качестве переключателя между текущим экспертом и другими программами, подхваченными конкретным ядром?

Насколько я понимаю если поставить Sleep(0) то переключает, а если Sleep(milliseconds) то выполнение эксперта будет остановлено на указанное количество миллисекунд.

При этом, как я понял, каждый эксперт представляет собой самостоятельный поток, каждый из таких потоков претендует на процессорное время (при этом проверка состояния потока происходит судя по справки каждые 100 миллисекунд).

Таким образом если поток не активен, не важно по какой причине, по идеи процессорное время передается другому потоку, а статус потока "решившего уснуть" будет проверен через 100 миллисекунд.

PS

По поводу распределения ядер между потоками это к разработчикам.

 
Yedelkin:

Вопрос про функцию Sleep(). Правильно ли я понимаю, что использование этой функции в эксперте приостанавливает выполнение только этого эксперта и передаёт ресурсы процессора (ядра) следующим задачам из списка задач этого ядра? Иными словами, правильно ли, что функция Sleep() не тормозит сам поток, в котором обрабатывается эксперт, а работает в качестве переключателя между текущим экспертом и другими программами, подхваченными конкретным ядром?

Каждый эксперт выполняется в своем отдельном потоке. Sleep() тормозит этот поток. Привязки к ядрам (affinity mask) нет.
 
Yedelkin:

Вопрос про структуру MqlTradeResult. Не обнаружил в ней поле time - время успешной базовой проверки запроса (или что-нибудь в этом роде) Кто-нибудь помнит, поднимался ли вопрос о введении дополнительного поля time в структуру MqlTradeResult? Потребовалось для выуживания отложенного ордера, если он вдруг уйдёт в историю.

неясна просьба. Если ордер открылся, то он и будет в себе хранить время открытия. Зачем вам время ответа сервера?
 
sergeev:
неясна просьба. Если ордер открылся, то он и будет в себе хранить время открытия. Зачем вам время ответа сервера?

Судьба ордера отслеживается по тикету, правильно? При этом возвращение функцией OrderSend() тикета ещё не гарантирует успешного выполнения торговой операции. У меня по логике программы достаточно проверить, не появился ли мой тикет среди исторических ордеров и какие сделки были после его выставления. Для этого хотелось бы закачивать в исторический кеш минимальный размер истории - т.е. со времени ответа сервера на первоначальный запрос, не более.  Работать со свойствами открытого ордера не требуется, - это будут излишние куски кода. Ордер может даже не открыться. Таким образом, время ответа сервера нужно для загрузки оптимального размера (количества) свежей истории с помощью функции HistorySelect(). Так доходчиво про "выуживание ордера из истории"?

Как я понял, вопрос о введении дополнительного поля time в структуру MqlTradeResult до сих пор не подымался. 

 

Про Sleep() понял так, что задержка потока у эксперта не влияет на выполнение других программ. Спс.

 

Ещё вопрос про Sleep(). В Примечании сказано "Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить". Читал форум, но так и не понял следующее: фраза "нельзя вызывать из индикаторов" - это предустановленный запрет или рекомендация программисту?

 
Yedelkin:

Судьба ордера отслеживается по тикету, правильно? При этом возвращение функцией OrderSend() тикета ещё не гарантирует успешного выполнения торговой операции.

кхм.... вам бы в учебник заглянуть про отправку ордера.
 
Yedelkin:

Ещё вопрос про Sleep(). В Примечании сказано "Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить". Читал форум, но так и не понял следующее: фраза "нельзя вызывать из индикаторов" - это предустановленный запрет или рекомендация программисту?

запрет
 
sergeev:
кхм.... вам бы в учебник заглянуть про отправку ордера.

Ну Вы же смысл поняли. Рассказываю дотошно на память, можете проверить: Функция OrderSend() возвращает булево значение. При этом в случае удачной проверки запроса в переменную структуры MqlResult записывается тикет ордера. Для себя я это называю "возвращение функцией тикета ордера". Вот ссылка на источник: "При отправке запроса на покупку функцией OrderSend() можно сразу же узнать тикет ордера, который был создан при успешном результате проверки запроса".

За ответ про "запрет" - спасибо, понял. 

 
Yedelkin:

Ну Вы же смысл поняли.

к сожалению до сих пор не уловил.

вам зачем-то нужно в структуре возврата иметь поле "время".  Используйте время в появившемся ордере. Этого достаточно для контроля небольшой истории.

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