Чем в mql4 заменить OnTradeTransaction()? - страница 4

 

Отлавливаю все события по тику, сравниваю с ранее записанными данными. 

все в массивах. 

Собственно тормоза иногда есть, когда очень много тиков. Поэтому сделал Задержку между проверками 1 секунда.

Это что касается  мониторинга многих позиций. 

А если только позиции конкретного робота, то там конечно легче. 

 

Благо дело у меня задача не сложная, а ордеров в работе не более двух-трех десятков всего.

А по сему буду по таймеру тренькать что там в OrdersTotal() имеется и записывать объемы в переменные new и old с замещением на каждой итерации, и если объём изменился - предпринимать дальнейшие шаги. 

 
Aleksandr Volotko:

Благо дело у меня задача не сложная, а ордеров в работе не более двух-трех десятков всего.

А по сему буду по таймеру тренькать что там в OrdersTotal() имеется и записывать объемы в переменные new и old с замещением на каждой итерации, и если объём изменился - предпринимать дальнейшие шаги. 

Объём не поменяется при срабатывании отложенного ордера.

 
Artyom Trishkin:

Объём не поменяется при срабатывании отложенного ордера.

Ну я в цикле фильтрую ордера по типу и подсчитываю объем открытой совокупной позиции.

Печалит, что надо тренькать вот так бестолково и тратить ресурсы, когда в МТ5 можно просто и без напряга ожидать конкретного события.

 
Aleksandr Volotko:

Ну я в цикле фильтрую ордера по типу и подсчитываю объем открытой совокупной позиции.

Печалит, что надо тренькать вот так бестолково и тратить ресурсы, когда в МТ5 можно просто и без напряга ожидать конкретного события.

ну мт5 на порядок выше, чем мт4. 

Это касается и других функций. 

 
В моей конкретной ситуации при сделках раз в сутки, и событии раз в сутки будет совершаться 60*60*24=86,400 лишних телодвижений. А по другому и никак пока.

 
Aleksandr Volotko:
В моей конкретной ситуации при сделках раз в сутки, и событии раз в сутки будет совершаться 60*60*24=86,400 лишних телодвижений. А по другому и никак пока.

Зависит от задачи.

Если нужно отловить открытие/закрытие (не частичное) позиции и установку/удаление ордеров, то тут не нужно каждый раз в цикле носиться по списку.

Можно просто проверять значение OrdersTotal() текущее и прошлое. При обнаружении разницы - имеем какое-то событие - тогда и смотрим что там.

Я всё делал при помощи хэш-суммы свойств ордеров и позиций. Как только изменилась - имеем какое-то событие - тогда и смотрим что там конкретно поменялось.

Но у меня была задача отследить все, и любые изменения.

 
Aleksandr Volotko:
В моей конкретной ситуации при сделках раз в сутки, и событии раз в сутки будет совершаться 60*60*24=86,400 лишних телодвижений. А по другому и никак пока.

Есть еще такой подход (если появление нового ордера возможно только со стороны эксперта):

  1. На старте советника формируется массив своих ордеров при помощи обхода всех ордеров по списку.
  2. На каждом новом тике проверяется наличие ордера при помощи

if (OrderSelect(nTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)

      3. Если ордер есть, то при необходимости обновляем его данные. Это если требуется слежение за SL/TP/объемом. Если не требуется, то вообще ничего больше не делаем.

      4. Если ордер обнаружен в списке закрытых (OrderCloseTime() > 0), то удаляем его из массива. Пополнение же массива производим только при открытии ордера советником.

В итоге не нужно будет на каждом тике обходить весь список ордеров. Операции только со своим массивом.

 

Я попробую пока сделать сравнение значений OrdersTotal() (респект @Artyom Trishkin ), по идее этого должно хватить. Частичных закрытий у меня не будет.

При инициализации буду присваивать старому значение -1, дабы на старте всегда проводилась полная проверка, не зависимо от наличия ордеров в рынке.

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

 
Aleksandr Volotko:

Я попробую пока сделать сравнение значений OrdersTotal() (респект @Artyom Trishkin ), по идее этого должно хватить. Частичных закрытий у меня не будет.

При инициализации буду присваивать старому значение -1, дабы на старте всегда проводилась полная проверка, не зависимо от наличия ордеров в рынке.

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

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

По итогу OrdersTotal() как был 8, таким и остался. Логика эксперта сбилась - не пересчитал новые данные