Добрый день. Подскажите как правильно описать новый бар на любом тайфрейме ?
на инструкцию ругается компилятор.
'isNewBar' - function can be declared only in the global scope New_Bars.mq5 37 6
Ок. Объявляю в глобалке и результата нет.
посмотрите этот код. он работает быстро и хорошо. может подойдет.
//+------------------------------------------------------------------+ //| Новый бар 4.mq4 | //| Peter Konow | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Peter Konow" #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ datetime Last_Bar_Time; int Periodicity = 25; int All_symbols; string Symbols[]; int Timeframes[7] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1}; int All_Timeframes = 7; int All_bars_table[][7]; int New_Bar_Events[][7]; //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetMillisecondTimer(25); //------------------------------------------------------------- //------------------------------------------------------------- Last_Bar_Time = Time[0]; //------------------------------------------------------------- //Узнаем сколько символов есть в обзоре рынка. //--------------------------------------------------------- All_symbols = SymbolsTotal(true); //--------------------------------------------------------- //Устанавливаем размер массива Symbols. Внутри него будут записаны //имена всех символов, которые есть в окне обзоре рынка. //--------------------------------------------------------- ArrayResize(Symbols,All_symbols); //--------------------------------------------------------- //Устанавливаем размеры массивов "All_bars_table[]" и "New_Bar_Events[]". //В массиве "All_bars_table[]" будет записыватся текущее количество баров каждого символа //и каждого таймфрейма. А в массиве "New_Bar_Events[]" устанавливаться флаги //события нового бара для каждого символа и каждого таймфрейма. //--------------------------------------------------------- ArrayResize(All_bars_table,All_symbols); ArrayResize(New_Bar_Events,All_symbols); //--------------------------------------------------------- //Записываем наименования символов обзора рынка в массив "Symbols[]". //--------------------------------------------------------- for(int a1 = 0; a1 < All_symbols; a1++) { Symbols[a1] = SymbolName(a1 + 1,true); //Возможно, нумерация символов в обзора рынка идет с нуля. //Тогда: Symbols[a1] = SymbolName(a1,true); } //--------------------------------------------------------- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { static bool Start_count; static int Current_period; //--------------------------- //Нам нужен корректный старт отсчета. Это должно быть время начала бара. //--------------------------- if(!Start_count && Last_Bar_Time != Time[0])Start_count = true; //--------------------------- if(Start_count)Current_period++; //--------------------------- //В следующем цикле, мы будем обращатся к функции iBars для получения количества баров на //каждом из символов и таймфреймов, которые будем проходить в цикле. //Далее, будем сравнивать записанное количество баров с текущим и при //наличии разницы установим флаг события нового бара в массив "New_Bar_Events[]". //--------------------------- if(Current_period*Periodicity >= 1000) { for(int a1 = 0; a1 < All_symbols; a1++) { string This_symbol = Symbols[a1]; //--------------------------------- for(int a2 = 0; a2 < All_Timeframes; a2++) { int This_timeframe = Timeframes[a2]; //------------------------------------------ int All_current_bars = iBars(This_symbol,This_timeframe); //------------------------------------------ if(All_current_bars > All_bars_table[a1][a2]) { //------------------------------------------------------------ //Если это не самая первая запись в массив All_bars_table, //то фиксируем событие нового бара. //------------------------------------------------------------ if(All_bars_table[a1][a2]) { New_Bar_Events[a1][a2] = true; } //------------------------------------------------------------ //Устанавливаем новое значение текущего количества баров. //------------------------------------------------------------ All_bars_table [a1][a2] = All_current_bars; } //------------------------------------------ } } //--------- Current_period = 0; } //----------------------------------------------- //Здесь наш код... //Здесь наш код... //Здесь наш код... Trading_on_new_bars_strategy(); //----------------------------------------------- //После завершения всех вызовов на этом событии таймера //снимаем флаги событий нового бара. if(!Current_period)Refresh_new_bar_events_table(); //----------------------------------------------- } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //Функция снимает флаги событий нового бара. //Эта процедура осуществляется после выполнения всего пользовательского //кода один раз в минуту. Вплоть до момента очищения массива флагов //новых баров, все функции могут их видеть обращаясь к массиву напрямую. //+------------------------------------------------------------------+ void Refresh_new_bar_events_table() { for(int a1 = 0; a1 < All_symbols; a1++) { for(int a2 = 0; a2 < All_Timeframes; a2++) { New_Bar_Events[a1][a2] = false; } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //Пример использования событий нового бара в пользовательском функционал. //Просто обращаемся к глобальному массиву "New_Bar_Events[a1][a2]" напрямую //и используем событие в наших торговых алгоритмах. //+------------------------------------------------------------------+ void Trading_on_new_bars_strategy() { for(int a1 = 0; a1 < All_symbols; a1++) { string This_symbol = Symbols[a1]; //---------------------------------- for(int a2 = 0; a2 < All_Timeframes; a2++) { bool New_bar = New_Bar_Events[a1][a2]; int This_timeframe = Timeframes[a2]; //---------------------------------- if(New_bar && This_symbol == "EURUSD" && This_timeframe == PERIOD_M1) { //Buy(); Alert("New_bar !!!"); } //---------------------------------- if(New_bar && This_symbol == "AUDUSD" && This_timeframe == PERIOD_M30) { //Sell(); } //---------------------------------- } } } //+------------------------------------------------------------------+
посмотрите этот код. он работает быстро и хорошо. может подойдет.
А у вас есть пример но только для MQL5 ???
Новый бар. Если обнаружен новый бар на текущем символе и на заданном таймфрейме "InpTimeFrame" - нас пропускает дальше, если бар не новый - нас выкинет из OnTick().
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- we work only at the time of the birth of new bar static datetime PrevBars=0; datetime time_0=iTime(Symbol(),InpTimeFrame,0); if(time_0==PrevBars) return; PrevBars=time_0; ... }
Переменная "InpTimeFrame" имеет тип ENUM_TIMEFRAMES.
Новый бар. Если обнаружен новый бар на текущем символе и на заданном таймфрейме "InpTimeFrame" - нас пропускает дальше, если бар не новый - нас выкинет из OnTick().
Переменная "InpTimeFrame" имеет тип ENUM_TIMEFRAMES.
'InpTimeFrame' - cannot convert enum New_BARS.mq5 80 35
Ругается на перечисление
'InpTimeFrame' - cannot convert enum New_BARS.mq5 80 35
Ругается на перечисление
Покажите полный код. Если есть вопрос - выработайте пожалуйста привычку показать полный код и прицепить код к сообщению в виде mq5 файла.
'InpTimeFrame' - cannot convert enum New_BARS.mq5 80 35
Ругается на перечисление
С такими вопросами лучше обращаться к справке, учится ею пользоваться.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день. Подскажите как правильно описать новый бар на любом тайфрейме ?
на инструкцию ругается компилятор.
'isNewBar' - function can be declared only in the global scope New_Bars.mq5 37 6
Ок. Объявляю в глобалке и результата нет.