|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
EA lässt nur einen offenen Trade im Metatrader 4 zu.
Hallo an diese geniale Trader Gemeinde.
Ich bin einer der neuen aus der letzten Woche. Zuerst mal an alle Profis hier ein großes Lob für die ganzen super Tipps hier im Forum. Da ist ein Anfänger so wie ich es bin sehr froh drüber. Ich trade seit ca. einem Jahr so wie es die Freizeit zulässt mit dem typischen Anfänger Erfolg. Ich habe seit diesem Jahr einige EAs ausprobiert welche mal besser mal überhaupt nicht funktionieren wollten. Ich habe mich versucht mit den ganzen Fachbegriffen und Programmierungen zu beschäftigen und habe letztlich mit etwas Unterstützung den hier aufgeführten EA programmiert. Er funktioniert so gesehen auch schon recht gut und ich bin damit zufrieden. Jedoch lässt er nur 1 offenen Trade im Metatrader 4 zu. Andere Qährungspaare können bei einem offen Teade und verfügbaren Signal nicht öffnen. Ich habe schon einige Beiträge hier im Forum ausprobiert. Aber das will immer noch nicht funktionieren. Ich hoffe es kann mir hier jemand helfen. Grüße an alle hier. QUELLTEXT: void OnTick() { // Erstelle ein Signal string signal=""; // Definition des EA double K0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,0); double D0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,0); double K1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,1); double D1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,1); //Verkaufssignal if ((K0>56)&&(D0>56)) if ((D1>K0)&&(D1<K1)) { signal="Verkaufen"; } //Kaufssignal if ((K0<44)&&(D0<44)) if ((D1<K0)&&(D1>K1)) { signal="Kaufen"; }* // Kaufe 2 Microlot if(signal=="Kaufen" && OrderIsOpen==true) OrderSend(_Symbol,OP_BUY,0.02,Ask,3,Ask-120*_Point,Ask+54*_Point,NULL,0,0,Green); // Verkaufe 2 Mikrolot if(signal=="Verkaufen" && OrderIsOpen==true) OrderSend(_Symbol,OP_SELL,0.02,Bid,3,Bid+120*_Poin t,Bid-54*_Point,NULL,0,0,Red); // Chart Ausgabe fuer das Signal Comment("Das aktuelle Signal ist: ",signal); } |
|
|||
Es ist eben immer besser, wenn der gesamte Code geschrieben wird, weil
ein wichtiges Detail vorenthalten wurde: Wo wird das Flag OrderIsOpen==true gesetzt? Wenn das auf false steht, dann kann auch nur eine Order geöffnet werden. Mal nebenbei: Von der Wortwahl her ist das natürlich nicht logisch zu schreiben, OrderIsOpen==true und dann soll eine Order geöffnet werden, weil OrderIsOpen ja bedeutet, es ist bereits eine Order offen. Besser wäre die Formulierung gewesen: OrderIsOpen==false Das hätte jetzt allerdings nicht das Problem der einmaligen Orderöffnung gelöst. D.h. sollen mehrere Orders geöffnet werden können, dann sollte OrderIsOpen ganz wegfallen. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hi.
Das mit OrderIsOpen=truhe war einer der Versuche in der Hoffnung es würde funktionieren. So wie er jetzt unten steht habe ich Ihn aktuell im Einsatz. Statt OrdersIsOpen steht da OrdersTotal()=0 Aber da lässt er eben nur einen offenen Trade zu. Erst wenn dieser durch TP oder SL geschlossen wurde und ein anderes Paar erhält ein Signal, dann öffnet das andere Paar ein Signal. Lasse ich aber OrdersTotal weg, dann öffnet er immer so lange Trdes bis kein Signal mehr gegeben wird. Das geht im schlimmsten Fall bis ins unendliche. Ich weiß nicht wie ich es eingrenzen kann. Da gibt es doch sicher einen Weg. Bitte. Gruß Peter void OnTick() { // Erstelle ein Signal string signal=""; // Definition des EA double K0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,0); double D0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,0); double K1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,1); double D1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,1); //Verkaufssignal if ((K0>56)&&(D0>56)) if ((D1>K0)&&(D1<K1)) { signal="Verkaufen"; } //Kaufssignal if ((K0<44)&&(D0<44)) if ((D1<K0)&&(D1>K1)) { signal="Kaufen"; }* // Kaufe 2 Microlot if(signal=="Kaufen" && OrdersTotal()==0) OrderSend(_Symbol,OP_BUY,0.02,Ask,3,Ask-120*_Point,Ask+54*_Point,NULL,0,0,Green); // Verkaufe 2 Mikrolot if(signal=="Verkaufen" && OrdersTotal()=0) OrderSend(_Symbol,OP_SELL,0.02,Bid,3,Bid+120*_Poin t,Bid-54*_Point,NULL,0,0,Red); // Chart Ausgabe fuer das Signal Comment("Das aktuelle Signal ist: ",signal); } |
|
|||
Hi.
Stimmt. Das gehört da nicht hin. Das muss beim kopieren des Quellcodes passiert sein. Hast Du eine Lösung für mein Problem? Gruß Peter |
|
||||
Ja, einfache Lösung:
Du lässt es nicht zu, dass mehr als ein Trade offen ist. Nimm "OrdersTotal()==0" aus deinen if-Abfragen, und dann sollte das funktionieren. OrdersTotal() gibt dir alles an was du offen hast, also auch Trades und PendingOrders welche in anderen Symbolen aktiv sind. |
|
|||
Hallo Peter,
Du kannst das schon mit dem bool Flag machen. Nur den musste halt auch irgendwo definierne und ändern. am besten in Kombination mit dem Returnwert der Ordersend(). Also if(signal=="Kaufen" && OrderIsOpen==false){ ticket = OrderSend(...); if (ticket >0 ) OrderIsOpen= true; } Mit dieser Triviallösung würde der EA nur einmal aus diesem Chart handeln. Insoweit wäre das Problem mit verschieden Charts gelöst. Solange das System sauber läuft. Gruß Traumexperte |
|
|||
Hi.
Danke für die schnelle Antwort. Also benötige ich genau Deinen Vorschlag? Oder muss ich da im Detail noch mehr definieren? Muss ich das an einer bestimmten Stelle setzen? Sorry. Bin da noch nicht so fit. Gruß Peter |
|
|||
Hallo Peter,
ob das nun 100% für Dich passt weiss ich nicht. Hängt davon ab was Du vorhast. Und ich übernehme auch keine Gewähr dafür was Du mit dem Codeschnipsel anfängst. Er soll Dir einfach nur helfen zu lernen. Also der Code dient nur zu Ausbildungszwecken. Du musst auf jedenfall noch int ticket und auch Dein bool Flag deklarieren. GGf die Sell Variante anpassen. Du findest schon heraus an welchen Stelle dies zu tun ist. Kleine Hausaufgabe ;-) Gruß TraumExperte Geändert von TraumExperte (18.05.20 um 09:58 Uhr) |
|
||||
Code:
for(int k = OrdersTotal() - 1; k >= 0; k--) if(OrderSelect(k, SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) return; // Eine Order ist für dieses Symbol bereits offen! Du durchsuchst alle Orders (auch PendingOrders) und selektierst sie. Ist das Symbol identisch mit dem aus deinem Chart und die MagicNumber ebenfalls gleich, dann wird keine neue Order in dem Symbol geöffnet, andere Orders können aber durchaus in anderen Symbolen erfolgen. Wichtig: Gib am besten für jeden EA in jedem Symbol eine neue MagicNumber mit. Wenn du z.B. irgendwann einmal 2 Systeme auf dem DAX laufen lässt (eins in M5 und eins in M15 z.B.), dann dient die MagicNumber zum Unterscheiden dieser Orders |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|