Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4753
Beiträge: 42347
Benutzer: 7.117
Aktive Benutzer: 140
Links: 83
Wir begrüßen unseren neuesten Benutzer: Krulle
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 21:38).
Neue Benutzer:
vor 23 Stunden
- Krulle
vor einem Tag
- adamascahs...
vor einem Tag
- David12
vor 2 Tagen
- adizycpitt...
vor 3 Tagen
- bgregoratt...

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 46
Gesamt: 46
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor einer Woche
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard 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;
   }   
}
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
Angehängte Grafiken
Dateityp: png Bildschirmfoto 2021-09-08 um 23.45.35.png (50,5 KB, 10x aufgerufen)
Mit Zitat antworten
  #2 (permalink)  
Alt vor einer Woche
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von noSkill06s Beitrag anzeigen
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:
Angehängte Dateien
Dateityp: mq4 iCustomIND_Stop_HANDEL_DER_BEWEGUNG.mq4 (8,3 KB, 3x aufgerufen)
Mit Zitat antworten
  #3 (permalink)  
Alt vor einer Woche
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 516
AVT befindet sich auf einem aufstrebenden Ast
Standard

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
Angehängte Grafiken
Dateityp: jpg AStbRm5aufm1.JPG (15,2 KB, 2x aufgerufen)
Mit Zitat antworten
  #4 (permalink)  
Alt vor einer Woche
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
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.
Mit Zitat antworten
  #5 (permalink)  
Alt vor einer Woche
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

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);
  }
//+------------------------------------------------------------------+
Mit Zitat antworten
  #6 (permalink)  
Alt vor einer Woche
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #7 (permalink)  
Alt vor einer Woche
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

Hier nochmal ein Bsp Bild vom Buch
Angehängte Grafiken
Dateityp: png Bildschirmfoto 2021-09-12 um 04.18.21.png (22,3 KB, 6x aufgerufen)
Mit Zitat antworten
  #8 (permalink)  
Alt vor 3 Tagen
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

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;
            }
         }
       }
Angehängte Grafiken
Dateityp: jpg Debuggen-2.jpg (205,1 KB, 4x aufgerufen)
Angehängte Dateien
Dateityp: mq4 iCustomIND_Stop_HANDEL_DER_BEWEGUNG_v3.mq4 (10,6 KB, 1x aufgerufen)
Mit Zitat antworten
  #9 (permalink)  
Alt vor 3 Tagen
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 278
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

Ich glaube dein Problem ist nun, dass du dir ein Repainter gebaut hast. Im Anhang findest du ein Beispiel von deinem jetzigen Indikator.
Angehängte Grafiken
Dateityp: png Trailing.png (11,4 KB, 4x aufgerufen)
Mit Zitat antworten
  #10 (permalink)  
Alt vor 3 Tagen
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
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.
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 21:17 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2021 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------