|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Zitat:
Such den Fehler in deinem EA. Ende April habe ich dir den ganzen EA so geschickt, dass er funktioniert. Schau doch das mal an. |
|
|||
Hat der in nem Demo-Konto pausenlos Orders offen gehabt oder nur im Strategietester/Backtest?
|
|
|||
ja, hat er, in einem Demokonto bei JFD.
|
|
|||
Ganz sicher? Hin und wieder hat er auch bei meinen Demo-Tests nach einer Gewinn-Order sofort wieder die Nächste in die selbe Richtung geöffnet, so wie er es eigentlich immer tun soll. Dann wieder dauerts oft 10-20 Min, manchmal über ne halbe Stunde. Mir fiel auf, dass er dann meistens erst zur vollen Stunde die nächste Order öffnet.
Zu diesen Fehler-Codes: Der EA selbst kann doch bei den Meisten sowieso nix selber machen. Ausser bei IsTradeAllowed() und IsTradeContextBusy(), wo man ihn dann halt kurz mit Sleep() warten lassen kann, gibts doch für die ganzen anderen Fehler keinen Weg, das jeweilige Problem vom EA alleine lösen zu lassen oder doch? |
|
|||
Wenn du sauber programmieren willst, solltest auf jeden Fall Fehler abfangen und deinen EA entsprechend reagieren lassen. Es gibt jede Menge mögliche Fehler.
Das sind nur die Fehler, die der Trade Server zurückgeben kann (aus stderror.mqh): Code:
//--- errors returned from trade server #define ERR_NO_ERROR 0 #define ERR_NO_RESULT 1 #define ERR_COMMON_ERROR 2 #define ERR_INVALID_TRADE_PARAMETERS 3 #define ERR_SERVER_BUSY 4 #define ERR_OLD_VERSION 5 #define ERR_NO_CONNECTION 6 #define ERR_NOT_ENOUGH_RIGHTS 7 #define ERR_TOO_FREQUENT_REQUESTS 8 #define ERR_MALFUNCTIONAL_TRADE 9 #define ERR_ACCOUNT_DISABLED 64 #define ERR_INVALID_ACCOUNT 65 #define ERR_TRADE_TIMEOUT 128 #define ERR_INVALID_PRICE 129 #define ERR_INVALID_STOPS 130 #define ERR_INVALID_TRADE_VOLUME 131 #define ERR_MARKET_CLOSED 132 #define ERR_TRADE_DISABLED 133 #define ERR_NOT_ENOUGH_MONEY 134 #define ERR_PRICE_CHANGED 135 #define ERR_OFF_QUOTES 136 #define ERR_BROKER_BUSY 137 #define ERR_REQUOTE 138 #define ERR_ORDER_LOCKED 139 #define ERR_LONG_POSITIONS_ONLY_ALLOWED 140 #define ERR_TOO_MANY_REQUESTS 141 #define ERR_TRADE_MODIFY_DENIED 145 #define ERR_TRADE_CONTEXT_BUSY 146 #define ERR_TRADE_EXPIRATION_DENIED 147 #define ERR_TRADE_TOO_MANY_ORDERS 148 #define ERR_TRADE_HEDGE_PROHIBITED 149 #define ERR_TRADE_PROHIBITED_BY_FIFO 150 Nach Order-Eröffnung z.B. so: Code:
if(Ticketnummer == -1) { FehlerCode = GetLastError(); string FehlerBeschreibung = ErrorDescription(FehlerCode); string FehlerAusgabe = StringConcatenate(FehlerCode," ",FehlerBeschreibung); Print(FehlerAusgabe); } |
|
|||
Hallo.
Kann man den EA rausfinden lassen, ob der Server momentan überhaupt Orders an nimmt? Ich meine nicht IsTradeContextBusy() oder IsTradeAllowed(). Der EA soll prüfen, ob der Broker gerade generell Orders ausführt und wenn nicht, es von Zeit zu Zeit wieder prüfen. Wenn ja, soll der EA seine Orders senden wie sonst auch. |
|
|||
Warum verwendest du so oft Sleep? Und warum so eine hohe Preisabweichung? Slippage=99999999;
Empfohlen wird hier meist 3 für Slippage: https://docs.mql4.com/trading/ordersend |
|
|||
Moin.
Gibt wohl keine Möglichkeit, rauszufinden, ob der Broker gerade überhaupt Orders an nimmt oder nicht. Oder geht das vielleicht über Pending-Orders? Wenn er die annimmt, kann man sie ja gleich wieder löschen und dann die eigentlichen Markt-Orders raus schicken. Anfängerfrage:Kann man eigentlich mehrere Orders auf einmal auswählen und vergleichen? Oder geht es nur mit mehreren Schleifen? Code:
extern string esMOBSC1="Max Orders"; extern string esMOBSC2="Sell / Buy"; extern string esMOBSC3="concurrently"; extern int MOBSC_Def=0; // Default Wert extern int MOBSC_Sel=0; // Start-Werte. extern int MOBSC_Buy=0; // Werden gleich nach OrderSend mit "++" erhöht. extern int MOBSC_Max_Sel=2; extern int MOBSC_Max_Buy=2; Code:
extern double Def_Lots=0.01; extern double LotsSel=0.01; extern double LotsBuy=0.01; extern string esLPOCP1="Lots Buy / Lots Sell"; extern string esLPOCP2="+ LotsPlus"; extern string esLPOCP3="if Order close"; extern string esLPOCP4="with Profit"; extern double LotsPlus=0.01; Code:
for(int j=OrdersTotal()-1;j>=0;j--){ if(OrderSelect(j,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_Sel){ if( CLsel_D < OrderOpenPrice() ){ if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(Sl_MS); LotsSel = OrderLots() + LotsPlus; if(MOBSC_Sel>=MOBSC_Max_Sel){ for(int k=OrdersTotal()-1;k>=0;k--){ if(OrderSelect(k,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_Buy){ if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(Sl_MS); MOBSC_Sel=MOBSC_Def; MOBSC_Buy=MOBSC_Def; LotsSel=Def_Lots; LotsBuy=Def_Lots; } } } } } } } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Die eigentliche Buy-Order auswählen: for(int l=OrdersTotal()-1;l>=0;l--){ if(OrderSelect(l,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_Buy){ if( CLbuy_D > OrderOpenPrice() ){ if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(Sl_MS); LotsBuy = OrderLots() + LotsPlus; if(MOBSC_Buy>=MOBSC_Max_Buy){ for(int m=OrdersTotal()-1;m>=0;m--){ if(OrderSelect(m,SELECT_BY_POS)){ if(OrderSymbol()==Symbol()){ if(OrderMagicNumber()==MN_Sel){ if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red); if(IsTradeContextBusy()==true)Sleep(Sl_MS); MOBSC_Sel=MOBSC_Def; MOBSC_Buy=MOBSC_Def; LotsSel=Def_Lots; LotsBuy=Def_Lots; } } } } } } } } } } |
|
|||
Zum Prinzip noch mal kurz:
Es sollen im selben Symbol eine Sell und auch eine Buy-Order geöffnet werden. Wenn Eine davon einen bestimmten Gewinn erreicht, wird sie geschlossen. Die Order der anderen Richtung bleibt offen. Gleich nach dem Schließen der Gewinn-Order soll eine Weitere mit dem selben Gewinn-Ziel, aber mehr Lot raus geschickt werden. Erreicht diese auch wieder ihr Gewinn-Ziel, soll sie und auch die Verlust-Order geschlossen werden. Wenns gut läuft, holen die beiden Gewinn-Orders die Spreads, Verlust der Verlust-Order und ein paar Pipen Gewinn. Nicht viel, es geht aber auch nicht darum, dick abzustauben. Sondern mit kleinem Risiko immer wieder ein paar Pipen Gewinn zu machen. Das Gute ist eben, dass es egal ist, in welche Richtung das Symbol() geht. Hauptsache es ist genug Bewegung drin, um immer wieder, wenn auch kleine, Gewinne bei möglichst kleinem Risko zu machen. Ich probiere im Demo-Konto schon seit weiß ich wie lange rum. Wäre der EA ständig mit Sells und Buys investiert, wie er soll, würde es gut laufen. Aber er braucht immer wieder lange, um die nächste Order zu öffnen. Also hab ich die Version 4 gemacht, die derzeit höchstens 2 Orders nacheinander in die selbe Richtung schickt, nach der 1. Gewinn-Order die Lots erhöht, nach der 2. Gewinn-Order Alles schließt und auf Anfangswerte zurück setzt. Aber auch da gibts immer wieder lange "Pausen". Bei AdmiralMarkets, JFD und ActivTrades. Backtests sind nur gut, um zu prüfen, ob das Ding überhaupt macht, was es soll. Apropo, die Version im Anhang hab ich noch gar nicht getestet. |
Lesezeichen |
|
|