TrailingStop mit Minimum Profit

 

Hallo Liebe Leser ,


ich habe mir ein Buch gekauft ( Expert Adviser Programing for MetaTrader 5 von Andrew.R.Young )

für das Trading möchte ich gerne ein paar dinge Programmieren um somit ein paar Vereinfachungen im Arbeitsablauf zu haben.

Da mein Fachwissen nicht ausreicht und ich den Rat eines Experten suche der sich mit der Materie bestens auskennt , suche ich Hilfe.


Aus dem Buch habe ich den Code um ein TrailingStop mit Minimum Profit zu Programmieren benutzt, aber es kommt beim Kompilieren eine Fehler Meldung  :"if" -expessions are not allowed on a global scope 

Die Fehlermeldung betrifft die Fett hervorgehobene Zeile.

Ich bin dankbar für Ratschläge die zur Lösung führen. 


Besten Dank  

Matthias



// Input variables

input int TrailingStop = 500;

input int MinimumProfit= 200;


// On Tick() event handler

if(PositionSelect(_Symbol) == true && TrailingStop > 0 )         


{

request.action = TRADE_ACTION_SLTP;

request.symbol = _Symbol;


long posType = PositionGetInteger (POSITION_TYPE);

double currentStop = PositionGetDouble (POSITION_SL);

double openPrice = PositionGetDouble (POSITION_PRICE_OPEN);


double minProfit = MinimumProfit * _Point;

double trailStop = TrailingStop * _Point;


double trailStopPrice;

double currentProfit;


if (posType == POSITION_TYPE_BUY)


{

   trailStopPrice = SymbolInfoDouble (_Symbol,SYMBOL_BID) - trailStop;

   currentProfit = SymbolInfoDouble (_Symbol,SYMBOL_BID) - openPrice;

   if (trailStopPrice > currentStop && currentProfit >= minProfit)

   {

      request.sl = trailStopPrice;

      OrderSend (request,result);

   }

   

}


else if (posType == POSITION_TYPE_SELL)

{

   trailStopPrice =SymbolInfoDouble (_Symbol,SYMBOL_ASK) + trailStop,

   currentProfit = openPrice - SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   

   if (trailStopPrice < currentStop && currentProfit >= minProfit)

   {

      request.sl = trailStopPrice; OrderSend ( request,result);

      

               }

             }

           }          

   

 

Punkt 1: Betrifft das Layout. Code hier im Forum bitte immer mit Click auf das "</>" -Symbol einfügen (oder Alt-S), das erhöht wesentlich die Lesbarkeit. Außerdem bitte zig unnötige Leerzeilen sparen; das macht den Code viel länger und macht unter Umständen viel Scrollen nötig um Probleme zu erfassen. Ich empfehle außerdem den Styler im Metaeditor zu verwenden (Ctrl+, oder Click auf das "Kamm"-Symbol), insbesondere damit zusammengehörende Klammern auch auf der gleichen Höhe erscheinen und somit die Dinge übersichtlich gruppiert erscheinen.

Punkt 2: OnTick wird hier als event-Handler im Kommentar genannt, aber dann fehlt die OnTick-Funktion trotzdem (--> entsprechend der Error wegen "if" auf globaler Ebene, da außerhalb einer Funktion (also hier der Funktion OnTick)). Ich habe das hier mal ergänzt:

input int TrailingStop = 500;
input int MinimumProfit= 200;

// On Tick() event handler
void OnTick()
  {
   if(PositionSelect(_Symbol) && TrailingStop>0)         
     {
      request.action = TRADE_ACTION_SLTP;
      request.symbol = _Symbol;  
      long posType = PositionGetInteger (POSITION_TYPE);
      double currentStop = PositionGetDouble (POSITION_SL);   
      double openPrice = PositionGetDouble (POSITION_PRICE_OPEN);
      double minProfit = MinimumProfit * _Point;
      double trailStop = TrailingStop * _Point;
      double trailStopPrice;
      double currentProfit;
      if (posType == POSITION_TYPE_BUY)
        {
         trailStopPrice = SymbolInfoDouble (_Symbol,SYMBOL_BID) - trailStop;
         currentProfit = SymbolInfoDouble (_Symbol,SYMBOL_BID) - openPrice;
         if (trailStopPrice > currentStop && currentProfit >= minProfit)
           {         
            request.sl = trailStopPrice;
            OrderSend (request,result);
           }
        } 
      else if (posType == POSITION_TYPE_SELL) 
        {
         trailStopPrice =SymbolInfoDouble (_Symbol,SYMBOL_ASK) + trailStop;
         currentProfit = openPrice - SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         if (trailStopPrice < currentStop && currentProfit >= minProfit)
           {
            request.sl = trailStopPrice;
            OrderSend ( request,result);
           }
        }
     }  
  } // end of OnTick

Das ist so noch kein fertiger Code, sondern nur etwas Anfangsarbeit!

Ein weiterer Punkt betrifft das grundsätzliche Konzept: willst Du wirklich bei jedem Tick einen Auftrag an den Broker schicken um den Stop zu modifizieren (=einschließlich des ganzen damit verbundenen Daten-Traffic) ? Warum nicht ein "harter" Stop nur als Notfall für Computerabsturz, Probleme mit der Internetverbindung usw. und ansonsten den Trailing-Stop nur intern mitrechnen und erst dann einen Stop-Auftrag schicken sobald dieser Kurs tatsächlich unterschritten wird. Klar - es wird eine minimale Latenz geben bis diese Order beim Broker ankommt, das wird aber nur im absoluten Hochfrequenzhandel einen relevanten Unterschied machen.

 

Hallo, ein herzliches Willkommen und viel Glück und Erfolg für 2020!


Aber trotzdem eine paar Bemerkungen:

    Beim Posten von Code verwende bitte den "Code-Knopf" (Alt+F5) oder das Code-Icon der Editierzeile </>   

    Hier einmal zwei Artikel für Anfänger:
    https://www.mql5.com/de/articles/100  // Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5
    https://www.mql5.com/de/articles/496  // Schnelleinstieg oder Kurzanleitung für Anfänger

    Christian hat auch eine Empfehlung:
    https://www.mql5.com/de/forum/329626#comment_14470067

    Sonst kannst Du mit dem Editor über Datei => Neu (Ctrl+N) leicht eine erstmal fehlerlose Version eines EAs mit alles notwendigen Basisfunktionen und anderer Dinge erstellen!
    Da gibt es auch den Link zu einem Youtube Video:
    https://www.youtube.com/watch?v=XVW_6X_uf8Q&index=2&list=PLltlMLQ7OLeKwyQwC8FhiKwjl9syKhOCK

    Ein Tipp noch:
    Erst suchen! Es gibt fast nix, was nicht schon für Mt4/5 programmiert wurde!
    Warum das Rad neu erfinden, wenn es in der CodeBase liegt, bereit zum abkupfern?

    Mein Tipp für Anfänger ist, sich in der CodeBase oder unter den Artikeln ein Beispiel suchen, das den eigenen Ideen am nächsten kommt und das ändern!
    Dann entgeht man erst einmal solchen Fehlern, bei denen man dann als Anfänger nicht weiter weiß.

    Verwende im Editor den Extras => Styler (oder gleich Ctrl+,), auch das hilft Fehler vermeiden und machte den Code (besonders für andere) lesbarer!

    Wenn das eigene Programm nicht tut, was es eigentlich soll, dann ist der Debugger die erste Wahl: im Editor a) unter Extras => Optionen => Debug das Setting festlegen, dann b) die Haltepunkte setzen (F9) und c) den Debugger mit F5 oder Strg+F5 starten.

Zu Deinem Fehler. Ich vermute bei Deinem nicht alles umfassenden Code(?), dass die Klammersetzung falsch ist. Hier würde der Styler schnell zeigen wo das ist!

Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5
Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5
  • www.mql5.com
Dieser Beitrag richtet sich an Anfänger, die wissen möchten, wie man einen einfachen Expert Advisor (EA) in der neuen MQL5-Sprache schreibt. Beginnen wir also zunächst mit der Festlegung dessen, was unser Expert Advisor können, und sehen uns dann an, wie wir festlegen können, wie er dies ausführen soll. 1. Handels-Strategie Er überprüft einen...
 

Artikel 100 ist leider auch nicht grad das gelbe vom Ei.

Mühsam wird mit TradeRequest und TradeResult herumgefuhrwerkt, auf die Systembibliothek Trade.mqh wird leider nicht eingegengen.

#include <Trade\Trade.mqh>

Das gleiche Dilemma besteht auch in dem Buch von Andrew.R.Young.

Es ist ein großes Versäumnis von Metaquotes kein gutes Studienmaterial zur Verfügung zu stellen!

Und als Einsteiger aus der Codebase etwas herauszusuchen ist denkbar mühsam.

 

Dankeschön @ Chris70 ;Carl Schreiberund Otto Pauser das ihr Euch die Zeit genommen habt um mir zu Helfen. 

Ich versuche mich durch das Thema durch zu Arbeiten. 


Beste Grüsse 


Matthias 

Chris70
Chris70
  • www.mql5.com
Profil des Traders
Grund der Beschwerde: