English Русский 中文 Deutsch 日本語 Português
Indicador técnico de preparación propia

Indicador técnico de preparación propia

MetaTrader 5Ejemplos | 24 noviembre 2022, 17:56
680 0
Aleksej Poljakov
Aleksej Poljakov

Introducción

Cualquier indicador técnico se basa en uno u otro algoritmo para procesar la información del mercado. Por regla general, como datos iniciales se usan los precios. Entonces, hablando en lenguaje matemático, podremos decir que el indicador es una función que convierte los precios en algún resultado final. En este artículo, analizaremos funciones lineales que se pueden usar para construir un indicador.


Regla #1

La esencia de todos los indicadores lineales es bastante simple, y se reduce a cuatro pasos:

  1. Tomamos un número predeterminado de lecturas de precios;
  2. Los multiplicamos por ciertos coeficientes;
  3. Sumamos los resultados obtenidos;
  4. El valor resultante se representa en forma de gráfico.

Resulta intuitivamente claro que el resultado final y el comportamiento de dicho indicador dependerán de los coeficientes. Y aquí nos surge la pregunta siguiente, ¿cuáles deberán ser estos coeficientes: podrán tener valores aleatorios o deberán estar sujetos a algunas restricciones?

Los indicadores establecidos en el gráfico principal se pueden expresar mediante una fórmula simple (en este caso, usaremos números enteros como coeficientes):

Para convertir los coeficientes a números reales, necesitaremos hacer una transformación simple:

Luego, la regla principal para tales indicadores se reducirá a una declaración simple: «la suma de los coeficientes deberá ser igual a la unidad». Es decir:

En apariencia, la fórmula del indicador resulta bastante simple, pero existen grandes oportunidades detrás de ella. Vamos a intentar crear varios indicadores por nuestra cuenta, siguiendo esta regla.

Como base para nuestros experimentos, usaremos un indicador bastante común. Su única diferencia residirá en el parámetro de entrada. Dicho parámetro será una variable string en la que escribiremos la secuencia de coeficientes. Este enfoque nos permitirá probar un gran número de opciones utilizando una sola plantilla.

input string InpCoefficient="1,1,1,1,1";//variable for indicator ratios

A modo de separador entre los coeficientes, usaremos una coma.

Dentro de la función OnInit(), realizaremos las siguientes acciones (existe algún otro centro misterioso en el código, cuyo propósito descubriremos más adelante):

   string s[];                                                  //array for substrings with ratios
   size=StringSplit(InpCoefficient,StringGetCharacter(",",0),s);//get substrings and their number
   
   ArrayResize(coeff,size);  //prepare the array for indicator ratios
   double denom=0,center=0;  //variables for normalizing values and calculating the center of the indicator
   for(int i=0; i<size; i++) // set the ratios
     {
      coeff[i]=StringToDouble(s[i]);
      denom=denom+coeff[i];
     }

   if(denom==0) //if the normalization term is 0, then something is wrong
     {
      Alert("Wrong odds!");
      return(INIT_FAILED);
     }

   for(int i=0; i<size; i++) //normalize the ratios and calculate the indicator center
     {
      coeff[i]=coeff[i]/denom;
      center=center+coeff[i]*(i+1);
     }

   Print((int)MathRound(center));//display the count closest to the center of the indicator

Bueno, ahora vamos a ver algunos ejemplos.

Primera secuencia. Tomaremos cinco lecturas de precios con los mismos coeficientes: 1,1,1,1,1. Entonces tendremos una media móvil simple, y la fórmula del indicador en este caso será: (price[0] + price[1] + price[2] + price[3] + price[4])/5.

Segunda secuencia. Para obtener esta secuencia, tomaremos cinco medias móviles con periodos de uno a cinco y encontraremos su promedio. Es decir, tendremos los siguientes datos iniciales:

price[0]/1 +
(price[0] + price[1])/2 +
(price[0] + price[1] + price[2])/3 +
(price[0] + price[1] + price[2] + price[3])/4 +
(price[0] + price[1] + price[2] + price[3] + price[4])/5.

Y la suma de estos nos dará los coeficientes de nuestra secuencia: 137.77.47.27.12.

Tercera secuencia. Para la presente secuencia, tomaremos cinco medias móviles con un desplazamiento de un paso hacia atrás, y luego encontramos su promedio. Es decir, como resultado, obtendremos el promedio de varias medias móviles. Datos de origen:

(price[0] + price[1] + price[2] + price[3] + price[4])/5 +
(price[1] + price[2] + price[3] + price[4] + price[5])/5 +
(price[2] + price[3] + price[4] + price[5] + price[6])/5 +
(price[3] + price[4] + price[5] + price[6] + price[7])/5 +
(price[4] + price[5] + price[6] + price[7] + price[8])/5.

Como resultado, obtendremos una ventana triangular con coeficientes: 1,2,3,4,5,4,3,2,1.

Podemos utilizar varias secuencias matemáticas como coeficientes del indicador. Aquí tenemos un ejemplo de algunos indicadores más, uno de ellos se basa en los números de Fibonacci: 34,21,13,8,5,3,2,1,1. Otro también se basa en los números de Fibonacci, pero a partir de ellos se genera una construcción simétrica: 1,1,2,3,5,3,2,1,1. Y la base del tercer indicador será una serie del triángulo de Pascal: 1,8,28,56,70,56,28,8,1.

Podrá encontrar igualmente los coeficientes para el indicador en la Enciclopedia de Secuencias Integrales. En 2014, se celebró un concurso para encontrar la nueva secuencia más bella. Vencieron tres secuencias: A229037, A235265, A235383. Más tarde, una de estas secuencias incluso obtuvo su propio nombre: «forest fire». La secuencia resulta interesante porque evita las tendencias lineales. Así es como se ven los indicadores construidos sobre su base.

Las palabras también pueden convertirse en coeficientes de indicadores. Vamos a tomar el nombre de la plataforma comercial más popular, MetaTrader 5. Como coeficientes, tomaremos el número ordinal de cada letra. Entonces obtendremos la secuencia: 13,5,20,1,20,18,1,4,5,18,5.
Esta plataforma comercial es lanzada por la compañía MetaQuotes Software Corp. Omitiremos los espacios y el punto. Así, obtendremos la secuencia: 13,5,20,1,17,21,15,20,5,19,19,15,6,20,23,1,18,5,3,15,18,16.

Los indicadores basados en estas secuencias tendrán el aspecto que sigue.

Y finalmente, crearemos un indicador, al que llamaremos... No, mejor no llamarlo así, de lo contrario, el artículo estará sujeto a restricciones de edad. Digamos que se llamará «Crazy». La peculiaridad de este indicador consistirá en que, con cada nueva llamada, usaremos coeficientes aleatorios.

Conociendo dichos coeficientes del indicador, podremos obtener una de sus características importantes. Para hacer esto, necesitaremos calcular en qué referencia caerá el centro de peso del indicador. Para ello, en la fórmula del indicador, deberemos sustituir los precios por el número de referencia:

Dependiendo del centro y periodo del indicador, podremos atribuirlo a uno de tres tipos. Supongamos que «period» es el periodo del indicador.

  • Tendencia:            center < period/3
  • Suavizador:      period/3 <  center < 2*period/3
  • Contratendencia:    2*period/3 <  center

    Regla #1а

    Como hemos visto, siguiendo la regla #1, siempre obteníamos un indicador técnico totalmente funcional. Pero aquí nos surge la pregunta: ¿puede haber coeficientes negativos en el indicador? Aquí entra en juego una regla adicional, que dice así: «el valor absoluto de cualquier coeficiente debe ser menor que su suma». O, de forma simbólica para coeficientes enteros y reales:

    Esta limitación se relaciona con la estabilidad del indicador. Por ejemplo, vamos a tomar varias secuencias obtenidas de una media móvil linealmente ponderada: 5,4,3,2,1 – línea azul, 5,4,3,2,-1 – verde, 5,4,3,-2,-1 – amarilla y 5,4,-3,-2,-1 – roja.

    Como podemos ver, la última opción se comporta con bastante libertad en comparación con las anteriores: el indicador ha perdido estabilidad. Por lo tanto, si existen coeficientes negativos en el indicador, deberemos verificar que cumplan con la regla 1a.


    Una pequeña pausa

    La regla de los coeficientes nos ofrece la oportunidad no solo de crear nuevos indicadores, sino también de modificar las opciones clásicas. Vamos a tomar como ejemplo una media móvil exponencial. Su fórmula es sencilla y todos la conocemos:

    Este es un ejemplo de un indicador recursivo en el que su valor actual depende del anterior. Si expandimos la recursividad, la fórmula de la media exponencial se verá así:

    En otras palabras, tenemos una progresión geométrica de longitud infinita.

    Una nota rápida: lo que coloquialmente llamamos periodo de la EMA es en realidad un periodo de media móvil simple cuyo centro coincide con el centro de la EMA.

    Intentaremos limitar la longitud de la progresión. Luego obtendremos un filtro, al que llamaremos geométrico. La característica más interesante de este filtro es que su comportamiento depende tanto del coeficiente de suavizado como de su periodo. Al mismo tiempo, conforme aumenta el periodo, el filtro geométrico se vuelve cada vez más similar a la EMA clásica. Por ejemplo, vamos a tomar un coeficiente de suavizado exponencial a = 0.1. Entonces el periodo de EMA se podrá calcular de la forma siguiente:

    Y ahora, vamos a comparar el comportamiento de la EMA y el filtro geométrico con el mismo coeficiente de suavizado, pero con un periodo igual a 10.

    Ahora, probaremos a aumentar gradualmente el periodo del filtro geométrico, y veremos como se acerca poco a poco a la EMA.

    Además de la progresión geométrica, también existe la aritmética. En el terminal MetaTrader, la progresión aritmética se implementa como una media linealmente ponderada. Vamos a hacerle algunos pequeños cambios: primero, introduciremos el paso de progresión aritmética. Con él podremos obtener un indicador con valores desde SMA hasta LWMA.

    Bueno, ahora queda dar un paso más: vamos a combinar ambas opciones para obtener como resultado una progresión aritmético-geométrica. Al mismo tiempo, nos desviaremos ligeramente de los cánones matemáticos y permitiremos que diferentes progresiones tengan periodos distintos. Como resultado, obtendremos un indicador cuyo comportamiento puede variar en un rango bastante amplio. Al menos las variantes clásicas (SMA, LWMA y EMA) no podrán mostrar la misma flexibilidad que nuestro nuevo indicador.


    Funciones de ventana para principiantes

    Como coeficientes indicadores, podemos utilizar funciones de ventana que se usan en el procesamiento de señales digitales. Vamos a analizar una opción bastante universal: la ventana de la suma de cosenos. La fórmula generalizada para los coeficientes de dicha ventana tiene el aspecto siguiente:

    Usando como base esta ventana, intentaremos construir una solución propia que se pueda usar en indicadores técnicos. Para lograr esto, escribiremos un script que calculará los coeficientes del indicador.

    Todas las funciones de ventana clásicas son simétricas respecto a su centro. Podemos darnos el lujo de desplazar el centro de la función de ventana al principio o al final del indicador. Luego, usando como base a la propia función, podremos obtener un indicador de tendencia, de suavizado o de contratendencia. Esta solución, aunque implícita, se utiliza en indicadores clásicos: por ejemplo, LWMA es la mitad de una ventana triangular y EMA es una ventana de Laplace truncada.

    Digamos que iPeriod es el periodo de nuestro futuro indicador. Entonces, el centro del indicador podrá tomar valores de 1 a iPeriod con un paso igual a 0,5. Es decir, iCenter podrá tomar los valores 1, 1,5, 2,… iPeriod.

       int period=MathMax(2,iPeriod),     //check indicator length for min. acceptable value
           step=(int)MathRound(2*iCenter);//number of steps to the center of the indicator by 0.5
    
       double center=0.5*step;      //indicator center
       if(center<1 || center>period)//check if the center has a valid value
          center=0.5*(period+1);
    

    Ahora solo nos queda determinar la anchura de la ventana y encontrar su desplazamiento. Este desplazamiento nos permitirá hacer coincidir el centro del indicador y la función de ventana.

       int width=(int)(2*center),//window function width
           shift=1;              //offset to match the centers of the indicator and the window
    
       if(2*center<=period)//if the center is shifted to the beginning of the indicator
         {
          width=2*period-(int)(2*center)+2;
          shift=period-(int)(2*center)+2;
         }

    Nos limitaremos a una ventana de quinto orden. Luego necesitaremos configurar hasta cinco coeficientes C1 - C5. Cualquier número podrá usarse como coeficiente. En este caso, la condición deberá cumplirse necesariamente: cada coeficiente subsiguiente deberá ser menor que el anterior. Es decir, C1 > C2 > C3 > C4 > C5. El cumplimiento de esta condición es imprescindible para que el valor de normalización se calcule correctamente.

    Si todos los coeficientes de la función de ventana son iguales a cero, obtendremos una ventana rectangular (SMA). A continuación, enumeraremos algunas otras opciones (los coeficientes con valores cero han sido omitidos).

    Ventana de Hann: C1 = 1.

    Ventana con disminución lineal de los coeficientes: C1 = 5, C2 = 4, C3 = 3, C4 = 2, C5 = 1.

    Ventana de Fibonacci: C1 = 8, C2 = 5, C3 = 3, C4 = 2, C5 = 1.

    Por cierto, para algunos valores de los coeficientes, podremos obtener funciones de ventana con valores parcialmente negativos. Esto hará que se vean como una ventana superior plana estándar C1 = 3, C2 = 2.

    Funciones de ventana para expertos

    Para construir funciones de ventana, podemos usar un polinomio adaptativo generalizado. Su fórmula tiene el aspecto siguiente:

    La característica distintiva de este polinomio es que todos los parámetros son independientes entre sí. La única excepción es que el parámetro C0 no deberá ser menor que la suma de todos los demás coeficientes. En este caso, los coeficientes deberán ser al menos cero y los exponentes deberán ser mayores (si el exponente es cero, entonces se obtendrá una ventana rectangular, que de todos modos se podrá obtener usando el coeficiente C0).

    Usando este polinomio, podremos obtener tanto las funciones de ventana ya conocidas, como algo inusual. Por ejemplo, con C0 = 1, obtendremos una ventana rectangular (SMA).

    Ventana triangular: C0 = 1, C1 = 1, P1 = 1.

    Ventana de Welch: C0 = 1, C1 = 1, P1 = 2.

    Y también podemos obtener algo inusual. Una ventana con números de Fibonacci y un aumento lineal del grado (dejamos libre el coeficiente C0, que luego tomará el valor 19): C1 = 8, P1 = 1, C2 = 5, P2 = 2, C3 = 3, P3 = 3, C4 = 2, P4 = 4, C5 = 1, P5 = 5.


    Regla #2

    Hasta ahora, hemos analizado indicadores que se colocan en el gráfico principal y nos hemos olvidado por completo de los osciladores. La regla que subyace en todos los osciladores es muy sencilla: la suma de los coeficientes de un oscilador es igual a cero.

    Un oscilador viable es más fácil de hacer usando como base dos indicadores. Entonces la fórmula del oscilador será así:

    En este caso, deberemos cumplir la siguiente condición: los indicadores deberán ser distintos. Por ejemplo, así es como se ve un oscilador construido con ayuda de ventanas rectangulares y triangulares: 1,1,1,1,1 y 1,2,3,2,1.

    También podremos usar la misma función de ventana, pero con diferentes longitudes: 1,2,3,2,1 y 1,2,3,4,5,4,3,2,1.

    O incluso el mismo indicador, pero cambiado algunas cuentas hacia atrás: 5,4,3,2,1 y 0,0,0,5,4,3,2,1 (los ceros en la segunda secuencia se desplazan tres veces):

    Los osciladores se usan con bastante frecuencia en las estrategias comerciales. Por ejemplo, todas las estrategias que usan el cruce de dos indicadores como señal se pueden reducir a un oscilador.
    Por ejemplo, vamos a escribir un asesor experto simple. Como fuentes de señal, ejercerán varias parejas de indicadores:

    • dos medias móviles simples;
    • una media linealmente ponderada y una ventana triangular;
    • un indicador de MetaQuotes con ambas plataformas comerciales (compararemos cuál es más rentable);
    • Bueno, y obviamente, vamos a probar el indicador «crazy».

    El asesor experto abrirá posiciones de compra cuando la línea del indicador con un pequeño punto cruce la línea del otro indicador de abajo hacia arriba. Las posiciones de venta se abrirán cuando se dé el cruce de arriba hacia abajo. La apertura de una posición en una dirección, provocará el cierre de las posiciones en la dirección opuesta. Estas condiciones se verán como un cambio en el signo del oscilador construido con la ayuda de los indicadores correspondientes. 

    Parámetros de la simulación: símbolo EURUSD, marco temporal H1, intervalo temporal de la prueba 2021.01.01 - 2021.12.31.
    En la siguiente tabla, mostramos los principales resultados de las pruebas. Para el indicador Crazy, teniendo en cuenta sus características, hemos realizado 5 pruebas.

    TypeInd Total Net Profit
    Gross Profit
    Gross Loss
    Total Trades
    SMA -112.15
    338.69
    -450.84
    340
    TMA 4.64
    422.06
    -417.42
    372
    MT4 -39.43
    402.26
    -441.69
    444
    MT5 -45.27
    395.20
    -440.47
    438
    Crazy 1 -82.13
    432.68
    -514.81
    640
    Crazy 2 -91.15 469.24   -560.39 662
    Crazy 3  -57.01 454.13   -511.14 612
    Crazy 4  -39.16 487.40 -526.56  673
    Crazy 5 -21.45 471.97 -493.42 666

    Como podemos ver, ninguna de las variantes ha mostrado resultados impresionantes. Eso sí, el indicador Crazy nos ha dado una pequeña alegría. La diferencia entre la mejor y la peor operación es de 4 veces. Este indicador es realmente una «locura».

    Veamos si podemos mejorar nuestra estrategia. Echemos un vistazo al gráfico: aquí tenemos un ejemplo de dos cruces, cuando formalmente la línea roja ha cruzado la línea azul en la misma dirección.

    Pero el comportamiento de la línea azul se ve distinto. Vamos a intentar añadir dos osciladores adicionales al oscilador principal: se encargarán de monitorear los cambios en los valores de los propios indicadores. Entonces el asesor podrá filtrar algunas entradas. Veamos qué resultados puede dar esta complicación.

    TypeInd Total Net Profit
    Gross Profit
    Gross Loss
    Total Trades
    SMA 45.64
    325.11
    -279.47
    138
    TMA 156.03
    466.26
    -310.23
    306
    MT4 -133.56
    296.25
    -429.81
    212
    MT5 -192.40
    273.05
    -465.45
    203
    Crazy 1 114.30
    564.00
    -449.70
    409
    Crazy 2 -93.57 421.01    -514.58 413
    Crazy 3  -31.83 445.27    -477.10 446
    Crazy 4  3.87 451.39 -447.52  431
    Crazy 5 -8.04 458.58 -466.62 409

    Como podemos ver, en algunos casos, la adición de osciladores adicionales ha tenido un efecto positivo. En otros, el resultado se ha visto empeorado. Quizá para tales estrategias sea necesario considerar no solo indicadores cualitativos, sino también cuantitativos. En cualquier caso, las estrategias de este tipo requieren mayor estudio.

    Conclusión

    Como podemos ver, el desarrollo de un indicador técnico puede suponer una experiencia bastante emocionante. Archivos adjuntos:

    1. Base Indicator — plantilla que permite construir indicadores basados en sus coeficientes.
    2. OEIS — indicador construido sobre las secuencias más bonitas. Todas las secuencias tienen restricciones según el periodo.
    3. Crazy — indicador que utiliza coeficientes aleatorios.
    4. Arithmetic Geometric Filter — indicador basado en progresiones aritméticas y geométricas.
    5. Window Functions for Dummies — script que permite calcular una función de ventana basada en un polinomio de coseno. El script guarda los coeficientes obtenidos en un archivo de texto en la carpeta Files.
    6. Window Functions for Advanced — script que calcula los coeficientes de los indicadores usando un polinomio adaptativo generalizado. El resultado del cálculo también se guarda en un archivo.
    7. Basic Oscillator — plantilla para un oscilador basada en dos indicadores.
    8. EA Indicator — experto que abre posiciones según varios osciladores. El parámetro Control determinará el número de osciladores a analizar.


    Traducción del ruso hecha por MetaQuotes Ltd.
    Artículo original: https://www.mql5.com/ru/articles/11348

    Redes neuronales: así de sencillo (Parte 26): Aprendizaje por refuerzo Redes neuronales: así de sencillo (Parte 26): Aprendizaje por refuerzo
    Continuamos estudiando los métodos de aprendizaje automático. En este artículo, iniciaremos otro gran tema llamado «Aprendizaje por refuerzo». Este enfoque permite a los modelos establecer ciertas estrategias para resolver las tareas. Esperamos que esta propiedad del aprendizaje por refuerzo abra nuevos horizontes para la construcción de estrategias comerciales.
    Aprendizaje automático y Data Science (Parte 06). Redes neuronales (Parte 02): arquitectura de la redes neuronales con conexión directa Aprendizaje automático y Data Science (Parte 06). Redes neuronales (Parte 02): arquitectura de la redes neuronales con conexión directa
    En el artículo anterior, comenzamos a estudiar las redes neuronales con conexión directa, pero hay algunas cosas que quedaron sin resolver. Una de ellas es el diseño de la arquitectura. Por ello, en el presente artículo, veremos cómo diseñar una red neuronal flexible, teniendo en cuenta los datos de entrada, el número de capas ocultas y los nodos de cada red.
    DoEasy. Elementos de control (Parte 16): Objeto WinForms TabControl - múltiples filas de encabezados de pestañas, modo de expansión de encabezados para ajustarse al tamaño del contenedor DoEasy. Elementos de control (Parte 16): Objeto WinForms TabControl - múltiples filas de encabezados de pestañas, modo de expansión de encabezados para ajustarse al tamaño del contenedor
    En este artículo, proseguiremos con el desarrollo del control TabControl, e implementaremos la disposición de los encabezados de las pestañas en los cuatro lados del control para todos los modos de establecimiento de tamaño del encabezado: "Normal", "Fixed" y "Fill To Right".
    Matemáticas del mercado: beneficios, pérdidas, costes Matemáticas del mercado: beneficios, pérdidas, costes
    En este artículo, le mostraremos cómo calcular el beneficio o las pérdidas totales de cualquier operación, incluyendo la comisión y el swap. Hoy crearemos un modelo matemático más preciso, escribiremos el código basado en él y lo compararemos con un referente. También intentaremos meternos analizar los entresijos de la función principal de MQL5 para calcular el beneficio y llegaremos al fondo de todos los valores necesarios de la especificación.