//+------------------------------------------------------------------+//| Новый бар 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();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
당신의 결과는 무엇입니까?
어디에서 함수를 호출합니까?
1. All_bars_table[][7] 배열에서 bool 유형을 int 유형으로 교체합니다. 전역 변수 가 선언된 상단.
2. 타이머에 전화를 걸어 "여기에 코드가 있습니다."라는 메시지가 표시됩니다.
이제 확인했는데 EURUSD에 1분 동안 인쇄됩니다. 더 짧게 작동합니다.
EURUSD의 분에 인쇄하는 옵션은 다음과 같습니다.
EURUSD의 분에 인쇄하는 옵션은 다음과 같습니다.
이것은 효과가 있지만 짧은 기간에 베팅해야 합니다.
그럼에도 불구하고 OOP 솔루션이 더 아름답게 보이고 코드가 몇 배는 적습니다.
이것은 효과가 있지만 짧은 기간에 베팅해야 합니다.
그럼에도 불구하고 OOP 솔루션이 더 아름답게 보이고 코드가 몇 배는 적습니다.
원하는 것을 사용하십시오.
웃지 마세요 - 아름답지 않고 아름답습니다. 리소스 사용량으로 비교합니다.
짧은 기간에 베팅할 필요는 없습니다.
대신:
남겨두기:
... 그리고 몇 배 적은 코드.전체 솔루션 코드는 다음과 같습니다.
숨겨진 OOP 코드를 잊지 마세요. 보이지 않기 때문에 코드가 적습니다!
누가 그것을 필요로 하는지 - 여기에 작동하는 크로스 플랫폼 기능이 있습니다(MT5 및 MT4용)
Peter의 코드와 달리 훨씬 빠르게 작동합니다.
누가 그것을 필요로 하는지 - 여기에 작동하는 크로스 플랫폼 기능이 있습니다(MT5 및 MT4용)
Peter의 코드와 달리 훨씬 빠르게 작동합니다.
목표는 하나였지만 다른 하나는 달성했습니다...
이제 ... 누군가가 시장 개요에서 모든 기호를 표시하지만 그는 하나만으로 작동합니다 ... 그러면 침묵하는 것이 좋습니다 ...
왜 측정 ... 코드, 목표는 완전히 달랐습니다 .......
목표는 하나였지만 다른 하나는 달성했습니다...
이제 ... 누군가가 시장 개요에서 모든 기호를 표시하지만 그는 하나만으로 작동합니다 ... 그러면 침묵하는 것이 좋습니다 ...
왜 측정 ... 코드, 목표는 완전히 달랐습니다 .......
나는 OOP 없이 많은 심볼 의 새로운 막대의 이벤트를 많은 시간 프레임에서 수신할 수 있도록 하고 짧고 효율적인 코드로 만드는 작업을 받았습니다.
이제 말해 보세요. 작업을 완료했습니까?
누가 그것을 필요로 하는지 - 여기에 작동하는 크로스 플랫폼 기능이 있습니다(MT5 및 MT4용)
Peter의 코드와 달리 훨씬 빠르게 작동합니다.
Nikolai, 나는 당신이 당신의 코드에서 내 코드의 변수 이름을 사용하는 것을 게을리하지 않았다는 것을 알았습니다:
물론, 나는 상관하지 않습니다. 그러나 이것과 함께 왜 내 코드를 귀하의 코드보다 "낮추는" 것입니까? ))
못생긴...