English Русский 中文 Deutsch 日本語 Português
Construcción automática de las líneas de apoyo y resistencia

Construcción automática de las líneas de apoyo y resistencia

MetaTrader 5Trading | 20 febrero 2018, 08:49
5 901 0
Vladimir Mametov
Vladimir Mametov

Introducción

En este artículo vamos a analizar la construcción automática de las líneas de apoyo y resistencia El análisis técnico de los instrumentos de divisa supone una parte importante del trading en los mercados financieros. Por eso, la construcción automática de estas líneas facilitará el trabajo a los analistas financieros y los tráders, dándoles la posibilidad de incrementar la velocidad del análisis técnico. Además, usando como base el indicador analizado, podremos crear asesores automáticos.

Buscando todos los máximos y mínimos locales

Las líneas de apoyo y resistencia se construyen con la ayuda de los máximos y mínimos locales de los gráficos de precio. Para definir estos extremos, utilizaremos el indicador ZigZag, conocido por todos. En los parámetros de entrada podemos indicar las propiedades necesarias para las líneas de apoyo y resistencia.

La dimensión de las líneas se puede modificar con la ayuda de los parámetros del indicador ZigZag, pero también es posible utilizar los mismos parámetros en diferentes marcos temporales. Esto nos dará la posibilidad de obtener los extremos que necesitamos, para construir después las líneas de apoyo y resistencia basándonos en ellos.

En las figuras de más abajo se muestra cómo cambia el carácter de los picos al modificar el marco temporal. En la primera figura se muestra un gráfico de 30 minutos, y después, uno de 4 horas.





Seleccionado los extremos adecuados para la construcción de los niveles

Vamos a construir solo las líneas de apoyo y resistencia que pasan cerca del precio actual: esto significa que serán actuales para nosotros en lo referente al análisis técnico en este momento concreto. Asimismo, para que las líneas tengan una inclinación convergente hacia el precio, utilizaremos aquellos extremos que sean iguales o superiores al anterior para las líneas de resistencia, en el caso de tendencia descendente; o iguales o inferiores al anterior en caso de tendencia ascendente. En la primera figura pueden ser los puntos 1-2-3-4-5-7, y en la segunda, 1-2-3-6-7-8.

Ya hemos decidido los criterios de selección de los extremos. Ahora vamos a analizar la implementación en forma de código. Vamos a mostrarlo aquí solo de forma parcial, para aclarar los momentos principales.

//+------------------------------------------------------------------+
struct trade_points               // Definimos la estructura para los extremos
  {
   double            price;       // Precio
   int               pos;         // Ubicación, número de barra
   bool              hpoint;      // En caso positivo, es un máximo 
   bool              lpoint;      // En caso positivo, es un mínimo
  };

En la función OnInit() creamos el manejador del indicador ZigZag:

int OnInit()
  {

   ZZ_handle=iCustom(_Symbol,_Period,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep);

   return(INIT_SUCCEEDED);
  }

A continuación, iteramos por turnos todos los extremos del indicador Zigzag, introducimos la información sobre ellos en la matriz:

double max=close[1];
   double min=close[1];
   int z=0;

   for(shift=0;shift<rates_total && !IsStopped();shift++)
     {
      CopyBuffer(ZZ_handle,0,shift,1,ZigzagBuffer);

      if(ZigzagBuffer[0]>0)
        {

         if(ZigzagBuffer[0]>=max && ZigzagBuffer[0]==high[shift])
           {
            ArrayResize(mass,z+1);
            max=ZigzagBuffer[0];
            mass[z].price=ZigzagBuffer[0];
            mass[z].pos=shift;
            mass[z].hpoint=true;
            mass[z].lpoint=false;
            z++;
           }

         if(ZigzagBuffer[0]<=min && ZigzagBuffer[0]==low[shift])
           {
            ArrayResize(mass,z+1);
            min=ZigzagBuffer[0];
            mass[z].price=ZigzagBuffer[0];
            mass[z].pos=shift;
            mass[z].lpoint=true;
            mass[z].hpoint=false;
            z++;
           }

        }
     }

Definiendo los criterios de construcción de las líneas de tendencia

