Как подсчитать количество закрытых минусовых сделок в подряд?

 

Появилась задача подсчёта некоторого количества сделок в подряд и, в зависимости от их количества, минипулировать с лотом. Я пошёл по пути наименьшего сопротивления. Решил плавно наращивать лот с каждым лосём, чтобы проверить верно ли я подсчитываю количество закрытых сделок по стопу в подряд.

У меня получилось как-то так:

double HistoryDealInfo :: selectedHistoryDealProfit(ulong ticket) {
  return HistoryDealGetDouble(ticket, DEAL_PROFIT);
}

long HistoryDealInfo :: selectedHistoryDealMagic(ulong ticket) {
  return HistoryDealGetInteger(ticket, DEAL_MAGIC);
}

string HistoryDealInfo :: selectedHistoryDealSymbol(ulong ticket) {
  return HistoryDealGetString(ticket, DEAL_SYMBOL);
}

bool HistoryDealInfo :: choiceDealPrimary(const string symbolName,    // Название торгового инструмента
                                          const ulong magic,          // Magic number позиции
                                          const ulong ticket) {       // Тикет сделки
//---
  if (!HistoryDealSelect(ticket))
    return false;
  if (selectedHistoryDealSymbol(ticket) != symbolName)
    return false;
  if (selectedHistoryDealMagic(ticket) != magic)
    return false;
//---
  return true;
}


int countOfPositionsAcquiredSL(const SymbolInstance *ptrSymbol,    // Указатель на класс свойств торгового инструмента
                               const ulong magic) {                // Magic позиции
//---
  int cnt = 1;
  int dealsCount = 0;
  ulong dealTicket = -1;
  HistorySelect(0, TimeCurrent());
  int historyDealsTotal = HistoryDealsTotal();
  
  for (int i = historyDealsTotal - 1; i >= 0; i--) {
    if (!choiceDealPrimary(ptrSymbol.getName(), magic, historyDealsTotal - cnt)) return NULL;
    if ((dealTicket = HistoryDealGetTicket(historyDealsTotal - cnt)) > 0) {
      if (selectedHistoryDealProfit(dealTicket) < 0) {
        cnt++;
        dealsCount++;
      } else
        break;
    }
  }
//---
  return dealsCount;
}

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

Вот скрин:


Утроенный лот, который должен быть после 3-х закрытых сделок всегда, согласно базового теста оказывается лишь в месте со стрелкой. В остальных местах не так. Хотя, выше видно, что идёт 5 минусовых сделок в подряд, но лота утроенного нет. Лот утраивается у меня в OnTick() (черновой вариант):

    if (prHistDealInfo.countOfPositionsAcquiredSL(prSym, g_magic, 1) == 2) {
      g_lot = i_lot * 3;
    }
    else if (prHistDealInfo.countOfPositionsAcquiredSL(prSym, g_magic, 1) == 1) {
      g_lot = i_lot * 2;
    }
    else
      g_lot = i_lot;
   

В чём суть? Я так понимаю, сделка подразумевается уже закрытая сделка или может косяк в том, что нужно отфильтровывать ещё не закрытые?

 
Denis Nikolaev:

типа так

На 5-ке я пару лет точно не писал. Помню, раньше функции OrderSelect() не было ещё. Но вот вопрос, чем же она (функция OrderSelect()) в режиме MODE_HISTORY отличается от пробега по сделкам функцией HistoryDealsTotal? Ведь HistoryDealsTotal() возвращает количество сделок, т.е. реализованных ордеров, которые и нужно, чтобы узнать прибыльность отработки.

Ведь функция HistoryDealsTotal() для того и появилась, чтобы ею пользовались в плане замены OrderSelect(). Иначе зачем она вообще нужна? Реально интересно..

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 
Viktar Dzemikhau:

На 5-ке я пару лет точно не писал. Помню, раньше функции OrderSelect() не было ещё. Но вот вопрос, чем же она (функция OrderSelect()) в режиме MODE_HISTORY отличается от пробега по сделкам функцией HistoryDealsTotal? Ведь HistoryDealsTotal() возвращает количество сделок, т.е. реализованных ордеров, которые и нужно, чтобы узнать прибыльность отработки.

Ведь функция HistoryDealsTotal() для того и появилась, чтобы ею пользовались в плане замены OrderSelect(). Иначе зачем она вообще нужна? Реально интересно..

Человек ответивший Вам перепутал разделы сайта и ответил Вам старым кодом (MQL4).

Вам нужно решить самую главную задачу: если Вы запрашиваете сделки по HistorySelect, то ЗАЧЕМ Вы ставите дату от момента рождения динозавров?

HistorySelect(0, TimeCurrent());

Смотрим справку HistorySelect

HistorySelect

Запрашивает историю сделок и ордеров за указанный период серверного времени.

bool  HistorySelect(
   datetime  from_date,     // с даты
   datetime  to_date        // по дату
   );

то есть Вам нужно манипулировать датой 'from_date' - хранить дату в переменной объявленной на глобальном программном уровне (в шапке эксперта). Если встретили сделку закрытую с плюсом, значит записываем её дату в свою глобальную переменную - в следующий раз не имеет смысла снова опрашивать эту сделку.

Документация по MQL5: Торговые функции / HistorySelect
Документация по MQL5: Торговые функции / HistorySelect
  • www.mql5.com
HistorySelect - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: