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);
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
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:
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?
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.
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...
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!
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
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