Was die Funktionen Lowest und Highest zurückgeben - Seite 4

 
Ich werde versuchen, mit dem von composter auf der ersten Seite angegebenen Code zu experimentieren. Vielleicht klappt ja etwas.
 
nen:
Richtig, sie wird berechnet. Die Zellennummer wird gefunden. Aus dieser Zelle (Zeitreihe) wird der Höchst- oder Mindestwert des Balkens entnommen. Es wird davon ausgegangen, dass der Höchstwert auf diesem Balken gefunden wurde. Dieser Wert wird dann zusammen mit der gefundenen Nummer in den Indikatorpuffer gestellt. Das Maximum des Indikators sollte mit dem Maximum des Balkens übereinstimmen. In meinem Code wird das Maximum auch aus dem Array (Zeitreihe) mit der gleichen gefundenen Zahl genommen und mit dem Wert von val verglichen. Es wird geprüft, ob wir das Richtige tun: Wir legen die Zahl val in den Puffer mit dieser Zahl. Er sollte auch gleich dem Maximum des Balkens sein. Der Vergleich von Zahlen, die von derselben Stelle stammen, ist durchaus korrekt.

Mir scheint, dass der Vergleich ...==val gefährlich ist, da sich die Zellennummer von Tick zu Tick ändern kann. Vor allem bei kleinen Zeitrahmen, wo es viele eng beieinander liegende Tiefs und Hochs gibt. Aber wir sollten darüber nachdenken, vielleicht meinen wir unterschiedliche Momente.
 
nen, möchten Sie diesen Zickzackkurs testen? Eigentlich ist dies eine Bitte an alle, die Erfahrung mit Zickzack haben und wissen, was sie vom Zickzack wollen. Vielleicht können Sie aus diesem Prototyp etwas Nützliches machen?
//+------------------------------------------------------------------+
//|                                                      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 Blue

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

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

//---- 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("CZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
//    EDev = ExtDeviation*Point;
    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;
    FirstRun = false;
  }
//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (AfterMax) {
//      res = Low[shift]-CurMin-hPoint;
      res = Low[shift]-CurMin;
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            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;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMax) 
    if (AfterMin) {
//      res = CurMax-High[shift]-hPoint;
      res = CurMax-High[shift];
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            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;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


Bitte beachten Sie, dass die Parameternamen zwar beibehalten werden, aber anders funktionieren.


 
Auch hier gilt: Schauen Sie sich mein ZigZag an, vielleicht hilft es, der Sache auf den Grund zu gehen ....

//+------------------------------------------------------------------+
//|                                                        DT_ZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, klot."
#property link      "klot@mail.ru"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Red
//---- indicator parameters
extern int ExtDepth=12;
//---- indicator buffers
double zzL[];
double zzH[];
double zz[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
 //  IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexArrow(2,159);
   SetIndexArrow(1,159);
//---- indicator buffers mapping
   SetIndexBuffer(0,zz);
   SetIndexBuffer(1,zzH);
   SetIndexBuffer(2,zzL);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
     
//---- indicator short name
   IndicatorShortName("DT_ZZ("+ExtDepth+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i,shift,pos,lasthighpos,lastlowpos,curhighpos,curlowpos;
   double curlow,curhigh,lasthigh,lastlow;
   double min, max;
   ArrayInitialize(zz,0.0);
   ArrayInitialize(zzL,0.0);
   ArrayInitialize(zzH,0.0);
   
   lasthighpos=Bars; lastlowpos=Bars;
   lastlow=Low[Bars];lasthigh=High[Bars];
  for(shift=Bars-ExtDepth; shift>=0; shift--)
    {
      curlowpos=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      curlow=Low[curlowpos];
      curhighpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      curhigh=High[curhighpos];
      //------------------------------------------------
      if( curlow>=lastlow ) { lastlow=curlow; }
      else
         { 
            //идем вниз
            if( lasthighpos>curlowpos  ) 
            { 
            zzL[curlowpos]=curlow;
              ///*
              min=100000; pos=lasthighpos;
               for(i=lasthighpos; i>=curlowpos; i--)
                  { 
                    if (zzL[i]==0.0) continue;
                    if (zzL[i]<min) { min=zzL[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=min;
               //*/
            } 
          lastlowpos=curlowpos;
          lastlow=curlow; 
         }
      //--- high
      if( curhigh<=lasthigh )  { lasthigh=curhigh;}
      else
         {  
            // идем вверх
            if( lastlowpos>curhighpos ) 
            {  
            zzH[curhighpos]=curhigh;
           ///*
               max=-100000; pos=lastlowpos;
               for(i=lastlowpos; i>=curhighpos; i--)
                  { 
                    if (zzH[i]==0.0) continue;
                    if (zzH[i]>max) { max=zzH[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=max;
           //*/     
            }  
         lasthighpos=curhighpos;
         lasthigh=curhigh;    
         }       
    //----------------------------------------------------------------------
    }
 return(0);
}
//+------------------------------------------------------------------+



 
nen Möchten Sie diesen Zickzackkurs testen? Eigentlich ist dies eine Bitte an alle, die Erfahrung mit Zickzacklinien haben und wissen, was sie von einer Zickzacklinie erwarten. Vielleicht können Sie aus diesem Prototyp etwas Nützliches machen?
Bitte beachten Sie, dass die Namen der Parameter zwar gleich sind, sie aber unterschiedlich funktionieren.


Kandidat. Ich werde es mir ansehen. Bei der ersten Installation machte ich folgende Beobachtung.
Es gibt mehrere aufeinanderfolgende Balken mit denselben Höchstständen. Ihre Variante des Zickzacks zeichnet einen Bruch (oben) auf dem letzten Balken. Das heißt, der Balken, der der Null am nächsten ist. Idealerweise sollte die Unterbrechung auf dem ersten Balken gezogen werden, der am weitesten vom Nullbalken entfernt ist. Der erste Scheitelpunkt, der erscheint, ist von Bedeutung. So ist es auch bei mtnemums. Ich kann mehrere Quellen (aus der Literatur) anführen, wenn dies erforderlich ist.
 
klot , danke. In Anlehnung an die Idee Ihres DT-ZigZag habe ich meinen Indikator nun so gestaltet, dass er auch mit Daten mit hohem Zeitrahmen funktioniert. Aber ich habe nur die Idee hinterlassen. Ich habe meinen eigenen Algorithmus entwickelt. Gestern habe ich einige weitere Korrekturen in Zickzack vorgenommen. Jetzt habe ich sie zum gemeinsamen Testen hochgeladen. Ich werde Ihre Variante auf jeden Fall ausprobieren. Hier ist die Beschreibung des Indikators, der den ganzen Schlamassel verursacht hat: http://onix-trade.net/forum/index.php?showtopic=373. Bitte beachten Sie, dass der DT-ZigZag-Modus den externen Zickzack verwendet, der im Indikator enthalten ist. Und dieser externe Zickzackkurs versagt manchmal schon beim ersten Strahl. Eine neue Version des externen Zickzacks wird derzeit getestet.
 
klot Ich danke Ihnen. In Anlehnung an die Idee Ihres DT-ZigZag habe ich meinen Indikator nun so gestaltet, dass er auch mit Daten höherer Timeframes funktioniert. Aber ich habe nur die Idee hinterlassen. Ich habe meinen eigenen Algorithmus entwickelt. Gestern habe ich einige weitere Korrekturen in Zickzack vorgenommen. Jetzt habe ich sie zum gemeinsamen Testen hochgeladen. Ich werde Ihre Variante auf jeden Fall ausprobieren. Hier ist die Beschreibung des Indikators, der den ganzen Schlamassel verursacht hat: http://onix-trade.net/forum/index.php?showtopic=373. Bitte beachten Sie, dass der DT-ZigZag-Modus den externen Zickzack verwendet, der im Indikator enthalten ist. Und dieser externe Zickzackkurs versagt manchmal schon beim ersten Strahl. Eine neue Version des externen Zickzacks wird derzeit getestet.

Ja, das habe ich bemerkt :) nur eine Idee :) . Ich verwende meine ZZ jetzt überall (Code im obigen Beitrag). Sie funktioniert stabiler mit anderen TF-Daten.
 
nen:
Bei der ersten Installation fiel mir sofort Folgendes auf.
Es gibt mehrere aufeinanderfolgende Balken mit denselben Höchstständen. Ihre Zickzack-Option zeichnet eine Pause (oben) auf dem letzten Balken.
Aha, ich habe also die falsche "Option" gewählt. Ich werde jetzt den Code im Quelltext bearbeiten. Zeichen der Änderungen sind die auskommentierten Zeilen der falschen "Option".
 
Candid, jetzt ist alles in Ordnung.
Klot, interessante Option.

Wenn Ihre Zickzack-Varianten interessante Ergebnisse zeigen, kann ich sie in meiner Entwicklung anwenden?
 
Wenn Ihre Zickzack-Varianten interessante Ergebnisse zeigen, können Sie sie in Ihrem Entwurf anwenden?
Ja, natürlich. Wenn das Ergebnis der Tests positiv ausfällt, werde ich sogar versuchen, es in die Code Base aufzunehmen.