Mt4 Fim do apoio. - página 42

 
Реter Konow:
Não.

Infelizmente eu só tenho meio trânsito até as 14h09, às 14h09, então não vou olhar. Eu cuidarei desse tempo. Isso é algo...

 
Реter Konow:

Obrigado, Nikolai - graças a você, aprendi o quanto ganhei por não ter uma pista sobre o depurador.

Se eu tivesse confiado nisso, agora eu não teria nada. Talvez eu teria, mas pela metade.

Simplesmente porque eu não teria sido capaz de usar uma vantagem colossal para usar minha própria linguagem na programação.

Estranho, porque você sabe inglês muito melhor do que eu, embora eu viva no Canadá. Por que não escrever nomes longos em inglês? Exceto que eles não serão destacados em vermelho.
 
Nikolai Semko:
É estranho, porque você sabe inglês muito melhor do que eu, apesar de eu morar no Canadá. Por que não escrever nomes longos em inglês? Exceto que eles não serão destacados em vermelho.

Em cada palavra em sua mente (embora inconscientemente) traduzir?

A língua materna está biologicamente enraizada no cérebro. A compreensão é a mais rápida possível. A língua estrangeira é sempre processada antes de ser compreendida.

Pura biologia.

Eu entendo meu próprio código muito mais rápido usando o russo do que se eu usasse o inglês. Eu o memorizo muito melhor.

 
Реter Konow:

Em cada palavra em sua mente (embora inconscientemente) traduzir?

A língua materna está biologicamente enraizada no cérebro. A compreensão é a mais rápida possível. A língua estrangeira é sempre processada antes de ser compreendida.

Pura biologia.

Eu entendo meu próprio código muito mais rápido usando o russo do que se eu usasse o inglês. Eu sou muito melhor em lembrá-lo.

E tente fazer algo com #define. Eu simplesmente não estou no meu computador neste momento. Talvez você possa de alguma forma trabalhar com nomes variáveis russos no depurador, se não puder passar sem eles.
 
Реter Konow:

Em cada palavra em sua mente (embora inconscientemente) traduzir?

A língua materna está biologicamente enraizada no cérebro. A compreensão é a mais rápida possível. A língua estrangeira é sempre processada antes de ser compreendida.

Pura biologia.

Eu entendo meu próprio código muito mais rápido usando o russo do que se eu usasse o inglês. Eu me lembro muito melhor.


Acontece que eu nunca tive inglês - nem na escola, nem em um único instituto, nem em um segundo. Eu ainda não entendo nada de ouvido. Eu mesmo estou aprendendo, mas minhas primeiras tentativas foram muito antes de começar a programar. Annygdot " - Como você aprendeu inglês tão rápido? - O que há para aprender - eles têm todas as palavras de C++" - esse sou eu.

E você sabe o que mais? Eu nunca tive um anglófono em minha vida por alguma razão. Portanto, fale por si mesmo - não generalize para todos.

 
Nikolai Semko:
Tente fazer algo com #define. Eu simplesmente não estou no meu computador neste momento. Talvez você possa de alguma forma trabalhar com nomes de variáveis russas no depurador, se não puder passar sem elas.

Traduzi meu código de solução para o inglês para a conveniência do 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 não ter confundido nada.

 
Реter Konow:

Obrigado, Nikolai - graças a você, aprendi o quanto ganhei por não ter uma pista sobre o depurador.

Se eu tivesse confiado nisso, agora eu não teria nada. Talvez eu teria, mas pela metade.

Simplesmente porque eu não teria sido capaz de usar uma vantagem colossal para usar minha própria linguagem na programação.

Tenho quase certeza que se eu usasse ferramentas como OOP e debugger em meu trabalho, eu faria tudo muito mais rápido e de melhor qualidade!
Pena que você não perceba que...

 
Реter Konow:

Para a conveniência do público, eu traduzi meu código de solução para o inglês.

Espero não ter cometido um erro.

Experimente e veja o 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:
Tenho quase certeza que se eu usasse ferramentas como OOP e debugger em meu trabalho, eu faria tudo muito mais rápido e melhor!


Eu não vou discutir. O tempo e a prática mostrarão se eu escolhi o caminho, a abordagem e as ferramentas corretas.

 
Vitaly Muzichenko:

Experimente uma impressão e veja os resultados

Quais são seus resultados?

De onde você está chamando a função?