Fragen zum Trailing von SL und TP

 
Zu diesem Thema wurden Beiträge hinzugefügt, die zu "StopLoss und TakeProfit einzeln modifizieren" nicht gehören.
 
class CAccount
  {
   private:
        MqlTradeRequest request;
        MqlTradeResult result;   
   public:
        uint      orderupdate(ENUM_ORDER_TYPE type, double sl, double tp);
  };

//+------------------------------------------------------------------+
//| function order update                                           |
//+------------------------------------------------------------------+
uint CAccount::orderupdate(ENUM_ORDER_TYPE type, double sl, double tp)
  {
   for (int a=0;a<PositionsTotal();a++)
     {
      if (PositionGetSymbol(a)==_Symbol && PositionGetInteger(POSITION_TYPE)==type)
        {
         ZeroMemory(request);
         request.action=TRADE_ACTION_SLTP;
         request.symbol=_Symbol;
         request.position=PositionGetTicket(a);
         if (sl!=0) {request.sl=sl;}
         if (tp!=0) {request.tp=tp;}
         if (OrderSend(request,result)==false){Print("SL/TP update has failed!");}
        }
     }   
   return result.retcode;
  }

Moin (mein erster Beitrag hier...),

im Hedging-Mode funktioniert es so ganz gut (s.o.), bei mir ausgelagert als Teil einer größeren Include-Datei; hier nur der relevante Code.

Im Hauptprogramm kann man dann z.B. als globale Variable deklarieren:

CAccount account;

und dann die eigentliche Order-Update-Funktion aufrufen als z.B.

account.orderupdate(POSITION_TYPE_BUY,1.2345,6.7890);

oder - wenn man z.B. NUR den take profit ändern möchte:

account.orderupdate(POSITION_TYPE_BUY,0,6.7890);

Mit dieser Methode (=unter der Verwendung der PositionsTotal-Schleife) wird sichergestellt, dass im Falle mehrerer Positionen des gleichen Symbols der Stop-Update auch für alle Positionen erfolgt. Außerdem können mit dieser Funktion separate Stops für Long- oder Short-Positionen vergeben werden (kann im Hedging-Mode evtl. gelegentlich nützlich sein). Es sind sicherlich ein paar Code-Zeilen mehr als ein einfaches OrderModify (habe ich nie verwendet), doch für die Performance sollte es keine Rolle spielen, da ja hoffentlich nicht bei jedem Tick ein Stop-Update erfolgt (kein Broker mag das). Wenn nur TP oder nur SL modifiziert werden sollen, trägt man für den jeweils anderen Wert eine Null in der Funktion ein, dann wird es beim Update ignoriert.

Dennoch mal eine generelle Sache: wie sinnvoll ist eine solche Stop-Update-Funktion überhaupt? Ich habe mir diesen Code zwar mal als Teil meiner libraries geschrieben, stelle aber fest, dass ich ihn quasi nie anwende. Denn: Reicht es nicht, EINMAL einen harten Stop und harten Take-Profit beim Einstieg zu erteilen (quasi als Sicherheit für Ereignisse wie Abbruch der Internetverbindung) und ansonsten nur den Kurz zu überwachen und dann bei Unter- oder Überschreiten gewisser Kurse einen Auftrag zur Schließung zu erteilen (quasi als Soft-Stop ohne ständige Updates an den Broker)? Die Schließung passiert je nach Ping-Zeit dann doch im Millisekunden-Bereich mit Ausführung zu i.d.R. praktisch identischem Preis. Ich habe bei mir stets eine Variable für SL und TP hinterlegt (die sich im Falle eines Stop-Trailings theoretisch auch bei jedem Tick ändern könnte), führe aber nicht jedes Mal einen Order-Update durch wenn sich die Variable ändert, sondern schließe nur, wenn der Preis die Variable triggert. Man spart sich so massiven Trafic zum Broker und vermeidet so bei manchen Brokern, dass das Konto gesperrt wird.

 
Christian:

und zack in die Falle gelaufen :-)


Mache bitte ein eigenes Thema auf oder nimmt er Bezug zum Thema ?.

Gruß

Hmm, so sieht's aus, wenn  ich das mache...

Schöne Pfingsten :)

 
Chris70:

Moin (mein erster Beitrag hier...),

im Hedging-Mode funktioniert es so ganz gut (s.o.), bei mir ausgelagert als Teil einer größeren Include-Datei; hier nur der relevante Code.

Im Hauptprogramm kann man dann z.B. als globale Variable deklarieren:

und dann die eigentliche Order-Update-Funktion aufrufen als z.B.

oder - wenn man z.B. NUR den take profit ändern möchte:

Mit dieser Methode (=unter der Verwendung der PositionsTotal-Schleife) wird sichergestellt, dass im Falle mehrerer Positionen des gleichen Symbols der Stop-Update auch für alle Positionen erfolgt. Außerdem können mit dieser Funktion separate Stops für Long- oder Short-Positionen vergeben werden (kann im Hedging-Mode evtl. gelegentlich nützlich sein). Es sind sicherlich ein paar Code-Zeilen mehr als ein einfaches OrderModify (habe ich nie verwendet), doch für die Performance sollte es keine Rolle spielen, da ja hoffentlich nicht bei jedem Tick ein Stop-Update erfolgt (kein Broker mag das). Wenn nur TP oder nur SL modifiziert werden sollen, trägt man für den jeweils anderen Wert eine Null in der Funktion ein, dann wird es beim Update ignoriert.

Dennoch mal eine generelle Sache: wie sinnvoll ist eine solche Stop-Update-Funktion überhaupt? Ich habe mir diesen Code zwar mal als Teil meiner libraries geschrieben, stelle aber fest, dass ich ihn quasi nie anwende. Denn: Reicht es nicht, EINMAL einen harten Stop und harten Take-Profit beim Einstieg zu erteilen (quasi als Sicherheit für Ereignisse wie Abbruch der Internetverbindung) und ansonsten nur den Kurz zu überwachen und dann bei Unter- oder Überschreiten gewisser Kurse einen Auftrag zur Schließung zu erteilen (quasi als Soft-Stop ohne ständige Updates an den Broker)? Die Schließung passiert je nach Ping-Zeit dann doch im Millisekunden-Bereich mit Ausführung zu i.d.R. praktisch identischem Preis. Ich habe bei mir stets eine Variable für SL und TP hinterlegt (die sich im Falle eines Stop-Trailings theoretisch auch bei jedem Tick ändern könnte), führe aber nicht jedes Mal einen Order-Update durch wenn sich die Variable ändert, sondern schließe nur, wenn der Preis die Variable triggert. Man spart sich so massiven Trafic zum Broker und vermeidet so bei manchen Brokern, dass das Konto gesperrt wird.

Wenn du damit dein gesammtes Kapital absicherst macht es Sinn.

Aber eigentlich setzt man ja nie sein volles Rohr auf ein Ziel , ich zumindest nicht. Und dann wird der Stopp überflüssig. Intern reicht es den Stopp "mitzurechnen" und die Position zu Beenden .

Es gibt hier einen ganz wilden im Forum der mit jedem Tick so ein Update macht......... :-) Konsequenz ist natürlich das der Broker dich abmahnt und später rauswirft.

Für die meisten Strategien reicht ein Update per Minute oder gar 5.

@Carl ....dachte du schläfst noch. Ja so sieht es natürlich schicker aus

 

@ Carl: ähm... Stop Loss und Take Profit einzeln modifizieren ist EXAKT das, was mein Code tut... insofern verstehe ich nicht, wieso das nicht zum Thema des Thread-Erstellers passen soll.

Klar - die Frage, ob eine solche Funktion überhaupt(!) sinnvoll ist, führt etwas weiter, trotzdem ist der Code genau das, worum es bei der initialen Frage ging.

Nun ja.. Ebenfalls einen schönen Sonntag / schöne Pfingsten.

 
Chris70:

@ Carl: ähm... Stop Loss und Take Profit einzeln modifizieren ist EXAKT das, was mein Code tut... insofern verstehe ich nicht, wieso das nicht zum Thema des Thread-Erstellers passen soll.

Klar - die Frage, ob eine solche Funktion überhaupt(!) sinnvoll ist, führt etwas weiter, trotzdem ist der Code genau das, worum es bei der initialen Frage ging.

Nun ja.. Ebenfalls einen schönen Sonntag / schöne Pfingsten.

Chris , mag sein das du schon eine gute Lösung angeboten hast aber hier wird sehr oft einfach nur der Thread breitgetreten und der TE weis am Ende garnicht mehr was er machen soll.

Teils weil die TE wichtige Informationen weglassen oder aus anderen Gründen wichtigen Code nicht zeigen.Und wenn dann jeder seine "spezielle" Version von Code schreibt wird das eigentliche Problem nicht angegangen.

Programmierfehler

Obwohl sie es grundsätzlich richtig machen, sich aber im Code ein kleiner BUG befindet,wird das Problem künstlich aufgebläht.


Sinnvoller ist es dem TE einen Weg zu zeigen seine eigenen Fehler zu finden.

Ich finde wenn der TE nicht mal solche kleinen Bugs findet wird er mit OOP-Code überbelastet.

Und einfügen kann er ihn auch sehr schwer da er sein Programm nun umschreiben muss inklusive neuer Fehler.

Hoffe du hast ein wenig Verständniss dafür.

Gruß

 

Danke für die Rückmeldung - alles gut.

Nur kurz zum Stichwort OOP: natürlich hätte ich mein Codebeipiel auch so formulieren können:

uint update_stops(ENUM_ORDER_TYPE type, double sl, double tp)
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   for (int a=0;a<PositionsTotal();a++)
     {
      if (PositionGetSymbol(a)==_Symbol && PositionGetInteger(POSITION_TYPE)==type)
        {
         ZeroMemory(request);
         request.action=TRADE_ACTION_SLTP;
         request.symbol=_Symbol;
         request.position=PositionGetTicket(a);
         if (sl!=0) {request.sl=sl;}
         if (tp!=0) {request.tp=tp;}
         if (OrderSend(request,result)==false){Print("SL/TP update has failed!");}
        }
     }   
   return result.retcode;
  }

dann wär's ja eine normale Funktion, die jeder in sein Programm einfügen und sie für updates von Stops und Take-Profit verwenden kann, ohne am sonstigen Code irgendwas ändern zu müssen. Ich denke aber, es ist eine Frage der Philosophie.

Du wirst mir beipflichten, dass es sinnvoll ist, so viel wie möglich objekt-orientiert zu programmieren, einmal da man so ja die einzelnen "Legosteine" wiederverwenden kann und im Handumdrehen mit ausgetauschter Handelslogik einen völlig neuen EA schreiben kann und dabei z.B. Order-Execution und Risk/Money-Management wiederverwendet ohne jedes Mal das Rad neu zu erfinden, andererseits bei vielen Programmiersprachen auch aus Performancegründen (Multithreading). Für "erfahrene" Programmierer (ich bin sicher, dass Du das bist) ist es ja eine Selbstverständlichkeit, deshalb wirst Du das vermutlich genauso sehen, doch ich denke, man kann auch "Anfänger" nicht genug mit OOP konfrontieren, denn es ist ja wirklich keine Hexerei und es beschleunigt die Fortschritte enorm.

Ich wäre froh gewesen und hätte hunderte Stunden Programmierzeit gespart, wenn man mich von vorne herein dazu gedrillt hätte, nur nach OOP-Regeln zu programmieren. "Allgemeiner" können code-snippets ja gar nicht sein und ich halte OOP daher eher für eine Erleichterung wenn es darum geht, Code aus solchen Foren für eigene Zwecke zu kopieren.  GERADE Anfänger profitieren davon. Wieso erst "falsch" lernen und danach nochmal alles neu? Das ist wie Tischtennis lernen um Tennis zu lernen: warum nicht gleich Tennis? Aber das ist meine persönliche Sicht - kann man selbstverständlich anders sehen.

 
Chris70:

Danke für die Rückmeldung - alles gut.

Nur kurz zum Stichwort OOP: natürlich hätte ich mein Codebeipiel auch so formulieren können:

dann wär's ja eine normale Funktion, die jeder in sein Programm einfügen und sie für updates von Stops und Take-Profit verwenden kann, ohne am sonstigen Code irgendwas ändern zu müssen. Ich denke aber, es ist eine Frage der Philosophie.

Du wirst mir beipflichten, dass es sinnvoll ist, so viel wie möglich objekt-orientiert zu programmieren, einmal da man so ja die einzelnen "Legosteine" wiederverwenden kann und im Handumdrehen mit ausgetauschter Handelslogik einen völlig neuen EA schreiben kann und dabei z.B. Order-Execution und Risk/Money-Management wiederverwendet ohne jedes Mal das Rad neu zu erfinden, andererseits bei vielen Programmiersprachen auch aus Performancegründen (Multithreading). Für "erfahrene" Programmierer (ich bin sicher, dass Du das bist) ist es ja eine Selbstverständlichkeit, deshalb wirst Du das vermutlich genauso sehen, doch ich denke, man kann auch "Anfänger" nicht genug mit OOP konfrontieren, denn es ist ja wirklich keine Hexerei und es beschleunigt die Fortschritte enorm.

Ich wäre froh gewesen und hätte hunderte Stunden Programmierzeit gespart, wenn man mich von vorne herein dazu gedrillt hätte, nur nach OOP-Regeln zu programmieren. "Allgemeiner" können code-snippets ja gar nicht sein und ich halte OOP daher eher für eine Erleichterung wenn es darum geht, Code aus solchen Foren für eigene Zwecke zu kopieren.  GERADE Anfänger profitieren davon. Wieso erst "falsch" lernen und danach nochmal alles neu? Das ist wie Tischtennis lernen um Tennis zu lernen: warum nicht gleich Tennis? Aber das ist meine persönliche Sicht - kann man selbstverständlich anders sehen.

Den Satz rahme ich mir ein

Ich wäre froh gewesen und hätte hunderte Stunden Programmierzeit gespart, wenn man mich von vorne herein dazu gedrillt hätte, nur nach OOP-Regeln zu programmieren.


Genau so quälen wir die Neulinge. Finger weg von MT4 .Alles andere ist Zeitverschwendung ...MT5....c++ Tutorials ...usw.

Nicht jeder nimmt das an. Ist wie mit der Herdplatte :-)

Es ist alles richtig was du sagst ,aber  auch mit deiner Funktion siehe oben wird der TE scheitern.

Er hat mit sehr hoher Wahrscheinlichkeit einen Fehler in der SL-Berechnung drin. So wie es Carl schon angedeutet hatte. Ist auch der häufigste Fehler im Forum,glaube ich zu mindest.

Und den finden wir nur wenn er den Code dazu zeigt.


An dem ist vor allem  MQ Schuld. Zu lange wurde kein Wert auf eine leichte Einführung in die allgemeine Programmierung gelegt. Der neue User wird hier ins kalte Wasser geschubst.

Ich schweife ab...der Stachel sitz tief :-)

Grund der Beschwerde: