Come codificare? - pagina 306

 

Ciao,

Non stavo andando da nessuna parte con le funzioni, le ho controllate innumerevoli volte senza alcun risultato, così ho deciso di scrivere un sacco di messaggi Print() in ogni fase del mio codice per vedere fino a che punto arriva prima di uscire. In realtà non arriva fino alla funzione GetLots e fallisce quando controlla i miei criteri di acquisto e vendita. Stranamente non ho cambiato questa parte del codice, ma c'è qualcosa che manca, ma almeno ora so dove concentrarmi!

 

Ciao a tutti,

Ho testato il mio codice oggi e ha funzionato relativamente bene. Senza cambiare il codice o i criteri del backtest (come le date ecc.) ho fatto un backtest un'ora dopo e i risultati sono completamente diversi, come nessun risultato. Quindi mi sto solo chiedendo perché questo è successo? Per esempio la connettività di MT4?

 

...

Se non hai cambiato nessun parametro, allora controlla quanto segue: quando esegui il back-test apri la scheda del diario e controlla se vi sono scritti degli errori. Errori nell'esecuzione degli ordini potrebbero essere la causa di risultati erratici. Controllate anche se i criteri di acquisto e di vendita sono "solidi", cioè se entrano in modo diverso sullo stesso punto.

crsnape@btinternet.com:
Ciao a tutti, ho testato il mio codice oggi e ha funzionato relativamente bene. Senza cambiare il codice o i criteri del backtest (come le date, ecc.) ho fatto un backtest un'ora dopo e i risultati sono completamente diversi, cioè nessun risultato. Quindi mi sto solo chiedendo perché questo è successo? Per esempio la connettività di MT4?
 

Non ricevo nessun errore nel mio diario. La prima voce è questa:

2012.07.22 15:35:37 H4 Periodo EA EURUSD,H4: caricato con successo

Seguito da un enorme elenco di questi:

2012.07.22 15:47:07 TestGenerator: unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

e poi finalmente:

2012.07.22 15:47:07 H4 Period EA inputs: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Ma poi niente dopo.

Il mio test è stato fatto dal 04.01.2012 - 21.07.2012.

 

...

Allora hai un problema con le condizioni di entrata (il tuo EA non ha mai provato ad aprire un ordine)

crsnape@btinternet.com:
Non ricevo nessun errore nel mio diario. La prima voce è questa:

2012.07.22 15:35:37 H4 Periodo EA EURUSD,H4: caricato con successo

Seguito da un enorme elenco di questi:

2012.07.22 15:47:07 TestGenerator: unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

e poi finalmente:

2012.07.22 15:47:07 H4 Period EA inputs: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Ma poi niente dopo.

Il mio test è stato fatto dal 04.01.2012 al 21.07.2012.
 

Sì, è strano perché prima entrava nelle posizioni. Ho alcune print() scritte nel mio codice dall'inizio alla fine e niente viene scritto nel diario per registrare anche solo l'inizio del mio codice. Nemmeno questo per controllare se una posizione precedente è già stata aperta sulla barra corrente:

se ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Controlla la possibilità di posizione lunga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Stampa("TEST");

se (... condizioni di ingresso...

 

...

Se il tuo EA ha tentato in qualsiasi fase di aprire un ordine, sarebbe stato scritto nel giornale (errore o no, non importa - nel caso in cui ci fosse stato un errore, un errore sarebbe stato lì, se avesse aperto un ordine sarebbe stato scritto lì)

Ma dato che non c'è scritto nulla, significa che il tuo EA non è mai arrivato al punto di provare ad aprire un ordine e questo può accadere solo se il tuo set di condizioni che devono essere soddisfatte nell'EA non arriva mai al punto di aprire effettivamente un ordine. Quindi devi chiarire le tue condizioni. Prova dalla condizione più semplice che sai che verrà eseguita, e poi costruisci aggiungendo condizioni. In questo modo sarai in grado di identificare il passo che ti impedisce di aprire gli ordini

crsnape@btinternet.com:
Sì, è strano perché prima stava entrando nelle posizioni. Ho alcuni print() scritti nel mio codice dall'inizio alla fine e niente viene scritto nel diario per registrare anche solo l'inizio del mio codice. Nemmeno questo per controllare se una posizione precedente è già stata aperta sulla barra corrente:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Controlla la possibilità di posizione lunga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

se (... condizioni di ingresso...
 

Ho messo alcune altre Print()s dopo i comandi if e penso che stia fallendo a questo punto, in particolare la linea rossa, poiché il mio diario smette di stampare dopo questo punto.

//--- VARIABILI GLOBALI

stringa HasOrderedGV = "has_ordered_GV

stringa barsGV = "bars_GV";

//--- Determinare se l'ordine è già stato piazzato sul blocco orario H4

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Determina se l'ordine è già stato piazzato per la barra corrente", HasOrderedGV);

//--- Controlla la possibilità di posizione lunga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Ho trovato questo pezzo di codice online e l'ho usato nel mio. Ma ora mi chiedo se funzionerà. La variabile globale barsGV è dichiarata come una stringa, tuttavia la riferisce a 0 nella prima linea. È giusto?

 

...

Questo codice funziona bene quando viene eseguito per la prima volta

0 è testato per il seguente motivo :

double GlobalVariableGet([/TD] [TD]string name)

"Restituisce il valore di una variabile globale esistente o 0 se si verifica un errore"

L'errore quando si recupera il valore della variabile globale sarebbe quando la variabile globale non è ancora creata. Ma, come ho detto, questo codice è OK quando viene eseguito per la prima volta. Il problema è il seguente: immaginate di eseguire un test e che il barGV sia impostato a 5000 alla fine del test. Ora esegui di nuovo l'EA e le barre saranno sempre inferiori al valore di barsGV (che è ancora 5000). Il codice deve essere scritto diversamente. Usa qualcosa come questo

GlobalVariableSet(barsGV,0);

nella init(), e allora dovrebbe funzionare bene anche per i test consecutivi. Ma anche, artificialmente, "fingerà" che non ci sia un ordine aperto alla barra corrente quando si avvia l'EA, il che potrebbe essere un errore. E' molto meglio usare la funzione per contare gli ordini aperti su una barra corrente piuttosto che usare le variabili globali per questo scopo (per molteplici ragioni)

________________________________________________

PS: usare le variabili globali in questo modo impedisce di usare istanze multiple di un EA (ogni variabile globale è visibile da un altro codice - qualsiasi codice : EA, script, indicatore ..., quindi se il nome non è unico, si rischia una confusione di EA che leggono e impostano tutti la stessa variabile globale allo stesso tempo)

crsnape@btinternet.com:
Ho messo alcune altre Print()s dopo i comandi if e penso che a questo punto stia fallendo, in particolare la linea rossa, poiché il mio giornale smette di stampare dopo questo punto.

//--- VARIABILI GLOBALI

stringa HasOrderedGV = "has_ordered_GV

stringa barsGV = "bars_GV";

//--- Determinare se l'ordine è già stato piazzato sul blocco orario H4

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Determina se l'ordine è già stato piazzato per la barra corrente", HasOrderedGV);

//--- Controlla la possibilità di posizione lunga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Ho trovato questo pezzo di codice online e l'ho usato nel mio. Ma ora mi chiedo se funzionerà. La variabile globale barsGV è dichiarata come una stringa, tuttavia la riferisce a 0 nella prima linea. È giusto?
 

Ahh... capisco. Perché le variabili globali salvano i loro valori in memoria. Quindi, come dici tu, quando finisce il backtesting ed è a 5000, questo viene salvato in memoria anche se il backtesting viene rieseguito, quindi non tornerà mai falso perché BarsGV non è sotto 5000? Gesù, questo è profondo.

E inoltre, se genera un errore, imposta HasOrderedGV su false in modo da poter continuare con il resto del codice?

Ho capito bene?

BTW- questo è permesso?

GlobalVariableSet(HasOrderedGV, false);

Perché in MQL4 Book dice:

datetime GlobalVariableSet([/TD] [TD]string name, double value)

Il secondo valore nella mia istanza è bool non double?

Motivazione: