Mt4 지원 종료. - 페이지 43

 
Реter Konow :

당신의 결과는 무엇입니까?

어디에서 함수를 호출합니까?


 //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   Trading_on_new_bars_strategy();
  }
 
Vitaly Muzichenko :

1. All_bars_table[][7] 배열에서 bool 유형을 int 유형으로 교체합니다. 전역 변수 가 선언된 상단.

2. 타이머에 전화를 걸어 "여기에 코드가 있습니다."라는 메시지가 표시됩니다.

이제 확인했는데 EURUSD에 1분 동안 인쇄됩니다. 더 짧게 작동합니다.

 

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                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetMillisecondTimer ( 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                                 |
//+------------------------------------------------------------------+
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();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+
 
Реter Konow :

EURUSD의 분에 인쇄하는 옵션은 다음과 같습니다.

이것은 효과가 있지만 짧은 기간에 베팅해야 합니다.

그럼에도 불구하고 OOP 솔루션이 더 아름답게 보이고 코드가 몇 배는 적습니다.

 
Vitaly Muzichenko :

이것은 효과가 있지만 짧은 기간에 베팅해야 합니다.

그럼에도 불구하고 OOP 솔루션이 더 아름답게 보이고 코드가 몇 배는 적습니다.

원하는 것을 사용하십시오.

웃지 마세요 - 아름답지 않고 아름답습니다. 리소스 사용량으로 비교합니다.

짧은 기간에 베팅할 필요는 없습니다.

대신:

 if (!Start_count && Last_Bar_Time != Time [ 0 ])Start_count = true ; 
 //--------------------------- 
 if (Start_count)Current_period++;
 //--------------------------- 

남겨두기:

Current_period++;
 
Vitaly Muzichenko :


... 그리고 몇 배 적은 코드.

전체 솔루션 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                  Новый бар 4.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
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 );
   //-------------------------------------------------------------   
   All_symbols = SymbolsTotal ( true );
   //---------------------------------------------------------   
   ArrayResize (Symbols,All_symbols);
   //---------------------------------------------------------
   ArrayResize (All_bars_table,All_symbols);
   ArrayResize (New_Bar_Events,All_symbols);
   //---------------------------------------------------------
   for ( int a1 = 0 ; a1 < All_symbols; a1++)Symbols[a1] = SymbolName (a1 + 1 , 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 int   Current_period;
 //---------------------------
 Current_period++;
 //--------------------------- 
 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])
            {
             if (All_bars_table[a1][a2])New_Bar_Events[a1][a2]  = true ;
             All_bars_table   [a1][a2]  = All_current_bars;
            }
         }
      }
     //---------
    Current_period = 0 ;
   }
 //-----------------------------------------------
 
 //-----------------------------------------------
 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 ;
      }
   }
}
//+------------------------------------------------------------------+


숨겨진 OOP 코드를 잊지 마세요. 보이지 않기 때문에 코드가 적습니다!

 

누가 그것을 필요로 하는지 - 여기에 작동하는 크로스 플랫폼 기능이 있습니다(MT5 및 MT4용)

Peter의 코드와 달리 훨씬 빠르게 작동합니다.

 //+---------------------------------------------------------------------------------------------------+
//|   Функция определения нового бара по всем ТФ всех инструментов в окне "Обзор рынка"               |
//|   два режима работы:                                                                              |
//|   - режим сбора информации, out=false (значение по умолчанию). Достаточно запустить IsNewBar();   |
//|   - режим вывода информации, out=true                                                             |
//|   tf - период таймфрейма, по умолчанию текущий ТФ (необходим только при выводе информации)        |
//|   Sym - символ инструмента, по умолчанию текущий символ (необходим только при выводе информации)  |
//+---------------------------------------------------------------------------------------------------+
bool IsNewBar( bool out= false , int tf= PERIOD_CURRENT , string Sym= "" )
  {
#ifdef __MQL5__
   static int allTF= 21 ;
   static const ENUM_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
   static int allTF= 9 ;
   static const ENUM_TIMEFRAMES TF[ 9 ]={ PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
#endif
   static bool New_Bar_Events[];
   static long All_bars_table[]; // array of current bars
   static int N_Sym= 0 ;
   static string 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 );
  }
파일:
 
Nikolai Semko :

누가 그것을 필요로 하는지 - 여기에 작동하는 크로스 플랫폼 기능이 있습니다(MT5 및 MT4용)

Peter의 코드와 달리 훨씬 빠르게 작동합니다.

목표는 하나였지만 다른 하나는 달성했습니다...

이제 ... 누군가가 시장 개요에서 모든 기호를 표시하지만 그는 하나만으로 작동합니다 ... 그러면 침묵하는 것이 좋습니다 ...

왜 측정 ... 코드, 목표는 완전히 달랐습니다 .......

 
Alexey Viktorov :

목표는 하나였지만 다른 하나는 달성했습니다...

이제 ... 누군가가 시장 개요에서 모든 기호를 표시하지만 그는 하나만으로 작동합니다 ... 그러면 침묵하는 것이 좋습니다 ...

왜 측정 ... 코드, 목표는 완전히 달랐습니다 .......

나는 OOP 없이 많은 심볼 의 새로운 막대의 이벤트를 많은 시간 프레임에서 수신할 수 있도록 하고 짧고 효율적인 코드로 만드는 작업을 받았습니다.

이제 말해 보세요. 작업을 완료했습니까?

 
Nikolai Semko :

누가 그것을 필요로 하는지 - 여기에 작동하는 크로스 플랫폼 기능이 있습니다(MT5 및 MT4용)

Peter의 코드와 달리 훨씬 빠르게 작동합니다.

Nikolai, 나는 당신이 당신의 코드에서 내 코드의 변수 이름을 사용하는 것을 게을리하지 않았다는 것을 알았습니다:

New_Bar_Events

All_bars_table


물론, 나는 상관하지 않습니다. 그러나 이것과 함께 왜 내 코드를 귀하의 코드보다 "낮추는" 것입니까? ))

못생긴...