Mt4 지원 종료. - 페이지 42

 
Реter Konow :
아니요.

안타깝게도 9월 14일 14시까지 트래픽이 반밖에 남지 않아 찾지 않겠습니다. 이 시간은 내가 돌볼게. 뭔가 있어보이네요...

 
Реter Konow :

고마워요, Nikolai - 당신 덕분에 디버거에 대한 단서가 없어서 얼마나 많은 것을 얻었는지 배웠습니다.

내가 그에게 의지했다면 나는 지금 아무것도 없었을 것입니다. 아마도 그럴 것입니다. 그러나 절반 미만입니다.

프로그래밍에서 모국어를 사용하는 엄청난 이점을 사용할 수 없었기 때문입니다.

내가 캐나다에 살고 있음에도 불구하고 당신이 나보다 영어를 훨씬 더 잘 알기 때문에 이상합니다. 긴 이름을 영어로 쓰지 않는 이유는 무엇입니까? 사실, 빨간색으로 강조 표시되지 않습니다.
 
Nikolai Semko :
내가 캐나다에 살고 있음에도 불구하고 당신이 나보다 영어를 훨씬 더 잘 알기 때문에 이상합니다. 긴 이름을 영어로 쓰지 않는 이유는 무엇입니까? 사실, 빨간색으로 강조 표시되지 않습니다.

(무의식적이긴 하지만) 마음속의 모든 단어를 번역하시겠습니까?

모국어는 생물학적으로 뇌에 이식됩니다. 이해가 가장 빠릅니다. 외국어는 항상 이해되기 전에 처리됩니다.

순수한 생물학.

러시아어를 사용하면 영어를 사용하는 것보다 훨씬 빨리 내 코드를 이해합니다. 훨씬 더 기억에 남습니다.

 
Реter Konow :

(무의식적이긴 하지만) 마음속의 모든 단어를 번역하시겠습니까?

모국어는 생물학적으로 뇌에 이식됩니다. 이해가 가장 빠릅니다. 외국어는 항상 이해되기 전에 처리됩니다.

순수한 생물학.

러시아어를 사용하면 영어를 사용하는 것보다 훨씬 빨리 내 코드를 이해합니다. 훨씬 더 기억에 남습니다.

그리고 #define을 통해 무언가를 일으키려고 합니다. 나는 지금 컴퓨터에 있지 않습니다. 러시아어 변수 이름 없이는 할 수 없는 경우 디버거에서 러시아어 변수 이름으로 작업하는 것이 가능할 수도 있습니다.
 
Реter Konow :

(무의식적이긴 하지만) 마음속의 모든 단어를 번역하시겠습니까?

모국어는 생물학적으로 뇌에 이식됩니다. 이해가 가장 빠릅니다. 외국어는 항상 이해되기 전에 처리됩니다.

순수한 생물학.

러시아어를 사용하면 영어를 사용하는 것보다 훨씬 빨리 내 코드를 이해합니다. 훨씬 더 기억에 남습니다.


그래서 나는 학교에서나 한 연구소에서나 두 번째 연구소에서나 영어를 한 번도 배운 적이 없었습니다. 지금까지도 나는 그를 전혀 이해하지 못한다. 나는 스스로 가르친다. 그러나 첫 시작은 내가 프로그래밍을 시작하기 훨씬 전에 있었다. Anigdot "- 영어를 어떻게 그렇게 빨리 배웠니? - 무엇을 배울 수 있습니까? - 그들은 C++에서 모든 단어를 가져왔습니다." - 이것은 저에 관한 것입니다.

그리고 당신은 알고 있습니까? 웬일인지, 영어 이름은 결코 눈을 늦추지 않았습니다. 따라서 자신을 위해 말하십시오. 모든 사람에게 일반화할 수 있는 것은 없습니다.

 
Nikolai Semko :
그리고 #define을 통해 무언가를 일으키려고 합니다. 나는 지금 컴퓨터에 있지 않습니다. 러시아어 변수 이름 없이는 할 수 없는 경우 디버거에서 러시아어 변수 이름으로 작업하는 것이 가능할 수도 있습니다.

대중의 편의를 위해 내 솔루션의 코드를 영어로 번역했습니다.

 //+------------------------------------------------------------------+
//|                                                  Новый бар 2.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 ];
bool    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 ;
   }
 //-----------------------------------------------
 //Здесь наш код...
 //Здесь наш код...
 //Здесь наш код...
 //-----------------------------------------------
 //После завершения всех вызовов на этом событии таймера
 //снимаем флаги событий нового бара.
 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_M15 )
         {
           //Buy();
         }
       //---------------------------------- 
       if (New_bar && This_symbol == "AUDUSD" && This_timeframe == PERIOD_M30 )
         {
           //Sell();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+

나는 내가 아무것도 혼동하지 않았기를 바랍니다.

 
Реter Konow :

고마워요, Nikolai - 당신 덕분에 디버거에 대한 단서가 없어서 얼마나 많은 것을 얻었는지 배웠습니다.

내가 그에게 의지했다면 나는 지금 아무것도 없었을 것입니다. 아마도 그럴 것입니다. 그러나 절반 미만입니다.

프로그래밍에서 모국어를 사용하는 엄청난 이점을 사용할 수 없었기 때문입니다.

작업에 OOP 및 디버거와 같은 도구를 사용하면 모든 작업을 훨씬 빠르고 더 잘 수행할 수 있다고 확신합니다!
당신이 그것을 깨닫지 못하는 것이 슬프다 ...

 
Реter Konow :

대중의 편의를 위해 내 솔루션의 코드를 영어로 번역했습니다.

나는 내가 아무것도 혼동하지 않았기를 바랍니다.

그것을 시도하고 결과를 참조하십시오

 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_M5 )
         {
           //Buy();
           Print ("M5");
         }
       //---------------------------------- 
       if (New_bar && This_symbol == "AUDUSD" && This_timeframe == PERIOD_M1 )
         {
           //Sell();
           Print ("M1");
         }
       //----------------------------------        
      }
   }
}
 
Nikolai Semko :
작업에 OOP 및 디버거와 같은 도구를 사용한다면 모든 작업을 훨씬 빠르고 더 잘 수행할 수 있을 것이라고 확신합니다!


나는 논쟁하지 않을 것이다. 시간과 연습은 내가 올바른 길, 접근 방식 및 도구를 선택했는지 여부를 보여줍니다.

 
Vitaly Muzichenko :

그것을 시도하고 결과를보십시오

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

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