Ligne verticale.

 
Bonjour, j'ai commencé à créer un indicateur qui tracera une ligne entre deux pips dans le temps et le prix, la façon dont la ligne est tracée est approximativement comme ceci :
for(int w=limit;w<rates_total;w++)
 SupportBuffer[w]=low[s1]+speeds*(w-s1);
Tout va bien, mais parfois les points de temps peuvent être dans une seule bougie, vous obtenez une ligne verticale. Je comprends que le SupportBuffer[w] ne peut pas être rendu vertical ?
 
Nauris Zukas:
Bonjour, j'ai commencé à faire un indicateur qui va dessiner une ligne entre deux pips dans le temps et le prix, la façon dont la ligne est dessinée est comme ceci :
Tout va bien, mais parfois les points de temps peuvent être dans une seule bougie, vous obtenez une ligne verticale. Je suppose que le SupportBuffer[w] ne peut pas être rendu vertical ?

Si on utilise un zigzag au lieu d'une ligne, ça marche.

 
Alexey Viktorov:

Si vous utilisez un zigzag au lieu d'une ligne, ça marche.

Merci, je vais essayer de démonter le ZigZag et de comprendre le principe du tracé d'une ligne.

 
Alexey Viktorov:

Si vous utilisez un zigzag au lieu d'une ligne, cela fonctionnera.

Le ZigZag lui-même s'est avéré être assez souple, il n'a donc pas été facile à démonter. Mais j'ai préparé un exemple simple... Pouvez-vous ajouter une fonction, où sur 3 barres à partir de la dernière barre il y aura une ligne entre le haut et le bas selon votre conseil zigzag ? Je voudrais comprendre le principe, et ensuite je pourrai le développer moi-même.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Support
#property indicator_label1  "Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3

//--- indicator buffers
double         LineTest[];
double         HighMapBuffer[];     // highs
double         LowMapBuffer[];      // lows
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,LineTest,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---
   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[])
  {
//---
   int limit=prev_calculated;

   for(int i2=limit;i2<rates_total;i2++) // New bar recalculate
     {
      if(limit<rates_total-1)continue; // New bar recalculate
      for(int i=0;i<rates_total;i++)
        {
         //if(i<rates_total-3 && i>rates_total-15) // H Line 3-15 bar
         //   LineTest[i]=high[rates_total-2]; // Price
         //else LineTest[i]=EMPTY_VALUE; 
         
         HighMapBuffer[i]=high[rates_total-3];
         LowMapBuffer[i]=low[rates_total-3];
         LineTest[i]=                    // ???
         

        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Le ZigZag lui-même s'est avéré être assez souple, il n'a donc pas été facile à démonter. Mais j'ai préparé un exemple simple... Pouvez-vous ajouter une fonction, où sur 3 barres à partir de la dernière barre il y aura une ligne entre le haut et le bas selon votre conseil zigzag ? J'aimerais comprendre le principe et ensuite je pourrai le développer moi-même.

https://www.mql5.com/ru/docs/customind/indicators_examples/draw_zigzag

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_ZIGZAG
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_ZIGZAG
  • www.mql5.com
//|                                                  DRAW_ZIGZAG.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Custom indicator initialization function                         |...
 
Taras Slobodyanik:

https://www.mql5.com/ru/docs/customind/indicators_examples/draw_zigzag


Merci, il y a déjà une description et c'est un style, pas un indicateur :), je vais essayer de trouver une solution.

 
Avez-vous une idée de la raison pour laquelle, dans OnCalculate, après le démarrage du terminal, le taux_total : sur le premier tick 372158 et ensuite le taux_total normal : 10001 ?
 

La ligne verticale a fonctionné, mais je ne comprends pas comment supprimer la ligne de liaison entre les lignes verticales. Quelqu'un peut-il corriger mon exemple pour que la ligne de liaison disparaisse ?

#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  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  10

//--- indicator buffers
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);

   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[])
  {
   int limit=prev_calculated;
   if(prev_calculated==0)limit=rates_total-1;

   for(int i2=limit;i2<rates_total;i2++) // recalculate on new bar
     {

      for(int i=0;i<rates_total;i++)
        {
         if(i==rates_total-3 || i==rates_total-15) // should be VLine on 3th and 15th bar!
           {
            ZigZagBuffer1[i]=high[i];
           }
         else
           {
            ZigZagBuffer1[i]=EMPTY_VALUE;
           }
                      
         if(i==rates_total-3 || i==rates_total-15) // should be VLine on 3th and 15th bar !
           {
            ZigZagBuffer2[i]=low[i];
           }
         else
           {
            ZigZagBuffer2[i]=EMPTY_VALUE;
           }           
           
         if(ZigZagBuffer1[i]!=EMPTY_VALUE )Print(" ZigZagBuffer1[",i,"]: ",ZigZagBuffer1[i]);
         if(ZigZagBuffer2[i]!=EMPTY_VALUE )Print(" ZigZagBuffer2[",i,"]: ",ZigZagBuffer2[i]);

        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

La ligne verticale a fonctionné, mais je ne comprends pas comment supprimer la ligne de liaison entre les lignes verticales. Quelqu'un peut-il corriger mon exemple pour que la ligne de liaison disparaisse ?

Eh bien, j'avais tort alors. Je n'ai pas compris le but...

Dans ce cas il est nécessaire, et plus facile, d'utiliser le dessin graphique DRAW_HISTOGRAM2

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_HISTOGRAM2
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_HISTOGRAM2
  • www.mql5.com
//|                                              DRAW_HISTOGRAM2.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Custom indicator initialization function                         |...
 
Alexey Viktorov:

Eh bien, j'avais tort alors. Je n'ai pas compris le but...

Dans ce cas, il est nécessaire, et plus facile, d'utiliser le tracé graphique DRAW_HISTOGRAM2

Merci, je vais essayer !

Autre question, DRAW_HISTOGRAM2 dessine-t-il uniquement verticalement ou peut-il également dessiner obliquement (entre deux barres) ?
 
Nauris Zukas:

Merci, je vais essayer !

Autre question, DRAW_HISTOGRAM2 ne dessine que verticalement ou peut-il également dessiner en pente (entre deux barres) ?

Vous devez décider ce que vous voulez...

Si vous avez besoin de mélanger les choses, de supprimer parfois les connexions entre les deux sections verticales du zigzag, il est préférable de prendre un zigzag coloré et de placer la condition d'attribuer aucune couleur.

Il ne serait pas inutile de lire toute la section de la documentation relative au tracé graphique. Cela vous donnerait une idée de ce qui peut être fait...