lunedì 20 giugno 2011

Metatrader: orderSend error 130

Una delle prime cose che si imparano una volta terminata la scrittura dei primi expert advisor è quella di effettuare la stampa degli errori che vengono sollevati durante la gestione degli ordini. Ad esempio è possibile visualizzare le motivazioni della mancata apertura di un ordine utilizzando la funzione GetLastError() subito dopo aver invocato la funzione orderSend:

v_ticket=OrderSend(Symbol(), OP_BUY, e_Lots, Ask, 3, Ask - (e_Stoploss*g_Point), Ask + (e_TakeProfit*g_Point), "my first EA", e_MagicID, 0, Green);
if(v_ticket>0){
if(OrderSelect(v_ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);

Gli errori sollevati a run-time da metatrader possono essere visualizzati:

  • sul diario se stiamo eseguendo un backtest
  • sulla casella consiglieri se stiamo utilizzando l'ea in demo o con denaro reale
metatrader error 130

E' possibile visualizzare la lista completa degli errori di metatrader al seguente link:

lista errori metatrader

Bisogna però tenere in considerazione che gli errori possono dipendere dai seguenti fattori:
  • dal codice che abbiamo implementato
  • dal broker e dal tipo di conto (demo/reale)
  • dal cross su cui effettuiamo le nostre operazioni

In questo articolo voglio approfondire l'errore 130 che, secondo la guida significa "Invalid Stops". Questo errore viene restituito generalmente quando tentiamo di inserire uno stoploss o un take profit troppo ravvicinato al prezzo di apertura, i broker infatti hanno delle limitazioni e non consentono di inserire stop e take profit troppo vicini al prezzo.

Ovviamente si può verificare anche durante la gestione di una posizione ad esempio quando stiamo utilizzando il trailing stop e, per errore, inseriamo lo stop ad una quotazione più vantaggiosa rispetto all'attuale.

Un altro fattore a cui bisogna prestare particolare attenzione per evitare questi errori è quello del numero di decimali del proprio broker. Se si utilizza un broker a 5 decimali infatti bisogna stare molto attenti e verificare che il Point corrisponda al valore di un pip.

Individuare le cause di un errore non è sempre facile e spesso richiede un bel pò di debug prima di risalire alla natura del problema.

Quali sono gli errori più strani in cui vi siete imbattuti?
 

6 commenti:

Ale L ha detto...

Ciao a tutti! Riguardo l'errore 130 volevo segnalare un problema che sto riscontrando con il test di un EA. Facendo il backtest infatti l'EA funziona correttamente e non restituisce nessun messaggio di errore. Se invece lo faccio lavorare in real time, quando dovrebbe aprire gli ordini mi restituisce l'errore 130, anche impostando valori di SL e TP molto larghi. Ho pensato che poteva essere un problema di cifre decimali, ma nell'EA ho inserito il controllo per normalizzare il valore dei pip anche in caso di 5 cifre decimali. Inoltre se fosse un problema di pips non dovrebbe segnalarlo anche durante il backtest?

carlo10 ha detto...

Ciao Ale,

in effetti è strano che in backtest funzioni mentre in live demo no. Hai provato con diversi broker?

In caso facci vedere un pò di codice che cerchiamo di capire dov'è il problema.

Ale L ha detto...

Ciao Carlo. A dire il vero non ho avuto il tempo di provarlo con altri broker, lo faccio lunedì. Cmq il codice è semplicissimo, il controllo dei pips l'ho preso da uno dei tuoi EA. Ecco qui le parti fondamentali:
___________________________________

int init()
{

StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) + MarketInfo(Symbol(), MODE_SPREAD);

double Poin;
if (Point == 0.00001) Poin = 0.0001;
else
if (Point == 0.001) Poin = 0.01;
else Poin = Point;

g_Point = Poin;

return(0);
}

int deinit()
{
//----
return(0);
}


int start()
{

RefreshRates();

int total = OrdersTotal();

if (StopLoss < StopLevel) StopLoss = StopLevel;
if (TakeProfit < StopLevel) TakeProfit = StopLevel;

if(total < 1)
{

// Apro una posizione BUY?

if (SegnaleBUY() == 1)
{
ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,High[1]-StopLoss*g_Point,Ask+TakeProfit*g_Point,"BUY",e_MagicID,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Aperto Ordine Buy: ",OrderOpenPrice());
}
else Print("Errore nell apertura dell ordine Buy: ", GetLastError());
return(0);
}

// Apro una posizione SELL?

if (SegnaleSELL() == 1)
{
ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,3,Low[1]+StopLoss*g_Point,Bid-TakeProfit*g_Point,"SELL",e_MagicID,0,Red);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Aperto Ordine Sell ",OrderOpenPrice());
}
else Print("Errore nell apertura dell ordine Sell: ", GetLastError());
return(0);
}
}
return(0);
}

__________________________________

Come SL e TP ho provato a inserire anche valori molto alti come 500, ma il problema rimane! Sembra alquanto strano...

Ale L ha detto...

Ciao Carlo, hai avuto modo di dare uno sguardo al codice? Ho provato l'EA su un'altra demo e lì funziona! Non capisco come mai, eppure il broker su cui non funziona l'EA è quello che consente SL e TP più bassi...eppure il backtest lo esegue correttamente!

carlo10 ha detto...

Dovresti capire se il broker in cui non funziona è un ECN, in questo caso non puoi inviare gli ordini direttamente con lo stoploss ma devi aprirli senza e poi modificarli.

Prova a leggere le risposte di Dainesi in questa discussione:

http://forex.forumup.it/post-150574-forex.html

Ale L ha detto...

Caspita! è proprio così! è un ECN ma non sapevo che avessero questa particolarità...Ora è chiaro, infatti se non inserisco SL e TP apre gli ordini. Grazie Carlo i tuoi suggerimenti sono sempre preziosi :-)

Posta un commento