На одно исполнение приходит пачка транзакций: добавление ордера, его изменение и удаление, добавление сделки, изменение позиции. Порядок не гарантирован, и при переподключении что-то может прийти повторно. Считать надо только 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 храни так, чтобы пережил перезапуск, иначе после рестарта посчитаешь заново. И при старте советника я бы один раз пересчитывала серию по истории, а события использовала только для обновления: если терминал был выключен, когда позицию закрыл стоп, никакого события ты не получишь.