Ahora, tras formar la matriz con los picos, podemos construir las líneas necesarias de apoyo y resistencia. La definición de los crieterios básicos de construcción de las líneas se aclara en la figura de abajo.

Comenzando por el punto 1, podemos construir las líneas con cualquiera de los puntos siguientes. Pero no todas las líneas se pueden considerar líneas de apoyo y resistencia. También pueden no resultar actuales en este momento o innecesarias para el gráfico. Para nosotros, resulta más cómodo que en el gráfico no haya demasiadas construcciones, por eso iteraremos y filtraremos las líneas sobrantes.

Vamos a considerar que el punto inicial de la línea es A, el segundo pico es B, y el punto que se encuentra junto a la última barra, С.

Los criterios pueden ser muchos, distintos en cada situación. Vamos a analizar aquí solo los básicos. En lo sucesivo, quien así lo desee, podrá perfeccionar este indicador a su gusto. Bien, los criterios básicos son:

  1. La relación de las distancias AB y BC
  2. El número de cruces entre el precio y el segmento AB
  3. El número de cruces entre el precio y el segmento BC
  4. La distancia desde C hasta el precio actual
  5. La longitud máxima y mínima de la línea
  6. La inclinación de la línea
  7. La búsqueda del precio por encima o debajo de la línea de resistencia

Vamos a analizar los criterios enumerados con más detalle, para entender mejor el ajuste de los parámetros de entrada.

  1. Para respetar las proporciones permisibles, podemos usar los coeficientes de Fibonacci y aplicar una relación mínima permisible no inferior a 0,25 o 0,382. De acuerdo con este criterio, la relación de las longitudes deberá corresponderse con la condición AB/BC>=02.25 (0.382)  y BC/AC>=02.25 (0.382). Para que sea más cómodo, el valor de este parámetro se indicará en los ajustes de entrada.
  2. Según el número de cruces del precio con el segmento de la línea AB, también hay que filtrar escrupulosamente todas las líneas disponibles. Dicha comprobación se puede realizar de muchas formas. Podemos tener en cuenta solo las barras cerradas tras romper esta línea, o podemos tener en cuenta la ruptura según los precios High o Low. El segundo criterio de esta comprobación es el número de barras que han cruzado este segmento de la línea. Estos parámetros también se han sacado a los ajustes de entrada.
  3. Según el número de rupturas, su carácter y la ubicación del precio actual con respecto al segmento BC, podemos evaluar la importancia de la línea. Todos los criterios enumerados se pueden utilizar tanto para formar las líneas, como para formar las estrategias comerciales al crear asesores automáticos. En este indicador representaremos solo las líneas que aún no han cruzado el segmento dado.
  4. La distacia desde el precio actual hasta la línea se puede filtrar, en primer lugar, en función de si es actual para nosotros esta línea. Por ejemplo, podemos construir solo las líneas cuya distancia hasta ellas no sea superior a 50 — 100 puntos.
  5. La longitud mínima de la línea, en nuestro caso, se define con los parámtros de entrada del indicador ZigZag, pero, de ser necesario, este parámetro también se puede controlar. En el indicador se comprobarán las longitudes finales de los segmentos AB y BC.
  6. Puesto que las líneas de apoyo son más significativas, - las posiciones se abren en función de ellas - el indicador construirá para la tendencia ascendente líneas con inclinación cero o positiva, y para la descendente, con inclinación cero o negativa.
  7. Podemos usar las líneas de dos formas. La primera consiste en tener en cuenta la no ruptura de la línea y comerciar en la dirección de la tendencia. La segunda consiste en utilizar solo la ruptura de las líneas de tendencia para la apertura de transacciones en la dirección opuesta. Ambos tipos de línea son importantes, por eso ambos se representarán en el indicador.

Más abajo se muestra la parte del código donde se forman las líneas de resistencia de las tendencias descendentes.

// Determinando la correspondencia de nuestras líneas con los criterios; posteriormente se rellena la matriz para la tendencia descendente.

   for(j=z-1; j>=0; j--)
     {
      if(mass[j].hpoint)
         for(i=j-1; i>=0; i--)
           {
            if(mass[i].hpoint)
               if(i<j)
                 {

                  a=mass[j].pos;
                  b=mass[i].pos;

                  double ratio=double((a-b)*100/a);       // Determinamos la correspondencia de la longitud del segmento AB con la longitud total AC

                  if(ratio>fibo && ratio<(100-fibo))      // Comprobamos si se cumple el criterio №1, la correspondencia de los segmentos AB y BC
                     if(b>Min_dist &&(a-b)>Min_dist)      // Comprobamos si se cumple el criterio №5, la longitud mínima de los segmentos AB y BC
                       {

                        ax=mass[j].price;
                        bx=mass[i].price;

                        coef=(ax-bx)/(a-b);

                        price=close[1];

                        deviation=(ax+coef*bx)-price;

                        cross_bc=0;
                        cross_ab=0;


                        if(MathAbs(deviation)<tolerance*_Point)   // Comprobamos si se cumple el criterio №4 (Distancia desde el punto C hasta el precio de cierre de la barra anterior)
                          {

                           // Número de cruces desde el punto A hasta el punto B 
                           for(int n=a; n>b; n--)
                              if((close[n]-(ax+coef*(b-n)))>0)
                                 cross_ab++;
                           // Número de cruces desde el punto B hasta el final  
                           for(int n=b-1; n>=0; n--)
                              if(close[n]>(bx+coef*(b-n)) && close[n+1]<(bx+coef*(b-n+1)))
                                 cross_bc++;

                           if(cross_bc<=Intersection_bc && cross_bc<=Intersection_ab)// Comprobamos si se cumplen los criterios №2 y №3
                             {
                              // Rellanando la matriz para la tendencia descendente
                              ArrayResize(DownTrend,y+1);
                              DownTrend[y].a=a;
                              DownTrend[y].b=b;
                              DownTrend[y].ax=ax;
                              DownTrend[y].bx=bx;
                              DownTrend[y].dst=MathAbs(deviation);
                              DownTrend[y].coef=coef;

                              y++;

                             }
                          }
                       }
                 }
           }
     }

// Según la matriz obtenida de líneas descendentes, representamos estas en el gráfico

   for(j=0; j<ArraySize(DownTrend); j++)
     {

      a=DownTrend[j].a;
      b=DownTrend[j].b;
      ax=DownTrend[j].ax;
      bx=DownTrend[j].bx;
      coef=DownTrend[j].coef;

      if(a>0 && b>0 && MathAbs(a-b)>0)
        {
if(a>0 && b>0 && MathAbs(a-b)>0)
        {
         //--- creamos la línea de tendencia 
         TrendCreate(0,"DownTrend "+string(j),0,time[a],ax,time[b],bx,DColor,DStyle,DWidth,DBack,DSelection,DRayLeft,DRayRight,DHidden,DZOrder);
         ChartRedraw();
        }
     }

Ejemplos de construcción del indicador:


Uso de las líneas de apoyo y resistencia en el comercio

El principio comercial básico que usa los niveles de apoyo y resistencia consiste en comprar cerca de la línea de apoyo durante la tendencia ascendente (y vender durante la tendencia descendente) o en el mercado plano. También se usan ciertos modelos gráficos (patrones).

Esta estrategia comercial permite usar los movimientos de la tendencia incluso cuando el instrumento financiero se encuentra en mercado plano, o cuando el precio forma alguna figura. La tendencia ayuda a definir la dirección en la que debemos abrir la transacción. Por ejemplo, si la tendencia actual es descendente, pero luego pasa a mercado plano, entonces será preferible abrir transacciones de venta cerca de la línea de resistencia, y no comprar en el nivel de apoyo. La presencia de una tendencia descendente indica que las transacciones de venta tienen más oportunidades de éxito que las transacciones de compra. Si la tendencia es ascendente, y después de ella se forma un triángulo, entonces será mejor abrir transacciones de compra junto a la línea de apoyo de este triángulo.

La apertura de transacciones según la tendencia cerca de las líneas de apoyo y resistencia puede traer beneficios, sin embargo, el precio rompe con frecuencia estos niveles. Por eso, debemos esperar la confirmación de este nivel sea significativo según un instrumento financiero concreto. Antes de comprar o vender en una línea, es necesario esperar la consolidaión del precio junto a ella. Como opción, podemos esperar el retroceso del precio con respecto al nivel y abrir una transacción solo después de ello.

Al abrir transacciones de compra a partir de la línea de apoyo, se recomienda esperar la consolidación del precio tras ella, y solo después de esto abrir una orden de compra, cuando el precio rompre hacia arriba el high de esta zona de consolidación. Esto nos dará la posibilidad de asegurarnos de que el nivel realmente influye en el precio, y también de que el precio comienza a moverse en la dirección necesaria (va hacia arriba) a partir de este nivel. Dicho factor es precisamente lo que necesitamos para la compra. Una situación análoga se desarrolla al abrir transacciones de venta a partir de la línea de resistencia: es necesario esperar la aparición de la consolidación junto a la zona de resistencia, y solo después abrir la transacción, cuando el precio desciende por debajo del precio Low de esta zona de consolidación.

Al abrir una transacción, es necesario pronosticar sus condiciones de cierre. Cuando abrimos una transacción de compra a partir de la línea de apoyo, es deseable cerrar la transacción antes de que el precio alcance una línea de resistencia fuerte. Una situación análoga se desarrolla al abrir una transacción de venta. También podemos cerrar la transacción en niveles de apoyo y resistencia secundarios. Al comprar en la línea de apoyo es necesario vender en el nivel de resistencia en el canal de tendencia ascendente. Pero podemos igualmente intentar obtener un beneficio mayor si dejamos al precio romper el nivel. Por ejemplo, al comprar a partir de un nivel de apoyo en el triángulo (con una tendencia general ascendente), podemos mantener la posición mientras que el precio no rompa el triángulo y no continúe el movimiento hacia arriba. Después de ello, podemos salir de la transacción en la siguiente línea de resistencia.

Asesor basado en un indicador

Más abajo mostramos un asesor que tiene las siguientes funciones:

  • StopLoss y TakeProfit
  • Número máximo de órdenes Buy/Sell
  • Trailing Stop
  • Función de ausencia de pérdidas
  • Cierre de transacciones opuestas según las señales del indicador
  • 4 filtros HTF (MACD, RSI, WPR, MA) con posibilidad de elección

El asesor trabaja directamente con las líneas de tendencia creadas con el indicador, por eso, para que funcione en tiempo real, tenemos que añadir el indicador al gráfico con el asesor instalado. Los ajustes relacionados con el indicador se deben instalar en el propio indicador. En el asesor también hay ajustes de indicador, pero se usan solo para la simulación. Para que podamos poner a prueba el asesor, en el código se ha creado un manejador del indicador, que se define al inicializar el asesor.

Se han previsto 3 modos de trabajo con el asesor:

  • from level — comercio usando el rebote del precio con respecto a la línea de tendencia. La transacción se abre si el precio máximo o mínimo de la barra ha cruzado el nivel, el precio de cierre no ha roto la línea de tendencia actual, y también el precio de la barra siguiente se ha cerrado sin romper la línea. Tiene lugar la comprobación de la ruptura por parte del precio de la línea tras el contacto.
  • level breakdown — comercio con la ruptura por parte del precio de la línea de tendencia. La transacción se abre si el precio máximo o mínimo de la barra ha cruzado el nivel, el precio de cierre no ha roto la línea de tendencia actual, y la vela de la barra siguiente se ha cerrado sin romper la línea de tendencia.
  • all — se usan los dos modos descritos más arriba.

Más abajo se muestra la función en el código, donde se forman las señales de compra y venta:

//+------------------------------------------------------------------+
int signal()
  {
   int res=0;

   int macd=0;
   int rsi=0;
   int wpr=0;
   int ma=0;

   if(Use_macd==true)macd=macdS();
   if(Use_rsi==true)rsi=rsiS();
   if(Use_wpr==true)wpr=wprS();
   if(Use_ma==true)ma=maS();

   CopyOpen(NULL,0,1,3,O);
   CopyHigh(NULL,0,1,3,H);
   CopyLow(NULL,0,1,3,L);
   CopyClose(NULL,0,1,3,C);

   Signals=0;
   for(int i=0;i<ObjectsTotal(0,0,OBJ_TREND);i++)
     {
      string sName=ObjectName(0,i,0,OBJ_TREND);
      if(StringFind(sName,"UpTrend")==0 || StringFind(sName,"DownTrend")==0)
        {
         ax=ObjectGetDouble(0,sName,OBJPROP_PRICE,0);
         bx=ObjectGetDouble(0,sName,OBJPROP_PRICE,1);
         p1=(int)ObjectGetInteger(0,sName,OBJPROP_TIME,0);
         p2=(int)ObjectGetInteger(0,sName,OBJPROP_TIME,1);
         a=iBarShift(p1);
         b=iBarShift(p2);
         kkk=(bx-ax)/(a-b);
         lvl=bx+kkk*b;
         plvl=bx+kkk*(b-1);

         if(mode==0 || mode==2)
           {
            if(StringFind(sName,"UpTrend")==0 && L[1]<=plvl && C[1]>plvl && C[0]>lvl)Signals=1;
            if(StringFind(sName,"DownTrend")==0 && H[1]>=plvl && C[1]<plvl && C[0]<lvl)Signals=2;
           }

         if(mode==1 || mode==2)
           {
            if(StringFind(sName,"UpTrend")==0 && L[1]<=plvl && C[1]>plvl && C[0]<lvl)Signals=2;
            if(StringFind(sName,"DownTrend")==0 && H[1]>=plvl && C[1]<plvl && C[0]>lvl)Signals=1;
           }
        }
     }

   if(Signals==1
      &&(macd==1 || Use_macd==false)
      && (rsi==1 || Use_rsi==false)
      && (wpr==1 || Use_wpr==false)
      && (ma==1 || Use_ma==false))res=1;

   if(Signals==2
      &&(macd==2 || Use_macd==false)
      && (rsi==2 || Use_rsi==false)
      && (wpr==2 || Use_wpr==false)
      && (ma==2 || Use_ma==false))res=2;

   return(res);
  }
//+------------------------------------------------------------------+

Al realizar la simulación hemos conseguido determinar que la rentabilidad del comercio con retroceso con respecto a la línea es menor que en el comercio con ruptura de niveles.

Más abajo se muestran los gráficos de simulación de los tres modos con los siguientes parámetros de entrada:

input string s="-------------------------------------------"; // Main settings
input int Magic=12345;
input double LotSize=0.1;
input int Slippage=30; //Slippage, points 
input int StopLoss=0; //StopLoss, points 
input int TakeProfit=0; //TakeProfit, points
input int TrailingStart=0; //Trailing Start, points     
input int TrailingStop= 0; //Trailing Stop, points     
input int TrailingStep= 0; //Trailing Step, points
input int SL_prof=0; //Start BE, points
input int SL_lev=0; //BE level, points
input int Buy_max=1; //Max Buy orders
input int Sell_max=1; //Max Sell orders
input bool Sig_close=true; //Close counter transactions
input tip mode=0;
input string s0="-------------------------------------------"; // Indicators settings
input int _ExtDepth=12;
input int _ExtDeviation=5;
input int _ExtBackstep=3;

input int _Min_dist=0;                                  // Minimum distance
input int _fibo=30;                                     // Fibo ratio
input int _tolerance=200;                               // Tolerance
input int _Intersection_ab=1;                           // The allowed number of intersections from point a to point b
input int _Intersection_bc=1;                           // The allowed number of intersections from point b to point c

input string s1="-------------------------------------------";     // MACD settings
input ENUM_TIMEFRAMES macd_tf=PERIOD_CURRENT;                      // period
input int fast_ema_period=12;                                      // period of fast ma 
input int slow_ema_period=26;                                      // period of slow ma 
input int signal_period=9;                                         // period of averaging of difference 
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE;                // type of price 

input string s2="-------------------------------------------";     // RSI settings
input ENUM_TIMEFRAMES rsi_tf=PERIOD_CURRENT;                       // period
input int rsi_period=14;                                           // period 
input ENUM_APPLIED_PRICE rsi_applied_price=PRICE_CLOSE;            // type of price
input double rsi_max_s=100;                                        // max price for Sell
input double rsi_min_s=70;                                         // min price for Sell
input double rsi_max_b=30;                                         // max price for Buy
input double rsi_min_b=0;                                          // min price for Buy

input string s3="-------------------------------------------";     // WPR settings
input ENUM_TIMEFRAMES wpr_tf=PERIOD_CURRENT;                       // period
input int calc_period=14;                                          // period  
input double wpr_max_s=0;                                          // max price for Sell
input double wpr_min_s=-20;                                        // min price for Sell
input double wpr_max_b=-80;                                        // max price for Buy
input double wpr_min_b=-100;                                       // min price for Buy

input string s4="-------------------------------------------";     // MA settings
input ENUM_TIMEFRAMES ma_tf=PERIOD_CURRENT;                        // period
input int ma_period=10;                                            // period of MA 
input int ma_shift=0;                                              // shift 
input ENUM_MA_METHOD ma_method=MODE_SMA;                           // type of smoothing 
input ENUM_APPLIED_PRICE ma_applied_price=PRICE_CLOSE;             // type of price 

input bool Use_macd=true;                                          // Use MACD as a filter
input bool Use_rsi=false;                                          // Use RSI as a filter
input bool Use_wpr=false;                                          // Use WPR as a filter
input bool Use_ma=false;                                           // Use MA as a filter

input int sbar=1;                                                  // Signal bar 0-current, 1-close

Al realizar la simulación, solo se abrió una transacción con un volumen de 0.1 lote en una de las direcciones. En el caso de darse una señal opuesta, se cerraba la transacción actual y se abría una opuesta a la misma. También se aplicó un filtro según el indicador MACD, con el cual las transacciones de compra se abrían con valores de indicador inferiores a cero, y las transacciones de venta se abrían con valores por encima de cero. La simulación se ha realizado en el intervalo temporal de 1 hora de EURUSD en los años 2015-2017.

Modo from level:


Modo level breakdown:

Más abajo se muestran los resultados de la simualación con los ajustes por defecto en varias parejas de divisas.

Aquí podemos ver que solo se muestran buenos resultados en EURUSD y USDCHF. En primer lugar, esto se relaciona con que no todas las líneas se deben tener en cuenta al comerciar. Asimismo, hay que tener en cuenta los otros factores enumerados al inicio del artículo.

Además, hay que recordar la influencia del análisis fundamental, puesto que el paso de las líneas de apoyo/resistencia con frecuencia tiene lugar tras la salida de noticias importantes.

Por eso, al asesor se le puede añadir un filtro de noticias para poner a prueba el funcionamiento solo en los momentos de salida de noticias, y también prohibiendo por completo la salida de estas. Como alternativa, este asesor se puede usar en los gráficos RENKO. 

Optimización

Los primeros siete parámetros, a nuestro juicio, se han establecido inicialmente en el asesor de forma óptima, y no hemos procedido a su posterior optimización. Los parámetros del indicado Zig-Zag se han establecido por defecto, y no nos vienen del todo bien. Al optimizar, hemos conseguido establecer que los siguientes parámetros son los más convenientes para todas las divisas simuladas anteriormente:

  • _ExtDepth=24;
  • _ExtDeviation=55;
  • _ExtBackstep=9;

Para la apertura de transacciones, durante la optimización se ha determinado cuál de los modos de funcionamiento es más conveniente para un instrumento financiero concreto, y también cuánto influye en el resultado el uso del filtro. Como filtro se ha usado solo el indicador MACD. Pero podemos probar a trabajar también con otros indicadores en diferentes marcos temporales.

Para cerrar una transacción con beneficios o con pérdidas se ha usado la función de cierre con la señal opuesta. Para fijar el beneficio y obtener el resultado máximo, se han usado las funciones de ausencia de pérdidas y establecimiento de take-profit. Los parámetros óptimos para cada divisa según estas funciones se han definido en el proceso de simulación.

No se ha utilizado el stop-loss para fijar la ausencia de pérdidas, las transacciones con pérdidas se han cerrado solo mediante la señal opuesta.

El proceso de optimización se representa en el recuadro. La simulación se ha realizado con un tamaño de lote de 0.1 en el año 2017. Asimismo, se ha aumentado el número de transacciones abiertas de compra y venta hasta 10, el resto de parámetros han sido ajustados por defecto.

 Símbolo Modo
  Filtro MACD TakeProfit
Start BE
Beneficio
 Profit Factor: Recovery Factor:
 Max DD,%
 Total Trades: Profit Trades,% 
EURUSD
level breakdown
false
0
25
117.20
1.88
1.65
0.69
79
73.42
USDCHF
level breakdown false 20
10
135.24
1.31
1.12
1.03
482
72.41
GBPCHF
from level
true
20
10
91.56
1.39
0.51
1.58
246
91.06
AUDUSD
level breakdown false 20
10
139.20
1.39
1.66
0.79
485
71.96
AUDCAD
level breakdown true 25
5
117.51
1.94
1.06
0.57
246
84.96
EURJPY
level breakdown false 20
5
128.90
1.60
0.98
1.26
341
78.89
GBPUSD
from level false 100
0
102.1
1.20
1.32
0.58
274
52.92
USDJPY
from level false 30
0
147.75
1.56
0.79
1.73
348
79.89
EURGBP
from level true 20
5
124.45
1.39
1.14
1.03
341
78.01
EURCHF
from level true 20
5
141.08
2.07
1.88
0.68
367
63.22
USDCAD
level breakdown false
100
25
142.57
1.46
0.45
1.22
248
78.87
NZDUSD
from level false 0
25
270.50
1.37
1.04
2.37
616
62.11
GBPJPY
level breakdown true 150
20
163.62
2.56
1.10
1.41
103
68.25

Conclusión

En el artículo se muestra el principio esencial de construcción de las líneas de apoyo y resistencia. Sobre su base se ha creado un asesor comercial y se han otimizado los parámetros de entrada de 13 instrumentos financieros. Para obtener el resultado máximo según un instrumento financiero concreto, es necesario seleccionar de forma individual sus parámetros óptimos. Para seleccionar estos, automatizar el comercio y comprobar el funcionamiento según las líneas de apoyo y resistencia, se ha creado un asesor que tiene una serie de funciones esenciales y 4 filtros HTF. En lo sucesivo, el indicador y el asesor podrán ser ampliados y modernizados, dependiendo de las necesidades concretas.

Según las conclusiones del trabajo, se ha establecido que en ciertas divisas el comercio con retroceso es menos rentable que el comercio con ruptura. Esto indica que el carácter del movimiento de los distintos instrumentos financieros es diferente, y que cada uno de ellos necesita un enfoque individual.


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

Archivos adjuntos |
TrendlinesEA.mq5 (46.56 KB)
Trendlines.mq5 (30.79 KB)
LifeHack para tráders: cocinamos ForEach usando #define LifeHack para tráders: cocinamos ForEach usando #define
Un escalón intermedio para aquellos que aún escriben en MQL4, pero todavía no han dado el salto a MQL5. Vamos a continuar buscando posibilidades para escribir código en el estilo MQL4. En esta ocasión, analizaremos la macrosustitución del preprocesador - #define.
Patrón de ruptura del canal Patrón de ruptura del canal
Como se sabe, los canales de precios se forman por las tendencias de precios. Una de las señales más fuertes del cambio de la tendencia es la ruptura del canal actual. En este artículo, yo propongo intentar automatizar el proceso de la búsqueda de las señales de este tipo, y ver si es posible formar su propia estrategia a base de eso.
Neuroredes profundas (Parte V). Optimización bayesiana de los hiperparámetros de las DNN Neuroredes profundas (Parte V). Optimización bayesiana de los hiperparámetros de las DNN
En el artículo se analizan las posibilidades de la optimización bayesiana de los hiperparámetros de las neuroredes profundas obtenidas con diferentes formas de entrenamiento. Se compara la calidad de la clasificación de las DNN con los hiperparámetros óptimos en diferentes variedades de entrenamiento. Se ha comprobado mediante forward tests la profundidad de la efectividad de los hiperparámetros óptimos de la DNN. Se han definido los posibles campos de mejora de la calidad de la clasificación.
Gestión de capital según Vince. Implementación como módulo de Wizard MQL5 Gestión de capital según Vince. Implementación como módulo de Wizard MQL5
El artículo se basa en el libro de R.Vince "Las matemáticas de la gestión de capital". En este se analizan los métodos empíricos y paramétricos usados para localizar el tamaño óptimo de lote comercial, sobre cuyas bases se han escrito los módulos comerciales de gestión de capital para el wizard MLQ5.