Mt4 Fin de l'assistance. - page 42

 
Реter Konow:
Non.

Malheureusement, il ne me reste qu'un demi-giga de trafic jusqu'au 14.09 à 14 heures, alors je ne chercherai pas. Je m'occuperai de cette période. C'est quelque chose...

 
Реter Konow:

Merci, Nikolaï - grâce à toi, j'ai appris combien j'ai gagné à ne pas avoir la moindre idée du débogueur.

Si j'avais compté sur elle, je n'aurais rien maintenant. Peut-être que je l'aurais fait, mais moitié moins.

Tout simplement parce que je n'aurais pas pu profiter d'un avantage colossal pour utiliser mon propre langage en programmation.

C'est étrange, car vous connaissez l'anglais bien mieux que moi, bien que je vive au Canada. Pourquoi ne pas écrire les noms longs en anglais ? Sauf qu'ils ne seront pas surlignés en rouge.
 
Nikolai Semko:
C'est étrange, car vous connaissez l'anglais bien mieux que moi, même si je vis au Canada. Pourquoi ne pas écrire les noms longs en anglais ? Sauf qu'ils ne seront pas surlignés en rouge.

Sur chaque mot traduit dans votre esprit (bien qu'inconsciemment) ?

La langue maternelle est biologiquement ancrée dans le cerveau. La compréhension est la plus rapide possible. Le langage extraterrestre est toujours traité avant d'être compris.

De la biologie pure.

Je comprends mon propre code beaucoup plus rapidement en utilisant le russe que si j'utilisais l'anglais. Je le mémorise beaucoup mieux.

 
Реter Konow:

Sur chaque mot traduit dans votre esprit (bien qu'inconsciemment) ?

La langue maternelle est biologiquement ancrée dans le cerveau. La compréhension est la plus rapide possible. Le langage extraterrestre est toujours traité avant d'être compris.

De la biologie pure.

Je comprends mon propre code beaucoup plus rapidement en utilisant le russe que si j'utilisais l'anglais. J'arrive beaucoup mieux à m'en souvenir.

Et essayez de faire quelque chose avec #define. Je ne suis pas devant mon ordinateur en ce moment. Vous pouvez peut-être travailler avec les noms de variables russes dans le débogueur, si vous ne pouvez pas vous en passer.
 
Реter Konow:

Sur chaque mot traduit dans votre esprit (bien qu'inconsciemment) ?

La langue maternelle est biologiquement ancrée dans le cerveau. La compréhension est la plus rapide possible. Le langage extraterrestre est toujours traité avant d'être compris.

De la biologie pure.

Je comprends mon propre code beaucoup plus rapidement en utilisant le russe que si j'utilisais l'anglais. Je m'en souviens beaucoup mieux.


Il se trouve que je n'ai jamais eu d'anglais - ni à l'école, ni dans un seul institut, ni dans un second. Je ne comprends toujours pas du tout à l'oreille. Je suis en train de l'apprendre moi-même, mais mes premières tentatives remontent à bien avant que je ne me mette à la programmation. Annygdot " - Comment avez-vous appris l'anglais si vite ? - Qu'y a-t-il à apprendre - ils ont obtenu tous les mots de C++" - c'est moi.

Et tu sais quoi ? Je n'ai jamais eu d'anglophone dans ma vie pour une raison quelconque. Parlez donc pour vous - ne généralisez pas à tout le monde.

 
Nikolai Semko:
Essayez de faire quelque chose avec #define. Je ne suis pas devant mon ordinateur en ce moment. Vous pouvez peut-être travailler avec les noms de variables russes dans le débogueur, si vous ne pouvez pas vous en passer.

J'ai traduit le code de ma solution en anglais pour la commodité du public.

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

J'espère que je n'ai rien mélangé.

 
Реter Konow:

Merci, Nikolaï - grâce à toi, j'ai appris combien j'ai gagné à ne pas avoir la moindre idée du débogueur.

Si j'avais compté sur elle, je n'aurais rien maintenant. Peut-être que je l'aurais fait, mais moitié moins.

Tout simplement parce que je n'aurais pas pu profiter d'un avantage colossal pour utiliser mon propre langage en programmation.

Je suis presque sûr que si j'utilisais des outils tels que la POO et le débogueur dans mon travail, je ferais tout beaucoup plus rapidement et avec une meilleure qualité !
Dommage que vous ne le réalisiez pas...

 
Реter Konow:

Pour la commodité du public, j'ai traduit le code de ma solution en anglais.

J'espère que je n'ai pas fait d'erreur.

Essayez-le et voyez le résultat.

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:
Je suis presque sûr que si j'utilisais des outils comme la POO et le débogueur dans mon travail, je ferais tout beaucoup plus vite et mieux !


Je ne discuterai pas. Le temps et la pratique montreront si j'ai choisi la bonne voie, la bonne approche et les bons outils.

 
Vitaly Muzichenko:

Essayez une impression et voyez les résultats

Quels sont vos résultats ?

D'où appelez-vous la fonction ?