El artículo es curioso y muy útil para mí. Sin embargo, tengo una pregunta: ¿cómo de correcta es la comparación de números reales en este trozo de código?
double AnnealingMethod::FindValue(double val,double step) { double buf=0; if(val==step) return val; if(step==1) return round(val);
Images\AnnealingMethod\back.bmp Images\AnnealingMethod\pause.bmp Images\AnnealingMethod\play.bmp Images\AnnealingMethod\stop.bmp Images\AnnealingMethod\forward.bmp
Gracias por el mensaje, corregido
| AnnealingMethod.zip | Zip-файл с картинками для создания интерфейса плеера. Файлы нужно разместить в папке MQL5/Images/AnnealingMethod |
Ha sido un buen artículo. Gracias al autor.
Todavía estoy un poco confundido, pero me gustaría decir algo al respecto
Несмотря на значительные преимущества, алгоритм метода отжига имеет следующие недостатки реализации:
- la imposibilidad de ejecutar el algoritmo en pruebas en la nube;
- la complejidad de la conexión con el Asesor Experto y la necesidad de seleccionar los parámetros para obtener los mejores resultados.
Propongo ajustar ligeramente el artículo para que pueda conectar cualquier Asesor Experto con pequeños movimientos.
Por ejemplo, puede conectar el Moving Average.mq5 estándar a la implementación presentada del método de recocido de la siguiente manera
//+------------------------------------------------------------------+ //|Medias móviles.mq5 //| Copyright 2009-2017, MetaQuotes Software Corp. | | //|http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Copyright 2009-2017, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #include <Trade\Trade.mqh> input double MaximumRisk = 0.02; // Riesgo máximo en porcentaje input double DecreaseFactor = 3; // Factor de disminución. input int MovingPeriod = 12; // Período de media móvil input int MovingShift = 6; // Desplazamiento de la media móvil // Insertar después de todas las entradas #include <AddAnnealingMethod.mqh> #define MaximumRisk Inputs[0] #define DecreaseFactor Inputs[1] #define MovingPeriod (int)Inputs[2] #define MovingShift (int)Inputs[3] //--- int ExtHandle=0; bool ExtHedging=false; CTrade ExtTrade; #define MA_MAGIC 1234501
¡Y eso es todo! No se requieren más manipulaciones. Para que funcione, tuvimos que cambiar ligeramente una función
//función de parametrización de la optimización uint AnnealingMethod::RunOptimization(string &InputParams[],int count,double F0,double T) { Input Mass[]; ArrayResize(Mass, ArraySize(InputParams)); ResetLastError(); bool Enable=false; double Start= 0; double Stop = 0; double Step = 0; double Value= 0; int j=0; Alg.HQRndRandomize(&state);//inicialización for(int i=0;i<ArraySize(InputParams);i++) { if(!ParameterGetRange(InputParams[i],Enable,Value,Start,Step,Stop)) return GetLastError(); // if(Enable) { // ArrayResize(Masa,ArrayTamaño(Masa)+1); Mass[j].num=i; // Masa[j].Valor=ValorUniforme(Inicio,Parada,Paso); Mass[j].Value=Enable ? UniformValue(Start,Stop,Step) : Value; Mass[j].BestValue=Mass[j].Value; Mass[j].Start=Start; Mass[j].Stop=Stop; Mass[j].Step=Step; Mass[j].Temp=T*Distance(Start,Stop); j++; // if(!ParameterSetRange(InputParams[i],false,Value,Start,Stop,count)) if(Enable && !ParameterSetRange(InputParams[i],false,Value,Start,Step,Stop)) return GetLastError(); } // si no // InputParams[i]="""; } if(j!=0) { if(!ParameterSetRange("iteration",true,1,1,1,count)) return GetLastError(); else return WriteData(Mass,F0,1); } return 0; }
y esconder un trozo de código decente en AddAnnealingMethod.mqh.
Таким образом, алгоритм сверхбыстрого отжига — достойный конкурент ГА и при правильных настройках может показать лучший результат.
¿con qué ajustes "correctos"?
el objetivo de un algoritmo de optimización es reducir el espacio de búsqueda. si hay una búsqueda en curso, significa que no se conoce la fórmula FF (de lo contrario, se podrían calcular los extremos con la fórmula basada en FF) y, por lo tanto, no hay "ajustes correctos".
el algoritmo busca mejor en igualdad de condiciones o peor, es imposible estar un poco embarazado.
Hubo intentos reales de comparar el GA regular y otros AOs en varias pruebas. los dioses dijeron - no habrá peleas y amén a eso.
ZY. 1, 2 parámetros optimizables? es simplemente ugh..... intenta optimizar varios cientos, miles de parámetros con tu recocido..... se te abrirán los ojos.
tester_file sólo se lee si existía (el contenido no es importante) en el momento de la compilación.
Si mq5 se compiló cuando no existía el archivo correspondiente, ni siquiera su existencia posterior se percibirá en EX5.
Por lo tanto, si genera un archivo para tester_file en OnTesterInit, asegúrese de compilar el EA cuando haya al menos un archivo pasado vacío.
@Renat Fatkhullin está un poco equivocado en su declaración
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
Puede un EA sin funciones DLL enviar datos a alguna parte?
Renat Fatkhullin, 2017.06.21 11:12 AM
No lo he comprobado, pero supongo que este archivo se puede generar directamente en OnTesterInit.
No, no irá en el paquete de datos calculado en el propio pase.
El artículo muestra que OnTesterInit genera perfectamente los datos que se enviarán a los Agentes en forma de fichero. Está claro que estos datos pueden ser de carácter personal...
El autor ha hecho un gran trabajo. Un artículo muy interesante.
Gracias.
Ha habido verdaderos intentos de comparar el GA regular y otros AOs en varias pruebas. los dioses han dicho - no habrá monociclo y amén a eso.
ZY. ¿1, 2 parámetros optimizables? es simplemente ugh..... intenta optimizar varios cientos, miles de parámetros con tu recocido..... se te abrirán los ojos.
El artículo es valioso no por el algoritmo de optimización (aunque es más que interesante), sino por la implementación incorporada en el optimizador estándar. La implementación es muy poco estándar por el momento e incluso contradice algunas declaraciones de los desarrolladores. Pero para entenderlo hay que leer el código fuente, que no se refiere al algoritmo de recocido en sí.
Nada te impide incrustar de forma similar tu propio algoritmo y mostrar sus pros/contras directamente en los Asesores Expertos, como hizo el autor.
El artículo es curioso y muy útil para mí. Sin embargo, tengo una pregunta: ¿cómo de correcta es la comparación de números reales en este trozo de código?
Sí, tienes razón, es imposible comparar así. La ayuda de MQL5 sugiere usar la siguiente función:
bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); }
Pero incluso si la comparación se realiza incorrectamente, la función FindValue producirá el resultado correcto
El artículo es valioso no por el algoritmo de optimización (aunque es más que interesante), sino por la implementación incorporada en el optimizador estándar. La implementación es muy poco estándar por el momento e incluso contradice algunas declaraciones de los desarrolladores. Pero para entenderla hay que leer las fuentes, que no se refieren al algoritmo de recocido en sí.
Nada te impide incrustar de forma similar tu propio algoritmo y mostrar sus pros/contras directamente en Expert Advisors, como hizo el autor.
Está claro que el artículo es valioso para la aplicación de la gestión de optimización, pero el autor hace una comparación con el algoritmo estándar por alguna razón, e incluso con un número insignificante de parámetros - esto es lo que traté de enfatizar en mi post, que es inútil competir con el optimizador estándar en el rango de espacio de búsqueda (número de parámetros y su paso) suficiente para fines prácticos de algotraders.
Y si se va a utilizar la optimización personalizada, definitivamente no es de esta manera, porque el "cuello de botella" en la velocidad es el propio probador, no el AO, y la calidad ya se ha mencionado - el estándar ya es lo suficientemente bueno.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Optimización controlable: el método del recocido:
En el simulador de estrategias de la plataforma comercial MetaTrader 5 solo existen dos variantes de optimización: la iteración completa de parámetros y el algoritmo genético. En este artículo se propone una nueva variante de optimización de estrategias comerciales: el método del recocido. Se muestra el algoritmo del método, su implementación y su método de inclusión en cualquier asesor. El algoritmo desarrollado se ha puesto a prueba con el asesor Moving Average.
Para implementar el algoritmo, escribiremos dos clases que se deben incluir en el asesor optimizado:
Asimismo, para que el algoritmo funcione, se necesita incluir un código adicional en la función OnInit y añadir al código del asesor las funciones OnTester, OnTesterInit, OnTesterDeInit, OnTesterPass. El proceso de conexión del algoritmo al asesor se muestra en la fig. 2.
Fig. 2. Inclusión del algoritmo en el asesor
Autor: Aleksey Zinovik