domenica 11 marzo 2012

OrderSend Error 138

L'errore 138 è un errore che si incontra tipicamente quando si utilizza denaro reale e non su conti demo oppure in fase di backtest.

Come al solito andiamo a cercare il suo significato nella documentazione ufficiale di metatrader:

ERR_REQUOTE - 138: The requested price has become out of date or bid and ask prices have been mixed up. The data can be refreshed without any delay using the RefreshRates function and make a retry. If the error does not disappear, all attempts to trade must be stopped, the program logic must be changed.

Che in parole povere indica che il prezzo di mercato che abbiamo inserito nella funzione OrderSend non è più valido rispetto all'attuale prezzo del cambio, comunemente questo comportamento viene chiamato requote.

Ci sono 2 motivi principale per cui questo può accadere:

  • il valore inserito come prezzo di apertura è molto vecchio e non compare tra le quotazioni recenti del cross. Può verificarsi quindi anche se il prezzo inserito non è molto "distante" da quello attuale e anche se è compreso nello slippage.
  • il prezzo inserito compare tra le quotazioni recenti del broker ma ha uno scostamento più elevato rispetto allo slippage che abbiamo inserito nella chiamata alla funzione OrderSend.

Aggirare questo problema non è molto difficile, è sufficiente utilizzare la funzione RefreshRates() subito prima della chiamata alla OrderSend ed utilizzare direttamente le variabili Bid e Ask per l'ordine che si vuole aprire senza ricorrere all'uso di variabili double memorizzate precedentemente.

Altro accorgimento che si può utilizzare è quello di inserire un valore di slippage sufficientemente alto in modo da non incorrere in questo errore anche se si verificano momenti di alta volatilità del mercato ed il prezzo subisce consistenti variazioni in pochi istanti. Un valore corretto per lo slippage può essere di 5, 10 pips.
Ovviamente uno slippage del genere non è adatto a tutti i tipi di operatività ed è consigliabile informarsi sul comportamento del broker con cui si intende aprire il conto prima di scontrarsi con spiacevoli inconvenienti.

Infine ricordo che è buona prassi verificare sempre l'esito della funzione OrderSend in modo da poter riproporre l'ordine nel caso questo non venisse accettato ad esempio per un requote.

Il seguente pezzo di codice tenta di aprire una posizione long, nel caso in cui non riesca a piazzare l'ordine a mercato stampa l'errore e riprova ad inserire una posizione long:

RefreshRates();
ticket=OrderSend("EURUSD", OP_BUY, Lots, Ask, 3, 0, Ask + TakeProfit * Point, "MicroHedgeSystem", MagicNumber, 0, Green);
if(ticket>0){
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ", OrderOpenPrice());
}
else{
Print("Error opening BUY order : ", GetLastError());
RefreshRates();
ticket=OrderSend("EURUSD", OP_BUY, Lots, Ask, 3, 0, Ask + TakeProfit * Point, "MicroHedgeSystem", MagicNumber, 0, Green);
if(ticket>0){
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ", OrderOpenPrice());
}
}

Articolo liberamente tradotto da OrderSend Error 138 (Requote).
 

0 commenti:

Posta un commento