Событие срабатывания стоплоса и тейкпрофита

 
помогите пожалуйста как определить когда срабатывает оба этих события на разных сделках
 

пробую вот так но неполучается


void UpdateOpenOrdersHistory()
{
   // Загружаем историю сделок до текущего момента
   HistorySelect(0, TimeCurrent());

   int totalOrders = OrdersTotal();
   ulong currentOrders[];
   ArrayResize(currentOrders, totalOrders);
   
   // Составляем список текущих открытых ордеров
   for(int i = 0; i < totalOrders; i++)
   {
      ulong ticket = OrderGetTicket(i);
      if(OrderSelect(ticket)) // Выбираем ордер для получения данных
         currentOrders[i] = ticket;
   }
   
   // Сравниваем сохранённый список ордеров с текущим
   for(int i = ArraySize(g_openOrders) - 1; i >= 0; i--)
   {
      bool found = false;
      for(int j = 0; j < ArraySize(currentOrders); j++)
      {
         if(g_openOrders[i] == currentOrders[j])
         {
            found = true;
            break;
         }
      }
      
      // Если ордер из старого списка не найден, он закрыт
      if(!found)
      {
         ulong closedTicket = g_openOrders[i];
         if(HistoryDealSelect(closedTicket)) // Получаем данные о закрытой сделке
         {
            double profit = HistoryDealGetDouble(closedTicket, DEAL_PROFIT);
            double volume = HistoryDealGetDouble(closedTicket, DEAL_VOLUME);
            string symbol = HistoryDealGetString(closedTicket, DEAL_SYMBOL);
            
            // Определяем причину закрытия
            ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger(closedTicket, DEAL_REASON);
            string closeReason = "Unknown";
            if(reason == DEAL_REASON_SL)
               closeReason = "Stop Loss";
            else if(reason == DEAL_REASON_TP)
               closeReason = "Take Profit";
            
            // Формируем сообщение для уведомления
            string msg = "🔔 Сделка закрыта (" + closeReason + ")\n" +
                         "Тикет: " + (string)closedTicket + "\n" +
                         "Символ: " + symbol + "\n" +
                         "Прибыль: " + DoubleToString(profit, 2) + "\n" +
                         "Объем: " + DoubleToString(volume, 2);
            
            // Отправляем уведомление во все каналы (Telegram, Email, Push) и выводим в журнал
            SendAllNotifications(msg);
            Print(msg);
         }
         // Удаляем закрытый ордер из сохранённого массива
         ArrayRemove(g_openOrders, i);
      }
   }
   // Обновляем сохранённый список открытых ордеров
   ArrayCopy(g_openOrders, currentOrders);
}
 
также пробовал вот так 
ulong g_openOrders[]; // Глобальный массив для хранения тикетов открытых ордеров
int lastOrdersCount = 0; // Количество ордеров на последней проверке

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
    if (id == CHARTEVENT_OBJECT_DELETE || id == CHARTEVENT_OBJECT_CLICK || id == CHARTEVENT_OBJECT_DRAG)
    {
        UpdateOpenOrdersHistory(); // Проверяем закрытые сделки
    }
}

void UpdateOpenOrdersHistory()
{
    int currentOrdersCount = PositionsTotal(); // Текущее количество открытых ордеров

    // Если количество ордеров уменьшилось, значит, какая-то сделка закрылась
    if (currentOrdersCount < lastOrdersCount)
    {
        // Загружаем историю сделок
        HistorySelect(0, TimeCurrent());

        int deals = HistoryDealsTotal();
        if (deals == 0)
        {
            Print("No trade history available");
            return;
        }

        // Перебираем историю с конца, чтобы найти последнюю закрытую сделку
        for (int i = deals - 1; i >= 0; i--)
        {
            ulong ticket = HistoryDealGetTicket(i);
            if (ticket == 0)
            {
                Print("HistoryDealGetTicket failed, no trade history");
                return;
            }

            // Проверяем, что сделка относится к текущему символу
            if (HistoryDealGetString(ticket, DEAL_SYMBOL) != _Symbol) continue;

            // Проверяем, что это была **закрытая сделка** (DEAL_ENTRY_OUT)
            if (HistoryDealGetInteger(ticket, DEAL_ENTRY) != DEAL_ENTRY_OUT) continue;

            // Получаем информацию о закрытой сделке
            string comment = HistoryDealGetString(ticket, DEAL_COMMENT);
            int dealType = HistoryDealGetInteger(ticket, DEAL_TYPE);
            double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
            double volume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
            double price = HistoryDealGetDouble(ticket, DEAL_PRICE);
            datetime closeTime = HistoryDealGetInteger(ticket, DEAL_TIME);
            string closeTimeStr = TimeToString(closeTime, TIME_SECONDS);

            // Определяем причину закрытия
            ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger(ticket, DEAL_REASON);
            string closeReason = "Unknown";
            if (reason == DEAL_REASON_SL)
                closeReason = "Stop Loss";
            else if (reason == DEAL_REASON_TP)
                closeReason = "Take Profit";

            // Определяем направление сделки
            string dealDirection = (dealType == DEAL_TYPE_BUY) ? "Покупка" : "Продажа";

            // Формируем сообщение
            string msg = "🔔 Закрыта сделка (" + closeReason + ")\n"
                       + "📌 Тикет: " + (string)closedTicket + "\n"
                       + "📈 Символ: " + _Symbol + "\n"
                       + "💰 Прибыль: " + DoubleToString(profit, 2) + "\n"
                       + "📏 Объем: " + DoubleToString(volume, 2) + " лот\n"
                       + "📉 Цена закрытия: " + DoubleToString(price, _Digits) + "\n"
                       + "🕒 Время закрытия: " + closeTimeStr + "\n"
                       + "📉 Направление: " + dealDirection;

            // Отправляем уведомление во все каналы (Telegram, Email, Push)
            SendAllNotifications(msg);
            Print(msg);

            break; // Нашли последнюю закрытую сделку, выходим
        }
    }

    // Обновляем количество ордеров для следующей проверки
    lastOrdersCount = currentOrdersCount;
}
но неработает
 
Триггером для отправки сообщений должно быть изменение и анализ истории сделок. Отслеживайте изменение истории при поступлении события OnTrade().
 
Обрабатывайте события OnTrade() и OnTradeTransaction(). Это проще и быстрее, чем на каждой миллисекунде дергать историю счета.
 
Ihor Herasko #:
Обрабатывайте события OnTrade() и OnTradeTransaction(). Это проще и быстрее, чем на каждой миллисекунде дергать историю счета.

спасибо починил и сделал так как вы сказали

 
Ihor Herasko #:
Обрабатывайте события OnTrade() и OnTradeTransaction(). Это проще и быстрее, чем на каждой миллисекунде дергать историю счета.

+ Правильный подход, обработка должны быть по событию.

 
Ihor Herasko #:
Обрабатывайте события OnTrade() и OnTradeTransaction(). Это проще и быстрее, чем на каждой миллисекунде дергать историю счета.

Про работу с событиями конечно верно. Но! Читаем help:

  • В общем случае нет точного соотношения по количеству вызовов OnTrade и OnTradeTransaction. Один вызов OnTrade соответствует одному или нескольким вызовам OnTradeTransaction.
  • OnTrade вызывается после соответствующих вызовов OnTradeTransaction.


То есть, в рамках именно этой узкой задачи что такого вы собиратесь узнать в  OnTrade, чего нет в  OnTradeTransaction? Это не сарказм, просто у меня стоит в плане похожая задача, может чего-то я не понимаю?.