помогите пожалуйста как определить когда срабатывает оба этих события на разных сделках
пробую вот так но неполучается
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(). Это проще и быстрее, чем на каждой миллисекунде дергать историю счета.
Обрабатывайте события OnTrade() и OnTradeTransaction(). Это проще и быстрее, чем на каждой миллисекунде дергать историю счета.
Про работу с событиями конечно верно. Но! Читаем help:
|
То есть, в рамках именно этой узкой задачи что такого вы собиратесь узнать в OnTrade, чего нет в OnTradeTransaction? Это не сарказм, просто у меня стоит в плане похожая задача, может чего-то я не понимаю?.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь