Ce que rapportent les fonctions Lowest et Highest - page 5

 
Candid Je vais bien maintenant.
Klot, option intéressante.

Si vos variantes de zigzag donnent des résultats intéressants, puis-je les appliquer dans mon développement ?

Bien sûr que vous pouvez, je suis le développement avec intérêt et j'aime beaucoup votre travail.
 
Merci.
 
2 nen:
Plus concernant les "options". Maintenant, une des conditions pour la commutation d'extremum : le bas actuel est plus élevé que le bas actuel de plus de points ExtDeviation (similaire pour le haut). Le code permet de mettre en œuvre d'autres options assez facilement, si nécessaire.
Eh bien, à la suite de Klot, je voudrais ajouter que mon intérêt actuel pour le zigzag est uniquement dû à mon intérêt pour votre dessin.
 
J'ai corrigé le code source à nouveau - hier j'ai découvert que la règle de la première barre significative n'est parfois pas respectée sur les minutes. Pour le vérifier, je n'avais qu'une heure et demie de temps en ligne, mais il semble qu'il s'agissait de comparer le double avec le zéro.
 
Autre bug : les extrêmes ne peuvent être changés qu'à la fin d'une barre, sinon il y a une différence entre le temps réel et l'historique. Il n'est pas difficile à réparer. Je n'ai pas encore corrigé le code source dans la branche - laissez la nouvelle version fonctionner sur les minutes.
 
Candid, a réalisé une version 45 de l'indicateur ZUP : http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=117997
Inclus votre zigzag comme un zigzag externe. Dès qu'une version stable et fonctionnelle apparaîtra, je la modifierai.
 
Jusqu'à présent je ne vois aucun problème, voici la version corrigée du code :
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Navy

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
//extern int ExtBackstep=3;

int    shift;
double res=0;
int i;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;
int BarTime;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  int fBar;
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    BarTime = 0;
    FirstRun = false;
  }


//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (BarTime!=Time[shift]) {
      BarTime=Time[shift];
      if (res > hPoint ) {
        MaxDist = Bars-CurMaxBar-shift+1;
        MinDist = Bars-CurMinBar-shift+1;
        if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
          if (AfterMax) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          } else {  //  if (AfterMax)
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  else if (AfterMax)    
        }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
      }  //  if (res > hPoint )
    }  //  if (BarTime!=Time[0])
    if (AfterMax) {
      res = Low[shift]-CurMin;
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      }  //  if (res < mhPoint)
    }  //  if (AfterMax) 
    if (AfterMin) {
      res = CurMax-High[shift];
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      }  //  if (res < mhPoint)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


Au sujet des particularités des différents zigzags. La principale caractéristique de ce zigzag est que tout est fait en une seule fois, le réexamen des données historiques n'est effectué que lorsqu'un extremum est fixé, et uniquement pour les données postérieures à cet extremum. C'est-à-dire qu'il doit être assez rapide. Les détails du dessin dépendront bien sûr des critères de fixation de l'extremum, mais diverses options peuvent facilement être mises en œuvre ici. Par exemple, j'ai déjà réalisé des variantes de commutation en pourcentage d'un mouvement précédent, en écartant le High du minimum (respectivement le Low du maximum) et en liant la commutation à la taille moyenne des barres.

 
Voici un autre problème avec l'indicateur : j'ai trouvé un coude dans mon zigzag (croix du curseur dans l'image). L'heure du coude correspond au moment où le terminal a été éteint, le prix correspond au moment où il a été rallumé.


Pour clarifier mes soupçons, j'ai inséré le Print dans le code :
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift]=",High[shift],", Low[shift]=",Low[shift]) ;


Le terminal a ensuite été fermé et redémarré quelques minutes plus tard. Et voici un fragment du journal :

2006.10.31 23:58:26 CZZ2 EURUSD,M1 : shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1 : shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1 : shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1 : shift=1, Bars=38233, Time[shift]=2006.10.31 22:50, High[shift]=1.2763, Low[shift]=1.2762 2006.10.3131 23:58:26 CZZ2 EURUSD,M1 : shift=2, Bars=38233, Time[shift]=2006.10.31 22:49, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1 : shift=3, Bars=38233, Time[shift]=2006.10.31 22:47, High[shift]=1.2763, Low[shift]=1.2762 2006.10.31 23:58:26 CZZ2 EURUSD,M1 : shift=4, Bars=38233, Time[shift]=2006.10.31 22:45, High[shift]=1.2763, Low[shift]=1.2762 2006.10.31 23:58:25 CZZ2 EURUSD,M1 : shift=0, Bars=38230, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:25 CZZ2 EURUSD,M1 : shift=1, Bars=38230, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762 2006.10.31 23:58:23 CZZ2 EURUSD,M1 : shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762 2006.10.31 23:58:22 CZZ2 EURUSD,M1 : shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762


Vous pouvez voir qu'à 23:58:23 l'historique n'a pas encore été pompé, et qu'à 23:58:25 le dernier 1 bar a été pompé. Et seulement en 2006.10.31 23:58:26 toutes les barres intermédiaires ont été pompées.
Question aux développeurs : est-ce la séquence normale de pagination ? Et si oui, quel en est l'intérêt ? Il est clair qu'il est souhaitable d'avoir la valeur du prix actuel dès le début. Mais l'existence prévue d'un trou dans l'histoire pendant un certain temps signifie essentiellement un échec garanti des indicateurs pour cette période. N'est-il pas plus sûr pour l'utilisateur de reporter le calcul des indicateurs jusqu'à ce que l'historique soit complètement permuté ? Ou au moins les réinitialiser après l'échange complet ?

 
Le truc de la "réinitialisation" était une erreur, ce serait essentiellement un trailblazer :)
 
Je suis familier avec ce genre de pagination de l'histoire. J'ai fait une vérification des cinq premières ruptures en zigzag ET un recalcul de l'indicateur ZUP.