//+------------------------------------------------------------------+ //| OrderTimeAlert.mq4 | //| Tapochun | //| https://www.mql5.com/ru/users/tapochun | //+------------------------------------------------------------------+ #property copyright "Tapochun" #property link "https://www.mql5.com/ru/users/tapochun" #property version "1.01" #property strict #property description "Звуковой сигнал по прошествии Х секунд от открытия ордера" #property description "v 1.01 - добавлена возможность выбора звука (каталог терминала/Sounds)" //+------------------------------------------------------------------+ //| Глобальные переменные | //+------------------------------------------------------------------+ string globGVName="PTA_lastOrderTicket"; //+------------------------------------------------------------------+ //| Входные параметры | //+------------------------------------------------------------------+ input int inpNum = 10; // Количество секунд (Х) для алерта input int inpTimerFreqSec = 1; // Частота таймера (проверки), сек input int inpMagic = 0; // Маджик эксперта для отслеживания (0 - фильтра нет) input string inpSymbol = ""; // Символ для отслеживания (пусто - фильтра нет) input bool inpUsePrint = true; // Принт в журнал input string inpSoundName = "Alert2.wav"; // Имя файла - звука //+------------------------------------------------------------------+ //| Функция инициализации эксперта | //+------------------------------------------------------------------+ int OnInit() { //--- Генерируем событие таймера EventSetTimer(inpTimerFreqSec); //--- Проверка глобальной переменной терминала if(!GlobalVariableCheck(globGVName ) ) // Если переменная не существует GlobalVariableSet( globGVName,0 ); // Создаем переменную return( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Функция - таймер | //+------------------------------------------------------------------+ void OnTimer() { int total = OrdersTotal(); // Общее количество ордеров if(total <= 0 ) return; // Если ордера не обнаружены - выходим int oType; // Тип ордера int oTicket; // Тикет ордера datetime oTime; // Время открытия ордера datetime currentTime; // Текущее время int lastOrderTicket=int(GlobalVariableGet(globGVName)); // Устанавливаем тикет последнего "озвученного" ордера (для сравнения) for(int i=total-1; i>=0; i--) // Цикл по всем ордерам { if(OrderSelect(i,SELECT_BY_POS)) // Если ордер выбран { if(inpSymbol=="" || inpSymbol==OrderSymbol()) // Если наш символ, либо фильтр по символу не установлен { oType = OrderType(); // Запоминаем тип ордера if( oType == OP_BUY || oType == OP_SELL ) // Если ордер рыночный (покупка/продажа) { if(inpMagic==0 || inpMagic==OrderMagicNumber())// Если наш маджик, либо фильтр по маджику не установлен { oTime=OrderOpenTime(); // Запоминаем время открытия ордера currentTime= TimeCurrent(); // Запоминаем текущее время oTicket = OrderTicket(); // Запоминаем тикет ордера if( currentTime - oTime >= inpNum && lastOrderTicket < oTicket ) // Если с момента открытия ордера прошло больше inpNum сек. и.. { // .. ордер ранее не обработан экспертом if( inpUsePrint ) // Если установлен параметр записи в журнал Print(_Symbol+": c момент открытия ордера #",OrderTicket()," прошло не менее ",inpNum," секунд!"); if(!PlaySound(inpSoundName)) // Если файл не найден - сообщение об ошибке Print("ОШИБКА! Звуковой файл "+inpSoundName+" не найден! Проверьте правильность имени. Файл в папке каталог терминала/Sounds"); GlobalVariableSet(globGVName,oTicket); // Устанавливаем новый тикет в ГПТ break; // Выходим из цикла перебора ордеров } else if(lastOrderTicket>=oTicket) break; // Если ордер ранее обработан - выходим } } } } else // Если ордер не выбран - сообщение об ошибке в журнал Print("ОШИБКА #",_LastError,"! Ордер #",i," c тикетом #",OrderTicket()," не выбран!"); } } //+------------------------------------------------------------------+ //| Функция деинициализации эксперта | //+------------------------------------------------------------------+ void OnDeinit(const int reason) // Причина деинициализации { if(reason == REASON_REMOVE || // Если эксперт удален с графика или.. reason == REASON_ACCOUNT || // .. активирован др. счет/переподкл. к торговому серверу или.. reason == REASON_TEMPLATE ) // .. изменен шаблон графика { //--- Удаляем глобальную переменную терминала GlobalVariableDel(globGVName); } //--- Перестаем генерировать событие таймера EventKillTimer(); } //+------------------------------------------------------------------+