Accueil Indicateur technique Publication

ZigZag Idéal : L'indicateur incontournable pour MetaTrader 4

Pièce jointe
10671.zip (2.71 KB, Télécharger 0 fois)


Avantages :

  • La fonction la plus gourmande en ressources, iBarShift, remplace complètement tous les cycles nécessaires pour récupérer les sommets.
  • Toutes les informations nécessaires pour construire le ZigZag pour chaque barre sont accessibles non seulement à chaque moment, mais également pour chaque code externe.
  • Pas de sommets suspendus.
  • Méthode efficace pour trouver les sommets.
  • Extrêmement rapide.
  • Fonctionne correctement lors des insertions d'historique et lors du changement de timeframe.
  • Idéal pour une utilisation dans un EA.

Inconvénients :

1. Exigences en mémoire : Cet indicateur utilise 5 buffers au lieu de 2 (ou même 1) dans d'autres implémentations similaires. Mais, à mon avis, cela vaut le coût pour les avantages #6 et #7. Aucun ZigZag rapide que j'ai vu ne peut traiter les insertions d'historique sans une reconstruction complète. Le mien le fait efficacement.

2. Lignes supplémentaires : Ces lignes sont nécessaires pour rendre les données visibles pour tout code externe. Elles ne devraient jamais être visibles.

Principe :

Le ZigZag est tracé selon le principe de canalisation. La largeur du canal peut être définie en Points (XLab_ZZ) ou en Pourcentage (XLab_ZZP).

Récupération des sommets :

extern int ChannelWidth = 100;

#property indicator_chart_window
#property indicator_buffers 1

#property indicator_color1 Red
#property indicator_width1 3

datetime LastTime;

int init()
{
   LastTime = 0;
  
   return(0);
}

bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime)
{
   if (dir < 0)
   {
      datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar);
      int i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else if (dir > 0)
   {
      t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar);
      i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else 
   {
      return (false);
   }
   
   return (true);
}

int start()
{
   if (LastTime == Time[0]) return (0);
   LastTime = Time[0];
   
   double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1);
   double rdir = -dir;

   if (dir == EMPTY_VALUE) return (0);
   
   double v1, v2, v3, v4, v5;
   int    i1, i2, i3, i4, i5;
   datetime t1, t2, t3, t4, t5;
   
   GetValue(dir, 1, 0, v1, i1, t1);
   GetValue(rdir, i1, 0, v2, i2, t2);
   GetValue(dir, i2, i1, v3, i3, t3);
   GetValue(rdir, i3, i2, v4, i4, t4);
   GetValue(dir, i4, i3, v5, i5, t5);

   SetPt("1", v1, t1);
   SetPt("2", v2, t2);
   SetPt("3", v3, t3);
   SetPt("4", v4, t4);
   SetPt("5", v5, t5);
   
   Print(v1, "   ", v2, "  ", v3, "  ", v4, " ", v5, " ", i1, "  ", i2, "  ", i3, " ", i4, " ", i5);

   return(0);
}

void SetPt(string name, double price, datetime time)
{
   ObjectCreate(name, OBJ_ARROW, 0, time, price);
   ObjectSet(name, OBJPROP_ARROWCODE, 108);
   ObjectSet(name, OBJPROP_PRICE1, price);
   ObjectSet(name, OBJPROP_TIME1, time);
}

Ce code est un indicateur qui marque (une fois par barre) les cinq premiers sommets (y compris celui en cours de formation).

Attention ! Ce code peut fonctionner de manière incorrecte si le mode 0th Bar est activé.

Mode 0th Bar :

Il est réglé avec la variable DrawZeroBar. Désactivé par défaut.

Il n'est pas recommandé d'utiliser cette option, surtout si l'indicateur est utilisé dans un EA.

Amusez-vous bien avec son utilisation ;) N'hésitez pas à poser vos questions.

Si vous trouvez des bugs, merci de me les signaler. Merci !

Articles connexes

Commentaire (0)