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!

- www.mql5.com
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


- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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);
}
}
}