Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   TrailingStop "Das Buch der Markttechnik" (http://www.expert-advisor.com/forum/showthread.php?t=7078)

noSkill06s 11.09.21 02:35

TrailingStop "Das Buch der Markttechnik"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute, ich versuche die Stopttechnik "Handel der Bewegung" von dem Buch "Das große Buch der Markttechnik" von "Michael Vogt" nachzustellen. Leider bin ich mit meinem Latein so ziemlich am Ende. Ich hoffe ihr könnt mir behilflich sein das Anliegen zu lösen. Ausgehen tue ich zur Beschreibung nur von einem Long Trade.

Realcode:
Code:

//---
  //Special Loop to avoid Array Out of Range
  int counted_bars = IndicatorCounted();
  if(counted_bars<0) return(-1);
  if(counted_bars>0) counted_bars--;
  int limit = Bars-counted_bars-5;
 
//+------------------------------------------------------------------+
for(int i=0;i<limit;i++){
  if(Close[i+1]>High[i+2]){
      lowCheck=Low[i+2];
      bool loopCheck=True;
      while(loopCheck){
        if(lowCheck>Low[i+1]){
            lowCheck +=1;
        }else{
            loopCheck=False;
            upStop_1[i+1]=lowCheck;
        }
      }
    upStop_1[i+1]=lowCheck;
  }
 
  if(Close[i+1]<Low[i+2]){
      highCheck=High[i+2];
      bool loopCheck=True;
      while(loopCheck){
        if(highCheck<High[i+1]){
            highCheck +=1;
        }else{
            loopCheck=False;
            upStop_1[i+1]=highCheck;
        }
      }
    upStop_1[i+1]=highCheck;
  } 
}

Bitte zur näheren Veranschaulichung das Angehängte Bild ansehen.

Mein Problem:
1.Habe ich den Algorithmus nach dem Bild korrekt umgesetzt?
2.Warum stürzt mein Indikator sofort ab sobald ich ihn einsetze

noSkill06s 11.09.21 02:45

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von noSkill06s (Beitrag 45660)
Hi Leute, ich versuche die Stopttechnik "Handel der Bewegung" von dem Buch "Das große Buch der Markttechnik" von "Michael Vogt" nachzustellen. Leider bin ich mit meinem Latein so ziemlich am Ende. Ich hoffe ihr könnt mir behilflich sein das Anliegen zu lösen. Ausgehen tue ich zur Beschreibung nur von einem Long Trade.

Realcode:
Code:

//---
  //Special Loop to avoid Array Out of Range
  int counted_bars = IndicatorCounted();
  if(counted_bars<0) return(-1);
  if(counted_bars>0) counted_bars--;
  int limit = Bars-counted_bars-5;
 
//+------------------------------------------------------------------+
for(int i=0;i<limit;i++){
  if(Close[i+1]>High[i+2]){
      lowCheck=Low[i+2];
      bool loopCheck=True;
      while(loopCheck){
        if(lowCheck>Low[i+1]){
            lowCheck +=1;
        }else{
            loopCheck=False;
            upStop_1[i+1]=lowCheck;
        }
      }
    upStop_1[i+1]=lowCheck;
  }
 
  if(Close[i+1]<Low[i+2]){
      highCheck=High[i+2];
      bool loopCheck=True;
      while(loopCheck){
        if(highCheck<High[i+1]){
            highCheck +=1;
        }else{
            loopCheck=False;
            upStop_1[i+1]=highCheck;
        }
      }
    upStop_1[i+1]=highCheck;
  } 
}

Bitte zur näheren Veranschaulichung das Angehängte Bild ansehen.

Mein Problem:
1.Habe ich den Algorithmus nach dem Bild korrekt umgesetzt?
2.Warum stürzt mein Indikator sofort ab sobald ich ihn einsetze

Hier der Indikator:

AVT 17.09.21 12:02

Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das Buch nie gelesen und kenne das nur aus dem, was so öffentlich als Beschreibung verfügbar ist; Dein Bild sagt mir leider auch nicht viel darüber. Die Logik kann ich also nicht beurteilen.
Deinen Indi habe ich mir geladen, der legt bei mir den MT lahm.
Was mir aufgefallen ist, ist das hier:
Code:

lowCheck=Low[i+2]; // das ist ein Preis
if(lowCheck>Low[i+1]){ lowCheck +=1;} // wieso hier +=1 ??

Wie das mit dem SL nach Markttechnik ist, weiß ich nicht - ist für mich auch nicht akzeptabel, denn wenn ich z.B. bei einem Longtrade den SL nach oben setze, dann hat das einen Grund und dann bleibt er da und wird nicht wieder runtergesetzt.
Irgendwann habe ich mal eine Rechteck-Version gemacht (im Anhang ist ein m5 gemalt auf m1, weiß ist Close, das letzte Rechteck wird erst gemalt, wenn die m5 Kerze beendet ist). Wenn Du die Berechnungen dazu haben willst, schicke ich sie Dir, damit Du vergleichen kannst. Dann sollte das mit dem SL auch einzubauen sein.
AVT

noSkill06s 17.09.21 16:20

Zitat:

Zitat von AVT (Beitrag 45686)
Ich habe das Buch nie gelesen und kenne das nur aus dem, was so öffentlich als Beschreibung verfügbar ist; Dein Bild sagt mir leider auch nicht viel darüber. Die Logik kann ich also nicht beurteilen.
Deinen Indi habe ich mir geladen, der legt bei mir den MT lahm.
Was mir aufgefallen ist, ist das hier:
Code:

lowCheck=Low[i+2]; // das ist ein Preis
if(lowCheck>Low[i+1]){ lowCheck +=1;} // wieso hier +=1 ??

Wie das mit dem SL nach Markttechnik ist, weiß ich nicht - ist für mich auch nicht akzeptabel, denn wenn ich z.B. bei einem Longtrade den SL nach oben setze, dann hat das einen Grund und dann bleibt er da und wird nicht wieder runtergesetzt.
Irgendwann habe ich mal eine Rechteck-Version gemacht (im Anhang ist ein m5 gemalt auf m1, weiß ist Close, das letzte Rechteck wird erst gemalt, wenn die m5 Kerze beendet ist). Wenn Du die Berechnungen dazu haben willst, schicke ich sie Dir, damit Du vergleichen kannst. Dann sollte das mit dem SL auch einzubauen sein.
AVT

vielen Dank für deine Rückmeldung, ich habe die Stelle die in meinem Code markiert hast korrigiert und schon weiter dran rumgewerkelt. Gerne würde ich mir deinen Code von deinem Stop ansehen sofern das für dich okay ist würde ich mich darüber freuen. Kann ich dich bitten meinen aktuellen code und beitrage anzuschauen, den ich habe nur noch ein kleines Problem.

noSkill06s 17.09.21 16:21

Code:

//+------------------------------------------------------------------+

  //LongTrariling
  for(int i=limit;i>=0;i--){
      if(Close[i+1]>High[i+2]){
        lastDirection = 1;
        int bar=i+2;
        double lowCheck=Low[bar];
        while(bar<Bars-1){
          if(lowCheck>Low[i+1]){
            bar++;
            lowCheck=Low[bar];
          }else{
            upStop_1[i+1]=lowCheck;
            break;
          }
        }
      }else if(Close[i+1]<High[i+2]){ //Letzter Schlusskurs ist kleiner als vorletzter Hoch
        lastDirection =-1;            //für den Fall das kein Fall zutrifft (nicht wirklich beachten)
        int bar=i+2;                  //Position des Bars (Index) speichern
        //Remember high of Position
        double highNumber=High[i+2];  //Hoch des vorletzten Bars speichern zum vergleichen
        //Remember Position of Index
        double lowCheck=Low[bar];    //Low des vorletzten Bars speichern zum vergleichen
        while(bar<Bars-1){            //Loop starten
            if(highNumber>Close[i+1]){ //vergleichen wenn die kommenden letzten Schlusskurse (fortlaufend kleiner als das Hoch (was wir gespeichert haben größer ist)
              if(lowCheck>Low[i+1]){  //dann checken wir ob der Low den wir gespeichert haben größer ist als der Low vom letzten Schlusskurs bar
                  bar++;              //dann addieren wir dem Bar Index dazu um nach hinten nach einem Low zu suchen der Tiefer notiert
                  lowCheck=Low[bar];  //Hier wird dann der Bar Index initialisiert
              }else{
                  upStop_1[i+1]=lowCheck; //Wenn der gespeicherte Hoch größer ist als der Hoch vom letzten Schlusskurs dann soll der Stop an den nächst tiefergelegenen Low vom Bar gesetzt werden
                  break;                  //sprich wenn die kommenden Bars sich innerhalb des hochs und lows befinden soll der Stop an den nächstgelegenen Low gesetzt werden
              }                          //das funktioniert auch nur ist das Problem
            }                            //Wenn Innerhalb eines OutsideBars sich ein weiterer Outsidebar bildet dann springt er von der Loop raus
        }
      }else{
        if(lastDirection == 1) upStop_1[i+1]=upStop_1[i+2]; 
        if(lastDirection ==-1) upStop_2[i+1]=upStop_2[i+2];
      } 

  }
//--- return value of prev_calculated for next call
  return(rates_total);
  }
//+------------------------------------------------------------------+


noSkill06s 17.09.21 16:24

Mein aktuelles Problem ist wenn er merkt:

hoch i+2 ist größer als Close i+1
dann ist ja Close i+1 eigentlich ein InsideBar und
der Bar mit High+2 ein Outsidebar (sofern der Low auch kleiner als der Close i+1 ist) und jetzt kommt das Problem er hält dann den Stop am letzten Tief ausgehende von diesem Outsidebar WENN ABER JETZT DER IDENTIFIZIERTE INSIDEBAR WÄHREND DES CHARTVERLAUFS SELBER ZUM OUTSIDEBAR WIRD DANN NIMMT ER DIESEN ALS REFERENZ UND SUCHT NACH EINEM NEUEN LOW WO ER DENN STOP SETZEN SOLL

Das macht er weil die While Schleife nicht als Bedingung highNumber>Closei+1 machbar ist immer wenn ich die while schleife so code stürzt alles ab.

noSkill06s 17.09.21 16:30

Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal ein Bsp Bild vom Buch

noSkill06s 21.09.21 01:23

Liste der Anhänge anzeigen (Anzahl: 2)
Der Code funktioniert bereits zu 99%, das Problem ist die "While()" Loop.

Wie nutze ich die While Loop?:
Code:

while(bar<Bars-1)
Wie benötige ich die While Loop?:
Code:

while(highNumber>Close[I+1])
Aber wenn ich sie wie benötigt nutzen möchte stürzt das System ab.
Mein Aktueller Code:
Code:

//---
  //Special Loop to avoid Array Out of Range
  int counted_bars = IndicatorCounted();
  if(counted_bars<0) return(-1);
  if(counted_bars>0) counted_bars--;
  //int limit = Bars-counted_bars;
  int limit = MathMin(Bars-3,Bars-counted_bars);
 
//+------------------------------------------------------------------+

  //LongTrariling
  for(int i=limit;i>=0;i--){
      if(Close[i+1]>High[i+2]){
        lastDirection = 1;
        int bar=i+2;
        double lowCheck=Low[bar];
        while(bar<Bars-1){
          if(lowCheck>Low[i+1]){
            bar++;
            lowCheck=Low[bar];
          }else{
            upStop_1[i+1]=lowCheck;
            break;
          }
        }
//THIS IS THE PROBLEM PART THIS IS THE PROBLEM PART THIS IS THE PROBLEM PART THIS IS THE PROBLEM PART THIS IS THE PROBLEM PART THIS IST THE PROBLEM PART
      }else if(Close[i+1]<High[i+2]){
        lastDirection =-1;
        int bar=i+2;
        //Remember high of Position
        double highNumber=High[i+2];
        //Remember Position of Index
        double lowCheck=Low[bar];
        while(bar<Bars-1){
            if(highNumber>Close[i+1]){
              if(lowCheck>Low[i+1]){
                  bar++;
                  lowCheck=Low[bar];
              }else{
                  upStop_1[i+1]=lowCheck;
                  break;
              }
            }
        }
      }else{
        if(lastDirection == 1) upStop_1[i+1]=upStop_1[i+2]; 
        if(lastDirection ==-1) upStop_2[i+1]=upStop_2[i+2];
      } 

  }
//--- return value of prev_calculated for next call
  return(rates_total);
  }
//+------------------------------------------------------------------+

Anbei siehe bitte auch den beigefügten Screenshot.
Jedesmal wenn er ein weiteres Close[i+1]<High[i+2] entdeckt springt er aus der "While()" Loop aber er müsste die in der "While()" Loop drin bleiben bis
Close[i+1]>Als die gespeicherte "highNumber" ist.

So müsste der Code sein den ich brauche (ohne Absturz)
Code:

else if(Close[i+1]<High[i+2]){
        lastDirection =-1;
        //Save bar Index of the previous High (which is Higher than the Closei+1)
        int bar=i+2;
        //Save high of previous Bar (which is Higher than the Closei+1)
        double highNumber=High[bar];
        //Save and initialize Low of the previous Bar (from the Bar which High is higher than the Closei+1)
        double lowCheck=Low[bar];
        while(Close[i+1]<highNumber){ //Stay in Loop until Close[i+1] is higher than the saved highNumber
            if(lowCheck>Low[i+1]){
              bar++;
              lowCheck=Low[bar];
            }else{
              upStop_1[i+1]=lowCheck;
              break;
            }
        }
      }


Indikator-Trading 21.09.21 10:33

Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube dein Problem ist nun, dass du dir ein Repainter gebaut hast. Im Anhang findest du ein Beispiel von deinem jetzigen Indikator.

noSkill06s 21.09.21 14:59

Zitat:

Zitat von Indikator-Trading (Beitrag 45707)
Ich glaube dein Problem ist nun, dass du dir ein Repainter gebaut hast. Im Anhang findest du ein Beispiel von deinem jetzigen Indikator.

Kann ich so nicht bestätigen das es von der Kerze kommt die du mit "grüner Pfeil" markiert hast zumindest meinem Code nach (vll sehe ich aber auch inzwischen vor lauter Bäumen den Wald nicht).

Code:

else if(Close[i+1]<High[i+2]){
        lastDirection =-1;
        int bar=i+2;
        //Remember high of Position
        double highNumber=High[i+2];
        //Remember Position of Index
        double lowCheck=Low[bar];
        while(bar<Bars-1){
            if(highNumber>Close[i+1]){
              if(lowCheck>Low[i+1]){
                  bar++;
                  lowCheck=Low[bar];
              }
else{
                  upStop_1[i+1]=lowCheck;
                  break;
              }
            }
        }
      }

an dieser Stelle lass ich in der While Loop solange nach hinten loopen bis er ein Low gefunden hat das Tiefer notiert als der Low von der "i+1" Wert.

Mein größtes Problem das ich die Deklaration der While Loop nicht so vornehmen kann wie ich es brauche dann stürzt er sofort ab, ich muss in der While Loop drin bleiben bis der Close[i+1] größer ist als der High den wir gespeichert haben, erst wenn der Close[i+1] aus dieser Range raus ist müsste ich die While Loop verlassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum