English Русский 中文 Deutsch 日本語 Português
Ejemplo de desarrollo de una estrategia con spread para futuros en la bolsa de Moscú

Ejemplo de desarrollo de una estrategia con spread para futuros en la bolsa de Moscú

MetaTrader 5Ejemplos | 29 diciembre 2016, 10:07
2 243 0
MetaQuotes
MetaQuotes


Correlación inversa de los símbolos Si y RTS

En la bolsa de Moscú se comercia con futuros del tipo Si-M.Y y RTS-M.Y, que están relacionados entre sí de una forma bastante estrecha. Aquí, M.Y indican la fecha de expiración del contrato:

  • M — es el número del mes
  • Y — indica las dos últimas cifras del año

Si  —  es el contrato de futuros sobre el curso del dólar USA/rublo ruso, RTS  —  es el contrato de futuros sobre el Índice RTS, mostrado en dólares USA.  Puesto que en el Índice RTS entran acciones de compañías rusas, cuyo precio se expresa en rublos, las oscilaciones del curso USD/RUR se reflejan igualmente en las oscilaciones del índice expresado en dólares USA. En los gráficos de estos instrumentos se ve que al crecer un activo, el segundo normalmente cae.


Para que sea más comprensible, hemos incorporado a ambos gráficos el canal de desviación estándar.


Calculamos la regresión lineal entre Si y RTS

Podemos expresar la conexión entre los dos instrumentos con la ayuda de una ecuación de regresión lineal del tipo Y(X)=A(X)+B. Para realizar las comprobaciones pertinentes, escribiremos el script CalcShowRegression_script.mq5, que toma las dos matrices de los precios de apertura, calcula los coficientes y muestra directamnete en el gráfico un diagrama de distribución con regresión lineal.

Para calcular los coeficientes de regresión se usa la función de la biblioteca ALGLIB, el dibujado se realiza con las clases gráficas de la Biblioteca Estándar.



Construimos el indicador de spread entre Si y el sintético

Hemos obtenido los coeficientes de regresión lineal, y ahora podemos construir un gráfico sintético del tipo Y(RTS) = A*RTS+B. Llamaremos srpead a la diferencia entre el activo original y la serie sintética. Esta diferencia cambiará en cada barra desde los  valores positivos hacia los negativos.

Para representar de forma visual el spread, escribiremos el indicador TwoSymbolsSpread_Ind.mql5, que muestra en forma de histograma el spread, basándose en los datos de las últimas 500 barras. Los valores positivos del spread se dibujan en color azul, y los negativos,  en color  amarillo.


El indicador actualiza y escribe en el diario del Experto los coeficientes de regresión lineal de cada nueva barra. Además, espera al momento cuando la nueva vela se abre en ambos instrumentos: Si y RTS. De esta forma, el indicador permite controlar la corrección y la precisión de los datos.


Construimos el gráfico de regresión lineal en el gráfico de spreads en las últimas 100 barras

El indicador de spread muestra que la diferencia entre el futuro Si y el instrumento sintético cambia de forma periódica. Para valorar la tendencia actual, escribiremos el indicador SpreadRegression_Ind.mq5 (el spread y la regresión lineal sobre él), que construye una línea de tendencia en el gráfico de spread. Los parámetros de la línea los calculamos de nuevo con el método de regresión lineal.  Colocamos ambos indicadores en el gráfico para la depuración.

La línea de tendencia cambia su inclinación dependiendo del valor del spread en las últimas 100 barras. En principio, ahora tenemos como mínimo los datos necesarios para intentar construir un sistema comercial.


Estrategia №1 — cambio de inclinación de la regresión lineal en el gráfico de spread

Los valores del spread en el indicador TwoSymbolsSpread_Ind.mql5 se consideran como la diferencia entre Si e Y(RTS)=A*RTS + B. Puede comprobar esto fácilmente, iniciando el indicador para la depuración (con el botón F5).


Haremos un asesor sencillo, que realiza un seguimiento del cambio de ángulo de inclinación de la regresión lineal implementada en el gráfico. Ángulo de inclinación de la línea — no es otra cosa que el coeficiente A en la ecuación Y=A*X+B. Al darse una tendencia positiva, en el gráfico de spread A>0, al darse una negativa, A<0. La regresión lineal se calcula con los últimos 100 valores del gráfico de spread. Aquí tenemos parte del código del asesor Strategy1_AngleChange_EA.mq5.

#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| tipo de estrategia de spread                                             |
//+------------------------------------------------------------------+
enum SPREAD_STRATEGY
  {
   BUY_AND_SELL_ON_UP,  // Buy 1-st, Sell 2-nd
   SELL_AND_BUY_ON_UP,  // Sell 1-st, Buy 2-nd
  };
//---
input int       LR_length=100;                     // número de barras para la regresión con el spread
input int       Spread_length=500;                 // número de barras para calcular el spread
input ENUM_TIMEFRAMES  period=PERIOD_M5;           // marco temporal
input string    symbol1="Si-12.16";                // primer símbolo de la pareja
input string    symbol2="RTS-12.16";               // segundo símbolo de la pareja
input double    profit_percent=10;                 // qué tanto por ciento del beneficio fijamos
input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // tipo de estrategia de spread
//--- manejadores de los indicadores
int ind_spreadLR,ind,ind_2_symbols;
//--- clase para las operaciones comerciales
CTrade trade;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- coeficiente de la inclinación A de la regresión lineal en el gráfico de spread Y(X)=A*X+B
   static double Spread_A_prev=0;
   if(isNewBar())
      PrintFormat("Una nueva barra %s se ha abierto en %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- esperamos a que los datos del indicador se actualicen, puesto que funciona con dos símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtenemos los valores de regresión lineal en el gráfico de spread para las barras con los índices 1 y 2 ("ayer" y "anteayer")
      double LRvalues[];
      double Spread_A_curr;
      int copied=CopyBuffer(ind_spreadLR,1,1,2,LRvalues);
      if(copied!=-1)
        {
         //--- coeficiente de regeresión lineal en la última barra finalizada ("de ayer")
         Spread_A_curr=LRvalues[1]-LRvalues[0];
         //--- si la inclinación de la regresión ha cambiado, entonces el producto del actual y el anterior será inferior a cero
         if(Spread_A_curr*Spread_A_prev<0)
           {
            PrintFormat("La línea LR ha cambiado su inclinación, Spread_A_curr=%.2f, Spread_A_prev=%.2f: %s",
                        Spread_A_curr,Spread_A_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- si no hay posiciones abiertas, entonces entramos en el mercado con los dos símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_A_curr-Spread_A_prev>0,strategy,symbol1,1,symbol2,1);
            //--- hay posiciones abiertas, hacemos un viraje
            else
               ReverseTrades(symbol1,symbol2);
           }
         //--- la inclinación de la regresión no ha cambiado, comprobamos el beneficio flotante, ¿quizá sea momento de cerrar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- se ha alcanzado el nivel necesario de beneficio flotante, fijamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
              }
           }
         //--- recordamos la dirección de la tendencia para comparar en la apertura de una nueva barra
         Spread_A_prev=Spread_A_curr;
        }
     }
  }

Para no tener que hacer suposiciones sobre qué hay que comprar y qué hay que vender al cambiar la tendencia, simplemente hemos añadido al asesor un parámetro externo que permite invertir las reglas comerciales:

input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // tipo de estrategia de spread

Ahora podemos iniciar la simulación y la depuración del asesor.


Simulando la estrategia comercial №1

Para depurar la nueva estrategia será mejor usar el modo de simulación visual. Para ello, a través del menú Servicio-Ajustes-Depuración, indique los datos necesarios:

  1. Símbolo
  2. Marco temporal
  3. Intervalo de simulación
  4. Modo comercial
  5. Tamaño del depósito
  6. Modo de generación de ticks

Para los instrumentos de la bolsa, le recomendamos elegir "Cada tick basado en ticks reales". En este caso, la simulación se realizará sobre los datos históricos registrados, y usted obtendrá resultados lo más próximo posibles a las condiciones comerciales reales.

El servidor comercial MetaTrader 5 acumula automáticamente todos los ticks que llegan a la bolsa y da al terminal la historia completa de ticks a la primera solicitud.


En este modo de depuración, usted podrá pasar por toda la simulación de forma visual y comprobar los valores de cualquier variable en los lugares necesarios del código con la ayuda de los puntos de interrupción. Los indicadores usados en el robot comercial se cargarán de forma automática en los gráficos, no tendrá que hacer nada manualmente.


Después de depurar el código del asesor, podemos optimizar los parámetros.


Optimización de la estrategia comercial №1

En el asesor Strategy1_AngleChange_EA.mq5 existen varios parámetros externos que se pueden elegir mediante la optimización (destacados en amarillo):

input int       LR_length=100;                     // número de barras para la regresión con el spread
input int       Spread_length=500;                 // número de barras para calcular el spread
input double    profit_percent=10;                 // qué tanto por ciento del beneficio fijamos

input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // tipo de estrategia de spread

Pero, en este caso, optimizaremos solo el parámetro profit_percent para las dos variantes de la estrategia, y así comprenderemos  si hay diferencia entre ellas. En otras palabras, fijamos el valor del parámetro strategy y optimizamos según el parámetro profit_percent de 0.2 a 3.0%, de forma que veamos la imagen general para los modos de comercio con el cambio de inclinación de la línea.

Para la regla BUY_AND_SELL_ON_UP (compramos el primer activo, vendemos el segundo), cuando la inclinación de la línea cambia de negativa a positiva, la optimización no da resultados muy buenos. En general, este método de entrada en el mercado no parece muy atractivo, pues obtenemos con mayor frecuencia pérdidas al simular en un intervalo de 2 meses.


Al usar las normas SELL_AND_BUY_ON_UP (vendemos el primer activo, compramos el segundo), los resultados de optimización son mejores: de 5 a 15 pasadas de optimización muestran algún beneficio.


La optimización se ha realizado usando la historia desde el 1 de agosto al 30 septiembre de 2016 (intervalo de dos meses). En defenitiva, ambas variantes tienen un aspecto no muy prometedor. Posiblemente el problema sea que para las entradas hemos usado un índice con bastante retraso: la inclinación de la línea de tendencia en las últimas 100 barras. Intentemos desarrollar una segunda variante de la estrategia.


Estrategia №2 — cambio de signo en la barra finalizada

En la segunda estrategia seguiremos los cambios del signo de spread. Miraremos solo los valores en las barras formadas, es decir, en la apertura de una nueva barra "de hoy". Si el spread en la barra de "anteayer" ha sido negativo, y en la de "ayer" se ha hecho positivo, consideraremos que el spread ha virado hacia arriba (UP). De nuevo, en el código se ha dejado la posibilidad de comerciar con el cambio de spread en cualquier dirección ,   podemos virar la dirección de entrada con la ayuda del parámetro strategy. Aquí tenemos un bloque de código del asesor Strategy2_SpreadSignChange_EA.mq5:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- valores anteriores de spread, como la diferencia de Symbol1 e Y(Symbol2)=A*Symbol2+B
   static double Spread_prev=0;
   if(isNewBar())
      PrintFormat("Una nueva barra %s se ha abierto en %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- esperamos a que los datos del indicador se actualicen, puesto que funciona con dos símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtenemos los valores de spread para las barras con los índices 1 y 2 ("ayer" y "anteayer")
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,1,2,SpreadValues);
      double Spread_curr=SpreadValues[1];
      if(copied!=-1)
        {
         //--- si el signo de spread ha cambiado, entonces el producto del actual y el anterior será inferior a cero
         if(Spread_curr*Spread_prev<0)
           {
            PrintFormat("El spread ha cambiado de signo, Spread_curr=%.2f, Spread_prev=%.2f: %s",
                        Spread_curr,Spread_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- si no hay posiciones abiertas, entonces entramos en el mercado con los dos símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_curr>0,strategy,symbol1,1,symbol2,1);
            //--- hay posiciones abiertas, hacemos un viraje
            else
               ReverseTrades(symbol1,symbol2);
           }
         //--- el signo de spread no ha cambiado, comprobamos el beneficio flotante, ¿quizá sea momento de cerrar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- se ha alcanzado el nivel necesario de beneficio flotante, fijamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
              }
           }
         //--- recordamos el signo de spread para comparar en la apertura de una nueva barra
         Spread_prev=Spread_curr;
        }
     }
  }

En primer lugar, como es habitual, depuramos el robot comercial en el modo de simulación visual, después iniciamos la optimización con el parámetro profit_percent, al igual que con la primera estrategia. Resultados:



Como podemos ver, en la segunda estrategia, la norma "Vendemos el primer activo y compramos el segundo" da unos resultados tan poco alentadores como en la primera. Además, la norma "Compramos el primer activo y vendemos el segundo" da pérdidas en todas las pasadas.

Vamos a intentar hacer una tercera variante de estrategia.


Estrategia №3 — cambio del signo de spread en la barra actual con confirmación en N ticks

Las dos anteriores estrategias han funcionado solo con la apertura de la barra, es decir, analizaban los cambios solo en las barras completamente finalizadas. Vamos a probar ahora a trabajar dentro de la barra actual. Analizaremos los cambios de estrategia en cada tick, y si los signos de spread en la anterior barra finalizada y en la actual en desarrollo se diferencian, entonces decidiremos que la dirección del spread ha cambiado.

Asimismo, exigiremos que el cambio del signo de spread permanezca estable en los últimos N ticks, de esta forma, intentaremos deshacernos de las señales falsas. Para ello, añadiremos al asesor el parámetro externo ticks_for_trade=10. Si en los últimos 10 ticks el signo de spread es negativo, y en la barra anterior es positivo, entonces entramos en el mercado. Este es el aspecto de la función OnTick() del asesor Strategy3_SpreadSignOnTick_EA.mq5.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(isNewBar())
      PrintFormat("Una nueva barra %s se ha abierto en %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- esperamos a que los datos del indicador se actualicen, puesto que funciona con dos símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtenemos los valores del spread en la barra actual ("hoy") y anterior("ayer")
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,0,2,SpreadValues);
      double Spread_curr=SpreadValues[1]; // spread en la barra actual en desarrollo
      double Spread_prev=SpreadValues[0]; // spread en la anterior barra finalizada
      if(copied!=-1)
        {
         //--- si el cambio del signo de spread se mantiene en los últimos ticks_for_trade ticks
         if(SpreadSignChanged(Spread_curr,Spread_prev,ticks_for_trade))
           {
            PrintFormat("El spread ha cambiado de signo, Spread_curr=%.2f, Spread_prev=%.2f: %s",
                        Spread_curr,Spread_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- mostramos en el gráfico los valores de los últimos ticks_for_trade ticks de ambos símbolos
            ShowLastTicksComment(ticks_for_trade);
            //--- si no hay posiciones abiertas, entonces entramos en el mercado con los dos símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_curr>0,strategy,symbol1,1,symbol2,1);
            //--- hay posiciones abiertas, hacemos un viraje
            else
               ReverseTrades(Spread_curr>0,positionstype,symbol1,symbol2);
           }
         //--- el signo del spread no ha cambiado, comprobamos el beneficio flotante, ¿quizá sea momento de cerrar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- se ha alcanzado el nivel necesario de beneficio flotante, fijamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
               positionstype=0;
              }
           }
        }
     }
   }

En este asesor hemos añadido la función ShowLastTicksComment(), que muestra los valores de los últimos N ticks de ambos símbolos en el gráfico en el momento de aparición de la señal. Así podremos simular de forma visual la estrategia y ver los cambios de los ticks con una precisión de milisegundos.


Iniciamos las mismas variantes de optimización que en las estrategias  anteriores, y obtenemos los siguientes resultados:

"Compramos el 1 activo y vendemos el 2"


"Vendemos el 1 activo y compramos el 2"


Los resultados con esta sencilla optimización no han mejorado demasiado.


Estrategia №4 — el spread alcanza un valor establecido en tanto por ciento

Creamos la cuarta y última estrategia para comerciar con spread. Será igual de sencilla que las tres anteriores. La señal comercial aparecerá en el momento en el que el spraed tenga el valor indicado en tanto por ciento spread_delta del precio del primer activo.  El manejador de ticks entrantes OnInit() ha cambiado significativamente, aquí tenemos su código en el asesor Strategy4_SpreadDeltaPercent_EA.mq5.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(isNewBar())
      PrintFormat("Una nueva barra %s se ha abierto en %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- esperamos a que los datos del indicador se actualicen, puesto que funciona con dos símbolos
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- obtenemos los valores del spread en la barra actual ("hoy")
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,0,1,SpreadValues);
      double Spread_curr=SpreadValues[0]; // spread en la barra que se desarrolla en estos momentos
      if(copied!=-1)
        {
         MqlTick tick;
         SymbolInfoTick(symbol1,tick);
         double last=tick.last;
         double spread_percent=Spread_curr/last*100;
         //--- si el spread en % ha alcanzado la magnitud indicada spread_delta
         if(MathAbs(spread_percent)>=spread_delta)
           {
            PrintFormat("El spread ha alcanzado %.1f%% (%G) %s",
                        spread_percent,TimeToString(TimeCurrent(),TIME_SECONDS),
                        Spread_curr);
            //--- si no hay posiciones abiertas, entonces entramos en el mercado con los dos símbolos
            if(PositionsTotal()==0)
               DoTrades(Spread_curr,strategy,symbol1,1,symbol2,1);
            //--- hay posiciones abiertas, hacemos un viraje
            else
               ReverseTrades(Spread_curr,positionstype,symbol1,symbol2);
           }
         //--- el spread se encuentra en los límites de lo permisible, comprobamos el beneficio flotante, ¿quizá sea momento de cerrar?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- se ha alcanzado el nivel necesario de beneficio flotante, fijamos
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
               positionstype=0;
              }
           }
        }
     }
  }

Igualmente, cerraremos las posiciones al alcanzar el tanto por ciento indicado del beneficio profit_percent=2, esta vez, lo haremos fijo. Iniciamos la optimización del parámetro spread_delta en el rango de 0.1 a 1%.

"Compramos el 1 activo y vendemos el 2"

/

"Vendemos el 1 activo y compramos el 2"


Esta vez, la primera norma "Compramos el 1 activo y vendemos el 2" tiene un aspecto significativamente mejor que la segunda norma.  Podrá realizar por usted mismo la optimización con el resto de parámetros.


MetaTrader 5 —  entorno de desarrollo de estrategias comerciales

En este artículo hemos analizado 4 sencillas estrategias para comerciar con el spread. Los resultados mostrados por estos sistemas de simulación y optimización no se pueden tomar como una guía de acción, puesto que han sido obtenidos en un intervalo limitado y pueden ser casuales en cierto grado.  En este artículo hemos mostrado lo cómodo que resulta comprobar y depurar las ideas comerciales en MetaTrader 5.

Para los desarrolladores de sistemas comerciales automáticos, el simulador en MetaTrader 5 propone las siguientes cómodas posibilidades:

  • descarga automática de la historia de ticks de todos los símbolos utilizados en el asesor,
  • modo visual de depuración de estrategias e indicadores con muestra de operaciones, historia comercial y diario de expertos,
  • inicio automático en el gráfico de los indicadores usados en el asesor , en el modo de simulación visual,
  • simulación de estrategias con datos de ticks reales registrados y reproducción de un entorno comercial real,
  • optimización multihilo de los parámetros con indicación de una función meta propia,
  • uso de miles de agentes de simulación para acelerar la optimización,
  • visualización de los resultados de optimización según sus propias reglas,
  • simulación de estrategias que comercien en varios instrumentos con sincronización de ticks al milisegundo,
  • depuración de estrategias directamente durante la simulación: podrá  indicar puntos de interrupción para estudiar los valores de las variables necesarias y recorrer paso a paso el código del programa.

El simulador de estrategias comerciales en este artículo se ha utilizado como un instrumento de investigación y búsqueda de la dirección correcta, esto se ha hecho como optimización de un parámetro, para sacar rápidamente conclusiones de calidad. Usted podrá añadir nuevas normas, modificar las ya existentes y someter los asesores obtenidos a una optimización total. Para acelerar esta ingente masa de cálculos, use la red global de computación MQL5 Cloud Network, creada especialmente para la plataforma MetaTrader 5


Observaciones imprescindibles sobre las estrategias

Normalmente, al buscar símbolos para comparar el spread, no se usan los valores absolutos de los precios, sino los incrementos. Es decir, en lugar de la serie Close[i] , se calcula Delta[i]=Close[i]-Close[i-1].

Para comerciar de forma equilibrada es necesario elegir un volumen para cada símbolo del spread. En el artículo, al realizar la simulación, se han usado solo volúmenes de 1 lote en cada símbolo.

Al simular se usan los ajustes actuales en las especificaciones de los contractos Si y RTS. Es imprescindible notar que:

  • la base del futuro RTS-12.16 es el dólar USA,
  • el precio del tick del futuro RTS-12.16 se establece cada día en la bolsa de Moscú
  • y este valor es igual a 0.2 del curso indicativo del dólar.


La metodología de cálculo se puede encontrar en la página de MOEX — http://fs.moex.com/files/3244. Por eso hay que tener en cuenta que los resultados de la optimización en el simulador de estrategias dependerán del curso del dólar en el momento de la simulación. En el artículo se han usado capturas de pantalla con los resultados de optimización realizados el 25 de octubre de 2016.

El código se ha escrito en condiciones de ejecución ideales:  no se han procesado los resultados del envío de las órdenes comerciales, no se han procesado los errores relacionados con la pérdida de conexión, no se han tenido en cuenta las comisiones, ni el deslizamiento.

Para los futuros, la liquidez y la ocupación de los gráficos mejoran cuando la finalización del contrato se encuentra más próxima. En el código no existe un procesamiento claro de la situación cuando en un símbolo las cotizaciones marchan y en otro se han omitido barras enteras (el comercio no tenía lugar en la bolsa por algún motivo). Aunque los propios indicadores usados en el asesor esperan con todas las garantías la sincronización de las barras conforme a sus símbolos, para calcular los valores del spread, buscan estos eventos en el diario.

No se ha tocado la cuestión de la estadística de las desviaciones del spread con respecto a los valores medios para crear reglas comerciales más fiables.

No se usa el análisis de la profundidad de mercado, puesto que no se emula el flujo de solicitudes en el simulador de MetaTrader 5.

Atención: Los indicadores usados en este artículo recalculan de forma dinámica los coeficientes de regresión lineal para crear gráficos de spread y de línea de tendencia. Por eso, al terminar la simulación, el tipo de gráficos y los valores de los indicadores en el momento actual se diferenciarán de aquellos que había durante la simulación.

Inicie los indicadores o asesores adjuntos en el modo de simulación visual para ver cómo sucede esto en el modo de tiempo real.


Artículos relacionados:


Programas usados en el artículo:

#
 Nombre
Tipo
Descripción
1
CalcShowRegression_script.mq5
Script
Calcula los coeficientes de regresión lineal y muestra un gráfico punteado con una línea de tendencia (se usa la clase СGraphic y la función de Alglib)
2
TwoSymbolsSpread_Ind.mql5
Indicador
Indicador que dibuja el histograma de spread en dos símbolos
3
SpreadRegression_Ind.mq5
Indicador Indicador que dibuja el gráfico de spread y la línea de regresión en el mismo
4
Strategy1_AngleChange_EA.mq5
Experto
Estrategia №1. Comercio basado en el cambio de signo del coeficiente А de regresión lineal en la ecuación Y=A*X+B. Análisis y entradas solo en la apertura de una nueva barra
5
Strategy2_SpreadSignChange_EA.mq5 Experto Estrategia №2. Comercio basado en el cambio de signo en el valor del spread. Análisis y entradas solo en la apertura de una nueva barra
6
Strategy3_SpreadSignOnTick_EA.mq5
Experto
Estrategia №3. Comercio basado en el cambio de signo en el valor del spread. Análisis y entradas dentro de la barra actual, el cambio de signo deberá mantenerse en los últimos N ticks
7 Strategy4_SpreadDeltaPercent_EA.mq5 
Experto
Estrategia №4. Comercio basado en el alcance del valor del spread indicado en tanto por ciento. Análisis y entradas dentro de la barra actual al darse el primer tick adecuado.

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

Archivos adjuntos |
MQL5.zip (22.9 KB)
Interfaces gráficas X: Control "Hora", control "Lista de las casillas de verificación" y ordenamiento (sort) de la tabla (build 6) Interfaces gráficas X: Control "Hora", control "Lista de las casillas de verificación" y ordenamiento (sort) de la tabla (build 6)
Continuamos con el desarrollo de la librería para la creación de interfaces gráficas. Esta vez mostraremos los controles «Hora» y «Lista de las casillas de verificación». Aparte de eso, a la clase de la tabla tipo CTable se le ha sido añadida la posibilidad de organizar los datos en orden ascendiente y descendiente.
LifeHack para tráders: Informe comparativo de varias simulaciones LifeHack para tráders: Informe comparativo de varias simulaciones
En el artículo se analiza el inicio simultáneo de la simulación del asesor en cuatro símbolos diferentes. La comparación final de los cuatro informes de la simulación se realizará en un recuadro, como sucede al elegir los productos en una tienda online. Como bonus adicional, se muestran los gráficos de distribución creados de forma automática para cada símbolo.
Oscilador universal con interfaz gráfica Oscilador universal con interfaz gráfica
En el artículo se describe la creación de un indicador universal basado en todos los osciladores del terminal con una interfaz gráfica propia. Esto permitirá cambiar de forma rápida y cómoda los parámetros de cada oscilador por separado, directamente desde la ventana del gráfico (y sin abrir la ventana de propiedades), comparar sus índices y elegir el óptimo para usted para una tarea concreta.
Zigzag universal Zigzag universal
El Zigzag es uno de los indicadores más populares entre los usuario de MetaTrader 5. En este artículo se han analizado las posibilidades de creación de diferentes versiones del Zigzag. Como resultado, obtenemos un indicador universal con amplias posibilidades para la ampliación de la funcionalidad, el cual es muy cómodo utilizar en el desarrollo de los Asesores Expertos y otros indicadores.