MQL4 отслеживание закрытия ордера по TP

 
Необходимо в код внедрить логику моментального отслеживания ордера, который был закрыт сам по TP, а не принудительно.
Была идея каждую итерацию таймера (1 сек) пробегать по всем закрытым ордерам и искать последний закрытый ордер у которого 
OrderClosePrice() >= OrderTakeProfit().
Какие у вас есть предложения?
 
adamsm1th:
Необходимо в код внедрить логику моментального отслеживания ордера, который был закрыт сам по TP, а не принудительно.
Была идея каждую итерацию таймера (1 сек) пробегать по всем закрытым ордерам и искать последний закрытый ордер у которого 
OrderClosePrice() >= OrderTakeProfit().
Какие у вас есть предложения?

бегать не каждую секунду (секунда это слишком редко, и забег трудоёмкий)

а каждый тик проверять : если изменился баланс или маржа, то проверить какого чёрта они поменялись

ps  и не надо лазить в историю - все свои ордера и позиции можно и нужно помнить

 
Maxim Kuznetsov #:

бегать не каждую секунду (секунда это слишком редко, и забег трудоёмкий)

а каждый тик проверять : если изменился баланс или маржа, то проверить какого чёрта они поменялись

Не будет проблемой, если советник сам открывает ордера и в целом почnи вся функциональность onTimer, а проверку изменения баланса делать onTick?
И как я проверяю баланс?
Если у меня все принудительно закрытые ордера идут в минус, следовательно баланс уменьшается, а я должен проверить ситуацию, когда баланс стал больше, я правильно понимаю?

 
adamsm1th:
Необходимо в код внедрить логику моментального отслеживания ордера, который был закрыт сам по TP, а не принудительно.
Была идея каждую итерацию таймера (1 сек) пробегать по всем закрытым ордерам и искать последний закрытый ордер у которого 
OrderClosePrice() >= OrderTakeProfit().
Какие у вас есть предложения?

  1. Устанавливать период сканирования истории счета нет смысла, т. к. для закрытия ордера нужен тик. Поэтому, если запускать советник на символе ордера, то вполне достаточно события OnTick().
  2. Не всегда цена закрытия, которая больше Take Profit (если речь о buy-ордерах), свидетельствует о срабатывании Take Profit. Может быть и такая ситуация: ордер не был закрыт сервером автоматически (ошибка на сервере), а пользователь/советник отдает приказ на закрытие ордера. Поэтому более достоверный способ определения причины закрытия ордера - парсинг поля комментария.


 
Возможно, надо проводить анализ открытых позиций, так обычно сделано во многих кодах.
 
adamsm1th #:

Не будет проблемой, если советник сам открывает ордера и в целом почnи вся функциональность onTimer, а проверку изменения баланса делать onTick?
И как я проверяю баланс?
Если у меня все принудительно закрытые ордера идут в минус, следовательно баланс уменьшается, а я должен проверить ситуацию, когда баланс стал больше, я правильно понимаю?

проверяйте в ontimer, в чем проблема ...

изменение баланса и/или маржи говорит что чьл-то произошло..открылась или закрылоась поза, сработала отложка, тейк или стоп...

проверить один-два показателя и по изменению выяснить прочии нюансы, гораздо быстрее и менее ресурсоёмко чем постоянно крутить любимый цикл с OrderSelect

 
Maxim Kuznetsov #:

проверяйте в ontimer, в чем проблема ...

изменение баланса и/или маржи говорит что чьл-то произошло..открылась или закрылоась поза, сработала отложка, тейк или стоп...

проверить один-два показателя и по изменению выяснить прочии нюансы, гораздо быстрее и менее ресурсоёмко чем постоянно крутить любимый цикл с OrderSelect

Цикл крутить не нужно, достаточно проверить OrdersHistoryTotal().

 
Ihor Herasko #:

Цикл крутить не нужно, достаточно проверить OrdersHistoryTotal().

оно тормозное..

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

А как мне поможет анализ открытых позиций, если ордер после достижения tp становится закрытым?

 
Maxim Kuznetsov #:

проверяйте в ontimer, в чем проблема ...

изменение баланса и/или маржи говорит что чьл-то произошло..открылась или закрылоась поза, сработала отложка, тейк или стоп...

проверить один-два показателя и по изменению выяснить прочии нюансы, гораздо быстрее и менее ресурсоёмко чем постоянно крутить любимый цикл с OrderSelect

А ну так я и изначально планировал в onTimer, как и описал в вопросе. Ответили, что каждая секунда будет редко.

 
Maxim Kuznetsov #:

оно тормозное..

Не воспроизводится.

void OnStart()
{
   ulong ulCnt = GetMicrosecondCount();
   double fBalance = AccountBalance();
   Print("Balance: ", GetMicrosecondCount() - ulCnt);

   ulCnt = GetMicrosecondCount();
   int nOT = OrdersHistoryTotal();
   Print("Orders: ", GetMicrosecondCount() - ulCnt);
}

Вывод:

0       17:43:19.374    Test GBPUSD,M1: initialized
0       17:43:19.375    Test GBPUSD,M1: Balance: 9
0       17:43:19.375    Test GBPUSD,M1: Orders: 8
0       17:43:19.375    Test GBPUSD,M1: uninit reason 0