Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1161

 
KolyanSNA:
Bonjour ! Comment modifier la taille de la police dans le terminal ? Quelqu'un peut-il me donner un indice ?

Il peut être utile de modifier le zoom dans les paramètres d'affichage du système d'exploitation si vous en avez besoin.

 

Existe-t-il un moyen de déterminer, à partir de l'événement OnChartEvent, si un bouton a été pressé sur le clavier lorsque la souris a cliqué sur le graphique ?

 

Veuillez m'aider à comprendre les indicateurs.

Ici, à l'ouverture de chaque nouvelle barre, il devrait y avoir un nouveau calcul.

Logique - Le zigzag doit relier les bas (bas des 3 dernières barres en dessous de deux barres adjacentes) et les hauts (haut des 3 dernières barres au-dessus de deux barres adjacentes).

Si un pic est suivi d'un nouveau, l'indicateur est redessiné sur le nouveau, l'ancien est supprimé, je pense que c'est clair.

En fait, l'indicateur relie tous les hauts et les bas de manière séquentielle, quel est le problème ?

#property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ZigZag 
#property indicator_label1  "ZigZag" 
#property indicator_type1   DRAW_ZIGZAG 
#property indicator_color1  clrBlue 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- indicator buffers 
double         ZigZagBuffer1[]; 
double         ZigZagBuffer2[]; 
double a = 0;
int last = 0; //В последний раз была вершина или низина 
int lastN = 0; //Номер бара с экстремумом
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- связывание массивов и индикаторных буферов 
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA); 
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA); 
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   ArrayInitialize(ZigZagBuffer1, EMPTY_VALUE);
   ArrayInitialize(ZigZagBuffer2, EMPTY_VALUE);
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2"); 
//--- 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &open[], 
                const double &high[], 
                const double &low[], 
                const double &close[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
{ 
   if(a != iOpen(_Symbol, PERIOD_CURRENT, 0))
   {
      a = iOpen(_Symbol, PERIOD_CURRENT, 0);
      for(int i = Bars(_Symbol, PERIOD_CURRENT) - 3; i > 0; i--)
      {
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1] && low[i] >= low[i+1] && low[i+2] >= low[i+1]) //В обе стороны на одном баре
         {
            if(last == 0) continue; //Если с этого начинается расчет - пропускаем просто
            if(last == 1) //Если была вершина
            {
               if(high[lastN] > high[i+1])//Если новая верщина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = -1;
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               if(low[lastN] < low[i+1])//Если новая низина не перебила старую
               {
                  ZigZagBuffer1[i+1] = high[i+1];
                  ZigZagBuffer2[i+1] = low[i+1];
                  lastN = i+1;
                  continue;
               }
               //Если перебила
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               ZigZagBuffer2[i+1] = low[i+1];
               last = 1;
               lastN = i+1;
               continue;
            }
         }
         if(high[i] <= high[i+1] && high[i+2] <= high[i+1]) //Новая вершина
         {
            if(last == 0)
            {
               last = 1;
               lastN = i+1;
               ZigZagBuffer1[i+1] = high[i+1];
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer1[lastN] = EMPTY_VALUE;
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer1[i+1] = high[i+1];
               lastN = i+1;
               last = 1;
               continue;
            }
         }
         if(low[i] >= low[i+1] && low[i+2] >= low[i+1])//Новая низина
         {
            if(last == 0)
            {
               last = -1;
               lastN = i+1;
               ZigZagBuffer2[i+1] = low[i+1];
               continue;
            }
            if(last == -1)
            {
               ZigZagBuffer2[lastN] = EMPTY_VALUE;
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               continue;
            }
            if(last == 1)
            {
               ZigZagBuffer2[i+1] = low[i+1];
               lastN = i+1;
               last = -1;
               continue;
            }
         }
      }
   }
   
   return(rates_total); 
} 
Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Roman Sharanov:

Veuillez m'aider à comprendre les indicateurs.

Ici, à l'ouverture de chaque nouvelle barre, il devrait y avoir un nouveau calcul.

Logique - Le zigzag doit relier les bas (bas des 3 dernières barres en dessous de deux barres adjacentes) et les hauts (haut des 3 dernières barres au-dessus de deux barres adjacentes).

Si un pic est suivi d'un nouveau, l'indicateur est redessiné sur le nouveau, l'ancien est supprimé, je pense que c'est clair.

En fait, l'indicateur connecte tous les HI et LH en série, quel est le problème ?

D'après ce que j'ai compris, vous avez deux tampons de dessin. Les deux sont dessinés. Chaque tampon a sa propre ligne, on obtient un extremum. Il y a 3 tampons dans le zigzag. Deux calculés pour les maxima et les minima séparément, et un pour le tirage au sort selon le signe qu'après avoir écrit les maxima dans le tampon, on cherche le minimum et vice versa.

 
Question, existe-t-il une description des bibliothèques standard pour MT4 ou non ?
 
Valeriy Yastremskiy:

Je comprends que vous avez deux tampons de dessin. Les deux sont dessinés. Chaque tampon a sa propre ligne, vous obtenez un extrême. Il y a 3 tampons dans le zigzag. Deux tampons de calcul sont séparés pour les maxima et les minima, et un tampon est utilisé pour le dessin suivant le dernier maximum écrit dans le tampon des maxima, et vice versa.

Aide - le zigzag est construit en utilisant 2 tampons, exemple avec 2 tampons aussi

 
Valeriy Yastremskiy:
Question : existe-t-il une description des bibliothèques standard pour MT4 ou non ?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin:

MT4.

Félicitations pour les articles. Excellent travail.

 
Roman Sharanov:

Aide - le zigzag est construit sur 2 tampons, exemple avec 2 tampons aussi

Début du code ZZ.

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Red
//---- indicator parameters
input int InpDepth=12;     // Depth
input int InpDeviation=5;  // Deviation
input int InpBackstep=3;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];

Un tampon de dessin. Trois réseaux.

Regardez le code. La logique est complexe. C'est généralement difficile à faire à la volée.

Code ZigZag avec commentaires traduits en russe
Dossiers :
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy:

MT4.

Félicitations pour les articles. Excellent travail.

Ce n'est pas grave - presque tout s'adapte.

Merci.