Progetto aperto - tester-ottimizzatore in-house - pagina 2

 
Tuttavia, non conosco la reazione del compilatore in anticipo, lascerà passare le costanti di trading nel corpo dell'indicatore o no? <br / translate="no"> Molto probabilmente sarà così.

Certo che dovrebbe, sono tutti solo interi, non un tipo separato.

Un piccolo consiglio.

Naturalmente, è auspicabile non riscrivere la strategia per il tester. Una volta scritta, la strategia dovrebbe funzionare nel tester e senza di esso (nel mondo reale).

Questo può essere fatto con l'aiuto delle biblioteche.
1. Tutte le funzioni relative al commercio, cambiano un po' il loro nome (il mio... - non molto bene, forse meglio _....).
2. Creare 2 librerie. Il primo contiene codice per i test (senza effettivamente inviare ordini), il secondo duplica solo i parametri nelle chiamate di funzioni standard. Il cambio di lavoro/prova viene fatto semplicemente sostituendo la libreria.

Naturalmente, potremmo mettere tutto in una libreria e introdurre un parametro globale per passare, ma probabilmente non è necessario.

E sarebbe meraviglioso introdurre in MT una funzione in più, che, imho, semplificherebbe radicalmente la scrittura di un tale tester - la funzione di impostare l'ultima barra corrente.

Cioè supponiamo di avere 1000 barre nella cronologia su cui stiamo testando.
Definiamo la barra 200 come ultima e usiamo Close[200] invece di Close[0]. Questa caratteristica dovrebbe funzionare in tutte le funzioni integrate.

Il tester si presenterà quindi come un ciclo sul numero di barra in cui questo valore è impostato (l'ultima barra del test) e la chiamata della funzione di avvio nella strategia.

In effetti, non è così semplice :))
Ho bisogno di altri punti ...
 
Non lo capisco, per favore spiegatemi
2. Creiamo 2 librerie. La prima libreria contiene codice per i test (senza effettivamente inviare ordini), la seconda semplicemente duplica i parametri nelle chiamate di funzioni standard.
Il
passaggio tra lavoro e test viene fatto semplicemente sostituendo la libreria
.
La frase "codice per i test" è un codice da tester o un codice EA? Sii più specifico.

Anche questo
Vale a dire che abbiamo 1000 barre nella storia su cui stiamo testando.
Definiamo 200 barre come ultima, quindi invece di Close[0] usiamo Close[200].
E questa fic dovrebbe funzionare (influenzare) in tutte le funzioni in linea.


Qualsiasi codice EA è facilmente convertibile in codice per un indicatore:
Prendiamo il blocco start() dell'EA, aggiungiamo un costrutto for (testerconter=Bars;testerconter>=0;testerconter--)
{
chiuderlo con una parentesi alla fine
}
Sostituisci tutti i posti che usano riferimenti con [testerconter+riferimento].

Ecco un esempio dal built-in MACD_sample.mq4 Expert Advisor.
Codice sorgente:
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);


Modificato

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+1);


Come potete vedere, non c'è nessun problema. Se volete, potete sempre ridefinire testerconter=0 se
il codice viene eseguito nel corpo di Expert Advisor, non nel corpo di Expert Advisor .

 
La frase "codice per i test" è un codice da tester o da EA? Sii più specifico.

Nella prima libreria la funzione
_OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid + Stop * Point, Bid - Take * Point);


emula l'esecuzione dell'ordine nel tester, cioè lo aggiunge alla lista degli ordini nel tester e non invia l'ordine al server.

Nella seconda libreria, questa funzione chiama semplicemente la funzione incorporata

int _OrderSend( string symbol, int cmd, double volume, double price, int slippage, 
                double stoploss, double takeprofit, string comment=NULL, int magic=0, 
                datetime expiration=0, color arrow_color=CLR_NONE) 
{
   return (OrderSend(symbol, cmd, volume, price, slippage, stoploss, 
                        takeprofit, comment, magic, expiration, arrow_color) );
}


Qualsiasi codice dell'Expert Advisor può essere facilmente rielaborato nel codice dell'indicatore:
Prendiamo il blocco start() dell'EA, aggiungiamo un costrutto for(testerconter=Bars;testerconter>=0;testerconter--)
{
chiuderlo con una parentesi alla fine
}
Sostituire tutti i posti che usano riferimenti con [testerconter+riferimento].

Questo è quello che voglio dire.
Sarebbe più facile chiamare la funzione che imposta il valore della variabile testerconter in MT (0 di default) invece di sostituirla e questa sostituzione ([testerconter+reference]) sarebbe fatta in MT stessa.
Allora non dovremmo fare queste sostituzioni nella strategia stessa.

for(testerconter=Bars;testerconter>=0;testerconter--)
{
   SetTestPoint(testerconter);
      далее текст эксперта без переделки,
      или лучше вызов его функции start (или _start)
}



Si prega di sostituire pre con. pre a citare in "cioè diciamo che abbiamo 1000 barre in ...".
altrimenti la pagina sparisce di nuovo.

 
L'ho sostituito con le virgolette, sembra che il tuo testo vada via, fai una traduzione forzata della stringa nel tuo esempio
su
int _OrderSend( string symbol,....


La mia conclusione: sembra che stiamo parlando della stessa cosa. Possiamo dimenticare l'attuale richiesta dell'ultima barra per ora -
Dovremmo cercare di farlo.
Per ora basta ridefinire le funzioni commerciali standard, il prefisso _. , è ancora più rispettabile :)
 
a avm
I test in questo modo sono possibili. Ed è abbastanza buono. Ma, sfortunatamente, non otterrete l'universalismo. <br / translate="no"> Ho passato un paio di settimane su questi test. A prima vista sembra semplice.


Ho il sospetto che tu abbia fatto il test "con molto sangue", cioè non hai ridefinito le funzioni di trading. E ogni nuovo test
Ogni nuovo test richiede la scrittura di un nuovo indicatore del tester. Ma dovete farlo solo una volta - e nessun problema dopo.
Se mi sbaglio - pubblicate le funzioni - non siate avari.
 
Un altro punto.

Sembra che non si possachiamare direttamente lafunzione di avvio dall'Expert Advisor.
Pertanto, sarebbe meglio scrivere il codice dell'Expert Advisor in una libreria e avere lì le funzioni _init, _deinit e _start.

Nell'Expert Advisor, scriveremo
#include ".....";
   ...............

int init()
{
   return(_init());
}

int deinit()
{
   return(_deinit());
}

int start()
{
   return(_start());
}


È un po' poco chiaro, però, quali siano i parametri.

 
A proposito, è possibile combinare diversi EAs/segnali su un grafico.
Come si fa in Omega:
#include "A1.....";
#include "A2.....";
   ...............

int init()
{
   _initA1();
   _initA2();
   return(0);
}

int deinit()
{
   _deinitA1();
   _deinitA2();
   return(0);
}

int start()
{
   _startA1();
   _startA2();
   return(0);
}


Non è molto bello, ma funzionerà.
In generale, un sistema di elaborazione degli eventi fatto in casa funzionerà :))

 
Forse è più facile? Si fa uno script parser, che viene applicato a un file mq4 (con codice Expert Advisor).
Elabora questo codice - inserisce tutti i tipi di include, array di lavoro per Balance, Equity, ecc,
rinomina le variabili Lots in _Lots (e altre). In generale, fa il lavoro grossolano.
Dovrò solo archiviare l'uscita e andare. :)
Metodo di trasporto semplice.
 
a avm<br / translate="no">
È possibile testare in questo modo. Ed è abbastanza buono. Ma, sfortunatamente, non otterrete l'universalismo. Ho passato un paio di settimane su questi test. A prima vista sembra semplice.

Ho il sospetto che tu abbia fatto il test "con molto sangue", cioè non hai ridefinito le funzioni di trading. E ogni nuovo test richiedeva di scrivere un nuovo indicatore del tester. Ma dovete farlo solo una volta - e senza problemi. Se mi sbaglio, puoi postare le funzioni - non essere avaro.

Assolutamente giusto. "Grande sangue". Non ci sono state sostituzioni. Ho fatto tali tester già in MT3.x. MQL4 è diverso da MQL2 come il cielo dalla terra. Tuttavia, non ho approfittato di MQL4. Sono mentalmente stordito. Avrei dovuto prima pensare e poi lavorare.
Alla donna è stato consigliato: "Pensa prima, parla dopo". La donna rispose: "Come posso pensare a ciò che non ho ancora detto".
 
Sono andato un po' avanti con il parser, le funzioni devono essere scritte prima. Ma ricordo che gli sviluppatori hanno detto che non ci sarà un tester multivaluta (portfolio tester). O sto confondendo qualcosa? Se non sono confuso - una ragione in più per scrivere il proprio.
Motivazione: