Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Einstieg zu MT4 Programmierung

Geschrieben

Hallo,

 

ich hätte da mal eine Frage:

Was benötigt man um überhaupt für mt4 Programmieren zu können?

Welche Standartsoftware ist damit gemeint.

 

Woher bekomme ich diese?

 

Grüsse

Jörg

  • Antworten 269
  • Aufrufe 81Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • Also wenn dein Code im Indikator aufgerufen wird, brauchst du auf jedem Fall die Funktion iBarShift, wie ich es oben beschrieben habe, aus dem ExpertAdvisor wird auch so funktionieren. Schau wirklich

  • die folgene Erklärung von Funktionen bezieht sich nur auf MQL4!   Was ist start() ? eine Funktion!   Alles was Arbeitet findet immer in Funktionen statt. Ausserhalb von Funktionen geht nix.   bei MQL

  • Das ist eigentlich kein Bug Du gibst in dem iHigh(NULL, 15, 1) in dem Parameter Barshift 1 an, das ist falsch. In dem Strategietester wird dieser Bar immer den gleichen Wert zurückgeben, nämlich Hi

Veröffentlichte Bilder

Featured Replies

Geschrieben

Danke für die Antworten.

 

Etwas ist mir noch nicht klar, aber wahrscheinlich habe ich da einen grundlegenden Denkfehler:

 

Wenn eine Funktion später im Code deklariert wird, also festgelegt wird, was sie macht, aber früher im Code

schon aufgerufen wird, also das Ergebnis der Funktion benutzt wird, dann ist der Rückgabewert der Funktion

doch beim Aufruf noch nicht bekannt.

 

Zum MACD EA:

Ich habe zwar verstanden, was beim abchecken der Bars und des Takeprofit geschieht, aber warum?

Macht man das bei jedem EA? Den Takeprofit auf bestimmte Grenzen zu überprüfen ist ja o.k., aber warum die 100 Bars?

Gibt es noch andere Sachen, die man am Anfang abchecken sollte?

 

Jetzt noch etwas, das mir aufgefallen ist:

// TrailingStop) in our case, we check TakeProfit

// on a chart of less than 100 bars

Das heißt doch auf deutsch, daß an einem Chart mit weniger als 100 Bars der Takeprofit gechekt wird.

 

 

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(TakeProfit<10)

{

Print("TakeProfit less than 10");

return(0); // check TakeProfit

}

Ich habe das so verstanden, daß Takeprofit gechekt wird, wenn der Chart mehr (nicht weniger) als als 100 Bars hat, oder?

Denn hat er weniger wird durch das erste return(0) abgebrochen und eben nicht der Takeprofit gechekt.

Hat er mehr, dann geht es mit der zweiten If-Anweisung weiter und der Takeprofit wird gechekt.

Geschrieben
Danke für die Antworten.

 

Etwas ist mir noch nicht klar, aber wahrscheinlich habe ich da einen grundlegenden Denkfehler:

 

Wenn eine Funktion später im Code deklariert wird, also festgelegt wird, was sie macht, aber früher im Code

schon aufgerufen wird, also das Ergebnis der Funktion benutzt wird, dann ist der Rückgabewert der Funktion

doch beim Aufruf noch nicht bekannt.

jein, du musst unterscheiden zwischen Reihenfolge im Code und Programmablauf. In MQL ist es egal wo im Code eine Funktion "erklärt" (definiert) wird. Wenn irgendwo im Code die Funktion aufgerufen wird, springt der Programmablauf an die Stelle wo die Funktion steht und führt diese Zeilen aus bis zum return, dann springt er zurück. Und das "wohin springen" findet der Compiler beim kompilieren raus.

 

Ich habe das so verstanden, daß Takeprofit gechekt wird, wenn der Chart mehr (nicht weniger) als als 100 Bars hat, oder?

Denn hat er weniger wird durch das erste return(0) abgebrochen und eben nicht der Takeprofit gechekt.

Hat er mehr, dann geht es mit der zweiten If-Anweisung weiter und der Takeprofit wird gechekt.

Das ist auf alle Fälle das, was dieser Codeblock tut. Bei einem EA ist das "was er tut" und das "was er tun sollte" bzw. "ob die kommentare dazupassen" nicht immer das gleiche ;)

 

Zu den sachen die man abchecken sollte: das kann ma so jetzt schwer sagen, hängt ganz vom EA ab. Du solltest auf alle Fälle immer über den aktuellen Status deiner Orders informiert sein. (falls du sowas meinst)

Geschrieben

OK. langsam kapiere ich so ein paar Basics. Schade, daß ich im Monent hier der einzige Fragensteller bin. Ich fand die Vorgehensweise, den Code Stück für Stück von den Anfängern erklären zu lassen und dann von den Könnern die Antworten berichtigen zu lassen nämlich sehr gut. Ich mach einfach mal so weiter:

total=OrdersTotal();

 

Es wird der Variable mit Namen total ein Wert zugewiesen. Der Wert wird von der Funktion mit Namen OrdersTotal() übergeben.

Meine Vermutung: Die Funktion OrdersTotal() ist eine Standardfunktion, da sie nirgends im Code deklariert wird. Sie gibt wohl die Anzahl der offenen Orders an.

 

Wenn das stimmt: Sind das die offenen Orders nur für das Symbol, in dem ich diesen EA laufen lasse? Wenn ich andere EAs auch auf diesem Symbol laufen habe, die auch offene Orders erzeugt haben, was passiert dann?

Oder kann man nur einen EA auf einem Symbol laufen lassen?

 

Was passiert, wenn ich eine offene long Order habe und zwei davon abhängige short Order (z.B. SL und TP). Dann müsste doch der Wert 1 sein und erst wenn die long Order ausgeführt ist, müsste der Wert 2 sein. Stimmt das?

 

Das bringt mich zu einer anderen Frage, über die ich mir eigentlich erst viel später Gedanken machen sollte: Ist es sinnvoll Stopporders zu verschicken und dem Broker zu verraten, oder sollte man nicht den EA warten lassen, bis der Kurs zu, dem man seine Stopporder gesetzt hätte, erreicht ist und dann eine Marketorder schicken?

Geschrieben
Es wird der Variable mit Namen total ein Wert zugewiesen. Der Wert wird von der Funktion mit Namen OrdersTotal() übergeben.

Meine Vermutung: Die Funktion OrdersTotal() ist eine Standardfunktion, da sie nirgends im Code deklariert wird. Sie gibt wohl die Anzahl der offenen Orders an.

Richtig vermutet. OrdersTotal() ist eine built-in function. Die Funktionsweise wird in der Hilfe von MT genau beschrieben (Funktionsnamen markieren und F1 drücken bringt dich direkt dorthin).

 

Wenn das stimmt: Sind das die offenen Orders nur für das Symbol, in dem ich diesen EA laufen lasse? Wenn ich andere EAs auch auf diesem Symbol laufen habe, die auch offene Orders erzeugt haben, was passiert dann?

Oder kann man nur einen EA auf einem Symbol laufen lassen?

Nein, das sind alle offenen Orders von diesem Account. Es gibt auch noch OrdersHistoryTotal(), das sind alle geschlossenen Orders. Du kannst beliebig viele EAs am gleichen Symbol und auch Timeframe laufen haben. Um die Orders jedoch zu den einzelnen EAs zuordnen zu können gibt es OrderSymbol() und OrderMagicNumber().

OrderSymbol() sagt dir von welchem Symbol diese Order ist.

Die MagicNumber, ist eine beliebige Nummer, die du der Order beim erstellen mitgeben kannst und die sie dann dauerhaft behält. Wenn jetzt jeder deiner EAs seinen Orders eine andere Magicnumber gibt, kannst du mithilfe von Symbol und Magicnumber eindeutig entscheiden ob diese Order nun zu deinem EA gehört oder nicht.

Ich codiere meist zur Laufzeit noch zusätzlich den aktuellen Timeframe in die MagicNumber dazu, wodurch es möglich ist den gleichen EA am gleichen Symbol aber in unterschiedlichen Timeframes laufen zu lassen, ohne das sie sich gegenseitig in die Quere kommen.

zb so:

#define MAGIC_NUMBER 1230000

int magic = MAGIC_NUMBER + Period();

 

Was passiert, wenn ich eine offene long Order habe und zwei davon abhängige short Order (z.B. SL und TP). Dann müsste doch der Wert 1 sein und erst wenn die long Order ausgeführt ist, müsste der Wert 2 sein. Stimmt das?

Stoploss und Takeprofit wie du das hier vielleicht meinst, ist in MT keine eigene Order, sondern vielmehr eine Eigenschaft einer Order.

Sprich du hast dann 1 Longorder mit SL und TP. Keine eigenständige Shortorder dazu.

Wenn du eine Longorder schließen willst, bringt es dir bei MT auch nichts, wenn du eine gleich große Short eröffnest. Dann hast du nur 2 Orders die sich gegenseitig hedgen.

 

Es wird auch keine Order "automatisch" (also Serverseitig) erstellt (als SToploss oder so). OrdersTotal() wird also nur größer, wenn du selber einen OrderSend Befehl schickst. (und kleiner, wenn bei einer Order SL oder TP geht, oder du eine Order mit OrderClose() schließt)

 

(Das alles gilt nur in der Theorie, ich hab schon von Brokern gehört die über Nacht Hedgingpositionen gegeneinander aufrechnen und somit schließen. Ist natürlich nicht nett, da der EA damit "vergisst" das er ja eigentlich im Markt war.)

 

hth

 

PS: Nur nicht abschrecken lassen weil du der einzige Fragensteller bist, es lesen sicher sehr viele mit, die nicht wissen was oder wie sie fragen sollen und sich sehr freuen das du fragst.

Geschrieben
[...]

Meine Vermutung: Die Funktion OrdersTotal() ist eine Standardfunktion, da sie nirgends im Code deklariert wird. Sie gibt wohl die Anzahl der offenen Orders an.

[...]

Korrekt - erkennst Du auch daran, dass es im Metaeditor blau geschrieben ist. Alle Dinge, die dort nicht schwarz dargestellt sind, sind quasi "interne" Kommandos. Wenn Du den Cursor innerhalb des Wortes platzierst und F1 drückst, bekommst Du eine kleine Hilfe zu dem jeweiligen Befehl. Die große Hilfe gibt es dann hier im Forum :wub:.

Geschrieben
PS: Nur nicht abschrecken lassen weil du der einzige Fragensteller bist, es lesen sicher sehr viele mit, die nicht wissen was oder wie sie fragen sollen und sich :wub:sehr freuen das du fragst.
Geschrieben

Ok, dann frag ich mal weiter, bzw. mach einfach mit dem Code das MACD EAs weiter.

 

if(total<1)

{

// no opened orders identified

if(AccountFreeMargin()<(1000*Lots))

{

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

 

Das Zitat ist nicht die gesamte if Anweisung, aber ich wollte nicht zu viel auf einmal machen.

 

Also, nur wenn keine Orders offen sind, wird die nächste if Anweisung abgearbeitet.

Sonst geht es mit dem for (cnt=0 ...) weiter. Glaub ich.

 

Da alle offenen Orders des Accounts gezählt werden, ist die Zeile aber wenig sinnvoll, außer man hat nur diesen EA laufen und

macht auch sonst keine diskretionären Orders.

 

Dann kommt die nächste if Anweisung, bei der die free margin abgecheckt wird. Ich habe gleich mal den Tipp mit Curser auf das farbige Wort und F1 drücken

befolgt. Das ist die free Margin des Accounts. Bedeutet das, die Summe aus allen Unterkonten, falls man welche hat?

 

Da die free margin größergleich 1000 x Lots sein muß, stellt sich die Frage, wieviel ist ein Lot. Ich dachte ein Lot wären 100.000 $, aber dann wäre das

ja eine Abfrage nach größergleich 1 Mio . Schlußfolgerung von mir: 1 Lot muß weniger als 100.000 $ sein. Eigentlich sollte ich das auch alleine herausfinden, wieviel ein Lot ist,

aber verratet Ihr es mir trotzdem? Das nächtemal schlage ich wieder selbst nach.

 

Falls zu wenig Geld da ist, schreibt er in das experts log (Curser und F1 haben mir das verraten, aber es war auch schon mal in diesem Thread davon die Rede, was die print Funktion macht)

und beendet wegen des return(0) die gesamte start Funktion.

 

Da ich in diesem Thread schon gelernt habe, daß eine Variable, die in der Funktion definiert wird, immer wieder auf null gesetzt wird,

habe ich mir über die Variable "total" Gedanken gemacht. Die bekommt doch vor der if Anweisung in der sie benutzt wird immer einen neuen/aktuellen Wert über die Funktion OrdersTotal ()

zugewiesen. Wäre es also auch möglich diese Variable außerhalb der start Funktion zu deklarieren und das Ergebnis wäre das selbe?

Mal davon abgesehen, daß es wohl keinen Grund gibt, das zu tun, also nur für mein Verständnis.

Geschrieben

Gerade ist mir aufgefallen, daß ganz am Anfang des Codes bei den extern Variablen Lots = 0,1 steht.

Also ist 1000 * Lots wohl 100. Bedeutet, daß die free Margin größer als 100 sein muß.

Euronen oder $ ??

Geschrieben
Dann kommt die nächste if Anweisung, bei der die free margin abgecheckt wird. Das ist die free Margin des Accounts. Bedeutet das, die Summe aus allen Unterkonten, falls man welche hat?

Nope. Nur des aktuell ausgewählten, wenn man der Funktionsreferenz trauen darf :wub: http://docs.mql4.com/account/AccountFreeMargin .

 

Da die free margin größergleich 1000 x Lots sein muß, stellt sich die Frage, wieviel ist ein Lot. Ich dachte ein Lot wären 100.000 $, aber dann wäre das ja eine Abfrage nach größergleich 1 Mio . Schlußfolgerung von mir: 1 Lot muß weniger als 100.000 $ sein. Eigentlich sollte ich das auch alleine herausfinden, wieviel ein Lot ist,

aber verratet Ihr es mir trotzdem? Das nächtemal schlage ich wieder selbst nach.

Ok, wenn Du mir das versprichst, dann sag ich Dir, das man die normalen Mengen für Metatrader immer durch 100.000 teilen muss, um die MT-Lotsizes zu bekommen. :smile:

0.1 Lot = 10.000

1 Lot = 100.000

 

 

..., aber es war auch schon mal in diesem Thread davon die Rede, was die print Funktion macht

und beendet wegen des return(0) die gesamte start Funktion.

Genau. start() wird beendet, aber nur, um - wenn es sich um einen EA oder einen Indikator handelt - beim nächsten eintrudelnden Tick wiederum aufgerufen zu werden. Im Sinne: und täglich grüßt das Murmeltier.

 

 

Da ich in diesem Thread schon gelernt habe, daß eine Variable, die in der Funktion definiert wird, immer wieder auf null gesetzt wird, habe ich mir über die Variable "total" Gedanken gemacht. Die bekommt doch vor der if Anweisung in der sie benutzt wird immer einen neuen/aktuellen Wert über die Funktion OrdersTotal ()

zugewiesen. Wäre es also auch möglich diese Variable außerhalb der start Funktion zu deklarieren und das Ergebnis wäre das selbe? Mal davon abgesehen, daß es wohl keinen Grund gibt, das zu tun, also nur für mein Verständnis.

Da sich, je nachdem, was Dein EA macht, die Anzahl der Orders ändert (es werden Einstopp-Orders gefillt o.ä.) muss diese Variable gelegentlich aktualisiert werden, wenn für Dich die Anzahl der Orders eine Rolle spielt. Du kannst die Deklaration der Variablen (int total;) innerhalb der Funktion start() vornehmen, aber auch irgendwo zwischen die Funktionsblöcke schreiben oder traditionellerweise an den Dateianfang.

Das hat den einzigen Unterschied, dass in der start()-Funktion die Variable in jeder Runde neu deklariert wird, am Ende der Funktion wird sie wieder weggemacht usw. usf....

Wenn Du sie außerhalb der Funktion "deklarierst" linked.gif, überlebt sie sozusagen die start()-Funktion (was Performanceerhöhung bedeuten kann, wenn man das unbedingt braucht) und stirbt erst bei Beendigung des EAs.

 

Gutes Programmdesign versucht allerdings, möglichst kompakte Klumpen zu bilden, sprich: alle Variablen, die nur in einer Funktion verwendet werden, auch nur dort, möglichst lokal zu deklarieren, damit einem nicht die Fäden aus den Händen gleiten, und außerdem ist es besser testbar/kontrollierbar. Meistens. Das sind aber Programmierprinzipien, die kann man bei den kurzen MT-Programmen getrost ignorieren.

 

Außerdem wird die Variable im Speicher an ner anderen (persistenten) Stelle angelegt, aber das sind Detail, die Du gleich wieder vergessen darfst. :wub:

 

Um das Aktualisieren des Variablenwertes per total=OrdersTotal() in start() kommst Du aber nicht drumrum.

 

Von daher ist es Wurscht, wo Du die Variable deklarierst.

Geschrieben
Euronen oder $ ??

Deine Kontowährung kannst Du Dir per AccountCurrency() anzeigen lassen.

http://docs.mql4.com/account/AccountCurrency

 

Diese Währung wird verwendet bei dem Test in Deiner If-Anweisung.

 

Gerade ist mir aufgefallen, daß ganz am Anfang des Codes bei den extern Variablen Lots = 0,1 steht.

Also ist 1000 * Lots wohl 100. Bedeutet, daß die free Margin größer als 100 sein muß.

Jup. Wenn Du weniger als 100 Euro/$ freie Margin hast, wird der Text mittels Print() ausgegeben. Im andern Fall passiert nix in Deinem Code-Block, wenn Lots=0.1 ist.

Geschrieben
Das nächstemal schlage ich wieder selbst nach.
Ok, wenn Du mir das versprichst, dann

Tatsächlich ist die F1 Taste im Editor in den letzten Tagen fast schon zu meinem Hobby geworden.

Aber die Hilfefunktion des Editors kann natürlich eine Antwort eines erfahrenen Programmieres nicht ersetzen.

Deshalb nochmal Danke an alle, die hier Ihre Erfahrung bereitstellen.

Geschrieben

Weiter im Text:

 

 

// check for long position (BUY) possibility

if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&

MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);

 

Die if Anweisung mit mehreren "und" Verknüpfungen ist eigentlich klar. MathAbs hab ich nachgeschaut, einfach der Absolutwert.

Point hab ich auch nachgeschaut, aber nicht kapiert. Da es aber wohl nur ein Faktor ist, mit dem der MACDOpenLevel multpliziert wird,

scheint das nicht sooo wichtig zu sein. Falls doch wichtig, bitte erklären.

 

Wichtiger scheint mir aber, daß man die ticket=... Zeile komplett versteht, da hier wohl die Order aufgegeben wird.

Ich habe mir die Parameter der OrderSend Funktion angeschaut. Meine Ergebisse:

 

Symbol() ist ja auch wieder eine Funktion, also ist hier eine Funktion ein Parameter einer anderen Funktion??

Symbol() gibt einen String zurück mit dem aktuellen Symbol, also das, was man handelt/handeln will.

 

OP_BUY bedeutet man will long gehen. Erst dachte ich, es bedeutet auch, daß man eine Marketorder macht, aber dann

hat mich der übernächste Parameter "Ask" verwirrt.

 

Lots gibt an, wieviel man kaufen will. In unserem Fall also 0,1 * 100.000 Währung also 10.000 Währung.

 

Ask, kann ich nur vermuten. Man muß der Funktion wohl noch mitteilen, ob der Ask-Kurs oder der Bid-Kurs verwendet werden soll. Und hier wird es für mich seltsam.

Wenn es eine Marketorder ist, bekomme ich doch eh nur den Ask Preis von meinem Broker. Muß also was anderes sein.

 

3: Das ist die Slippage. Bedeutet wohl, daß die Order nur ausgeführt wird, wenn der Kurs max 3 Pips vom ask-Kurs (dann wird doch ein Schuh draus, wenn ask einfach nur als Ausgangswert für die Slippage dient) abweicht.

 

0: Stoploss, also wird mit der Order keine Stoplossorder mitgegeben.

 

Ask+TakeProfit*Point: Takeprofitorder wird aber eine mitgegeben. Sch... hier ist ja wieder der "Point". Ist wohl doch wichtig.

 

"macd sample": Die Order braucht einen Namen

 

16384: Magic number !? Ist das die magicnumber des EAs, oder warum 16384?

 

0: datetime ??

 

Green: Grün! Ist wohl die Farbe das Pfeil im Chart, der die Order darstellt.

 

Damit sind die Parameter durch.

 

Aber die Zeile bedeutet noch mehr: Die OrderSend Funktion gibt etwas zurück, (die Ordernummer, die der Broker der Order gibt glaub ich)

und das ist dann der Wert der Variablen "ticket". Oder -1, falls die Order schief geht.

 

Aber: Wird hier wirklich schon die Order aufgegeben? Eigentlich wird doch nur der Variablen "ticket" ein Wert zugewiesen. Grübel.

 

Wow, das war für mich schon ein ganz schöner Brocken, bin mal gespannt, was davon richtig ist.

Geschrieben
Point hab ich auch nachgeschaut, aber nicht kapiert. Da es aber wohl nur ein Faktor ist, mit dem der MACDOpenLevel multpliziert wird, scheint das nicht sooo wichtig zu sein.

Seh ich genauso. ;)

 

Wichtiger scheint mir aber, daß man die ticket=... Zeile komplett versteht, da hier wohl die Order aufgegeben wird.

Ich habe mir die Parameter der OrderSend Funktion angeschaut. Meine Ergebisse:

 

Symbol() ist ja auch wieder eine Funktion, also ist hier eine Funktion ein Parameter einer anderen Funktion??

Symbol() gibt einen String zurück mit dem aktuellen Symbol, also das, was man handelt/handeln will.

Richtig. Das Ergebnis (Output) der einen Funktion ist wiederum Input für eine weitere. Sowas kann man beliebig ineinanderschachteln, bis man vor Klammern nix mehr sieht. Aber man sollte der Übersichtlichkeithalber auf mehr als 2 Verschachtelungen verzichten und dann doch lieber Hilfsvariablen benutzen für Zwischenergebnisse.

Ist aber für Einsteiger vernachlässigbar ;).

 

 

OP_BUY bedeutet man will long gehen. Erst dachte ich, es bedeutet auch, daß man eine Marketorder macht, aber dann

hat mich der übernächste Parameter "Ask" verwirrt.

Ist auch ne Marketorder. Man muss halt einen von 0 verschiedenen Entry-Preis angeben und zum Ask sollte ne aktuelle Longorder ausgeführt werden können. Daher steht da Ask.

 

Ask, kann ich nur vermuten. Man muß der Funktion wohl noch mitteilen, ob der Ask-Kurs oder der Bid-Kurs verwendet werden soll. Und hier wird es für mich seltsam.

Wenn es eine Marketorder ist, bekomme ich doch eh nur den Ask Preis von meinem Broker. Muß also was anderes sein.

Du hast nur eine einzige Funktion (OrderSend), um so ziemlich alle denkbaren Ordertypen damit abzudecken.

Je nachdem wie die Parameter eingestellt sind.

Im Prinzip setzt Du bei Ausführen der Funktion OrderSend eine Bracket-Order ab: Einstieg (mit Limit oder per Market oder Einstopp-Order plus Stopploss und Ausstieg (TakeProfit)).

Über den Parameter ExpirationTime kannst Du außerdem noch die Gültigkeitsdauer steuern.

Die Funktion ist schon recht kompakt.

 

3: Das ist die Slippage. Bedeutet wohl, daß die Order nur ausgeführt wird, wenn der Kurs max 3 Pips vom ask-Kurs (dann wird doch ein Schuh draus, wenn ask einfach nur als Ausgangswert für die Slippage dient) abweicht.

Genau.

Geschrieben
0: Stoploss, also wird mit der Order keine Stoplossorder mitgegeben.

Jup. Allerdings eine Ausstiegsorder:

 

Ask+TakeProfit*Point: Takeprofitorder wird aber eine mitgegeben. Sch... hier ist ja wieder der "Point". Ist wohl doch wichtig.

Na ja, so wichtig ist Point nicht, eher nen Skalierungsfaktor.

 

Ich würde prinzipiell IMMER auch ne Stopporder zeitgleich mitabsetzen, kenne aber auch EAs, wo im Nachhinein mit OrderModify ne SL-Order nachgereicht wird, indem der SL-Parameter auf nen anderen Wert als 0 gesetzt wird.

Wenn aber zwischendurch das I-Net zusammenbricht, ist das aber nicht so prickelnd. Muss aber jeder selbst entscheiden, wie er das handhabt.

 

"macd sample": Die Order braucht einen Namen

Genau. Der Comment taucht hinterher auch in der Order-Tabelle auf und ist zur Unterscheidung von Orders aus verschiedenen EAs recht hilfreich. Ich nutze den Comment auch manchmal artfremd, um bestimmte Parameter (Standardabweichung usw. zu dem Zeitpunkt der Orderaufgabe) zu speichern für spätere statistische Auswertung der getätigten Trades.

 

16384: Magic number !? Ist das die magicnumber des EAs, oder warum 16384?

Könnte auch 42 da stehen. That's magic. Dient zum Unterscheiden der verschiedenen EAs-Orders und ist v.a. auch kürzer als Comment (wo man ja Text und nicht nur ne Zahl reinschreiben kann).

 

0: datetime ??

Die Gültigkeitsdauer der Order. 0 heißt Good-till-canceled. Manche MT-Broker erlauben auch keine kürzere Zeit.

 

Green: Grün! Ist wohl die Farbe das Pfeil im Chart, der die Order darstellt.

Genau.

 

Aber die Zeile bedeutet noch mehr: Die OrderSend Funktion gibt etwas zurück, (die Ordernummer, die der Broker der Order gibt glaub ich) und das ist dann der Wert der Variablen "ticket". Oder -1, falls die Order schief geht.

 

Aber: Wird hier wirklich schon die Order aufgegeben? Eigentlich wird doch nur der Variablen "ticket" ein Wert zugewiesen.

Ja, die Order wird zum Broker geschickt und wenn es keine Fehler gab (Serverausfall oder Stop invalide oder irgendwas in der Art), bekommst Du Deine Ticketnummer zurückgeschickt. Oder aber die -1.

 

Ich kann Dir nur nahelegen, nicht nur auf ticket != -1 zu testen, sondern ebenfalls die Fehlermeldung auszugeben. Dann hat man schneller ne Idee, warum was schiefgegangen ist.

 

ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My order #2",16384,0,Green);
if(ticket<0)
      {
       Print("OrderSend failed with error #",GetLastError());
       return(0);
      }

 

:blink: :wub:

Geschrieben
Könnte auch 42 da stehen

 

Nee, nicht 42, ich will dem Broker doch nicht die Antort auf ALLE FRAGEN mitteilen. Das soll der mal selbst rausfinden. :blink:

Geschrieben
Na ja, so wichtig ist Point nicht, eher nen Skalierungsfaktor.

Naja Point is schon "wichtig"... gleich wichtig wie Bid,Ask, Stoplevel, Spread etc... (vor allem weil die letzten zwei in Point angegeben sind;) Ok, es ist ein Skalierungsfaktor, aber die können ja auch wichtig sein...

 

F1 hilft hier wiedermal sehr:

 

"The current symbol point value in the quote currency."

 

Bei EURUSD hast du zB meist Point = 0.0001.

 

Es ist ratsam "absolute" Parameter, wie in diesem Fall die TP-Differenz, in Points eingeben zu lassen, da du damit einen Symbolunabhängigen Fixpunkt hast.

 

hth

Geschrieben
Naja Point is schon "wichtig"... gleich wichtig wie Bid,Ask, Stoplevel, Spread etc... (vor allem weil die letzten zwei in Point angegeben sind;) Ok, es ist ein Skalierungsfaktor, aber die können ja auch wichtig sein...

Och Menno, Mythos :blink:

 

Es ist ratsam "absolute" Parameter, wie in diesem Fall die TP-Differenz, in Points eingeben zu lassen, da du damit einen Symbolunabhängigen Fixpunkt hast.

*nickt gnädig* Das kann man so stehen lassen. gallery_446_9_7479.gif

Geschrieben

OK. Point hab ich verstanden. Wenn auch eine Stopplossorder mitgegeben werden soll würde man dann also "Ask+Stopploss*Point" statt der "0"

schreiben. Es müsste dann natürlich die Variable Stopploss deklariert sein.

Bei diesem EA gibt es aber eine Variable TraillingStop. Kann man mit der OrderSend Funktion auch gleich ein Traillingstopp mitgeben?

 

Mal eine allgemeinere Frage zu der OrderSend Funktion:

Wenn der EA die Order aufgibt, wartet er dann bis der Broker eine Ticketnummer oder -1 zurückschickt?

Wenn ja: Wie lange wartet er?

Falls er wartet: Was ist mit den reinkommenden Ticks während der Wartezeit, werden die einfach ignoriert,

oder geht das so schnell, daß keine Ticks in dieser Zeit passieren?

 

Wenn ich weiß, daß die Order aufgegeben wurde, weil ticket>0 ist, heißt das aber nicht, daß die Order auch ausgeführt wurde, oder doch?

Wenn nein, wo wird in diesem MACD Sample EA denn abgefragt, ob die Order ausgeführt wurde?

 

Überhaupt frage ich mich, warum vorher zwar mit OrdersTotal abgefragt wurde, ob es offene Orders gibt, es wird aber nicht abgefragt (oder ich habs noch nicht gefunden),

ob es offene Positionen gibt.

Je nachdem, welche Aus- und Einstiege der EA hat, könnte es doch passieren, daß mehrere Positionen geöffnet werden (Pyramidisieren) und

das will man doch nicht dem Zufall überlassen.

Geschrieben
OK. Point hab ich verstanden. Wenn auch eine Stopplossorder mitgegeben werden soll würde man dann also "Ask+Stopploss*Point" statt der "0"

schreiben. Es müsste dann natürlich die Variable Stopploss deklariert sein.

