Il mio EA fa una doppia entrata

 

Mi ricordo che qualcuno ha avuto lo stesso problema e usa xxxx.

Non sono riuscito a trovare quel thread, se qualcuno può aiutarmi sarebbe un grande grazie.

i miei codici come segue 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);

Dovrebbe inserire il lotto 0.01 ma invece ha inserito il lotto 0.02.

Dal diario

2013.12.20 08:35:01 Trades '800****': affare #27731692 compra 0.01 EURUSD a 1.36354 fatto(basato sull'ordine #40018327)

2013.12.20 08:35:01 Trades '800****': scambio comprare 0.01 EURUSD a mercato piazzato per esecuzione in 331 ms

2013.12.20 08:35:01 Trades '800****': affare #27731691 comprare 0.01 EURUSD a 1.36353 fatto (basato sull'ordine #40018326)

2013.12.20 08:35:00 Trades '800****': scambio acquistare 0.01 EURUSD a mercato

2013.12.20 08:35:00 Trades '800****': scambio acquisto 0.01 EURUSD a mercato piazzato per l'esecuzione in 313 ms

2013.12.20 08:35:00 Trades '800****': scambio acquisto 0.01 EURUSD a mercato

 

Ho finalmente trovato il thread https://www.mql5.com/en/forum/14327

mi ci sono volute 2 ore solo per trovare quel thread... comunque non è EA che non dorme abbastanza a lungo che è il motivo per cui fa una doppia entrata?

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

Mi ricordo che qualcuno ha avuto lo stesso problema e usa xxxx.

Non sono riuscito a trovare quel thread, se qualcuno può aiutarmi sarebbe un grande grazie.

i miei codici come segue in On_Tick()

Dovrebbe inserire il lotto 0.01 ma invece ha inserito il lotto 0.02.

Dal diario

2013.12.20 08:35:01 Trades '800****': affare #27731692 compra 0.01 EURUSD a 1.36354 fatto(basato sull'ordine #40018327)

2013.12.20 08:35:01 Trades '800****': scambio comprare 0.01 EURUSD a mercato piazzato per esecuzione in 331 ms

2013.12.20 08:35:01 Trades '800****': affare #27731691 comprare 0.01 EURUSD a 1.36353 fatto (basato sull'ordine #40018326)

2013.12.20 08:35:00 Trades '800****': scambio acquistare 0.01 EURUSD a mercato

2013.12.20 08:35:00 Trades '800****': scambio acquisto 0.01 EURUSD a mercato piazzato per l'esecuzione in 313 ms

2013.12.20 08:35:00 Trades '800****': scambio acquisto 0.01 EURUSD a mercato

  • Questo non è il log del codice che hai postato (dove sono i risultati dell'istruzione Print?).
  • Perché hai bisogno di usare Sleep()? Non è necessario.
  • Perché hai bisogno di un ciclo? Non controlli nemmeno il motivo dell'errore, e quindi non lo correggi.
  • Devi controllare ResultRetcode() e/o GetLastError() e non (solo) ResultComment().
 
  • Questo non è il log del codice che hai postato (dove sono i risultati dell'istruzione di stampa?).

Sotto la scheda esperto, non c'è alcun output dall'istruzione di stampa oltre allaposizione aperta in EURUSD

L'altro thread sembra risolverlo usando Sleep
  • Devi controllare ResultRetcode() e/o GetLastError() e non (solo) ResultComment().

Mi documenterò su questi

Ma conif(!PositionSelect(Symbol())

perché esegue ancora 2 volte?

 
doshur:
  • Questo non è il log del codice che hai postato (dove sono i risultati dell'istruzione di stampa?).

Sotto la scheda esperto, non c'è alcun output dall'istruzione di stampa oltre allaposizione aperta in EURUSD

Ok, quindi viene stampato 2 volte o no?

L'altro thread sembra risolverlo usando Sleep

Risolvere cosa?
  • Devi controllare ResultRetcode() e/o GetLastError() e non (solo) ResultComment().

Mi documenterò su questi

Ma conif(!PositionSelect(Symbol())

perché esegue ancora 2 volte?

Stiamo cercando di trovare la risposta. Questo problema si verifica ogni volta che si apre una posizione?
 

Sì, ha stampato 2 volte >Posizione aperta in EURUSD

Stesso problema riportato da un altro utente >https://www.mql5.com/en/forum/14327

risolto usando lo sleep con 350ms

Il mio EA ha fatto altri 2 trade prima di questo e sono perfettamente a posto.

Sto pensando se il mio EA aveva già finito di elaborare l'ordine e il broker deve ancora restituirmi i dettagli del trade e il mio EA ha elaborato un nuovo tick causando 2 entrate?

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

Sì, ha stampato 2 volte >Posizione aperta in EURUSD

Stesso problema riportato da un altro utente >https://www.mql5.com/en/forum/14327

risolto usando lo sleep con 350ms

Il mio EA ha fatto altri 2 trade prima di questo e sono perfettamente a posto.

Sto pensando se il mio EA aveva già finito di elaborare l'ordine e il broker deve ancora restituirmi i dettagli del trade e il mio EA ha elaborato un nuovo tick causando 2 entrate?

Questa sembra una possibile spiegazione, ma se è il caso non è normale. Stai usando la modalità asincrona? Se no, il tuo EA deve aspettare la risposta del server e poi solo continuare ed elaborare il prossimo tick.

Se ho capito bene questo è un problema casuale e non puoi riprodurlo?

Puoi provare a stampare più informazioni di debug aggiungendo questa linea dopo la dichiarazione di m_Trade :

m_Trade.LogLevel(LOG_LEVEL_ALL);
 
angevoyageur:

Questa sembra una possibile spiegazione, ma se è il caso non è normale. Stai usando la modalità asincrona? Se no, il tuo EA deve aspettare la risposta del server e poi solo continuare ed elaborare il prossimo tick.

Se ho capito bene questo è un problema casuale e non puoi riprodurlo?

Puoi provare a stampare più informazioni di debug aggiungendo questa linea dopo la dichiarazione di m_Trade:

Sto usando la classe cTrade. Lamodalità asincrona èattiva di default?

mi suggerisci di usare questo m_Trade.SetAsyncMode(false);

Dovrei impostare questo all'interno di on_init()?

 
doshur:

Sto usando la classe cTrade. Lamodalità asincrona èattiva per impostazione predefinita?

mi suggerite di usare questo m_Trade.SetAsyncMode(false);

Dovrei impostare questo all'interno di on_init()?

Normalmente è false di default. E con il codice che stai usando deve essere false.

Quello che hai riportato è "interessante", secondo me non è un comportamento normale, e sembra che ci sia un bug da qualche parte. Hai la possibilità di postare un codice di esempio per riprodurre l'errore? In ogni caso indagherò su questo problema.

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.
 

Grazie per l'aiuto ad indagare, allego il mio template con cui ho sviluppato il mio EA. Lo Sleep() era a 100ms prima, l'ho appena aggiornato a 800 dopo aver letto il thread iniziato da un altro utente.

//+------------------------------------------------------------------+
//|                                                     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);
  }
 
Grazie ti faccio sapere se trovo qualcosa.