Jump to content
Tom Next - Daytrading Community

Recommended Posts

Posted

Hi,

 

zu1. Die Addieremich Funktion steht nicht in der Startfunktion, weil nicht eine Funktion innerhalb einer anderen stehen kann.

Die Antwort glaube ich mir eigentlich selbst nicht.

Jein. Man muss unterscheiden zwischen der Deklaration/Definition einer Funktion (also dort wo du dem Compiler sagst was die Funktion tut) und den Funktionsaufrufen.

Definiert wird eine Funktion nur einmal im Code, und das kann nicht innerhalb einer anderen Funktion geschehen. Aufgerufen wird sie dann innerhalb anderer Funktionen.

 

zu2. Vor oder nach der deinit - habe keine eigene Antwort.

Wo die Definition im Code steht ist bei MQL völlig egal.

 

zu3. Der Rückgabewert einer Funktion kann nicht direkt in einer Printanweisung benutzt werden, deshalb der Umweg über eine Variable x

Der Rückgabewert kann durchaus direkt an eine Printanweisung übergeben werden, ich glaube hier war es lediglich zu Demonstrationszwecken. (Es ist ja auch nicht unbedingt sinnvoll eine eigene Funktion zu definieren die nur addiert ;)

 

zu5. Sie gibt nicht automatisch etwas zurück, deshalb ist die Frage "an wen" falsch gestellt. Es ist einfach das Ergebnis und wenn man z.B. durch

eine Variable darauf zurückgreift, erhält die Variable das, was in den Klammern nach "return" steht. Wenn aber eine Funktion nicht wirklich etwas ausrechnet

und auch sonst kein ein "Ergebnis" hat, welches man im Programm weiterverwenden möchte, beendet man sie mit return(0).

stimmt teils. Eine Funktion gibt nicht automatisch etwas zurück sondern nur wenn man es explizit per "return( )" Anweisung vorschreibt.

Wenn eine Funktion nichts ausrechnet und damit kein wirklicher Rückgabewert existiert, sollte diese als "void" deklariert werden.

 

Warum in void-Funktionen trotzdem return(0):

Es zählt mit unter zum "schönen" programmieren, eine Funktion nicht einfach am Ende des Funktionsblocks "sterben" zu lassen, sondern "definiert" per return zu beenden. In c kann man return ohne Wert für void-Funktionen machen, in MQL geht das AFAIK nicht weswegen man auf "return(0)" zurückgreift.

 

Liege ich mit meinen Antorten wenigstens auf dem richtigen Weg?

ja, definitiv :blink:

Posted

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.

Posted
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)

Posted

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?

Posted
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.

Posted
[...]

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:.

Posted
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.
Posted

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.

Posted

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 $ ??

Posted
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.

Posted
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.

Posted
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.

Posted

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.

Posted
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.

Posted
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:

Posted
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:

Posted
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

Posted
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

Posted

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.

Posted
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

Posted

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

Posted
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.

Posted
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

Posted (edited)

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.

Edited by mh21

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...