Ecco la variante che si stampa sul minuto di EURUSD:
//+------------------------------------------------------------------+//| Новый бар 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();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
Se ne avete bisogno, ecco una funzione cross-platform funzionante (per MT5 e MT4)
A differenza del codice di Peter, funziona ed è un ordine di grandezza più veloce.
//+---------------------------------------------------------------------------------------------------+//| Функция определения нового бара по всем ТФ всех инструментов в окне "Обзор рынка" |//| два режима работы: |//| - режим сбора информации, 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);
}
L'obiettivo era uno e il raggiungimento di un altro...
Se qualcuno ha... qualcuno, la panoramica del mercato mostra TUTTI i simboli e funziona solo con uno... Preferisco non dire altro...
Perché misurare ... codice, l'obiettivo era molto diverso.........
Mi è stato dato un compito: fare un modo per ottenere gli eventi di una nuova barra di un insieme di simboli, su un insieme di timeframes, senza OOP, e renderlo codice breve ed efficiente.
Qual è il suo risultato?
Da dove chiamate la funzione?
1. Sostituire il tipo bool con il tipo int dell'array All_bars_table[][7]; all'inizio dove sono dichiarate le variabili globali.
2. Metti la chiamata al timer, dove dice "Ecco il tuo codice".
Ora ho controllato e funziona su EURUSD. In breve, funziona.
Ecco la variante che si stampa sul minuto di EURUSD:
Ecco una variante che stampa al minuto su EURUSD:
Funziona, ma bisogna metterlo su un piccolo lasso di tempo.
Tuttavia, devo ammettere che la soluzione OOP sembra più bella e c'è qualche volta meno codice.
Questo funziona, ma bisogna metterlo su un piccolo lasso di tempo.
Tuttavia, vale la pena ammettere che la soluzione OOP sembra più bella, e c'è qualche volta meno codice.
Usate quello che volete.
Non essere ridicolo - non è bello, non è bello. Confrontateli in termini di consumo di risorse.
Non è necessario metterlo in un piccolo lasso di tempo.
Invece:
Lasciare solo:
... e il codice è molte volte inferiore.Ecco tutto il codice per la soluzione:
Non dimenticare il codice OOP nascosto. C'è meno codice perché non si vede!
Se ne avete bisogno, ecco una funzione cross-platform funzionante (per MT5 e MT4)
A differenza del codice di Peter, funziona ed è un ordine di grandezza più veloce.
Se ne avete bisogno, ecco una funzione cross-platform funzionante (per MT5 e MT4)
A differenza del codice di Peter, funziona ed è molto più veloce.
L'obiettivo era uno, ma ne ha raggiunto un altro...
Se ... qualcuno, la panoramica del mercato mostra TUTTI i simboli, ma funziona con un solo ... Preferisco non dire altro...
Perché stai cercando di misurare... codice, lo scopo era piuttosto diverso.........
L'obiettivo era uno e il raggiungimento di un altro...
Se qualcuno ha... qualcuno, la panoramica del mercato mostra TUTTI i simboli e funziona solo con uno... Preferisco non dire altro...
Perché misurare ... codice, l'obiettivo era molto diverso.........
Mi è stato dato un compito: fare un modo per ottenere gli eventi di una nuova barra di un insieme di simboli, su un insieme di timeframes, senza OOP, e renderlo codice breve ed efficiente.
Ora ditemi: ho raggiunto l'obiettivo?
Se ne avete bisogno, ecco una funzione cross-platform funzionante (per MT5 e MT4)
A differenza del codice di Peter, funziona ed è molto più veloce.
Nikolai, vedo che non hai trascurato di usare i nomi delle mie variabili nel tuo codice:
Certamente non mi dispiace, ma perché "abbassare" il mio codice sotto il vostro? ))
Non è bello...