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?
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
- Perché hai bisogno di usare Sleep()? Non è necessario.
- Devi controllare ResultRetcode() e/o GetLastError() e non (solo) ResultComment().
Mi documenterò su questi
Ma conif(!PositionSelect(Symbol())
perché esegue ancora 2 volte?
- 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
- Perché hai bisogno di usare Sleep()? Non è necessario.
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?
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?
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);
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()?
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.
- www.mql5.com
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); }
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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