|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
TrailingStop "Das Buch der Markttechnik"
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; } } Mein Problem: 1.Habe ich den Algorithmus nach dem Bild korrekt umgesetzt? 2.Warum stürzt mein Indikator sofort ab sobald ich ihn einsetze |
|
|||
Zitat:
|
|
|||
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 ?? 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 |
|
|||
Zitat:
|
|
|||
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); } //+------------------------------------------------------------------+ |
|
|||
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. |
|
|||
Hier nochmal ein Bsp Bild vom Buch
|
|
|||
Der Code funktioniert bereits zu 99%, das Problem ist die "While()" Loop.
Wie nutze ich die While Loop?: Code:
while(bar<Bars-1) Code:
while(highNumber>Close[I+1]) 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); } //+------------------------------------------------------------------+ 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; } } } |
|
|||
Zitat:
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; } } } } 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. |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|