Mt4 Fin de l'assistance. - page 30

 
Реter Konow:

La charge est placée sur l'ordinateur par l'attitude négligente du développeur à l'égard de la cohérence de son mécanisme. Une volonté d'économiser de l'énergie pour améliorer le système. Consommation déraisonnable des ressources informatiques au nom de la facilitation de leur travail.

Tant que l'ordinateur réussit à faire face à un code écrit de manière inefficace, le développeur continuera à "parasiter" la puissance de traitement. C'est une route sans issue.

Tôt ou tard, le mécanisme inefficace cessera d'évoluer et sera remplacé par un meilleur homologue.

Le temps et les efforts de l'homme seront gaspillés et son invention finira à la poubelle.

Dans le monde de la concurrence, ce risque existe en permanence.

En concevant des mécanismes, nous devons penser à leur performance en premier lieu, et au confort et à la commodité de passer nos heures de travail en second lieu).

Vous n'avez toujours pas écrit de fonction pour définir une nouvelle barre en style procédural.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Mt4 Fin de l'assistance.

Artyom Trishkin, 2017.09.10 23:21

J'avais pour objectif que le résultat final de son code de style procédural fonctionne dans une telle boucle :

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Реter Konow:

Oui, nous en avons discuté hier.

J'avais l'habitude de travailler avec une autre plateforme et là, les barres étaient formées par le temps, indépendamment des cotations qui arrivaient (regardez dans TWS).

On m'a dit que ce n'était pas le cas sur MT.

J'ajouterai un contrôle d'arrivée de devis pour confirmer un nouvel événement d'occurrence de barre.

Je l'ai regardé pendant un certain temps maintenant. Plateforme intéressante, mais d'après ce que j'ai compris, elle n'est pas gratuite, et si vous n'êtes pas sûr de gagner de l'argent, c'est dommage de payer pour utiliser ce jouet...

 

Apparemment, mon expérience d'essayer d'expliquer le point de vue des autodidactes a échoué...

 
Vladimir:

Existe-t-il, en principe, un exemple de cela? Même si ce n'est pas le vôtre ? J'ai de profonds doutes. Au début des années 2000, j'ai arrêté de compter le nombre de lignes de code débogué et fonctionnel que j'ai écrit parce qu'il dépassait le million, cela devenait inintéressant .

Un exemple élémentaire serait d'ajouter une autre série n d'entrées à l'EA, avec différents paramètres d'entrée.
Et, bien sûr, maintenir ces n-positions, avec des paramètres distincts, jusqu'à la fermeture.

...Et très probablement (en utilisant oop) lignes de code, vous en auriez moins. Bien qu'il y ait des adeptes du gonflement du code oop).

 
Aleksey Altukhov:

Je ne sais pas si quelqu'un l'a suggéré, mais pourquoi ne pas déplacer tout ce qui est dans MT4 vers MT5, alors tout le monde bougerait.


Et qui transférerait cette montagne d'EA, d'indicateurs et de scripts accumulés ?

 

Je pense que j'ai trouvé un exemple primitif de l'utilité de la POO. Voici une fonction permettant de remplir un tableau avec une valeur spécifiée. Il en existe huit variétés, en fonction du type de tableau.

Imaginez que vous deviez écrire une fonction qui doit passer un ensemble de paramètres, puis un autre, puis un troisième... En utilisant l'approche algorithmique, vous obtiendrez N noms de fonctions différents. Il semblerait qu'il n'y ait aucun problème, vous pouvez écrire 8 fonctions telles que ArrayInitializeInt()ArrayInitializeDouble() et ainsi de suite. Mais c'est agréable de ne pas penser au type de tableau, il suffit d'utiliser une fonction dans tous les cas, et à quel point il est sûr de mélanger le tableau que vous mettez là...

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Développement d'une nouvelle solution pour la nouvelle fonction de bar. Il est plus simple et plus concis. Il a mis en place la possibilité de recevoir une notification sur l'événement d'une nouvelle barre sur n'importe quel symbole disponible dans l'aperçu du marché et sur n'importe quelle période prédéfinie.

Si vous voyez des erreurs, veuillez commenter.

//+------------------------------------------------------------------+
//|                                                  Новый бар 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 Время_последнего_бара;

int      Частота_таймера        = 25;
int      Всех_символов;
int      Таймфреймы[7]          = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int      Всех_таймфреймов       = 7;
int      Количество_баров[][7];
bool     События_нового_бара[][7];

string   Символы[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time[0];
   //-------------------------------------------------------------   
   //Узнаем сколько символов есть в обзоре рынка.
   //---------------------------------------------------------
   Всех_символов = SymbolsTotal(true);
   //---------------------------------------------------------   
   //Устанавливаем размер массива Символы. Внутри него будут записаны
   //имена всех символов, которые есть в окне обзоре рынка.
   //---------------------------------------------------------
   ArrayResize(Символы,Всех_символов);
   //---------------------------------------------------------
   //Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".
   //В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа
   //и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги
   //события нового бара для каждого символа и каждого таймфрейма. 
   //---------------------------------------------------------
   ArrayResize(Количество_баров,Всех_символов);
   ArrayResize(События_нового_бара,Всех_символов);
   //---------------------------------------------------------
   //Записываем наименования символов обзора рынка в массив "Символы[]".
   //---------------------------------------------------------
   for(int a1 = 0; a1 < Всех_символов; a1++)
     {
      Символы[a1] = SymbolName(a1 + 1,true); 
      //Возможно, нумерация символов в обзора рынка идет с нуля.
      //Тогда: Символы[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 Начало_отсчета;
 static int  Минута;
 //---------------------------
 //Нам нужен корректный старт отсчета. Это должно быть время начала бара.
 //---------------------------
 if(!Начало_отсчета && Time[0] != Время_последнего_бара)Начало_отсчета = true; 
 //--------------------------- 
 if(Начало_отсчета)Минута++;
 //--------------------------- 
 //В следующем цикле, мы будем обращатся к функции iBars (раз в минуту) для получения количества баров на 
 //каждом из символов и таймфреймов, которые будем проходить в цикле.
 //Далее, будем сравнивать записанное количество баров с текущим и при 
 //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".
 //---------------------------
 if(Минута*Частота_таймера >= 60000)
   {
    for(int a1 = 0; a1 < Всех_символов; a1++)
      {
       string Этот_символ = Символы[a1];
       //---------------------------------
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          int Этот_таймфрейм = Таймфреймы[a2];
          //------------------------------------------
          int Текущее_количество_баров = iBars(Этот_символ,Этот_таймфрейм);
          //------------------------------------------
          if(Текущее_количество_баров > Количество_баров[a1][a2])
            {
             //------------------------------------------------------------
             //Если это не самая первая запись в массив Количества баров,
             //то фиксируем событие нового бара.
             //------------------------------------------------------------
             if(Количество_баров[a1][a2])События_нового_бара[a1][a2]  = true;
             //------------------------------------------------------------
             //Устанавливаем новое значение текущего количества баров.
             //------------------------------------------------------------
             Количество_баров   [a1][a2]  = Текущее_количество_баров;
            }
          //------------------------------------------
         }
      }
    //---------
    Минута = 0;
   }
 //-----------------------------------------------
    
}
//+------------------------------------------------------------------+






//---------------------------------------------------------------------
//Функция Новый_бар() принимает наименование символа и таймфрейм.
//Она делает цикл по массиву символов, находит совпадение наименований и 
//с запрашиваемым символом, и далее ищет нужный таймфрейм для получения
//индекса ячейки массива в которой он находится. 
//Найдя индекс ячейки имени нужного символа и индекс ячейки нужного
//таймфрейма, функция обращается к массиву "События_нового_бара" и 
//возвращает факт события нового бара или его отсутствие.
//После возврата флага события, функция снимает этот флаг.
//Следовательно, флаг события можно получить только один раз за бар.
//---------------------------------------------------------------------
bool Новый_бар(string Символ, int Таймфрейм)
{
 bool Новый_бар;
 //-----------------------
 for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    if(Символы[a1] == Символ)
      {
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          if(Таймфреймы[a2] == Таймфрейм)
            {
             Новый_бар  = События_нового_бара[a1][a2];
             if(Новый_бар)События_нового_бара[a1][a2] = 0;
             return(Новый_бар);
            }
         }
      }
   }
 //-----------------------
 return(false);
}
//+------------------------------------------------------------------+
 
Реter Konow:

Développement d'une nouvelle solution pour la nouvelle fonction de bar. Il est plus simple et plus concis. Il a mis en place la possibilité de recevoir une notification sur l'événement d'une nouvelle barre sur n'importe quel symbole disponible dans l'aperçu du marché et sur n'importe quelle période prédéfinie.

Si vous voyez des erreurs, veuillez commenter.


4 cycles, c'est pas cool ? avec 600 symboles dans la vue d'ensemble du marché, chaque minute le terminal va mourir ....

 
Реter Konow:

Développement d'une nouvelle solution pour la nouvelle fonction de bar. Il est plus simple et plus concis. Il a mis en place la possibilité de recevoir une notification sur un nouvel événement de barre sur n'importe quel symbole disponible dans la vue d'ensemble du marché et sur n'importe quelle période prédéfinie.

Si vous voyez des erreurs, veuillez commenter.

Je ne m'attends pas à ce que cette fonction saute dans OnTimer() et j'ai déjà commenté mon idée

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Support d'extrémité Mt4.

Alexey Viktorov, 2017.09.11 10:09

Apparemment, mon expérience d'essayer d'expliquer un point de vue autodidacte a échoué...


 
Реter Konow:

Développement d'une nouvelle solution pour la nouvelle fonction de bar. Il est plus simple et plus concis. Il a mis en place la possibilité de recevoir une notification sur l'événement d'une nouvelle barre sur n'importe quel symbole disponible dans l'aperçu du marché et sur n'importe quelle période prédéfinie.

Si vous voyez des erreurs, veuillez commenter.

Quant aux commentaires sur le code : Que faire si vous devez définir l'ouverture de la période en cours et un seul symbole dans le programme ? La structure entière va boucler toutes les boucles ? Ce n'est pas rationnel.

ps ; Et pourquoi devrais-je lancer une minuterie en millisecondes ? Une seconde minuterie n'est-elle pas suffisante ?