Hier ist die Variante, die auf der EURUSD-Minute gedruckt wird:
//+------------------------------------------------------------------+//| Новый бар 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 |//+------------------------------------------------------------------+intOnInit()
{
//--- create timerEventSetMillisecondTimer(25);
//-------------------------------------------------------------//Записываем время последнего бара на момент загрузки эксперта. //Для корректного начала работы, робота нужно запустить на М1. //-------------------------------------------------------------
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 |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- destroy timerEventKillTimer();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
staticbool Start_count;
staticint 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();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
Wenn Sie es brauchen, hier ist eine funktionierende plattformübergreifende Funktion (für MT5 und MT4)
Im Gegensatz zu Peters Code funktioniert er und ist um eine Größenordnung schneller.
//+---------------------------------------------------------------------------------------------------+//| Функция определения нового бара по всем ТФ всех инструментов в окне "Обзор рынка" |//| два режима работы: |//| - режим сбора информации, out=false (значение по умолчанию). Достаточно запустить IsNewBar(); |//| - режим вывода информации, out=true |//| tf - период таймфрейма, по умолчанию текущий ТФ (необходим только при выводе информации) |//| Sym - символ инструмента, по умолчанию текущий символ (необходим только при выводе информации) |//+---------------------------------------------------------------------------------------------------+bool IsNewBar(bool out=false,int tf=PERIOD_CURRENT,string Sym="")
{
#ifdef __MQL5__staticint allTF=21;
staticconstENUM_TIMEFRAMES TF[21]=
{
PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
};
#else
staticint allTF=9;
staticconstENUM_TIMEFRAMES TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
#endif
staticbool New_Bar_Events[];
staticlong All_bars_table[]; // array of current barsstaticint N_Sym=0;
staticstring symbName[]; // массив имен символовif(Sym=="") Sym=Symbol();
int total=SymbolsTotal(true);
if(total!=N_Sym) // если первый раз, или добавлен, или удален новый символ
{
ArrayResize(symbName,total);
for(int i=0; i<total; i++) symbName[i]=SymbolName(i,true);
ArrayResize(All_bars_table,allTF*total); ArrayInitialize(All_bars_table,0);
ArrayResize(New_Bar_Events,allTF*total); ArrayInitialize(New_Bar_Events,false);
N_Sym=total;
}
int n_cur=-1;
for(int i=0; i<total; i++) if(Sym==symbName[i]){ n_cur=i; break;}
if(n_cur<0) { Print("данного символа нет в списке MarketWatch(окошко слева - Обзор рынка)"); return(false);}
if(out && N_Sym>0) // если режим вывода информации
{
int curtf=0;
if(tf==PERIOD_CURRENT) tf=_Period;
while(TF[curtf]!=tf) curtf++;
return (New_Bar_Events[n_cur*allTF+curtf]);
}
// режим сбора информацииfor(int j=0,j1=0; j<total; j++,j1+=allTF) // перебор символовfor(int i=0;i<allTF;i++) // перебор таймфреймов
{
#ifdef __MQL5__long CurBars=SeriesInfoInteger(symbName[j],TF[i],SERIES_LASTBAR_DATE);
#else
long CurBars=iTime(symbName[j],TF[i],0);
#endif
if(All_bars_table[j1+i]<CurBars) // пришел новый бар
{
//if (All_bars_table[j1+i]>0) Print ("Новый бар: "+SymbolName(j,true)+" "+EnumToString(TF[i]));
All_bars_table[j1+i]=CurBars;
New_Bar_Events[j1+i]=true;
}
else// еще не пришел новый бар
{
New_Bar_Events[j1+i]=false;
if(i==0) for(;i<allTF;i++) New_Bar_Events[j1+i]=false; // если минутный бар тот же, то нет смысла продолжать проверять старшие ТФ
}
}
return(false);
}
Das Ziel war das eine, die Erreichung das andere...
Wenn jemand... jemand, die Marktübersicht zeigt ALLE Symbole an und funktioniert nur mit einem... Ich möchte lieber nichts weiter sagen...
Warum messen ... Code war das Ziel ganz anders.........
Mir wurde eine Aufgabe gestellt: einen Weg zu finden, um die Ereignisse eines neuen Balkens einer Reihe von Symbolen auf einer Reihe von Zeitrahmen zu erhalten, ohne OOP, und es kurz und effizient Code zu machen.
Und jetzt sagen Sie mir: Habe ich das Ziel erreicht?
Was ist Ihr Ergebnis?
Von wo aus rufen Sie die Funktion auf?
1. Ersetzen Sie den Typ bool durch den Typ int des Arrays All_bars_table[][7]; oben, wo die globalen Variablen deklariert sind.
2. Setzen Sie den Aufruf an den Timer, wo es heißt "Hier ist Ihr Code".
Jetzt habe ich es überprüft und es funktioniert bei EURUSD. Kurz gesagt, es funktioniert.
Hier ist die Variante, die auf der EURUSD-Minute gedruckt wird:
Hier ist eine Variante, die auf eine Minute auf EURUSD druckt:
Es funktioniert, aber man muss es auf einen kleinen Zeitrahmen beschränken.
Dennoch muss ich zugeben, dass die OOP-Lösung schöner aussieht und ein paar Mal weniger Code enthält.
Das funktioniert, aber man muss es auf einen kleinen Zeitrahmen beschränken.
Trotzdem muss man zugeben, dass die OOP-Lösung schöner aussieht und ein paar Mal weniger Code enthält.
Verwenden Sie, was Sie wollen.
Machen Sie sich nicht lächerlich - das ist nicht nett, nicht nett. Vergleichen Sie sie im Hinblick auf den Ressourcenverbrauch.
Sie müssen sich nicht auf einen kleinen Zeitrahmen beschränken.
Stattdessen:
Nur Urlaub:
... und der Code ist um ein Vielfaches kleiner.Hier ist der gesamte Code für die Lösung:
Vergessen Sie nicht den versteckten OOP-Code. Es gibt weniger Code, weil man ihn nicht sehen kann!
Wenn Sie es brauchen, hier ist eine funktionierende plattformübergreifende Funktion (für MT5 und MT4)
Im Gegensatz zu Peters Code funktioniert er und ist um eine Größenordnung schneller.
Wenn Sie es brauchen, hier ist eine funktionierende plattformübergreifende Funktion (für MT5 und MT4)
Im Gegensatz zu Peters Code funktioniert er und ist viel schneller.
Das Ziel war das eine, aber es wurde ein anderes erreicht...
Wenn ... jemand, die Marktübersicht zeigt ALLE Symbole an, funktioniert aber nur mit einem ... Ich möchte lieber nichts weiter sagen...
Warum versuchen Sie zu messen... code, der Zweck war ein anderer.........
Das Ziel war das eine, die Erreichung das andere...
Wenn jemand... jemand, die Marktübersicht zeigt ALLE Symbole an und funktioniert nur mit einem... Ich möchte lieber nichts weiter sagen...
Warum messen ... Code war das Ziel ganz anders.........
Mir wurde eine Aufgabe gestellt: einen Weg zu finden, um die Ereignisse eines neuen Balkens einer Reihe von Symbolen auf einer Reihe von Zeitrahmen zu erhalten, ohne OOP, und es kurz und effizient Code zu machen.
Und jetzt sagen Sie mir: Habe ich das Ziel erreicht?
Wenn Sie es brauchen, hier ist eine funktionierende plattformübergreifende Funktion (für MT5 und MT4)
Im Gegensatz zu Peters Code funktioniert er und ist viel schneller.
Nikolai, wie ich sehe, haben Sie es nicht versäumt, die Namen meiner Variablen in Ihrem Code zu verwenden:
Ich habe nichts dagegen, aber warum sollte ich meinen Code unter den Ihren "senken"? ))
Das ist nicht schön...