Почему терминал на одно торговое событие OnTrade присылает три

 

Приветствую! 

Хочу записывать все торговые события с терминала. Решил использовать OnTrade. Но почему-то терминал при закрытии ордера, например, присылает аж три аллерта из кода ниже

void OnTrade()
  {
  //--- 
   Alert("New Trade Event");
  }

Почему так происходит и как этого избежать?

ЗЫ: В гугле только про квик есть похожие обсуждения. 

Торговые события в MetaTrader 5
Торговые события в MetaTrader 5
  • www.mql5.com
Мониторинг текущего состояния торгового счета подразумевает контроль над открытыми позициями и ордерами. Прежде чем торговый сигнал станет сделкой, он должен быть отправлен из клиентского терминала в виде запроса торговому серверу, где он будет помещен в очередь запросов и ждать своей обработки. Принятие запроса сервером, удаление его по времени истечения или проведение на его основе сделки - все это сопровождается торговыми событиями, о которых сервер сообщает терминалу.
 
Справку откройте и прочтите по OnTrade
Документация по MQL5: Обработка событий / OnTrade
Документация по MQL5: Обработка событий / OnTrade
  • www.mql5.com
OnTrade - Обработка событий - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov #:
Справку откройте и прочтите по OnTrade
Спасибо за ответ. Доку читал) Так и не понял на что мне сделать проверку, чтобы три раза подряд не вызывать весь функционал(
 
satori_matori #:
Спасибо за ответ. Доку читал) Так и не понял на что мне сделать проверку, чтобы три раза подряд не вызывать весь функционал(
Используйте лучше OnTradeTransaction и отлавливайте торговые события.
 

Проще отслеживать OnTrade (нужно отслеживать только кол-во позиций). OnTradeTransaction заставит вас попариться над внутренней обработкой торговых событий.

// -----------------------------------------------------------------------------
// Проверить открытие или закрытие позиции
// запускать в OnTrade() эксперта
// -----------------------------------------------------------------------------
bool AnalyserTrade::Run() {

    SelectPositions(); // выбрать тикеты позиций по текущему символу
    
    if (m_newTickets.Total() == m_oldTickets.Total()) return false;
    
    long ticket;
    if (m_newTickets.Total() > m_oldTickets.Total()) {
        
        // ищем тикет новой позиции
        ticket = FindExtraTicket(m_newTickets, m_oldTickets);
        if (ticket > 0) {
            PrintFormat("%s / opened %I64d", __FUNCTION__, ticket);
        }
    }
    else
    if (m_newTickets.Total() < m_oldTickets.Total()) {
        
        // ищем тикет закрытой позиции
        ticket = FindExtraTicket(m_oldTickets, m_newTickets);
        if (ticket > 0) {
            PrintFormat("%s / closed %I64d", __FUNCTION__, ticket);
        }
    }    

    // запоминаем текущие тикеты
    m_oldTickets.Clear();
    if (m_newTickets.Total() > 0)
        m_oldTickets.AddArray(m_newTickets);
        
    return true;
}

Меня как трейдера (хеджингового счета) интересует только события:

  • открылась позиция
  • сработала отложка
  • закрылась позиция
 
Vladimir Karputov #:
Используйте лучше OnTradeTransaction и отлавливайте торговые события.
Спасибо еще раз, ушел пилить OnTradeTransaction
 
satori_matori #:
Спасибо еще раз, ушел пилить OnTradeTransaction
Уточните что именно нужно отследить - какое событие.
 
Vladimir Karputov #:
Уточните что именно нужно отследить - какое событие.
Появление новых, модификацию и исполнение ордеров и позиций. Спасибо)
 
Malik Arykov #:

Проще отслеживать OnTrade (нужно отслеживать только кол-во позиций). OnTradeTransaction заставит вас попариться над внутренней обработкой торговых событий.

Меня как трейдера (хеджингового счета) интересует только события:

  • открылась позиция
  • сработала отложка
  • закрылась позиция
Разве подобный код спасет от того, что терминал по три раза подряд его будет запускать? Пардон за нубский вопрос, но что это за функции такие
AnalyserTrade
?
 
satori_matori #:
Разве подобный код спасет от того, что терминал по три раза подряд его будет запускать? Пардон за нубский вопрос, но что это за функции такие ?

AnalyserTrade - мой класс анализа трейдов (ордеров, сделок и позиций)

Кстати, по количеству срабатываний обработчик событий OnTrade меньше OnTradeTransaction. Сначала срабатывает OnTradeTransaction, затем  OnTrade.

P.S. Каждый пишет свой "велосипед" по обработке трейдов, из-за кучи торговых событий терминала. Меня, например, интересуют только 2 события - открытие и закрытие позиции. Остальные просто игнорирую.

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