К содержимому
Форекс
на автомате

OnTradeTransaction: одна закрытая сделка считается два раза

gleb_1968с 01.2021
Первый прогон
6сообщений
Автор темы#1
Перевожу советника на OnTradeTransaction, чтобы считать закрытые сделки по событиям, а не перебором истории на каждом тике. Нужен счётчик убыточных подряд, после трёх стопов пауза до следующего дня. Проблема: одна позиция, закрытая по стопу, увеличивает счётчик на два, иногда на три. Похоже, событие приходит не одно. Как правильно отфильтровать?
vinogradova_tс 03.2023
Первый прогон
4сообщения
#2
На одно исполнение приходит пачка транзакций: добавление ордера, его изменение и удаление, добавление сделки, изменение позиции. Порядок не гарантирован, и при переподключении что-то может прийти повторно. Считать надо только TRADE_TRANSACTION_DEAL_ADD, выбрать сделку из истории и проверить, что это выход и что она твоя:
Код:
void OnTradeTransaction(const MqlTradeTransaction &t, const MqlTradeRequest &rq, const MqlTradeResult &rs) { if(t.type != TRADE_TRANSACTION_DEAL_ADD || !HistoryDealSelect(t.deal)) return; if(HistoryDealGetInteger(t.deal, DEAL_MAGIC) != InpMagic) return; if(HistoryDealGetInteger(t.deal, DEAL_ENTRY) != DEAL_ENTRY_OUT) return; if(t.deal <= lastDeal) return; // уже посчитана lastDeal = t.deal; double pnl = HistoryDealGetDouble(t.deal, DEAL_PROFIT) + HistoryDealGetDouble(t.deal, DEAL_COMMISSION); lossStreak = (pnl < 0) ? lossStreak + 1 : 0; }
lastDeal храни так, чтобы пережил перезапуск, иначе после рестарта посчитаешь заново. И при старте советника я бы один раз пересчитывала серию по истории, а события использовала только для обновления: если терминал был выключен, когда позицию закрыл стоп, никакого события ты не получишь.
Продолжить обсуждение

Для ответа войдите в свой аккаунт.

Войти
← Предыдущая темаСледующая тема →