SQ 3.8.0 Errore 129 prezzo non valido nel trading reale
14 risposte
mikeyc
9 anni fa #113353
Ciao Mark,
Ho creato, testato ed esportato il MQL4 per una strategia che sembra promettente sul timeframe EURUSD H1. Utilizza l'opzione di inversione della posizione di mercato, ma fallisce durante il test in avanti su un conto reale:
2015.02.16 17:59:59.599 Strategia 9.7 EURUSD,H1: 2015.02.16 20:00:09 Errore nell'apertura dell'ordine: 129 : prezzo non valido
2015.02.16 17:59:59.599 Strategia 9.7 EURUSD,H1: 2015.02.16 20:00:09 Ordine di apertura, direzione: 0, prezzo: 1.13572, Ask: 1.13572, Bid: 1.13548
2015.02.16 17:59:55.489 Strategia 9.7 EURUSD,H1: 2015.02.16 20:00:05 Errore nell'apertura dell'ordine: 129 : prezzo non valido
2015.02.16 17:59:55.489 Strategia 9.7 EURUSD,H1: 2015.02.16 20:00:05 Ordine di apertura, direzione: 0, prezzo: 1.13572, Ask: 1.13572, Bid: 1.13548
2015.02.16 17:59:52.067 Strategia 9.7 EURUSD,H1: 2015.02.16 20:00:01 Errore nell'apertura dell'ordine: 129 : prezzo non valido
2015.02.16 17:59:52.067 Strategia 9.7 EURUSD,H1: 2015.02.16 20:00:01 Ordine di apertura, direzione: 0, prezzo: 1.13572, Ask: 1.13572, Bid: 1.13548
2015.02.16 17:59:52.052 Strategia 9.7 EURUSD,H1: chiudere #164716296 vendere 0,10 EURUSD a 1,14383 al prezzo 1,13572
Qualche idea sul perché l'EA non sembra essere in grado di aprire la direzione di trading opposta dopo aver chiuso un trade?
Grazie,
Mike
mikeyc
9 anni fa #128868
Mark,
Osservando la logica di trading nell'EA generato, mi sembra che ritenti indipendentemente dalla causa dell'errore, e in caso di errore 129 dovrebbe aggiornare il bid/ask poiché il prezzo si è spostato oltre lo slippage.
Vedi http://forum.mql4.com/61528
Per i miei EA utilizzo una libreria chiamata OrderReliable per gestire i complicati errori richiesti.
https://github.com/keyguy/TradersTech/blob/master/OrderReliable_2011.01.07.mqh
Forse è possibile includerlo nella prossima versione del modello SQ per MQ4?
Saluti,
Mike
Mark Fric
9 anni fa #128890
grazie per avermi segnalato l'errore e la libreria, ci darò un'occhiata.
Marchio
Architetto StrategyQuant
mikeyc
9 anni fa #129627
L'errore di slippage è molto frequente con alcuni broker (ciao FXDD :angry: ). Penso che la soluzione migliore sia evitare questi broker con un cattivo slippage.
geektrader
9 anni fa #129666
Vai con un broker ECN, quell'errore è tipico dei broker market maker che rifiutano di accettare il tuo ordine al prezzo che mostrano in MT4. Si chiamano requotes e servono a far guadagnare di più il broker dalle vostre perdite:) Questo non accadrà mai su un broker ECN buono e onesto. Ce ne sono molti, il mio consiglio è Global Prime in Australia.
Matusiak Adrian
9 anni fa #129687
Questo non accadrà mai su un broker ECN buono e onesto.
Ti sbagli... Ci sono molte altre cose che causano i requotes. Semplicemente, provate a fare trading senza requotes con ping al server di trading > 300ms. Anche con un broker onesto non otterrete mai il prezzo che vedete, perché questo prezzo già non esiste.
geektrader
9 anni fa #129701
Certo, ma questo non è un requote, è uno slippage e non darà un errore all'EA come un requote - l'operazione verrà aperta in ogni caso, solo con un prezzo slittato. Continuo a preferire questo metodo rispetto al requote. Inoltre, è chiaro che non si dovrebbe avere un ping di 300 ms verso il server del broker. Io lavoro per un broker ECN, e anche per i piccoli conti si dovrebbe affittare un VPS per gestire le proprie strategie.
Matusiak Adrian
9 anni fa #129704
Anche per i piccoli conti si dovrebbe affittare un VPS per gestire le proprie strategie.
Assolutamente d'accordo.
Dan
8 anni fa #133511
Ciao Mark,
Sto ricevendo lo stesso errore di MickeyC, in cui alcune volte quando il mio AE va a piazzare un'operazione ottengo il messaggio "Errore nell'apertura dell'ordine 129: prezzo non valido" e si ritira altre 3 volte con il prezzo originale. Esiste un codice per aggiornare il prezzo quando tenta di sostituire l'ordine che posso inserire ed è qualcosa che SQ4 affronterà.
Grazie per il vostro aiuto
tomas262
8 anni fa #133524
Dan
8 anni fa #133528
Ciao Thomas,
Preferisco non condividere il mio AE e risolvere il problema partendo dal presupposto che si tratta di un problema di logica SQ, in cui dovrebbe aggiornare il prezzo quando ha superato l'importo dello slippage. MIckeyC l'ha segnalato in precedenza su questo thread e Mark aveva intenzione di esaminarlo. Vedi sopra, Mark ha apportato qualche modifica per risolvere questo errore nella prossima edizione di SQ? Ho seguito il link fornito da MickeyC per il sito MQL4. http://forum.mql4.com/61528 e dice che per risolvere il codice di errore 129 prezzo non valido, è necessario inserire RefreshRates(); prima dell'invio dell'ordine. Non sono un programmatore, al massimo ho provato a inserirlo nell'AE. In grassetto verso il fondo è dove ho aggiunto il codice della frequenza di aggiornamento, non sono sicuro che funzionerà, è qui che avrei bisogno della vostra esperienza. Devo dire che l'errore si è verificato solo due volte e in seguito ha tentato di effettuare l'ordine tre volte senza successo con l'errore di prezzo non valido 129. Spero che l'aggiunta del codice RefreshRate possa risolvere il problema.
Grazie per il vostro aiuto
// ordine aperto con gestione degli errori e tentativi
int ticket = 0;
int retries = 3;
while(true) {
ritenta-;
if(retries < 0) return;
if(getMarketPosition() := 0) return;
if(sqIsTradeAllowed() == 1) {
ticket = openOrderWithErrorHandling(orderType, orderLots, openPrice, stopLoss, profitTarget, comment, MagicNumber);
if(ticket > 0) {
se(tradeDirection > 0) {
ObjectSetText("righe", "Ultimo segnale: lungo, biglietto: "+biglietto, 8, "Tahoma", LabelColor);
} else {
ObjectSetText("righe", "Ultimo segnale: breve, biglietto: "+biglietto, 8, "Tahoma", LabelColor);
}
ritorno;
}
}
if(ticket == -130 || ticket == -129) {
// stop o volume non validi, non possiamo aprire l'operazione
ritorno;
}
Sleep(1000);
}
ritorno;
}
//+——————————————————————+
int openOrderWithErrorHandling(int orderType, double orderLots, double openPrice, double stopLoss, double profitTarget, string comment, int magicNumber) {
//—————————————
// inviare l'ordine
int errore, ticket;
Log("Ordine di apertura, direzione: ", orderType,", prezzo: ", openPrice, ", Ask: ", Ask, ", Bid: ", Bid);
ticket = OrderSend(Symbol(), orderType, orderLots, openPrice, MaxSlippage, 0, 0, comment, magicNumber, 0, Green);
if(ticket < 0) {
// ordine fallito, scrivere l'errore nel log
error = GetLastError();
Log("Errore nell'apertura dell'ordine: ", errore, " : ", ErrorDescription(error));
ritorno(-errore);
Sleep(1000);
//aggiornamento dei dati sui prezzi
RefreshRates();
}
rettmp = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
Log("Ordine aperto: ", OrderTicket(), " al prezzo:", OrderOpenPrice());
stopLoss = getSpecialSL(stopLoss);
profitTarget = getSpecialPT(profitTarget);
if(EmailNotificationOnTrade) {
SendMail("Strategia GB - Ordine aperto", getNotificationText());
}
Dan
8 anni fa #133543
Ciao Tomas, ho bisogno del tuo intelletto e della tua guida per il problema di cui sopra.
Dan
8 anni fa #133561
Thomas non otterrò una risposta????
Mark Fric
8 anni fa #133566
Mi dispiace per la risposta tardiva. Purtroppo non è così semplice, perché il prezzo di un'operazione viene impostato qualche tempo prima che questa funzione venga chiamata, anche per gli ordini di mercato.
Ma è possibile aggiungere il seguente pezzo di codice subito dopo la chiamata di sqIsTradeAllowed().
Aggiornerà il prezzo di mercato poco prima dell'invio dell'ordine.
se(orderType == OP_BUY || orderType == OP_SELL) {
Marchio
Architetto StrategyQuant
Dan
8 anni fa #133576
Ciao Mark,
Grazie per aver risposto, aggiungerò lo snippet di codice e vedrò se funziona........ Grazie ancora
Stai visualizzando 14 risposte - da 1 a 14 (di 14 totali)