Errore di convalida quando si rilascia il robot di trading al mercato. - pagina 6

 
Andrey Kaunov:

Pensi che io non controlli. La dimensione del lotto è controllata in una funzione separata

I limiti non sono necessari qui, perché Stop Loss e Take Profit sono uguali a zero all'apertura della negoziazione.RefreshRates() aggiorna i dati quando calcola la dimensione del lotto. Certo, non c'è nessun controllo di connessione, ecc. prima di ogni ingresso, ma non è questo il punto. Se OrderSend inviasse una richiesta, ci sarebbe un errore specifico: 130, 131, ecc. Ma quello che ho è.

Non sta cercando di inviare un ordine da aprire. Anche nell'ultimo test, quando ho impostato una posizione di controllo nella funzione OnInit().


È possibile. Ma ho già ricontrollato tutto. Non so dove andare dopo.

Nella funzione di normalizzazione dei lotti, si arrotonda il lotto dopo averlo controllato al valore massimo/minimo.
 
Artyom Trishkin:
Nella funzione di normalizzazione dei lotti, si arrotonda il lotto dopo averlo controllato al valore massimo/minimo.

Beh, sì, è così.

MathRound();
P.S. Penso che si debba scavare dai parametri di input, perché succede che passa. Fate un controllo "a prova di bomba" su ogni parametro.
 
Non sto parlando dei registri dei test del validatore. Ma almeno i parametri che NON sono convalidati potrebbero essere possibili da inviare. Non c'è niente da prendere al volo per sistemare il codice. Comprendo che la variabilità della selezione dei parametri di prova può essere infinita. Potete impostare una variabile di tipo int a +50000 o a -45000. Ma non posso semplicemente limitare alcuni parametri di input a una serie di valori. Sarà diverso per i diversi strumenti.
 
Andrey Kaunov:
Non sto nemmeno parlando dei registri dei test del validatore. Ma almeno i parametri che NON sono convalidati potrebbero essere possibili da inviare. Non c'è niente da prendere al volo per sistemare il codice. Capisco che la variabilità della scelta dei parametri di test può essere infinita. Potete impostare una variabile di tipo int a +50000 o a -45000. Ma non posso semplicemente limitare alcuni parametri di input a un certo intervallo di valori, perché sarà diverso per i diversi strumenti.

È necessario assicurarsi che il lotto di trading sia valido in tutti i casi. Non è per niente che ho fatto notare che cambiate il lotto nel vostro codice dopo che è stato controllato per un intervallo di dimensioni valido.

Ed è il controllo dei parametri di input completamente stupidi che deve essere fatto.

 

Non c'è nessun problema con il lotto. Viene controllato per max/min. Prima dell'arrotondamento viene diviso per il passo, poi l'intero arrotondato viene di nuovo moltiplicato per il passo. Otteniamo un lotto perfettamente corretto.

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin()*0.95;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*step(0.01)=0.57

Poi controlla se c'è abbastanza margine libero per aprire. Il validatore non impreca affatto. Non vede le funzioni di trading, apparentemente, a causa di parametri di input errati. L'Expert Advisor semplicemente non fa affatto dei trade con una certa combinazione di essi! Non è che ho un martin non condizionato, e non ho un creatore di rete che apre su ogni candela. Come posso spiegare al validatore che l'EA logicamente non fa trade con certi parametri?

 
Andrey Kaunov:

Non c'è nessun problema con il lotto. Viene controllato per max/min. Prima dell'arrotondamento viene diviso per il passo, poi l'intero arrotondato viene di nuovo moltiplicato per il passo. Otteniamo un lotto perfettamente corretto.

_lot(0.568)/step(0.01)=56.8

MathRound(56.8)=57

57*step(0.01)=0.57

Poi si controlla se c'è abbastanza margine libero per aprire. Il validatore non impreca affatto. Non vede le funzioni di trading, apparentemente, a causa di parametri di input errati. L'Expert Advisor semplicemente non fa affatto dei trade con una certa combinazione di essi! Non è che ho un martin non condizionato, o un gridlocker che si apre su ogni candela. Come posso spiegare al validatore che l'EA logicamente non fa trade usando certi parametri?

Non spiegare, ma fare in modo che l'EA corregga i parametri di input sbagliati. Preferibilmente con un messaggio al giornale sul loro valore non valido e la correzione al valore valido.

E, se per qualche ragione volete rendere l'utente responsabile dell'inserimento di parametri errati nel mondo reale, l'utente dovrebbe essere avvisato dei parametri errati.
Ma per il tester, hanno anche bisogno di essere corretti - in modo che l'EA faccia trading.

 

Quindi come possono essere regolati se ci sono alcuni parametri per EURUSD e altri per Gold, per esempio. In questo momento le impostazioni predefinite sono più o meno tollerabili per le coppie principali, ma per l'oro non funzionano affatto. Non ci saranno scambi. È per questo che esistono i parametri (da quanto ho capito), per adattarli ad ogni strumento. Se tutto fosse così facile, avrei incorporato tutti i parametri nell'Expert Advisor e non avrei inviato nulla a quelli esterni.

Un altro bug del validatore è che non vede affatto altri timeframe. L'ho aggirato, ma a scapito dell'algoritmo in una certa misura. L'Expert Advisor prende dati da altri timeframe, da quello settimanale, D1, H4, ecc. a M1. Ma i dati sono nulli, come ho scoperto attraverso numerosi esperimenti. Non c'è niente che possiamo fare, possiamo solo lavorarci intorno. Perché dobbiamo modificare l'Expert Advisor a scapito dell'algoritmo? Non è il contrario: il validatore deve essere adattato ai test. Altrimenti, controllare un EA perfettamente funzionante si trasforma in una specie di lavoro duro!

 
Andrey Kaunov:
Quindi come possono essere regolati se ci sono alcuni parametri per EURUSD e altri per Gold, per esempio. In questo momento le impostazioni predefinite sono più o meno tollerabili per le coppie principali, ma per l'oro non funzionano affatto. Non ci saranno scambi. È per questo che esistono i parametri (da quanto ho capito), per adattarli ad ogni strumento. Se tutto fosse così semplice, avrei incorporato tutti i parametri nell'Expert Advisor e non avrei inviato nulla a quelli esterni.
Hai messo la divisione per 0 proprio prima di OrderSend - e c'è stato un tale errore. Quindi, raggiunge OrderSend, ma non si apre. Cioè, lotti/margine/limiti/prezzo, qualcosa di loro non è contabilizzato
 
Maxim Kuznetsov:
Hai già messo la divisione per 0 appena prima di OrderSend - e c'era questo errore. Quindi arriva a OrderSend, ma non si apre. Quindi lotti/margine/limiti/prezzo, alcuni di loro non sono contabilizzati.

Maxim, se qualcuna di queste cose non è contabilizzata, il validatore darà un errore molto preciso : 130, 131, 134, 145 ecc. Non è questo il caso!

P.S. Credetemi, ho inviato più di un centinaio di convalide in 4 giorni, e ho provato un sacco di opzioni.

 

Sì, raggiunge la divisione per 0 (quindi OrderSend) immediatamente. E genera un errore.

Ma se mando a controllare l'Expert Advisor senza divisione per 0 nel codice, in qualche modo imposta magicamente dei parametri che non aprono affatto dei trade durante il periodo specificato e restituisce un errore. Questa è la mia versione di ciò che sta accadendo, ma apparentemente non è lontana dalla verità.