Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Leggete come lavorare con le cornici.
Ecco il codice:
inNum=0;
{ // Leggere i corrispondenti parametri di ingresso ottimizzati
Print("GLOC = ",GLOC);
Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading.
Librerie: TesterCache
fxsaber, 2019.11.11 04:45 pm.
È stato ricevuto un file opt in un array di byte. Quindi, è necessario inserirlo nella Cache.
L'ho corretto come avete detto:
string Sohran,Contr;
MTTESTER::GetSettings(Sohran); // Le impostazioni iniziali correnti del robot vengono lette e salvate temporaneamente in Sohran.
prWrite = MTTESTER::SetSettings2(Odinar); // Imposta Odinar sulle impostazioni del robot.
prRead = MTTESTER::GetSettings(Contr); // Legge le impostazioni del robot appena impostate.
Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
Print("SettingBeg OdinarContr ",Kol," PoseY = ",PoseY," Iterazione ",IterNumber,"\n",Contr);
Run(Contr[0]); // Esecuzione dell'ottimizzazione sui valori del parametro Y selezionato
int GLOC = MTTESTER::GetLastOptCache(Bytess); // Ottenere il file opt nell'array di byte Bytess
TESTERCACHE<ExpTradeSummary> Cache;
bool CL = Cache.Load(Bytess); // Alimenta l'array di byte Bytess nella Cache
ProfitNow = Cache[GetMaxProfitPos(Cache)].profit; // Profitto massimo
int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Numero del passaggio con il massimo profitto
int IndexMaxProfit = GetMaxProfitPos(Cache); // Indice dell'array con il valore del parametro https://www.mql5.com/ru/forum/318998/page2#comment_13846951
Cache.GetInputs(IndexMaxProfit,Paramas);
ParamMax = Paramas[0,1].double_value; // Il valore del parametro al quale è stato raggiunto il massimo profitto
Alert("CL=",CL," GLOC = ",GLOC," GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Iterazione ",IterNumber);
ritorno;
Il risultato è ancora sbagliato.
Per qualche motivo i dati ProfitNow e ParamMax di una precedente esecuzione vengono letti dalla cache.
Saluti, Alexander
Per qualche motivo, i dati di ProfitNow e ParamMax di una precedente esecuzione vengono letti dalla cache.
Questo script mostra i valori corretti dopo l'ottimizzazione?
Se sì, è molto probabile che il problema sia dovuto al fatto che il file di opt non è pronto subito dopo l'ottimizzazione. Si può provare a inserire Sleep dopo Run. Oppure Run non funziona correttamente.
Questo script mostra i valori corretti dopo l'ottimizzazione?
Se sì, molto probabilmente il problema è che il file opt non è pronto subito dopo l'ottimizzazione. Si può provare a inserire Sleep dopo Run. Oppure Run non funziona correttamente.
Grazie! Domani controllerò tutto questo.
Ma ora ho scoperto che se imposto l'ottimizzazione con un nuovo parametro, tutto funziona correttamente.
Quindi mi sembra che il punto sia che il tester, se si reimposta un'ottimizzazione che ha già funzionato in precedenza, non la elabora di nuovo, ma si limita a recuperare dalla memoria il risultato precedente.
Non si potrebbe inventare qualcosa per distruggere preventivamente questa memoria del tester?
Quindi mi sembra che il punto sia che il tester, se si reimposta un'ottimizzazione precedentemente in esecuzione, non la elabora di nuovo, ma semplicemente recupera dalla memoria il risultato passato.
Le vostre ipotesi sono sbagliate. Il problema è nel codice che avete scritto.
Le vostre ipotesi sono sbagliate. Il problema è il codice che avete scritto.
Buon pomeriggio!
Sono d'accordo con lei: "Il problema è nel codice che ho scritto". L'errore è in esso e non so ancora come risolverlo.
Tuttavia, ho scoperto sperimentalmente che se si rimuovono manualmente tutti i file opt prima di eseguire Run.
dalla cartella "C:\Users\ASAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache",
allora il mio codice funziona correttamente ed esegue l'ottimizzazione sul parametro selezionato.
Se questa cartella non viene ripulita, il Tester non esegue ottimizzazioni ripetute (con gli stessi dati invariati), ma legge
file opt già esistente da questa cartella. Ciò è chiaramente visibile quando si esegue ripetutamente la stessa ottimizzazione manualmente.
Si può notare che l'ottimizzazione vera e propria viene eseguita solo la prima volta e poi legge solo il file opt dalla cartella.
Questa lettura ripetuta non sembra aggiornare il contenuto della cache e questo è ciò che causa l'errore nel mio codice.
La cancellazione della cartella potrebbe aiutare a risolvere l'errore. Naturalmente, questa è una cattiva soluzione e sarebbe più elegante poter ripristinare i dati giusti nella cache.
Ma non so come fare. Per ora, i dati della precedente ottimizzazione reale rimangono nella cache (non corrispondono alla rilettura della cartella).
Purtroppo questa cartella non può essere pulita dallo script con FolderClean, perché è vietata in MQL5.
è fuori dalla "sandbox" e viene riempita solo dallo Strategy Tester.
Forse si dovrebbe creare un componente aggiuntivo esterno tramite C++ ed eseguirlo dallo script.
Saluti, Alexander