Il mio EA fa una doppia entrata - pagina 6

 
doshur:
Qualche aggiornamento dal service desk?
Non ancora.
 
angevoyageur:
Non ancora.

Ciao,

Qualche notizia dal service desk?

 
doshur:

Ciao,

Ancora nessuna notizia dal service desk?

Puoi essere sicuro che pubblicherò la risposta qui se ne avrò una.

Personalmente non sono ancora arrivato a riprodurre il problema.

 

Il mio EA genera il segnale molto lentamente e oggi ha fatto un trade.

Nessun problema con la dimensione del lotto dopo aver usato il nuovo codice, tuttavia non posso confermare che il nuovo codice funziona.

 
doshur:

Il mio EA genera il segnale molto lentamente e oggi ha fatto un trade.

Nessun problema con la dimensione del lotto dopo aver usato il nuovo codice, tuttavia non posso confermare che il nuovo codice funziona.

Ciao doshur,

Nessuna risposta dal ServiceDesk ancora. Comunque il tuo problema mi sta "disturbando" Puoi confermare di avere questo problema di doppi trade su un conto reale e non su un demo? (Non riesco a riprodurre questo problema sul mio conto demo).

Controllando ancora una volta i tuoi post, ho notato questo log:

Forum sul trading, sistemi di trading automatizzati e test di strategie di trading

Il mio EA fa una doppia entrata

(basata sull'ordine #40018327) DEAL2 - Entrata 3

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

2013.12.20 08:35:01 Transazioni '800****': affare #27731691 compra 0.01 EURUSD a 1.36353 fatto (basato sull'ordine #40018326) DEAL 1 - Entrata 3

2013.12.20 08:35:00 Operazioni '800****': scambio comprare 0.01 EURUSD a mercato DEAL2 - Entrata 1

2013.12.20 08:35:00 Trades '800****': scambio acquistare 0.01 EURUSD a mercato piazzato per esecuzione in 313 ms DEAL1 - Entrata 2

2013.12.20 08:35:00 Trades '800****': scambio acquistare 0.01 EURUSD a mercato DEAL1 - Entrata 1

Se ho capito bene, conferma che il problema è che PositionSelect() è ancora falso, mentre viene aperta una nuova posizione. Infatti, si può vedere che 1 operazione dà luogo a 3 entrate, e la seconda operazione viene avviata prima che arrivi la terza entrata per l'operazione 1 (conferma della nuova operazione/posizione).

Per quanto riguarda il workaround con la funzione Sleep(), non sono soddisfatto, perché non c'è modo di sapere quale ritardo usare. Naturalmente più questo ritardo è grande, meno è la possibilità di ottenere un "doppio scambio", ma è ancora possibile. Quindi sto ancora cercando una soluzione migliore.


 
angevoyageur:

Per quanto riguarda il workaround che utilizza la funzione Sleep(), non sono soddisfatto in quanto non c'è modo di sapere quale ritardo utilizzare. Naturalmente più questo ritardo è grande, meno è la possibilità di ottenere un "doppio scambio", ma è ancora possibile. Quindi sto ancora cercando una soluzione migliore.

Scusate se mi sbaglio, visto che sono appena arrivato in questo topic, ma sembra che questo codice possa essere una soluzione migliore del semplice Sleep(), e aiuterebbe a identificare il problema e il reale valore di ritardo necessario:

bool fatalError=false; // atention: declare this as global

....

if (fatalError==false) {
  if (m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) {
    Print("Position opened in ", Symbol());
    int maxTimeout=0;
    while (!PositionSelect(Symbol())) {
       Sleep(100);
       maxTimeout++;
       if (maxTimeout>100) {
          Print("### PositionSelect fatal error!");
          fatalError=true;
          break;
       }
    }
    Print("--> PositionSelect delay=",maxTimeout*100);
    break;
  }
}
 
angevoyageur:

Ciao doshur,

Nessuna risposta dal ServiceDesk ancora. Tuttavia il tuo problema mi "disturba" Puoi confermare di avere questo problema di doppio trade su un conto reale e non su un demo? (Non riesco a riprodurre questo problema sul mio conto demo).

Controllando ancora una volta i tuoi post, ho notato questo log:

Se ho capito bene, conferma che il problema è che PositionSelect() è ancora falso, mentre viene aperta una nuova posizione. Infatti, si può vedere che 1 operazione dà luogo a 3 entrate, e la seconda operazione viene avviata prima che arrivi la terza entrata dell'operazione 1 (conferma della nuova operazione/posizione).

Riguardo al workaround usando la funzione Sleep(), non sono soddisfatto di questo perché non c'è modo di sapere quale ritardo usare. Naturalmente più questo ritardo è grande, meno è la possibilità di ottenere un "doppio trade", ma è ancora possibile. Quindi sto ancora cercando una soluzione migliore.


Sì, sto usando un conto reale
Un'altra operazione effettuata. Nessuna doppia entrata. Forse il mio nuovo codice funziona?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Account Properties - Documentation on MQL5
 
figurelli:

Scusate se mi sbaglio, visto che sono appena arrivato in questo topic, ma sembra che questo codice possa essere un workaround migliore della semplice Sleep(), e aiuterebbe a identificare il problema e il reale valore di ritardo necessario:

Idea interessante. La userò per identificare il problema, ma non mi piace la funzione Sleep() Anche se ognuno è libero di scegliere la sua soluzione.

Grazie.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
angevoyageur:

Idea interessante. La userò per identificare il problema, ma non mi piace la funzione Sleep() Anche se ognuno è libero di scegliere la sua soluzione.

Grazie.

Non c'è di che, questa soluzione è solo un workaround, anche a me non piace Sleep, dato che si perdono dei tick. Probabilmente semafori/flags o anche macchine a stati sarebbero più sicuri/efficienti/eleganti.
 
figurelli:
Sei il benvenuto, questa soluzione è solo un workaround, anche a me non piace Sleep, dato che perderai dei tick. Probabilmente semafori/flags o anche macchine a stati sarebbero più sicuri/efficienti/eleganti.
I miei test con la tua soluzione mostrano che PositionSelect() è a volte vero subito dopo PositionOpen (maxcount=0), o falso (maxcount=1). Quindi c'è ovviamente un ritardo. Sarebbe interessante se qualcuno può testarlo su un conto reale.
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Standard Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Environment State / Account Properties - Documentation on MQL5