Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Más información sobre el trabajo con marcos.
Este es el código
inNum=0;
{ // Leer los parámetros de entrada optimizados correspondientes
Print("GLOC = ",GLOC);
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.
Librerías: TesterCache
fxsaber, 2019.11.11 04:45 pm.
Ha recibido un fichero opt en una matriz de bytes. A continuación, debe introducirlo en Caché.
Lo he corregido como has dicho
string Sohran,Contr;
MTTESTER::GetSettings(Sohran); // Se leen los ajustes iniciales actuales del robot para guardarlos temporalmente en Sohran.
prWrite = MTTESTER::SetSettings2(Odinar); // Configura Odinar a los ajustes del robot
prRead = MTTESTER::GetSettings(Contr); // Leer los ajustes del robot que se acaban de establecer.
Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
Print("SettingBeg OdinarContr ",Kol," PoseY = ",PoseY," Iteration ",IterNumber,"\n",Contr);
Run(Contr[0]); // Ejecuta la optimización sobre los valores del parámetro Y seleccionado
int GLOC = MTTESTER::GetLastOptCache(Bytess); // Obtener el archivo opt en la matriz de bytes Bytess
TESTERCACHE<ExpTradeSummary> Caché;
bool CL = Cache.Load(Bytess); // Introducir la matriz de bytes Bytess en Cache
ProfitNow = Cache[GetMaxProfitPos(Cache)].profit; // Beneficio máximo
int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Número de la pasada con beneficio máximo
int IndexMaxProfit = GetMaxProfitPos(Cache); // Índice de la matriz con el valor del parámetro https://www.mql5.com/ru/forum/318998/page2#comment_13846951
Cache.GetInputs(IndexMaxProfit,Paramas);
ParamMax = Paramas[0,1].double_value; // Valor del parámetro en el que se ha alcanzado el beneficio máximo
Alert("CL=",CL," GLOC = ",GLOC," GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Iteration ",IterNumber);
devolver;
El resultado sigue siendo erróneo.
Por alguna razón los datos ProfitNow y ParamMax de alguna ejecución anterior se leen de la caché.
Saludos, Alexander
Por alguna razón, los datos de ProfitNow y ParamMax de alguna ejecución anterior se leen de la caché.
¿Muestra este script los valores correctos después de la optimización?
Si es así, el problema es que el archivo opt no está listo justo después de la optimización. Puede intentar poner Sleep después de Run. O Run no funciona correctamente.
¿Muestra este script los valores correctos tras la optimización?
Si es así, lo más probable es que el archivo opt no esté listo justo después de la optimización. Puede intentar poner Sleep después de Run. O Run no funciona correctamente.
Gracias. Voy a comprobar todo esto mañana.
Pero ahora he descubierto que si configuro la optimización con un nuevo parámetro, todo funciona correctamente.
Así que me parece que la cuestión es que el comprobador, si vuelve a configurar una optimización que ya funcionaba antes, en realidad no la procesa de nuevo, sino que sólo recupera el resultado anterior de la memoria.
¿No se podría inventar algo para destruir de antemano esta memoria del comprobador?
Así que me parece que la cuestión es que el comprobador, si vuelve a ajustar una optimización ejecutada previamente, en realidad no la procesa de nuevo, sino que simplemente recupera el resultado anterior de la memoria.
Tus hipótesis son erróneas. El problema está en el código que has escrito.
Tus hipótesis son erróneas. El problema es el código que has escrito.
Buenas tardes.
Estoy de acuerdo contigo en que "El problema está en el código que escribí". El error está en él, y aún no sé cómo solucionarlo.
Sin embargo, he comprobado experimentalmente que si eliminas manualmente todos los archivos opt antes de ejecutar Run.
de la carpeta "C:\sers\ASUSAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache",
entonces mi código funciona correctamente y realiza la optimización en el parámetro seleccionado.
Si no se limpia esta carpeta, el Probador no realiza optimizaciones repetidas (con los mismos datos sin modificar), sino que lee de esta carpeta
archivo opt ya existente de esta carpeta. Esto puede verse claramente cuando se ejecuta repetidamente la misma optimización de forma manual.
Puede verse que la optimización real sólo se realiza la primera vez, y entonces sólo lee el archivo opt de la carpeta.
Esta lectura repetida no parece actualizar el contenido de la caché, y esto es lo que está causando el error en mi código.
Borrar dicha carpeta podría ayudar a resolver el error. Por supuesto, esta es una mala solución, y sería más elegante poder restaurar los datos correctos en la caché.
Pero no sé cómo hacerlo. Por ahora, los datos de la optimización real anterior están colgados en la caché (no coinciden con la relectura de la carpeta).
Desafortunadamente, esta carpeta no se puede limpiar desde el script usando FolderClean, porque está prohibido en MQL5.
Está fuera de la "caja de arena" y se llena sólo por el Probador de Estrategias.
Tal vez deberías crear algún complemento externo mediante C++ y ejecutarlo desde el script.
Saludos, Alexander