Mein EA macht einen doppelten Eintrag

 

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

if(!PositionSelect(Symbol()))
            do
            {
               Price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);

               if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0))
               {
                  Print("Position opened in ", Symbol());
                  Sleep(100);

                  break;
               }
               else
               {
                  ErrorCount++;

                  printf("Error opening BUY position in %s : '%s'", Symbol(), m_Trade.ResultComment());
               }

               if(ErrorCount == ErrCnt)
               {
                  Print("Error count = ", ErrCnt);
               }
            }
            while(ErrorCount < ErrCnt);

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

 

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?

Problem: Multiple Trades at brokerX
Problem: Multiple Trades at brokerX
  • www.mql5.com
Problem: Multiple Trades at brokerX.
 
doshur:

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.

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?

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

Ok, es wird also 2 mal gedruckt oder nicht ?

Der andere Thread scheint das Problem mit sleep zu lösen.

Was auflö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?

Wir versuchen, die Antwort zu finden. Tritt dieses Problem jedes Mal auf, wenn Sie eine Position öffnen?
 

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?

Problem: Multiple Trades at brokerX
Problem: Multiple Trades at brokerX
  • www.mql5.com
Problem: Multiple Trades at brokerX.
 
doshur:

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);
 
angevoyageur:

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?

 
doshur:

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.

Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 

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);
  }
 
Danke, ich lasse Sie wissen, wenn ich etwas finde.