Il mio EA fa una doppia entrata - pagina 5

 
Klammeraffe:

La linea riguardante "ogni tick" potrebbe essere il motivo per cui non succede più.

La funzione viene eseguita solo quando appare una nuova barra. Quindi, molto probabilmente, solo il primo tick di una barra può eseguire un trade. Dopo la prima barra, il codice ottiene un 'ritorno' finché non appare una nuova barra. Forse questo mi ha risolto il problema.

Penso che questo pezzo di codice provenga dagli articoli:

Questo è un altro work around ma se c'è qualche errore di ritorno dal broker o da qualche altra parte, il vostro segnale non è più valido a meno che non manteniate un ciclo per controllare ancora e ancora.
 
doshur:
  • Il codice postato inizialmente da doshur, può spiegare perché può vedere nel suo log "Position opened in..." mentre nessun trade è stato aperto. Questo perché, anche se PositionOpen() restituisce true, non significa che sia stato piazzato un trade,vedi documentazione. Ma non può spiegare perché è stato piazzato un trade "doppio".
correzione. C'è un doppio"Posizione aperta in..." e sono state aperte 2 operazioni.
Naturalmente. Voglio dire "perché ha potuto vedere ...". Il punto qui è che non c'è niente nel tuo codice che possa spiegare perché hai ottenuto questi 2 trade.
 
angevoyageur:
Naturalmente. Voglio dire "perché ha potuto vedere...". Il punto qui è che non c'è niente nel tuo codice che possa spiegare perché hai ottenuto questi 2 scambi.
Ok. Capire.
 
angevoyageur:

Penso che sia molto importante trovare la ragione dietro questo problema, naturalmente è anche importante avere un workaround (Sleep ?) fino a quando non possiamo capire completamente cosa sta succedendo. Quindi provo a riassumere la situazione:

* Quando si usa il metodo PositionOpen della classe CTrade, almeno 3 utenti hanno ottenuto, in un certo momento, 2 operazioni nella stessa direzione invece di 1, con il risultato di una posizione con un volume raddoppiato rispetto a quello previsto.

Uso entrambi i metodi, per aprire una nuova posizione = "vecchia maniera", modificando lo stoploss = "CTrade class".


* Questo problema sembra verificarsi sullo stesso broker, con un simbolo in cui è attivato Depth of Market (gli interessati possono confermarlo per favore).

Sì, il server del broker X, Depth of Market è attivato.


* Questo problema si verifica con l'ordine sincrono, l'ordine asincrono non è stato usato (per favore confermate).

Sì, l'ordine asincrono non è stato usato.


* Il problema si verifica casualmente.

Sì, ma solo durante le ore di mercato intenso( eventimacroeconomici ).



 

Secondo me questo problema può essere facilmente risolto.


L'EA deve sempre aspettare una risposta/risposta se viene utilizzata la funzione "PositionSelect(Symbol())" e il terminale ha aggiornato i dati della funzione, prima di poter riprendere l'esecuzione del codice.

L'EA deve sempre aspettare una risposta/risposta se viene utilizzata la funzione "OrderSend(mrequest,mresult)" e il terminale ha aggiornato i dati della funzione, prima di poter riprendere l'esecuzione del codice.


Cito anche il terminale stesso perché i dati della funzione saranno copiati nel terminale e anche questo richiederà un po' di tempo.

In questo modo la dimensione della posizione corrente sarà sempre calcolata correttamente, quindi il doppio ordine non avrà più luogo.


Cosa ne pensate?

 
snelle_moda:

Secondo me questo problema può essere facilmente risolto.


L'EA deve sempre aspettare una risposta/risposta se viene utilizzata la funzione "PositionSelect(Symbol())" e il terminale ha aggiornato i dati della funzione, prima di poter riprendere l'esecuzione del codice.

L'EA deve sempre aspettare una risposta/risposta se viene usata la funzione "OrderSend(mrequest,mresult)" e il terminale ha aggiornato i dati della funzione, prima di poter riprendere l'esecuzione del codice.


Cito anche il terminale stesso perché i dati della funzione saranno copiati nel terminale e anche questo richiederà del tempo.

In questo modo la dimensione della posizione corrente sarà sempre calcolata correttamente, quindi il doppio ordine non avrà più luogo.


Cosa ne pensate?

Non sono sicuro di cosa intendi per "aspettare sempre una risposta...". ?

Comunque ho compilato una richiesta al ServiceDesk per chiedere un consiglio. Vedremo.

 
angevoyageur:

Non sono sicuro di cosa intendi per "aspettare sempre una risposta..." ?

Comunque ho compilato una richiesta al ServiceDesk per chiedere consiglio. Vedremo.

"Non sono sicuro di cosa intendi per "aspettare sempre una risposta...". ?"


L'EA dovrebbe aspettare/stop fino a quando la funzione PositionSelect(Symbol()) non ha completato la copia dei dati su una posizione nell'ambiente del programma.

Vedila come una funzione sleep() forzata.

 
snelle_moda:

"Non sono sicuro di cosa intendi per "aspettare sempre una risposta..." ?"


L'EA dovrebbe aspettare/stop fino a quando la funzione PositionSelect(Symbol()) non ha completato la copia dei dati su una posizione nell'ambiente del programma.

Vedila come una funzione sleep() forzata.

Ok capito. Ma non posso essere soddisfatto di una tale soluzione, o c'è qualcosa che non capiamo o c'è un bug da qualche parte.
 
Spero solo che ci sia una soluzione.

Comunque buon Natale a tutti.
 
Qualche aggiornamento dal service desk?