Mt4 Fin de soporte. - página 42

 
Реter Konow:
No.

Lamentablemente sólo me queda medio giga de tráfico hasta las 14:00 horas del 14.09, así que no miraré. Me ocuparé de ese tiempo. Eso es algo...

 
Реter Konow:

Gracias, Nikolai - gracias a ti aprendí lo mucho que gané por no tener ni idea del depurador.

Si hubiera confiado en ello, ahora no tendría nada. Tal vez lo hubiera hecho, pero a medias.

Simplemente porque no habría podido aprovechar una ventaja colosal para utilizar mi propio lenguaje en la programación.

Es extraño, porque tú sabes inglés mucho mejor que yo, aunque vivo en Canadá. ¿Por qué no escribir los nombres largos en inglés? Excepto que no estarán resaltados en rojo.
 
Nikolai Semko:
Es extraño, porque tú sabes inglés mucho mejor que yo, aunque vivo en Canadá. ¿Por qué no escribir los nombres largos en inglés? Excepto que no estarán resaltados en rojo.

En cada palabra en su mente (aunque inconscientemente) traducir?

La lengua materna está biológicamente arraigada en el cerebro. La comprensión es la más rápida posible. El lenguaje ajeno siempre se procesa antes de entenderse.

Biología pura.

Entiendo mi propio código mucho más rápido usando el ruso que si usara el inglés. Lo memorizo mucho mejor.

 
Реter Konow:

En cada palabra en su mente (aunque inconscientemente) traducir?

La lengua materna está biológicamente arraigada en el cerebro. La comprensión es la más rápida posible. El lenguaje ajeno siempre se procesa antes de entenderse.

Biología pura.

Entiendo mi propio código mucho más rápido usando el ruso que si usara el inglés. Soy mucho mejor para recordarlo.

Y trata de hacer algo con #define. Ahora mismo no estoy en mi ordenador. Quizás puedas trabajar de alguna manera con los nombres de las variables rusas en el depurador, si no puedes prescindir de ellos.
 
Реter Konow:

En cada palabra en su mente (aunque inconscientemente) traducir?

La lengua materna está biológicamente arraigada en el cerebro. La comprensión es la más rápida posible. El lenguaje ajeno siempre se procesa antes de ser entendido.

Biología pura.

Entiendo mi propio código mucho más rápido usando el ruso que si usara el inglés. Lo recuerdo mucho mejor.


Lo que pasa es que nunca he tenido inglés: ni en la escuela, ni en un instituto, ni en un segundo. Sigo sin entenderlo de oído en absoluto. Yo también estoy aprendiendo, pero mis primeros intentos fueron mucho antes de empezar a programar. Annygdot " - ¿Cómo has aprendido inglés tan rápido? - Qué hay que aprender, todas las palabras las han sacado de C++", así soy yo.

¿Y sabes qué? Por alguna razón, nunca he tenido un anglófono en mi vida. Así que habla por ti, no generalices con todo el mundo.

 
Nikolai Semko:
Intenta hacer algo con #define. Ahora mismo no estoy en mi ordenador. Quizás puedas trabajar de alguna manera con los nombres de las variables rusas en el depurador, si no puedes prescindir de ellos.

He traducido el código de mi solución al inglés para comodidad del público.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+

Espero no haber confundido nada.

 
Реter Konow:

Gracias, Nikolai - gracias a ti he aprendido lo mucho que he ganado por no tener ni idea del depurador.

Si hubiera confiado en ello, ahora no tendría nada. Tal vez lo hubiera hecho, pero a medias.

Simplemente porque no habría podido aprovechar una ventaja colosal para utilizar mi propio lenguaje en la programación.

Estoy seguro de que si utilizara herramientas como OOP y el depurador en mi trabajo, lo haría todo mucho más rápido y de mayor calidad.
Lástima que no te des cuenta...

 
Реter Konow:

Para comodidad del público, he traducido el código de mi solución al inglés.

Espero no haber mezclado nada.

Pruébalo y verás el resultado.

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:
Estoy bastante seguro de que si utilizara herramientas como la POO y el depurador en mi trabajo, lo haría todo mucho más rápido y mejor.


No voy a discutir. El tiempo y la práctica demostrarán si he elegido el camino, el enfoque y las herramientas adecuadas.

 
Vitaly Muzichenko:

Pruebe una impresión y vea los resultados

¿Cuáles son sus resultados?

¿Desde dónde llamas a la función?

Razón de la queja: