Risultati del test esperto multivaluta - pagina 6

 
tol64:

Perché te la prendi con la seconda fonte?)

Se inizio a rispondere nel merito, la risposta sarà o qualcosa su"frasi strappate separatamente" o"non sono il tipo di persona che pensa di avere sempre ragione su tutto". Ormai è comprensibile.

Per quanto riguarda il ping-pong, è una posizione un po' strana da prendere. Sei interessato a un argomento, ricevi risposte e domande di punta, e cominci a sfidarle o a spazzolarle via. Avete o chi ha bisogno dell'argomento in primo luogo? Personalmente non ho bisogno di questi risultati e il risultato della vostra scelta mi interessa poco. L'argomento in sé sembrava degno di attenzione, ma lo zelo polemico dell'autore crea dubbi sull'opportunità del suo mantenimento.

 
marketeer:

Perché dovrebbe esserlo? Avete OnTimer come terzo numero. Sei già stato citato su questo argomento: hai solo bisogno di implementare un metodo che esegua correttamente il test. Ce n'è uno. Questa è la funzione OnTimer () con un intervallo minimo. Quindi deve avere qualcos'altro in mente.

Prima di questo hai scritto che:

Ma non è la stessa cosa:
In realtà, si sta cercando di "catturare" il momento del ticchettio delle nuove barre su tutti i simboli ed è ovvio che il modo migliore per farlo è usare l'evento OnTick.


Il fatto è che non sto cercando di "catturare" i tick in OnTimer(). In OnTimer() il controllo di una nuova barra viene eseguito per ogni simbolo separatamente. Questo controllo viene eseguito all'intervallo impostato nel timer (in secondi).

Un evento come un tick viene ricevuto nella funzione OnTick() e nello schema proposto da Konstantin Gruzdev, cioè nella funzione OnChartEvent(). In OnChartEvent() possiamo tracciare qualsiasi evento, compresa la formazione di una nuova barra su qualsiasi timeframe.

Non c'è nessun problema con il timer. Ora provo l'EA multivaluta nel seguente modo

1. Ottimizzo i parametri per ogni simbolo separatamente, attaccando l'EA al simbolo i cui parametri vengono ottimizzati. Il processo di ottimizzazione è fatto usando la funzione OnTick(). Al momento dell'ottimizzazione dei parametri per un simbolo, tutti gli altri simboli sono disabilitati, cioè non partecipano ai test e gli scambi vengono eseguiti solo per il simbolo i cui parametri vengono ottimizzati.

2. Dopo l'ottimizzazione dei parametri per tutti i simboli, abbiamo bisogno di testare tutti i simboli in una volta. Sposto il codice nella funzione OnTimer() (per ora), abilito il timer per un test preliminare (60 secondi) e analizzo il risultato ottenuto. Se sono soddisfatto, metto a punto il sistema di gestione del denaro e altri sottosistemi. Poi accendo il test finale (timer 10 secondi) e ricevo, secondo me, il risultato più preciso. Il mio punto di vista e le mie conclusioni si basano sui risultati dei test di tutti i metodi e sul confronto di questi risultati tra loro.

marketeer:
Se è importante per te, ti consiglierei comunque di verificare con gli sviluppatori qual è l'analogo del file fxt in Five. Ho già scritto che è probabile che vengano generate diverse basi di tick per diversi test.

Questa è un'ipotesi interessante. Potrebbe anche essere il caso. Una risposta da parte degli sviluppatori sarebbe quindi benvenuta.

 
Non ci sono file fxt in mt5. Ora i tic non vengono scritti su un file, ma modellati al volo dalla cronologia dei minuti.

Si scopre che generare tick al volo è più veloce che leggerli dal disco.
Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
Renat:
Non ci sono file fxt in mt5. Ora i tic non vengono scritti su un file, ma modellati al volo dalla cronologia dei minuti.

Si è scoperto che generare zecche al volo è più veloce che leggerle dal disco.
Ciao Renat. Grazie per la vostra risposta. Questa è una grande notizia.
 
tol64:
Ciao Renat. Grazie per la vostra risposta. Questa è una grande notizia.
Non vedo nulla di grandioso, si scopre che in mt5 non è possibile testare su tick reali
 
Loky:
Non vedo nulla di grandioso, si scopre che in mt5 non si può testare su tick reali
Vorresti essere in grado di raccogliere il tuo vero tickbase o prenderlo da qualche parte e testarlo o qualcosa del genere?
 
Yedelkin:

Se inizio a rispondere nel merito, la risposta sarà o qualcosa del tipo"frasi estrapolate separatamente" o"non sono il tipo di persona che pensa di avere sempre ragione su tutto". Questo è già chiaro.

No. Sembra che continui a non capire nulla. E ora ve lo spiegherò per la quarta volta. Riportiamo il nostro dialogo sui binari giusti.

Tutto è iniziato da questo momento:

Yedelkin:
Fate attenzione alla parte del codice:

int OnInit()
{
if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   
if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

Qui si può vedere che si "incardina" un certo "Spy Control panel MCM" su due caratteri diversi. Quindi avete diversi simboli come fonti di segnale. Ma tu affermi che "facciamo trading su EURUSD", cioè la fonte del segnale è uno stesso simbolo. Decidiamo.

A questo vi ho risposto:

tol64:

Oh, si sta avvicinando. Sembra che sia apparsa una variante, dove mi sbaglio)). Ci penserò per un po' e lo scriverò in dettaglio...

Pensiero. Risposta:

tol64:

Tratta solo su EURUSD.

Nei miei test considero lo schema di Konstantin Gruzdev - Implementation of the Multicurrency Mode in MetaTrader 5. ))) Tutto è definito. I file allegati contengono l'indicatore Spy Control panel MCM e l'Expert Advisor exSpy Control panel MCM. Installando l'Expert Advisor su un grafico, puoi vedere come funziona. Il registro mostra chiaramente gli eventi specificati ricevuti dall'Expert Advisor da diversi simboli. Tutto è chiaro, niente è mescolato.

Ora ho provato a specificare in OnChartEvent() il simbolo da cui viene ricevuto l'ID, ma questo non ha cambiato i risultati. Ho rimosso il secondo carattere da OnInit() per eliminare qualsiasi possibilità di ricevere gli eventi sbagliati. Il test è stato ora eseguito utilizzando questa variante:

...

codice

...

immagini

...

I risultati non corrispondono. Non c'è più il secondo simbolo, i segnali vengono solo da EURUSD. Ma questo purtroppo non ha risolto il problema.

Il punto chiave era:"Non c'è più un secondo simbolo, i segnali vengono solo da EURUSD. Ma questo purtroppo non ha risolto il problema."


Vedi? La rimozione della seconda fonte non ha risolto il problema. La situazione era semplificata e avresti potuto lasciare la seconda fonte, ma hai continuato a citare l'esempio originale invece di cercare di risolvere la domanda seguente. Perché avendo un solo simbolo (fonte unica) ma scambiando (in modalità test) da un altro simbolo, si ottengono varianti non identiche?

Ecco il post in cui hai espresso questo:

Yedelkin:
Cominciamo con le parole corrette. Nell'esempio iniziale, avresti voluto "trade on EURUSD". Infatti, gli eventi utente provenivano da due simboli, e nel gestore di eventi TradeSignalCounter()+TradePerformer() venivano chiamati quando venivano ricevuti eventi da uno di questi due simboli. Possiamo supporre che la coda degli eventi fosse sempre piena.

Ora hai rimosso una delle fonti di segnale ma hai inserito il controllo "if(sparam == Symbol_01)" nel gestore di eventi per qualche motivo. Ma la prossima domanda è diversa. A giudicare dal codice, lo schema di Lizar è usato in modalità "All ticks" e le funzioni TradeSignalCounter()+TradePerformer() sono chiamate ad ogni tick dalla fonte del segnale (EURUSD). Interessante ha già accennato ad un possibile overflow della coda degli eventi. Mi sto chiedendo, quale strumento è usato come parametro Symbol_01 di queste due funzioni e se hai provato a cambiare la periodicità degli eventi nello schema di Lizar.

Te l'ho spiegato una seconda volta (per qualche motivo lo chiami sbattere via):

tol64:

Sì, è quello che volevo fare. Dopo tutto, ogni azione che facciamo è innescata dal nostro desiderio. In questo caso, ho ottenuto esattamente quello che volevo. Cioè, abbiamo fatto trading solo su EURUSD, perché la funzione TradePerformer() controlla se è permesso fare trading per ogni simbolo nell'array di simboli. Questa opzione si trova in variabili esterne e a quel tempo il trading con il simbolo GBPUSD era proibito. Gli eventi utente provenivano da due simboli, ma nel gestore dell'evento, di nuovo, la funzione TradePerformer() permetteva il trading solo sul simbolo EURUSD. La funzione TradePerformer() contiene anche una funzione che determina se si è verificata una nuova barra su un particolare simbolo, in questo caso EURUSD. La tua supposizione che la coda degli eventi sia sempre piena è corretta, ma in questo caso tutto è stato processato separatamente e un ritardo di un tick non è significativo quando si testa su barre giornaliere.

La rimozione di una fonte di segnale, quella che non dovrebbe essere coinvolta nel test, ha solo confermato che tutto era stato fatto correttamente prima. Il controllo "if(sparam == Symbol_01)" è rimasto da quando ho controllato i risultati senza cancellare una fonte di segnale che non dovrebbe essere testata, ma dalla quale dovrebbe essere testata. Questo controllo si è rivelato in realtà addirittura superfluo. I risultati non sono cambiati. Il simbolo EURUSD è usato come parametro Symbol_01. Ho provato a cambiare la frequenza degli eventi ma non è cambiato nulla. Più precisamente, posso dire che la modalità tutte le zecche è la più precisa.

Punto chiave:"Questo test si è rivelato in realtà addirittura superfluo. I risultati non sono cambiati."
Questa è la seconda volta che "non ti sei accorto" che il problema non è quello che indichi tu, ed è la seconda volta che ti rispondo la stessa cosa, ma in modo ancora più esplicito.

Lei ha continuato:

Yedelkin:
"...tutto era fatto bene prima" - questo appartiene alla categoria della compiacenza. Era sbagliato per cominciare. A quanto pare, non date importanza a un fenomeno come "l'overflow della coda degli eventi". Soprattutto quando si tratta di trasmissione post-itica degli eventi. Date un'occhiata al materiale di riferimento e al forum sull'argomento. La parola chiave è "coda".

Dato che le funzioni TradeSignalCounter()+TradePerformer() processano eventi da una sola fonte di segnale, lo stato della coda e il suo possibile overflow non è cambiato in alcun modo. In altre parole, il "divieto di elaborare eventi per simbolo GBRUSD" non ha rimosso affatto gli eventi appropriati dalla coda. Per la terza volta, segnalo il problema: "Un possibile overflow nella coda degli eventi era già stato accennato" :) Se credete che si tratti solo di "un tick di ritardo", su che cosa si basano queste conclusioni?

"...In questo caso tutto è stato gestito separatamente". Il problema è che nella versione originale, il gestore di eventi chiamava le funzioni quando gli eventi venivano ricevuti da entrambe le fonti di segnale, e poi quelle funzioni già filtravano il segnale dalla fonte "non necessaria". Ma le funzioni venivano chiamate ogni (!) volta.

Non ha molta importanza su quale periodo viene testato il gestore dell'evento. Se lo schema di Lizar genera segnali su base tick-by-tick, allora anche loro stanno segnando la coda degli eventi su base tick-by-tick, non una volta al giorno.

"Ho provato a cambiare la frequenza degli eventi, ma non ha fatto alcuna differenza. Più precisamente posso dire che la modalità tutte le zecche è la più precisa". Potresti darmi qualche screenshot comparativo sulle modalità non di picco di Lizar?

E ti ho risposto per la terza volta nel modo più educato possibile. E le faccine che apparentemente hai percepito come una presa in giro, in realtà esprimono la mia cordialità nei tuoi confronti. Cercherò di non metterli altrove, visto che sono così ambigui.

tol64:

Buongiorno! ))

Oltre a questa frase estratta separatamente, ho anche scritto: "...non escludo mai la possibilità che mi sbagli da qualche parte e controllo sempre tutto. Ma anche dopo i controlli più duri, quando a prima vista tutto sembra giusto, non posso ancora escludere la possibilità che ci sia un errore da qualche parte". Devo aggiungere che non sono il tipo di persona che pensa di avere sempre ragione su tutto. )))

Ho dato un'occhiata all'argomento Timer. I punti chiave che ho evidenziato sono:

1. Mentre un evento viene elaborato, gli altri non possono essere elaborati.

2. Se lo stack degli eventi si riempie, i vecchi eventi vengono rimossi dalla coda senza essere processati.

Prendiamoli in ordine. C'è un'enumerazione di eventi:

...
codice
...
Durante l'inizializzazione, specifichiamo da quale personaggio riceveremo l'evento, e quale evento riceveremo:
...
codice
...

Quindi, accetteremo l'evento CHARTEVENT_TICK solo da EURUSD. Non ci sono altri simboli.

Il test è iniziato. Quando si verifica un qualsiasi evento, il programma entra nella funzione OnChartEvent(), dichiara gli array di variabili per i segnali di trading e controlla l'evento. Se questo è un evento personalizzato, il programma determina il segnale in TradeSignalCounter(), poi controlla se si è verificata una nuova barra nella funzione TradePerformer() e poi decide su altre condizioni a seconda di questo. La funzione ha smesso di funzionare e comincerà a funzionare solo quando si è verificato un evento sul grafico EURUSD. In altre parole, una zecca in questo caso.

...

codice
...

L'esecuzione di queste funzioni è molto veloce. Nessuna coda di eventi ha il tempo di traboccare e non perderemo nessun evento significativo. E se la coda addirittura trabocca e gli eventi vengono persi, cosa ci perdiamo? Una zecca, due zecche, tre? E allora? È insignificante sulle barre diurne.

Cosa stai scegliendo su questa seconda fonte))) Non c'è più una seconda fonte. Ce n'è uno - EURUSD, ma l'Expert Advisor fa trading su EURUSD dal grafico GBPUSD. E i risultati sono identicamente sbagliati. Una copia. Cioè, sono gli stessi come se fosse presente la seconda fonte. )))

-----------

Meglio fare il test da soli, mostrare i risultati del test e scrivere (brevemente) cosa avete fatto per ottenere i risultati corretti del test, se ovviamente ci riuscite. L'esperto più semplice andrà bene per questo test. Entrata da qualsiasi condizione, Stop Loss, Take Profit. Che siano le barre giornaliere degli ultimi 10 anni. E lo vedrete voi stessi. Alcuni periodi coincideranno e altri no. Apri il grafico dei risultati e vedi dov'è la discrepanza.

E dopo di che scrivi:

Yedelkin:
Riguardo al ping-pong - una posizione un po' strana. Si è interessati a un certo argomento, si ottiene una risposta e si pongono delle domande di fondo, e si comincia a sfidarli o a respingerli. Avete o chi ha bisogno dell'argomento in primo luogo? Non credo che qualcuno farà il tuo lavoro al posto tuo. Personalmente non me ne frega niente dei risultati e l'esito delle vostre scelte mi interessa poco. L'argomento in sé sembrava degno di attenzione, ma il fervore polemico dell'autore crea dubbi sull'opportunità del suo mantenimento.

Poi ci sono le domande.

1. Che tipo di reazione ti aspettavi, se continui a ripetere la stessa cosa, cioè che è già irrilevante e che ti hanno già risposto tre volte?

2. Se ha preso le mie risposte come un'argomentazione, si sbaglia, perché ho risposto e spiegato quello che stavo facendo. Ma tu l'hai presa come un'argomentazione perché stavi argomentando te stesso. )))

3. Non mi affido mai a qualcun altro per fare il mio lavoro.

4. Non sono l'unico che ha bisogno dell'argomento, ma tutti quelli che incontreranno questo problema. Se non ne hai bisogno, allora perché sei entrato nel dialogo? Il mio fervore polemico era solo una conseguenza, la causa veniva da te.

---
Non analizzerò il vostro comportamento dal punto di vista psicologico, altrimenti io e voi dovremo volare fuori dall'atmosfera. Quindi cerchiamo di mantenere il dialogo breve e mirato. Ma se non ne avete bisogno, è meglio non continuare. Perché: Si prega di osservare le regole. )))

 

Naturalmente, personalmente, non mi interessa analizzare le peculiarità delle visioni del mondo degli altri. Ho già esposto le mie conclusioni sul suo fervore polemico qui sopra. Non c'è niente da aggiungere.

 
Yedelkin:

... Niente da aggiungere.

Sì, meglio di no. Altrimenti, si riveleranno solo chiacchiere inutili. Torniamo all'argomento.

---

Ha fatto un'altra serie di test. I risultati dei test presentati in precedenza sono stati ottenuti solo in modalità - Prezzi di apertura. Secondo me, sono riuscito a ottenere risultati corretti in questo modo solo usando la funzione OnTimer(). Tutti gli altri metodi non hanno mostrato i risultati corretti.

Questa volta ho condotto dei test in modalità All ticks a partire dall'inizio del 2011. Allo stesso tempo, era interessante vedere quanto tempo avrebbe richiesto questo o quel metodo. Per esempio, nei test automatici di Expert Advisors per il campionato, un Expert Advisor deve essere testato in modalità "All ticks" per non più di 15 minuti. Per questo test, ho costruito un semplice Expert Advisor che fa trading su 12 coppie di valute. Le uniche condizioni che contiene sono Stop Loss, Take Profit e Trailing Stop. Non c'è nessun allargamento e restringimento della posizione, nessun sistema di gestione del denaro, il lotto scambiato è fisso (0,1). L'Expert Advisor è scritto senza un solo ciclo, è massimamente semplificato. L'orizzonte temporale di lavoro su tutti i simboli è H8.

Ho ottimizzato i parametri per ogni simbolo separatamente, a turno, usando OnTick(). Non ho aspettato che l'ottimizzazione finisse. Dopo 100 corse, ho fermato l'ottimizzazione e ho scelto quella con il minor rischio, piuttosto che l'opzione migliore.

La frequenza del processore su cui è stato eseguito il test è di 2 GHz. Qui c ' è scritto su cosa concentrarsi.

Inoltre sostituirò la parola identico con quasi identico poiché l'obiettivo non è una corrispondenza esatta ma quando si analizza il grafico visivamente le differenze non dovrebbero essere eclatanti.

---

Risultati dei test:

La funzione OnTimer() è stata usata per il primo test perché l'ultima volta ha dato risultati quasi identici. E ora il suo risultato servirà come riferimento per il confronto.

OnTimer()

L'intervallo del timer è di 60 secondi.

Il test è durato 27 minuti.

---

Intervallo del timer 300 secondi:

I risultati sono quasi identici. La durata del test è di 26 minuti.

---

Intervallo del timer 28800 secondi - 8 ore (tempo utilizzato).

I risultati sono quasi identici. La durata del test è di 25 minuti.

Ho anche fatto prove con intervalli di 1800 e 3600 secondi, i risultati sono anche coerenti.

-----------

OnChartEvent()

Il periodo di 1 minuto è CHARTEVENT_NEWBAR_M1.

I risultati sono quasi identici. La durata del test è di 37 minuti.

---

Periodo di 1 minuto - CHARTEVENT_NEWBAR_H1.

I risultati sono quasi identici. Durata del test 27 minuti.

---

Periodo di 1 minuto - CHARTEVENT_NEWBAR_H8.

I risultati sono quasi identici. La durata del test è di 27 minuti.

----------

OnTick()

I risultati sono quasi identici. La durata del test è di 72 minuti.

-----------------

In modalità "Tutte le zecche", tutti i metodi hanno mostrato risultati quasi identici. OnTick() è risultata essere la variante più lunga. La durata del test diOnTimer() e OnChartEvent() è quasi identica.

Rapporto:

Linea di fondo:

Nel mio caso, anche il più semplice Expert Advisor multicurrency che fa trading su 12 coppie di valute su un timeframe molto grande (H8) non può essere inserito nel campionato, perché non supererà il test (15 minuti per il test). Dovremo "tagliare l'appetito" o cercare metodi per ottimizzare al massimo il codice dell'Expert Advisor.

---

Mi chiedo se qualcuno ha ottenuto un test veloce su 12 coppie? Quanto dura il tuo test?

 
tol64:

Mi chiedo se qualcuno ha realizzato un test rapido su 12 coppie? Quanto dura il tuo test?


3.
capr2011 su EURUSD:H1 ogni tick 2011.01.01-2011.08.01


4. inizio
finito in 3 min 21 sec


5. Statistiche
1233 kb di file di log
100 transazioni, 200 affari, profitto 83043.82 USD