//+------------------------------------------------------------------+//| Новый бар 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();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
kimin ihtiyacı var - işte çalışan bir platformlar arası işlev (MT5 ve MT4 için)
Peter'ın kodunun aksine, aynı zamanda daha hızlı çalışır.
Hedef birdi, ama diğerine ulaşıldı ...
Şimdi, eğer ... biri, piyasaya genel bakışta TÜM sembolleri gösteriyorsa, ancak yalnızca bir tanesiyle çalışıyorsa ... O zaman sessiz kalmak daha iyidir ...
Neden ölçün ... kod, amaç tamamen farklıydı .........
Şimdi, eğer ... biri, piyasaya genel bakışta TÜM sembolleri gösteriyorsa, ancak yalnızca bir tanesiyle çalışıyorsa ... O zaman sessiz kalmak daha iyidir ...
Neden ölçün ... kod, amaç tamamen farklıydı .........
Bana bir görev verildi: OOP olmadan birçok sembolden oluşan yeni bir çubuğun olaylarını birçok zaman diliminde almayı mümkün kılmak ve onu kısa ve verimli bir kod haline getirmek.
Sonuç nedir?
Fonksiyonu nereden çağırıyorsunuz?
1. All_bars_table[][7] dizisindeki bool türünü int türü ile değiştirin; global değişkenlerin bildirildiği en üstte.
2. Aramayı, "İşte kodunuz" yazan bir zamanlayıcıya koyun.
Şimdi kontrol ettim ve bir dakikalığına EURUSD'ye yazdırıyor. Daha kısa çalışır.
EURUSD'de dakikayı yazdıran bir seçenek:
EURUSD'de dakikayı yazdıran bir seçenek:
Bu işe yarar, ancak küçük bir zaman diliminde bahis yapmanız gerekir.
Yine de, OOP çözümünün daha güzel göründüğünü ve kodun birkaç kat daha az olduğunu kabul etmeye değer.
Bu işe yarar, ancak küçük bir zaman diliminde bahis yapmanız gerekir.
Yine de, OOP çözümünün daha güzel göründüğünü ve kodun birkaç kat daha az olduğunu kabul etmeye değer.
İstediğini kullan.
Gülme - güzel, güzel değil. Kaynak tüketimine göre karşılaştırın.
Küçük bir zaman diliminde bahis yapmak gerekli değildir.
Bunun yerine:
Yalnızca bırakın:
... ve birkaç kat daha az kod.İşte tüm çözüm kodu:
Gizli OOP kodunu unutmayın. Görünmediği için daha az kod var!
kimin ihtiyacı var - işte çalışan bir çapraz platform işlevi (MT5 ve MT4 için)
Peter'ın kodunun aksine, aynı zamanda daha hızlı çalışır.
kimin ihtiyacı var - işte çalışan bir platformlar arası işlev (MT5 ve MT4 için)
Peter'ın kodunun aksine, aynı zamanda daha hızlı çalışır.
Hedef birdi, ama diğerine ulaşıldı ...
Şimdi, eğer ... biri, piyasaya genel bakışta TÜM sembolleri gösteriyorsa, ancak yalnızca bir tanesiyle çalışıyorsa ... O zaman sessiz kalmak daha iyidir ...
Neden ölçün ... kod, amaç tamamen farklıydı .........
Hedef birdi, ama diğerine ulaşıldı ...
Şimdi, eğer ... biri, piyasaya genel bakışta TÜM sembolleri gösteriyorsa, ancak yalnızca bir tanesiyle çalışıyorsa ... O zaman sessiz kalmak daha iyidir ...
Neden ölçün ... kod, amaç tamamen farklıydı .........
Bana bir görev verildi: OOP olmadan birçok sembolden oluşan yeni bir çubuğun olaylarını birçok zaman diliminde almayı mümkün kılmak ve onu kısa ve verimli bir kod haline getirmek.
Şimdi söyle bana - görevi tamamladım mı?
kimin ihtiyacı var - işte çalışan bir platformlar arası işlev (MT5 ve MT4 için)
Peter'ın kodunun aksine, aynı zamanda daha hızlı çalışır.
Nikolai, kodumun değişkenlerinin adlarını kodunuzda kullanmayı ihmal etmediğinizi görüyorum:
Tabii ki umurumda değil, ama neden bununla birlikte kodumu sizinkinin altına "indiriyorsunuz"? ))
Çirkin...