Ich bin nicht zu tief in Ihren Code eingedrungen.
Warum RefreshRates und dann für 1 Sekunde schlafen, wenn der Markt sich schnell bewegt, werden die Daten veraltet sein!?
Sie rechnen auf Ticks, nicht auf Balken, so dass 1 Tick einen Auftrag auslösen kann, wenn sich ein MA um einen minimalen Betrag über/unter den anderen bewegt. Wenn sich der folgende Tick (nach dem Sleep) umkehrt, kreuzen sich die MAs wieder und der Auftrag wird geschlossen.
Die Idee ist, einfach in der Schleife zu halten, während die Bedingungen warten, bis die schließen Bedingungen auftreten (Aka die SMA's umschalten) - zugegebenermaßen nicht der beste Weg, dies zu tun, aber eine der billigsten rechnerisch.
Die SMA's schnell bewegen über/unter einander ist eines der Probleme des Codes - aber ich sehe keinen Grund, warum, wenn es derzeit 10 - 15 Pips zwischen den beiden, die ich auf, würde dazu führen, zu schließen? die Bedingungen sind definitiv halten für die while-Schleife, um in der Kontrolle zu bleiben, anstatt sofort springen, um den Abschluss (meine Annahme ist, dass die while-Schleife für den Kauf ignoriert wird, aber nicht den Verkauf - und ich weiß nicht, warum)
Die Idee ist, einfach in der Schleife zu halten, während die Bedingungen warten, bis die schließen Bedingungen auftreten (Aka die SMA's umschalten) - zugegebenermaßen nicht der beste Weg, dies zu tun, aber eine der billigsten rechnerisch.
Die SMA's bewegen sich schnell über/unter einander ist eines der Probleme des Codes - aber ich sehe keinen Grund, warum, wenn es derzeit 10 - 15 Pips zwischen den beiden, die ich auf, würde dazu führen, dass die Schließung? die Bedingungen sind definitiv halten für die while-Schleife, um die Kontrolle zu bleiben, anstatt sofort springen, um die Schließung (meine Annahme ist, dass die while-Schleife für den Kauf ignoriert wird, aber nicht den Verkauf - und ich weiß nicht, warum)
Wenn Sie nur überprüfen, ob ein MA über/unter dem anderen ist, bezweifle ich, dass es normalerweise 10 bis 15 Pips Unterschied ist, es kann 0,1 Pips sein und so kann der nächste Tick es leicht umkehren.
Es ist nur meine Meinung, aber wenn ich mit Crossovers arbeite, glaube ich, dass es am besten ist, nur auf geschlossenen Bars zu berechnen, um zu viele entgegengesetzte Signale zu vermeiden.
Auch in Ihrem Init
int i; total=0; if (OrdersTotal()==0) { total=OrdersTotal(); } else { for (i=1; i<=OrdersTotal(); i++) //--- counter for any trades open on the pair { if (OrderSelect(i-1,SELECT_BY_POS)==true) { if (OrderSymbol()==Symbol()) { if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- with an open buy if the conditions have reversed close on initiation } if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- same with sell } else { total++; //--- if there are open trades yet to be completed add to tally (*) } } } } }
gilt Ihr else nur für das letzte if, d.h. wenn der EA eine offene Verkaufsorder nicht schließt, wird die Gesamtsumme um 1 erhöht. Warum sollten Sie das wollen?
Wenn Sie nur prüfen, ob ein MA über/unter dem anderen liegt, bezweifle ich, dass es normalerweise 10 bis 15 Pips Unterschied sind, es können 0,1 Pips sein und so kann der nächste Tick es leicht umkehren.
Es ist nur meine Meinung, aber wenn ich mit Crossovers arbeite, glaube ich, dass es am besten ist, nur auf geschlossenen Bars zu berechnen, um zu viele entgegengesetzte Signale zu vermeiden
war eine Fehlkalkulation meinerseits in Bezug auf Pips! mein Fehler! Aber der Punkt ist, dass es sicherlich eine Atempause zwischen den beiden gibt, so dass es kein Cross-Over-Signal gibt, das den Verkauf erzwingt. Das Ersetzen des Sleep(1000) durch while (TimeSecond(TimeCurrent)!=59) {Sleep(1000)} würde sicherstellen, dass der Crossover erst beim Schließen der Kerze getestet wird?
Ich habe die OrderClose in der Buy-Sektion entfernt, und die Order wird immer noch geöffnet, wenn sie läuft, und dann mit dem nächsten Pip geschlossen :s
Als Nächstes habe ich OP_BUY und OP_SELL umgeschaltet, und der Verkauf hält wie erwartet, wenn der 6SMA über dem 21SMA liegt - ich warte auf den nächsten Crossover, um zu sehen, was passiert (natürlich teste ich dies vorerst im Minuten-Zeitrahmen)
Es gibt eine Menge zu ändern..... eine Sache, an der man arbeiten muss
Welche Magicnumber haben die Trades, die Ihr EA erstellt?
Warum machen Sie es nicht als externe Eingabevariable, so dass Sie es eine eindeutige Nummer und es ist nicht schließen Trades anderen EA's machen können
int init() { //---- int i; total=0; if (OrdersTotal()==0) { total=OrdersTotal(); }
was hier passiert...
for (i=1; i<=OrdersTotal(); i++) //--- counter for any trades open on the pair { if (OrderSelect(i-1,SELECT_BY_POS)==true) { if (OrderSymbol()==Symbol()) { if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose( OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- with an open buy if the conditions have reversed close on initiation } if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(O rderTicket(),OrderLots(),OrderClosePrice(),0,Green); //--- same with sell } else { total++; //--- if there are open trades yet to be completed add to tally (*) } } }
Zählen Sie nicht die zu prüfenden Trades auf, es wird fehlschlagen, wenn Sie Trades innerhalb der Schleife schließen, wie Sie es jetzt tun
Werfen Sie einen Blick hier, um zu sehen, warum Sie arbeiten müssen und wie das Herunterzählen
https://www.mql5.com/en/forum/139654
(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)
diese Bedingung kann sich mehrmals in wenigen Augenblicken ändern, wenn ein neuer Tick in jedem Handel kommt, den Sie Spread bezahlen
Bedingung ist nicht immer ändern einmal ....auf einen einzigen bar
while (AccountBalance()>50) //---- ensures an infinite loop for 1 trade a run { //---- (no infibuying!) (*) but always run //----
was immer läuft, lassen Sie es schlafen
und wenn der Tick fertig ist und ein neuer Tick kommt, wird wieder start() aufgerufen
while (TimeSeconds(TimeCurrent())!=0) //---wait until a new minute { Sleep(1000); } continue; }
auf diese Weise wird der Code nur dann ausgeführt, wenn die Sekunde 0 ist, was oft nicht funktioniert
weil es oft vorkommen kann, dass in einer Sekunde kein neuer Tick kommt
wenn der erste Tick der Minute bei 1 Sekunde kommt, müssen Sie auf die neue Minute warten und hoffen, dass der neue Tick bei Sekunde 0 der nächsten Minute kommt
Prüfen Sie die Funktion RefreshRates()
es gibt noch mehr Dinge, wie z.B. dass es sowohl mit 4- als auch mit 5-stelligen Brokern funktioniert
Überprüfung der Returncodes....
Slippage Ihr Wert 0 warum ist es notwendig??? um es größer zu haben
Es gibt eine Menge zu ändern..... eine Sache, an der man arbeiten muss
Welche Magicnumber haben die Trades, die Ihr EA erstellt?
Warum machen Sie es nicht als externe Eingabevariable, so dass Sie es eine eindeutige Nummer und es ist nicht schließen Trades anderen EA's machen können
was hier passiert...
Zählen Sie nicht die zu prüfenden Trades auf, es wird fehlschlagen, wenn Sie Trades innerhalb der Schleife schließen, wie Sie es jetzt tun
Werfen Sie einen Blick hier, um zu sehen, warum Sie arbeiten müssen und wie das Herunterzählen
https://www.mql5.com/en/forum/139654
diese Bedingung kann sich mehrmals in wenigen Augenblicken ändern, wenn ein neuer Tick in jeden Handel kommt, den Sie als Spread bezahlen
Bedingung ist nicht immer ändern einmal ....auf einen einzigen bar
was immer läuft, lassen Sie es schlafen
und wenn der Tick fertig ist und ein neuer Tick kommt, wird wieder start() aufgerufen
auf diese Weise wird der Code nur dann ausgeführt, wenn die Sekunde 0 ist, was oft nicht funktioniert
weil es oft vorkommen kann, dass in einer Sekunde kein neuer Tick kommt
wenn der erste Tick der Minute bei 1 Sekunde kommt, muss man auf die neue Minute warten und hoffen, dass der neue Tick bei Sekunde 0 der nächsten Minute kommt
Prüfen Sie die Funktion RefreshRates()
es gibt noch mehr Dinge, wie z.B. dass es sowohl mit 4- als auch mit 5-stelligen Brokern funktioniert
Überprüfung der Returncodes....
Slippage Ihr Wert 0 warum ist es notwendig??? um es größer zu haben
Also, ich gestrippt zurück den Code in den einfachsten Kapazitäten (dh Crossover = Reverse-Positionen) laufen - seine verursacht viele kaufen/verkaufen Aufträge, wenn die beiden SMAs nahe sind, aber Im nicht besorgt über das (für jetzt) und läuft gut auf einem Demo-Konto. Was ist jetzt über mich ist, wenn ich meinen Code auf der Strategie-Tester laufen, öffnet es die erste Position richtig, aber dann nicht nach vorne Zeit weise zu bewegen, so dass die SMAs nie überqueren. Was mache ich falsch? Meine Druckliste lautet:
2013.10.22 23:41:26 2013.09.18 00:41 Tester: Auftrag #1 ist geschlossen
2013.10.22 23:41:26 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
...
2013.10.22 23:40:53 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
2013.10.22 23:40:52 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
2013.10.22 23:40:51 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0
2013.10.22 23:56:18 SMACode3 GBPJPY,M1: erfolgreich geladen
Code:
//+------------------------------------------------------------------+ //| SMA scripy.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern int z=1234; int total; //---- //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int init() { //---- int i; total=0; if (OrdersTotal()!=0) { for (i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS)) { if (OrderSymbol()==Symbol()) { if (OrderMagicNumber()==z) { if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); } if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0))) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); } else { total++; } } } } } } //---- return; } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int start() { //---- int i,L; while (AccountBalance()>50) { RefreshRates(); //----- double SMA6=iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0); double SMA21=iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0); double RSI70=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70; double RSI30=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30; //----- if (IsTesting()==true) { Sleep(60000); Print(GetLastError()); } //---- if (total==0) { if ((RSI70)&&(SMA6>SMA21)) { OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,"",z,0,Red); total+=1; continue; } if ((RSI30)&&(SMA6<SMA21)) { OrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue); total+=1; continue; } } //--- if (total!=0) { L=0; for (i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS)) { if (OrderSymbol()==Symbol()) { if (OrderMagicNumber()==z) { if ((OrderType()==OP_BUY)&&(SMA6<SMA21)) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); total+=-1; return; } if ((OrderType()==OP_SELL)&&(SMA6>SMA21)) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green); total+=-1; return; } else { L++; } } total=L; } } } } //---- } //---- return; } //--------------------------------------------------------------+
int start(){ while (AccountBalance()>50){ :
Nein, natürlich nicht. RTFM. Du bekommst nur ein neues Häkchen, wenn du vom Start zurückkehrst.if (IsTesting()==true){ Sleep(60000); Print(GetLastError()); }
RTFM & Einschränkungen des Testers Sie können NICHT im Tester schlafenOrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue); OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);
Was sind Funktionsrückgabewerte? Wie kann ich sie verwenden? - MQL4-Forum
- 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.
Also ich lerne mql4 nach ein paar anderen Sprachen, und ich (oder so dachte ich) gerade fertig die erste Version meines ersten EA, eine einfache gleitenden Durchschnitt Trader. Ich ließ es laufen während gestern ohne Bedenken, Eintritt und Austritt waren wie erwartet, und ich dachte, es war bereit zu gehen. Heute Morgen bin ich auf alle möglichen Probleme gestoßen, zunächst würde der Code, wenn ich ihn wiederholte, unabhängig von der Position nur verkaufen, und jetzt, nach ein wenig Fummelei, kauft und verkauft er in den richtigen Positionen, ABER wenn er kauft, wird der Handel beim nächsten Tick geschlossen, egal. Das passiert nicht, wenn ich verkaufe, obwohl ich das gleiche Format habe - kann mir jemand sagen, woran das liegt?
(Als Randbemerkung, mein Computer war in der Lage, den Code den ganzen Tag gestern ohne viel mehr von einem Brummen (CPU durchschnittlich 12%) heute seine gehen wie Höllenglocken, um den Code (~60-90%) laufen)
Code: