Ich habe endlich den Thread gefunden https://www.mql5.com/en/forum/14327
es hat mich 2 Stunden gekostet, diesen Thread zu finden... ist es nicht so, dass EA nicht lange genug schläft und deshalb einen doppelten Eintrag macht?
Ich erinnere mich an jemanden, der das gleiche Problem hatte und xxxx verwenden.
Ich konnte nicht finden, dass Thread, wenn jemand mir helfen kann, das wäre ein großer Dank.
meine Codes wie folgt in On_Tick()
Es sollte 0.01 Lot eingeben, aber stattdessen wird 0.02 Lot eingegeben.
Aus dem Journal
2013.12.20 08:35:01 Trades '800****': deal #27731692 buy 0.01 EURUSD at 1.36354 done(based on order #40018327)
2013.12.20 08:35:01 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 331 ms
2013.12.20 08:35:01 Trades '800****': deal #27731691 buy 0.01 EURUSD at 1.36353 done (based on order #40018326)
2013.12.20 08:35:00 Trades '800****': Umtausch Kauf 0.01 EURUSD am Markt
2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market platziert zur Ausführung in 313 ms
2013.12.20 08:35:00 Trades '800****': Börsenkauf 0,01 EURUSD am Markt
- Dies ist nicht das Protokoll des von Ihnen geposteten Codes (wo sind die Ergebnisse der Print-Anweisung?).
- Warum müssen Sie Sleep() verwenden? Das ist unnötig.
- Wozu brauchen Sie eine Schleife? Sie prüfen nicht einmal die Ursache des Fehlers und korrigieren ihn daher nicht.
- Sie müssen ResultRetcode() und/oder GetLastError() prüfen und nicht (nur) ResultComment().
- Dies ist nicht das Protokoll des von Ihnen geposteten Codes (wo sind die Ergebnisse der Druckanweisung?).
Auf der Registerkarte "Experte" gibt es außer derin EURUSD geöffneten Position keine Ausgabe der Druckanweisung.
- Warum müssen Sie Sleep() verwenden? Das ist unnötig.
- Sie müssen ResultRetcode() und/oder GetLastError() prüfen und nicht (nur) ResultComment().
Ich werde dies nachlesen
Aber mitif(!PositionSelect(Symbol()))
warum wird es trotzdem 2 Mal ausgeführt?
- Dies ist nicht das Protokoll des von Ihnen geposteten Codes (wo sind die Ergebnisse der Druckanweisung?).
Auf der Registerkarte "Experte" gibt es außer derin EURUSD geöffneten Position keine Ausgabe der Druckanweisung.
- Warum müssen Sie Sleep() verwenden? Das ist unnötig.
Der andere Thread scheint das Problem mit sleep zu lösen.
- Sie müssen ResultRetcode() und/oder GetLastError() prüfen und nicht (nur) ResultComment().
Ich werde dies nachlesen
Aber mitif(!PositionSelect(Symbol()))
warum wird es trotzdem 2 Mal ausgeführt?
Ja, es wurde 2 Mal gedruckt >Position in EURUSD eröffnet
Gleiches Problem wie von einem anderen Benutzer berichtet >https://www.mql5.com/en/forum/14327
behoben durch Verwendung von sleep mit 350ms
Mein EA machte 2 andere Geschäfte vor diesem und sind völlig in Ordnung.
Ich denke, wenn mein EA bereits die Verarbeitung der Bestellung beendet hatte und der Makler hat noch zu mir die Handelsdetails zurück und mein EA verarbeitet eine neue Tick verursacht 2 Einträge?
Ja, es wurde 2 Mal gedruckt >Position in EURUSD eröffnet
Gleiches Problem wie von einem anderen Benutzer berichtet >https://www.mql5.com/en/forum/14327
behoben durch Verwendung von sleep mit 350ms
Mein EA machte 2 andere Geschäfte vor diesem und sind völlig in Ordnung.
Ich denke, wenn mein EA hatte bereits die Verarbeitung der Bestellung beendet und der Broker hat noch zu mir die Handelsdetails zurück und mein EA verarbeitet einen neuen Tick verursacht 2 Einträge?
Dies scheint eine mögliche Erklärung zu sein, aber wenn dies der Fall ist, ist es nicht normal. Verwenden Sie den asynchronen Modus? Wenn nicht, muss Ihr EA die Antwort des Servers abwarten und dann erst mit der Verarbeitung des nächsten Ticks fortfahren.
Wenn ich das richtig verstanden habe, ist dies ein zufälliges Problem, das Sie nicht reproduzieren können?
Sie können versuchen, mehr Debug-Informationen zu drucken, indem Sie diese Zeile nach der Deklaration von m_Trade hinzufügen:
m_Trade.LogLevel(LOG_LEVEL_ALL);
Dies scheint eine mögliche Erklärung zu sein, aber wenn dies der Fall ist, ist es nicht normal. Verwenden Sie den asynchronen Modus? Wenn nicht, muss Ihr EA die Antwort des Servers abwarten und erst dann mit der Verarbeitung des nächsten Ticks fortfahren.
Wenn ich es richtig verstehe, ist dies ein zufälliges Problem und Sie können es nicht reproduzieren?
Sie können versuchen, mehr Debug-Informationen zu drucken, indem Sie diese Zeile nach der Deklaration von m_Trade hinzufügen:
Ich verwende die Klasse cTrade. Ist derasynchrone Modus standardmäßig aktiviert?
Schlagen Sie vor, dass ich diesen m_Trade.SetAsyncMode(false)verwende;
Sollte ich dies innerhalb von on_init() einstellen?
Ich verwende die Klasse cTrade. Ist derasynchrone Modus standardmäßig aktiviert?
Schlagen Sie vor, dass ich diesen m_Trade.SetAsyncMode(false)verwende;
Ich sollte dies in on_init() festlegen?
Normalerweise ist es standardmäßig false. Und mit dem Code, den Sie verwenden, muss es false sein.
Was Sie berichtet haben ist "interessant", meiner Meinung nach ist es kein normales Verhalten, und es scheint, dass es irgendwo einen Fehler gibt. Haben Sie die Möglichkeit, einen Beispielcode zu posten, um den Fehler zu reproduzieren? In jedem Fall werde ich dieses Problem untersuchen.
- www.mql5.com
Vielen Dank für die Hilfe zu untersuchen, werde ich meine Vorlage anhängen, wo ich verwendet, um meine EA mit zu entwickeln. Die Sleep() war bei 100ms vor, ich habe gerade aktualisiert, um 800 nach dem Lesen des Threads von einem anderen Benutzer gestartet werden.
//+------------------------------------------------------------------+ //| Template.mq5 | //| doshur | //| http://tradeaud.blogspot.com | //+------------------------------------------------------------------+ #property copyright "doshur" #property link "http://tradeaud.blogspot.com" #property version "1.00" #include <Trade\Trade.mqh> #define ErrCnt 5 //--- Input Parameters input int TP = 50; input int SL = 40; input double LotSize = 0.01; //--- Buffers double MA_Fast[]; double MA_Slow[]; //--- Handles int h_MA_Fast; int h_MA_Slow; //--- Globals double AdjPoints; CTrade m_Trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- h_MA_Fast = iDEMA(Symbol(), 0, 3, 0, PRICE_CLOSE); h_MA_Slow = iDEMA(Symbol(), 0, 5, 0, PRICE_CLOSE); //--- long SymDigits; double SymPoints; SymPoints = SymbolInfoDouble(Symbol(), SYMBOL_POINT); SymDigits = SymbolInfoInteger(Symbol(), SYMBOL_DIGITS); if(SymDigits == 3 || SymDigits == 5) { AdjPoints = SymPoints * 10; } else { AdjPoints = SymPoints; } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- IndicatorRelease(h_MA_Fast); IndicatorRelease(h_MA_Slow); //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(!CopyBufferAsSeries(h_MA_Fast, 0, 0, 3, true, MA_Fast)) return; if(!CopyBufferAsSeries(h_MA_Slow, 0, 0, 3, true, MA_Slow)) return; //--- double Price; ulong SymSpread; int ErrorCount; ErrorCount = 0; SymSpread = SymbolInfoInteger(Symbol(), SYMBOL_SPREAD); m_Trade.SetDeviationInPoints(SymSpread); MqlDateTime sTime; TimeCurrent(sTime); //--- if(!PositionSelect(Symbol())) if(TradeCount(PERIOD_CURRENT) == 0) { // Open BUY Position if(MA_Fast[0] > MA_Slow[0] && MA_Fast[1] < MA_Slow[1]) { // { do { Price = SymbolInfoDouble(Symbol(), SYMBOL_ASK); if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) { Print("Position opened in ", Symbol()); Sleep(800); break; } else { ErrorCount++; Print("Error opening BUY position in ", Symbol(), " - ", m_Trade.ResultComment(), "\n", "Return Code Desc - ", m_Trade.ResultRetcodeDescription()); } if(ErrorCount == ErrCnt) { Print("Error count = ", ErrCnt); } } while(ErrorCount < ErrCnt); } } // Open SELL Position if(MA_Fast[0] < MA_Slow[0] && MA_Fast[1] > MA_Slow[1]) { // { do { Price = SymbolInfoDouble(Symbol(), SYMBOL_BID); if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_SELL, LotSize, Price, 0, 0)) { Print("Position opened in ", Symbol()); Sleep(800); break; } else { ErrorCount++; Print("Error opening SELL position in ", Symbol(), " - ", m_Trade.ResultComment(), "\n", "Return Code Desc - ", m_Trade.ResultRetcodeDescription()); } if(ErrorCount == ErrCnt) { Print("Error count = ", ErrCnt); } } while(ErrorCount < ErrCnt); } } } //--- long Pos_OT, Pos_HT; double Pos_OP; if(PositionSelect(Symbol())) { Pos_OT = PositionGetInteger(POSITION_TIME); Pos_HT = TimeCurrent() - Pos_OT; Pos_OP = PositionGetDouble(POSITION_PRICE_OPEN); Price = PositionGetDouble(POSITION_PRICE_CURRENT); if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { // Take Profit if(Price - Pos_OP >= TP * AdjPoints) { m_Trade.PositionClose(Symbol(), SymSpread); Sleep(800); } // Stop Loss if(Pos_OP - Price >= SL * AdjPoints) { m_Trade.PositionClose(Symbol(), SymSpread); Sleep(800); } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { // Take Profit if(Pos_OP - Price >= TP * AdjPoints) { m_Trade.PositionClose(Symbol(), SymSpread); Sleep(800); } // Stop Loss if(Price - Pos_OP >= SL * AdjPoints) { m_Trade.PositionClose(Symbol(), SymSpread); Sleep(800); } } } //--- } //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester() { //--- //--- } //+------------------------------------------------------------------+ //| Copy Buffer As Series | //+------------------------------------------------------------------+ bool CopyBufferAsSeries(int handle, int buffer, int start, int number, bool asSeries, double &M[]) { //--- if(CopyBuffer(handle, buffer, start, number, M) <= 0) return(false); ArraySetAsSeries(M, asSeries); return(true); //--- } //+------------------------------------------------------------------+ //| Trade Count | //+------------------------------------------------------------------+ int TradeCount(ENUM_TIMEFRAMES TimeFrame) { //--- int Cnt; ulong Ticket; long EntryType; datetime DT[1]; Cnt = 0; if(CopyTime(Symbol(), TimeFrame, 0, 1, DT) <= 0) { Cnt = -1; } else { HistorySelect(DT[0], TimeCurrent()); for(int i = HistoryDealsTotal() - 1; i >= 0; i--) { Ticket = HistoryDealGetTicket(i); EntryType = HistoryDealGetInteger(Ticket, DEAL_ENTRY); if(EntryType == DEAL_ENTRY_IN) if(Symbol() == HistoryDealGetString(Ticket, DEAL_SYMBOL)) { Cnt++; } } } //--- return(Cnt); }
- 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.
Ich erinnere mich an jemanden, der das gleiche Problem hatte und xxxx verwenden.
Ich konnte nicht finden, dass Thread, wenn jemand mir helfen kann, das wäre ein großer Dank.
meine Codes wie folgt in On_Tick()
Es sollte 0.01 Lot eingeben, aber stattdessen wird 0.02 Lot eingegeben.
Aus dem Journal
2013.12.20 08:35:01 Trades '800****': deal #27731692 buy 0.01 EURUSD at 1.36354 done(based on order #40018327)
2013.12.20 08:35:01 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 331 ms
2013.12.20 08:35:01 Trades '800****': deal #27731691 buy 0.01 EURUSD at 1.36353 done (based on order #40018326)
2013.12.20 08:35:00 Trades '800****': Umtausch Kauf 0.01 EURUSD am Markt
2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market platziert zur Ausführung in 313 ms
2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market