Automatización de la búsqueda de estrategias. - página 3

 
Aliaksandr Hryshyn:

Efectivamente hay muchas cosillas.

Estoy intentando hacer un sistema universal, de modo que con un mínimo esfuerzo sea posible añadir diferentes posibilidades para analizar indicadores, velas, etc. Cada función tiene información sobre los datos con los que puede trabajar y los datos que saldrán. También se describirán los indicadores, qué tipo de datos proporcionan. Los datos se dividen en tipos, tanto simples como complejos, por ejemplo {double} y {int,double}. Se dividen en categorías, por el mismo ejemplo "precio" y "posiciones en el gráfico", otro ejemplo: "línea recta" (se puede utilizar para definir canales), etc. Se dividen por "tipo de escala". Se dividen por "tipo de escala", por ejemplo "constante" (parámetro de la estrategia), "índice" (hay un mínimo y un máximo), "ratio" (sólo hay un punto de referencia, por ejemplo precio, volumen), etc. Es necesario modificar la estrategia de una manera coherente, hay tal matiz, la modificación en un lugar puede afectar a las condiciones de modificación en otro lugar.

Así es... Para reducir el número de combinaciones de la búsqueda y se utilizan las restricciones anteriores (tipo, escala, categoría), por ahora será suficiente y cambios puntuales (añadir / quitar una / pocas funciones).

"la recombinación también es espontánea, pero de soluciones enteras ya hechas" - este pensamiento me vino a la mente), es difícil imaginar cómo se puede realizar. Lo más probable es que un grupo de funciones combinadas tenga más conexiones con el "mundo exterior" que una sola función, por lo que habrá menos oportunidades de encajarlo todo. El algoritmo se complica mucho, dejémoslo para tiempos mejores)).

Permítanme aclarar el pensamiento. Para reducir el número de variantes y que la modificación en una no afecte a los demás bloques debería ser aún más universal. El truco está en que las mismas tareas se pueden conseguir por diferentes métodos y a menudo no está claro de antemano cuál es mejor. Por ejemplo, hemos definido una tarea universal llamada TRANSFORMACIÓN. Hay cerca de una docena de osciladores que definen cada uno a su manera esta sobresolvencia. Supongamos que en el script del oscilador hemos establecido la tarea de probar TODOS los indicadores o todos los métodos. Entonces debemos normalizar la interacción de estos bloques con el resto del código. Digamos que hemos elegido que el estándar de interacción sea porcentajes de la parte superior. Secuencialmente, el generador sólo tiene que insertar en el código un bloque llamado Oversold1, buscar las variables que deben probarse en este bloque concreto, ejecutar un volkin-forward y recordar los resultados de la prueba. Luego prepara una nueva versión del Asesor Experto, ya con el bloque Oversold 2, que también da porcentajes, a pesar de que el indicador original muestra enteros, e incluso con signo distinto de cero, etc. Al final de las pruebas, deja el bloque más exitoso y pasa a otra tarea.

Al mismo tiempo, no es necesario preparar tantos bloques para empezar, 2 o 3 bloques serán suficientes. Lo principal es establecer la interacción.

Lo mismo ocurre con las dependencias. Hay A, B, C. Primero, si A es mayor que B, entonces C es cierta. Luego, si B es mayor que A, y así sucesivamente.

Luego podemos pasar a interacciones más complejas.

 

"Con el fin de reducir el número de opciones y la modificación en uno no afecta a los otros bloques deben ser MUCHO más versátil." => "Digamos que elegimos el estándar de interacción - porcentajes de la parte superior". - Entiendo lo que quieres decir)). Se trata de llevar los indicadores a una única vista, es decir, el preprocesamiento. En mi sistema todo está demasiado formalizado, me gustaría mantenerlo todo, ya estoy trabajando en la implementación de cosas tales como escala, categoría, ya he descubierto cómo hacerlo, hay realmente una conexión de algunos bloques afecta a la conexión de bloques en otros lugares. La normalización de los indicadores pasa por la descripción del propio indicador y en función de ella se conectarán automáticamente ciertos bloques. Uno de los bloques puede ser fácilmente el cálculo del porcentaje de un valor de otro, sólo estos valores deben tener una conexión entre ellos, que será controlado, por ejemplo:

  1. Porcent( Abierto[0] , Abierto[3] )
  2. Porcentaje(Abierto[0], Caimán[3])
  3. Porcentaje(Volumen[0], Caimán[3])

La 1ª y 3ª opción son buenas, lógicas, pero la 3ª no tiene sentido.

Los índices se calcularán también, por ejemplo Open[ Max_on_position(iAC,0,30) ] ]

 
Youri Tarshecki:

Al mismo tiempo, no es necesario preparar tantos bloques para empezar, 2 o 3 bloques serán suficientes. Lo principal es establecer la interacción.

Lo mismo ocurre con las dependencias. Hay A, B, C. Comprobamos primero si A es mayor que B, entonces se cumple C, luego si B es mayor que A, y así sucesivamente.

Luego podemos pasar a interacciones más complejas.

Ya está ahí.

Se implementa de la siguiente manera:

  1. hay tipos básicos int,double,bool
  2. los tipos complejos se crean a partir de los tipos básicos (se pueden añadir), por ejemplo (int,double) - coordenada en el gráfico, (x,b) - coeficientes de la ecuación de la recta, (a,b,c,d) - soporte de hasta 4 valores.
  3. los indicadores se representan como un conjunto de tipos complejos con un elemento
  4. las constantes se representan como tipos complejos, son los parámetros de estrategia que se optimizan
  5. las funciones reciben ciertos tipos complejos de variables como entrada, su número no está limitado, la salida también son tipos complejos.
  6. a las funciones no les importa de donde provienen estos datos, lo principal es que exista una correspondencia de tipos
  7. se soportan todas las órdenes disponibles en mql4 (6 piezas)
  8. la estrategia define sólo un tipo de orden (compra o venta o buy_stop o...)
  9. para las órdenes no pendientes hay 4 nodos en la parte superior del gráfico: condición de entrada al mercado, condición de salida, tp y sl.
  10. Los bloques (funciones/nodos del gráfico) pueden tomar parámetros de entrada de indicadores, constantes, otros nodos, se permite que muchos otros nodos puedan tomar datos como parámetros de entrada del resultado de un nodo, no hay restricciones, excepto por el hecho de que es imposible permitir ciclos en el gráfico.
  11. A continuación, el gráfico se traduce en un código secuencial, y este código será enviado al Asesor Experto para su ejecución, nada tiene que ser compilado en MQL.
Aquí hay un ejemplo de código:

#define
 symbol          GBPUSD;
period          60;
repeat_signal_skip      True;
stop_level              60;
trade           op_buy;
max_shift               13;
stack           4;
const           9;
cache           1;
#data
{True},{-1.26761795},{4.67108999},
{2.08088665},{-0.33782435},{22},
{1.63150050},{-11},{-0.22006371};
#program
 push    [0];
push    [1];
push    [2];
call    F_plus_d;
push    [3];
push    [4];
call    F_plus_d;
push    [5];
get     .Ichimoku_2;
call    F_plus_d;
push    [6];
call    F_minus_d;
save    [0];
push    [7];
get     .Open;
call    F_plus_d;
call    F_less;
load    [0];
push    [8];
#end

Aún no está todo hecho, no toda la información necesaria está en el código, el código se ejecuta correctamente desde el punto de vista del control de tipos, las expresiones sin sentido aún no se tienen en cuenta.

En el código sólo se utilizan tipos simples.

 

Supongo que las estrategias se pueden transmitir a través del protocolo HTTP, MQL tiene la posibilidad de recibir estrategias de esta manera.

Quiero hacer todo totalmente automatizado, buscar estrategias, hacer carteras de estrategias, transferir al Asesor Experto, etc.

Parte del sistema en MQL está listo en un 90%, trabajando con muchas estrategias (control de posiciones, riesgos, manejo de errores, etc.).

Todavía hay mucho trabajo por hacer.

 
Yuriy Asaulenko:
Si buscas una estrategia, no es más fácil. No sé el resto, no he pensado en ello. Aunque, cualquier modelización es más fácil en entornos especiales, no en MT. MT es un producto final, no está creado para la investigación y no es muy adecuado para ello
Estoy de acuerdo, yo mismo modelé inicialmente la idea en matlab. Aún así, el probador MT es una caja negra.
 
Aliaksandr Hryshyn:
He aquí otro ejemplo de expresión sin sentido: =Alto>(Abrir-Cerrar), tampoco colará.

Explique por qué no tiene sentido. En realidad, yo la escribiría así

=High>MathAbs(Open-Close)

ю

 

Aliaksandr Hryshyn:

a continuación, el gráfico se traduce en un código de serie, y este código será enviado al Asesor Experto para su ejecución, nada tiene que ser compilado en MQL.


¿Cómo, por favor explique?
 

Siempre devolverá true)).

(Apertura-Cierre) siempre será menor que (Alto)

 
Alexey Volchanskiy:

Explique cómo, por favor.
¿Qué es, retransmitido o realizado?
 
Aliaksandr Hryshyn:

Siempre devolverá true)).

(Abrir-Cerrar) siempre será menor que (Alto)

Frenado ))))))))))
Razón de la queja: