[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 366

 
lottamer:


no hay garrapatas.

Quizás la falta de normalización dentro de la EA provoca este efecto.

Sin embargo, cuando aparece la pestaña de parámetros de entrada, la optimización en sí no se produce.

¡El probador hace algo, en la parte inferior se puede ver el número actual de rebasamientos (7/62), pero al terminar en las pestañas resultados de optimización, y el gráfico de optimización está Vacío!

La marca de verificación del parámetro es, por supuesto, ....

Ni siquiera sé hacia dónde mirar...


El comprobador no proporciona resultados repetibles con datos inalterados, ya que la dispersión cambia sin saberlo cuando se comprueba.

Cura:https://www.mql5.com/ru/forum/119830

 
Chiripaha:

Los valores vacíos pueden indicar que el resultado de la optimización de determinados parámetros no es rentable, es decir, una fuga. Intente ejecutar uno de los parámetros con Visualización y podrá ver este resultado.

En cuanto a la normalización, tampoco creo que haya tal efecto, ya que al ser los mismos valores, los números matemáticos serán exactamente los mismos, por lo que no habrá cambios.

En cuanto a "qué pensar", a veces es mejor no pensar y aplazar la pregunta; la idea y los pensamientos vendrán después. Tienes que dar a tu cerebro espacio para maniobrar, descansar y pensar sin esforzarte.


1. el asesor es rentable.

2. Ya lo he comprobado a mano: es rentable en todo el rango del parámetro. Sólo quería ampliar un poco el rango y hacer el paso más pequeño.

 
tara:


El comprobador no proporciona resultados repetibles con datos inalterados, porque la dispersión cambia sin saberlo durante la prueba.

La cura:https://www.mql5.com/ru/forum/119830



El spread es flotante, ¿no?

otra cosa es que tenga que estar cimentado en la historia...

en general el resultado flota ligeramente y el número de operaciones no cambia...así que este tema no me asusta demasiado...

La otra cosa es que el optimizador no funciona en absoluto. Esto es molesto...

esto es lo que dice el probador en el registro..:



2013.05.29 12:20:10 Se han realizado 8 pases durante la optimización, 8 resultados han sido descartados por ser insignificantes

 
tara:


El comprobador no proporciona resultados repetibles con datos inalterados porque la dispersión cambia sin saberlo durante la prueba.

La cura:https://www.mql5.com/ru/forum/119830

Puede que sea posible, pero el tamaño de mi extensión se pone en Info - y se muestra cuando se cambia. En el probador no he notado que el spread flote. Toma los datos de los parámetros estándar de MarketInfo de la cuenta corriente y no los modifica más.

Esta cura cambia el spread p-r para que puedas ver diferentes resultados de optimización con diferentes spreads. Según tengo entendido, este es el único propósito para el que se necesita el software del enlace.

 
lottamer:


2013.05.29 12:20:10 Se han realizado 8 pases durante la optimización, 8 resultados han sido descartados por ser insignificantes

Así es, estos resultados han sido descartados por ser insignificantes. - Por eso no aparece en los resultados ni en el gráfico.
 
Chiripaha:
Así es, estos resultados fueron marcados como insignificantes. - Por eso no aparece en los resultados ni en el gráfico.



Creo que tengo un problema más profundo.

Mi primera pregunta ayer fue cómo optimizar los parámetros dentro de una función de usuario.

Me dijeron: muévelos al doble externo

Lo hice.

y ahora el optimizador arroja el resultado... debo haberlos movido incorrectamente.

Aquí está el código. Es un modificador común de parar y tomar

En lugar de STOP y TAKE, solía haber números 100 y 200

He cambiado los números a STOP y TAKE

y al principio del código he añadido

extern double STOP = 100;
extern double TAKE = 200;

¿Hay algún error aquí?

(el propio modificador funciona al 100%)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

Por ahora estoy mirando el código, pero permitiré algunos comentarios a lo largo del camino.

Esta línea no tiene ningún sentido:

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

Sólo será necesario si tiene una estrategia multidivisa, pero entonces, en lugar de una estrategia multidivisa, tiene que utilizar

Symbol()

Deberá utilizar otros valores predefinidos, pero no esta función normal.

Esta variable tampoco es necesaria.

total=OrdersTotal();

Porque dentro de su función se aplica sólo una vez, en la enumeración, que por alguna razón está comentada, y sólo desordena el código. - De ahí la pregunta - ¿Por qué ha comentado la enumeración por orden?

Esto:

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

mejor agrupados en general - la condición es la misma. Por cierto, los has escrito de forma diferente por estructura. - Es a la cuestión de la pérdida de la estructura. El estilo de la escritura debe ser uniforme - entonces se puede ver la estructura y los posibles errores saldrán como baches después de la nevada.

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

De lo que has presentado no he encontrado ningún punto principal que pueda afectar al resultado. Pero... Sólo has presentado una función aquí (bastante descuidada, a no ser que cuentes la enumeración comentada - esto se refleja en la pregunta). Para decir el veredicto - no necesitas la función, necesitas el código del programa, porque no sabes dónde y dónde está la causa y tienes que buscarla. Para ello, debe ejecutar el programa en el probador y ver con sus propios ojos los errores que pueden producirse. Entonces ya recorre el código (o en orden inverso) y busca la causa.

Como sensación general puedo decir que tú, Oleg, tienes bastantes descuidos (indiferencia, diría yo). Esto puede llevar a 1. A la basura del sistema en uso. 2. Pérdida de la estructura como resultado de esta basura y dificultad para identificar y detectar el bicho. Así que mi consejo es este. - Si es posible, tire toda la "basura" (excesos) del código - el error será más fácil de encontrar. - Este es un error clásico de la mayoría de las personas que piden ayuda: el descuido.

 
lottamer:


Probablemente sea más profundo que eso.

Mi primera pregunta ayer fue cómo optimizar los parámetros dentro de una función personalizada.

Me dijeron: ponlos en doble externo.

Lo hice.

Y ahora el optimizador arroja el resultado... aparentemente, los saqué de alguna manera equivocada.

No, creo que te equivocas. El probador lanza el resultado no por los parámetros que ponemos, sino porque los resultados no pasan el criterio de significación.

Pero es posible que el propio programa contenga un error. Además, los resultados inestables son una indicación indirecta de ello. - Significa que algo va mal. En mi consulta, no permito que esos programas lleguen al mundo real. Porque si algo va mal, significa que la situación es incontrolable. Y cualquier cosa puede salir.

Los parámetros Stop-Loss y Take-Profit, por definición, están en variables externas en cualquier programa, y no sólo porque necesiten ser optimizados. No es que vayas a entrar en tu código cada vez que quieras cambiarlos. Por lo tanto, no importa si se trata de variables externas o internas. - Eso es seguro.

 
Chiripaha:

Por ahora estoy viendo el código, pero permitiré algunos comentarios a lo largo del camino.

Esta línea no tiene ningún sentido:

Sólo lo necesitarás si tienes una estrategia multidivisa, pero entonces en lugar de

Tendrá que sustituir otros valores predefinidos, pero no esta función básica.

Esta variable tampoco es necesaria.

Se utiliza sólo una vez dentro de la función en la enumeración, que se comenta por alguna razón y sólo desordena el código. - De ahí la pregunta - ¿Por qué ha comentado la enumeración por órdenes?

Aquí está.

En general, sería mejor agruparlas - la condición es la misma.

Bueno, no he encontrado ningún punto principal de lo que has presentado que pueda afectar al resultado. Pero... Aquí sólo has presentado una función (bastante descuidada, a no ser que cuentes la enumeración comentada - esto se refleja en la pregunta). Para decir el veredicto - no necesitas la función, necesitas el código del programa, porque no sabes dónde y dónde está la causa y tienes que buscarla. Para ello, debe ejecutar el programa en el probador y ver con sus propios ojos los errores que pueden producirse. A continuación, ya ejecutar a través del código (o en orden inverso) y buscar esta causa.

Como sensación general puedo decir que tú, Oleg, tienes bastante descuido (indiferencia, diría yo). Esto puede llevar a 1. A la basura del sistema en uso. 2. Pérdida de la estructura como resultado de esta basura y dificultad para identificar y detectar el bicho. Así que mi consejo es este. - Si es posible, tire toda la "basura" (excesos) del código - el error será más fácil de encontrar. - Este es un error clásico de la mayoría de la gente que pide ayuda: el descuido.


Yo no he escrito este modificador.

Lo tengo preparado desde las bibliotecas.

Lo principal es que funciona al 100%.

Pero por qué el parámetro dentro de él no está optimizado - esa es la pregunta.....

No hay errores básicos.

El resto del código funciona.

Poner cualquier condición en el algoritmo.

- comprar

-Modificar

- cerrar

---------------------------

y tratar de prooptimizar el parámetro dentro de mi orden MODIFICADORA - es decir, detener y tomar

 
Chiripaha:

No, creo que se equivoca. El probador no es expulsado por los parámetros que pone, sino porque los resultados no pasan los criterios de significación.

Pero es posible que el propio software contenga un error. Además, los resultados inestables son una indicación indirecta de ello. - Significa que algo va mal. En mi consulta, no permito que esos programas lleguen al mundo real. Porque si algo va mal, significa que la situación es incontrolable. Y cualquier cosa puede salir.

Los parámetros Stop-Loss y Take-Profit, por definición, están en variables externas en cualquier programa, y no sólo porque necesiten ser optimizados. No es que vayas a entrar en el código cada vez que quieras cambiarlos. Por lo tanto, no importa si se trata de variables externas o internas. - Eso es seguro.

Bueno, mira,

Si devuelvo todo ahora, es decir, quito los parámetros externos STOP y TAKE y escribo números dentro de la función en lugar de ellos, entonces el EA se ha ejecutado semana tras semana durante 10 semanas y muestra resultados claros.

Si cambio manualmente los parámetros de parada y despegue, todo funcionará y dará resultados ligeramente diferentes (por supuesto)

Pero ahora, ¿por qué, cuando cambio estos parámetros fuera del modificador, el optimizador los considera insignificantes?