Genau. Und Stopploss müsste negativ sein, damit der Stopp (da Du ihn ja aufaddierst) dennoch unterhalb des Entries liegen muss bei ner Long-Order.

Ansonsten müsstest Du schreiben: "Ask-Stopploss*Point" .

 

Bei diesem EA gibt es aber eine Variable TraillingStop. Kann man mit der OrderSend Funktion auch gleich ein Traillingstopp mitgeben?

Nope, leider nicht. TrailingStop muss leider per Hand im Programmcode nachgezogen werden mittels der OrderModify-Funktion.

 

Mal eine allgemeinere Frage zu der OrderSend Funktion:

Wenn der EA die Order aufgibt, wartet er dann bis der Broker eine Ticketnummer oder -1 zurückschickt?

Ja, er wartet. Die Funktion "blockiert" an der Stelle, d.h. das Programm (der Client) hält an, bis vom Server eine Antwort geschickt wurde. Natürlich kann da auch eine negative dabei sein.

Schau Dir mal die Liste an möglichen Fehlern an: http://docs.mql4.com/constants/errors

 

Daher mein Rat: wenn möglich, immer den Fehlercode mitüberprüfen.

  int check;
  check=GetLastError();
  if(check!=ERR_NO_ERROR) 
         Print("Received error code : ",ErrorDescription(check));

Nur wenn der Fehlercode (der zusätzlich zur Ticketnummer mit zurückgeschickt wird) nicht 0 ist bzw. ERR_NO_ERROR (was in diesem Fall dasselbe ist), ist alles glattgegangen.

 

Für die anderen Fälle musst Du eigentlich separate Varianten programmieren. Das haben sie in dem Beispielcode natürlich nicht gemacht, weil der Code schnell unübersichtlich wird bei so vielen if-then-else-Anweisungen.

Metatrader ist dumm, der weiß nicht, was er machen soll, wenn der Server "busy" ist oder der Preis ungültig ist.

Wenn Du willst, dass er in diesen Fällen irgendwas besonderes macht, musst Du das dem EA sagen.

 

 

Wenn ja: Wie lange wartet er?

Falls er wartet: Was ist mit den reinkommenden Ticks während der Wartezeit, werden die einfach ignoriert,

oder geht das so schnell, daß keine Ticks in dieser Zeit passieren?

 

 

Wenn ich weiß, daß die Order aufgegeben wurde, weil ticket>0 ist, heißt das aber nicht, daß die Order auch ausgeführt wurde, oder doch?
The main function used to open a position or place a pending order.

Returns number of the ticket assigned to the order by the trade server or -1 if it fails.

Quelle: http://docs.mql4.com/trading/OrderSend

Zumindest aufgegeben wurde sie. Bei ner Einstopporder heißt ticket!= -1 z.B., dass sie zumindest vom System angenommen wurde und jetzt auf nen Fill wartet. Bei ner Marketorder sollte sie ausgeführt sein, falls Ask+Slippage nicht zu schnell wegwaren, so dass ein Requote nötig wäre.

 

Wenn nein, wo wird in diesem MACD Sample EA denn abgefragt, ob die Order ausgeführt wurde?

total=OrdersTotal();
if(total<1) {

if (MacdCurrent<0 && MacdCurrent>SignalCurrent && 
   MacdPrevious<SignalPrevious &&
   MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && 
   MaCurrent>MaPrevious)
       {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
                 "macd sample",16384,0,Green);
        if(ticket>0)
          {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                 Print("BUY order opened : ",OrderOpenPrice());
          }
        else Print("Error opening BUY order : ",GetLastError()); 
        return(0); 
       }
}

Na ja, direkt wird nicht geprüft, ob die Order gefillt wurde. Ist aber auch egal, denn in der nächsten Runde, wenn in der start-Funktion beim nächsten Tick wieder diese if-Anweisung if (total

 

Sobald die Order aufgegeben wurde, ist Ruhe und die if-Anweisung wird erst wieder beschritten NACH Schließen, Canceln oder ähnlichem. Dann ist nämlich total wieder

Geschrieben

Was man als MT-Neuling vielleicht auch wissen sollte:

In MT gilt "Order == Position".

Eine gesendete MarketOrder _ist_ ausgeführt. Kann sie nicht ausgeführt werden, kriegst du beim senden einen Error (Requote, busy etc). D.h. eine "offene" MarketOrder ist einfach eine offene Position.

Sendest du eine Stoporder und wird diese getriggert, wird sie einfach zu einer MarketOrder und steht damit für eine offene Position.

 

Will man also die aktuellen offenen Positionen wissen, so muss man sich die aktuellen offenen MarketOrders anschauen.

 

Deswegen wird eine Longposition auch nicht mit einer Shortorder geschlossen, sondern durch schließen der LongOrder "die die Position eröffnet hat" geschlossen.

 

hth

Geschrieben
Ansonsten müsstest Du schreiben: "Ask-Stopploss*Point" .

 

Gut, daß Du das erwähnst, das hätte ich nämlich falsch gemacht.

 

Jetzt muß ich nochmal auf das Order absetzen/ausführen kommen. Sorry, wenn ich darauf rumreite.

 

Ich stell mir das jetzt so vor:

Die OrderSend Funktion schickt eine Order zum Broker. Wenn die ankommt ist totals gleich 1 und ticket gleich der Ticketnummer.

 

Jetzt ist es völlig egal, wie lange es dauert, bis die Order tatsächlich ausgeführt wird (bei Limit oder Einstopp kann das ja sehr lange dauern),

es passiert nix, weil eben totals=1 und die if-anweisung nicht durchlaufen wird. (Es passiert natürlich schon etwas, denn der EA besteht ja nicht nur aus dieser if-Anweisung.)

Das ist daher nicht die gleiche Situation, wie bei dem "blockieren" solange man auf Antwort vom Broker wartet.

 

Wenn die Order jetzt ausgeführt wird, weil z.B. der Einstopp-Kurs erreicht wurde, ist aber immernoch totals =1, weil ja noch die Takeprofit-Order

da ist. Der EA geht also weiterhin über die if-Anweisung hinweg.

Also selbst wenn ein weiteres Einstiegssignal käme, würde es nicht zum Absetzen einer weiteren Order kommen, bis die vorhandene Position geschlossen wurde

und die Takeprofitorder dadurch weg ist.

 

Und damit erübrigt sich meine nächste Frage, denn, wenn ich mehrere Positionen aufbauen will, steuere ich das über if(total<Maximum zugelassene Positionen)

 

Gerade gelesen:

In MT gilt "Order == Position".

Ja, das ist eine Umgewöhnung für mich, die mir schwer fällt. In meinem Hirn ist eine geöffnete Order noch lange keine Position.

Für mich ist war bisher eine Order mit Stopploss und Takeprofit = 3 Orders.

Da werde ich jetzt mal länger drüber nachdenken und morgen weiterposten.

Geschrieben
Jetzt ist es völlig egal, wie lange es dauert, bis die Order tatsächlich ausgeführt wird (bei Limit oder Einstopp kann das ja sehr lange dauern),

es passiert nix, weil eben totals=1 und die if-anweisung nicht durchlaufen wird. (Es passiert natürlich schon etwas, denn der EA besteht ja nicht nur aus dieser if-Anweisung.)

Das ist daher nicht die gleiche Situation, wie bei dem "blockieren" solange man auf Antwort vom Broker wartet.

Hier ist wieder zu unterscheiden zwischen "Order ausgeführt" und "order an Broker gesendet". Bei einer MarketOrder ist es das gleiche, sonst nicht.

Was Krümel meinte: Das Programm "steht" bis die OrderSend-Funktion fertig ist und einen Rückgabewert liefert (so wie bei jeder anderen Funktion übrigens auch). Die OrderSend ist "fertig" wenn vom Broker das Signal "Order korrekt übermittelt und hat dieses Ticket..." kommt, oder eben ein Error.

 

Falls die Order korrekt übermittelt wurde, hast du dann (wie du richtig gesagt hast) OrdersTotal()== 1 bis die offene Order geschlossen (händisch oder durch SL oder TP) oder gecancelt wird.

 

Zum "order vs. Position": vergiss einfach den Namen Order und denk dir die OrderSend funktion als "eröffne Position", und du kannst Positionen per Market eröffnen, per Stop oder Limit. Eine Position kann einen SL und einen TP haben und händisch wieder geschlossen werden. (Heißt ja auch OrderClose).

 

hth

Geschrieben

Was ist mit totals wenn eine Limitorder noch nicht ausgeführt wurde?

Falls totals dann = 1, wie kriege ich denn heraus, wieviele ausgeführte Orders und damit geöffnete Positionen ich habe?

 

Ich habe immer totals geschrieben, aber totals ist ja nur die Variable in diesem EA, es muß OrdersTotal() heißen.

Bearbeitet von mh21

Geschrieben
Was ist mit totals wenn eine Limitorder noch nicht ausgeführt wurde?

Fall totals dann = 1, wie kriege ich denn heraus, wieviele ausgeführte Orders und damit geöffnete Positionen ich habe?

 

Folgendes nutz ich, um offene Positionen und Pending Orders zu unterscheiden:

 

#define OT_BUY		1
#define OT_SELL	   2
#define OT_BUYLIMIT   4
#define OT_SELLLIMIT  8
#define OT_BUYSTOP   16
#define OT_SELLSTOP  32

#define OT_TRADES	 3
#define OT_PENDING   60

int OrdersTotalByType(int type)
{
 int result = 0;

 for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
  if (0 != OrderType() & type) result++;
}
 }

 return (result);
}

 

Die Verwendung ist denkbar einfach:

 

// Prüfen, ob es Pending Orders gibt
if (0 == OrdersTotalByType(OT_PENDING)) {
 Print("Keine pending Orders gefunden");
}

// Anzahl der offenen Positionen ausgeben
Print("Offene Positionen: ", OrdersTotalByType(OT_TRADES));

// Anzahl aller Long Trades/Orders ausgeben
Print("Long Positionen/Orders: ", OrdersTotalbyType(OT_BUY | OT_BUYLIMIT | OT_BUYSTOP));

Bearbeitet von Buthus

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.