Discusión sobre el artículo "Recetas MQL5 - Desarrollo de un indicador multidivisa para el análisis de la divergencia de precios"

 

Artículo publicado Recetas MQL5 - Desarrollo de un indicador multidivisa para el análisis de la divergencia de precios:

En este artículo veremos el desarrollo de un indicador multidivisa para el análisis de la divergencia de precios en un periodo de tiempo determinado. Ya hemos visto muchos momentos importantes en el anterior artículo sobre la programación de indicadores multidivisa: "Desarrollo de un indicador multidivisa de volatilidad en MQL5". Por eso, esta vez sólo nos detendremos en las funciones nuevas, o bien en aquellas funciones que hayan sufrido cambios significativos. Si es la primera vez que se encuentra con el tema de los indicadores multidivisa, entonces le recomendamos que lea en primer lugar el artículo anterior.

Time frame semanal en el modo "Línea vertical"

Autor: Anatoli Kazharski

 

¿Es sólo un error tipográfico o debería serlo?

No importa cuántas veces lo he intentado, todas las funciones del "Escuadrón de copia" nunca devuelven cero, sólo -1 o >0.

//+------------------------------------------------------------------+
//| Comprueba el número de datos disponibles para todos los caracteres |||
//+------------------------------------------------------------------+
bool CheckAvailableData()
  {
   int attempts=100;
   
//---
   for(int s=0; s<SYMBOLS_COUNT; s++)
     {
      //--- Si existe tal carácter
      if(symbol_names[s]!=empty_symbol)
        {
datetime time[];                    // Array para comprobar el número de barras
   int      total_period_bars   =0;    // Número de barras del periodo actual
   datetime terminal_first_date =NULL; // Primera fecha de datos disponibles del periodo actual en el terminal
         //--- Obtener la primera fecha de los datos del periodo actual en el terminal
         terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE);
         //--- Obtener el número de barras disponibles a partir de la fecha especificada
         total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent());
         //--- Compruebe la disposición de estas barras
         for(int i=0; i<attempts; i++)
           {
            //--- Copiar la cantidad especificada de datos
            if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
              {
               //--- Si se copia la cantidad requerida, detener el bucle
               if(ArraySize(time)>=total_period_bars)
                  break;
              }
           }
         //--- Si se copian menos datos, hay que hacer otro intento.
         if(ArraySize(time)==0 || ArraySize(time)<total_period_bars)
           {
            msg_last=msg_prepare_data;
            ShowCanvasMessage(msg_prepare_data);
            OC_prev_calculated=0;
            return(false);
           }
        }
     }
//--- Si en el modo de línea vertical para el punto de partida de la diferencia de precios, salir
   if(StartPriceDivergence==VERTICAL_LINE)
      return(true);
   else
     {
      datetime time[];                    // Array para comprobar el número de barras
      int      total_period_bars   =0;    // Número de barras del periodo actual
      datetime terminal_first_date =NULL; // Primera fecha de datos disponibles del periodo actual en el terminal
      //--- Obtener la primera fecha de los datos del periodo actual en el terminal
      for(int i=0; i<attempts; i++)
         if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0)
            break;
      //--- Obtener el número de barras disponibles a partir de la fecha especificada
      for(int i=0; i<attempts; i++)
         if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0)
            break;
      //--- Compruebe la disposición de estas barras
      for(int i=0; i<attempts; i++)
         //--- Copiar la cantidad especificada de datos
         if(CopyTime(Symbol(),timeframe_start_point,
            terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0)
            break;
      //--- Si se copian menos datos, debe hacerse otro intento.
      if(ArraySize(time)<=0 || total_period_bars<=0)
        {
         msg_last=msg_prepare_data;
         ShowCanvasMessage(msg_prepare_data);
         OC_prev_calculated=0;
         return(false);
        }
     }
//---
   return(true);
  }
 
Fleder:

¿Es sólo un error tipográfico o debería serlo?

No importa cuántas veces lo haya intentado, todas las funciones de la "brigada de copia" nunca devuelven cero, sólo -1 o >0.

En general, se debe hacer >0. Pero en este caso, las comprobaciones posteriores permiten no hacerlo.
 
tol64:
En general, deberías hacer >0. Pero en este caso, las comprobaciones posteriores te permiten no hacerlo.

Pero esta expresión siempre será verdadera:

if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
 
Fleder:

Pero esta expresión siempre será verdadera:

Puede eliminar el if en absoluto. En este caso no es crítico.
 
tol64:
Usted podría quitar el si en absoluto. En este caso no es crítico.
Bueno, eso es lo que pensaba :-)
 

En general, la carga de datos históricos en un símbolo no se produce de la forma en que está escrito en la ayuda.

De hecho, resulta así

si desde el programa mql5 se solicitan datos de alguna serie temporal utilizando, por ejemplo, la función CopyTime

y estos datos no están en el terminal (no se han cargado todavía), el terminal descargará estos datos del servidor no en la cantidad solicitada (en el ejemplo de la ayuda son 100 barras),

sino tantas barras de la serie temporal solicitada como el parámetro "Máx barras en gráfico" permita "colocar" en la RAM.

Basta con solicitar una sola barra de un periodo superior, digamos PERIOD_W1, ya que todo el histórico se descargará del servidor.

 
Fleder:

En general, la carga de datos históricos en un símbolo no se produce de la forma en que está escrito en la ayuda.

De hecho, resulta así

si desde el programa mql5 se solicitan datos de alguna serie temporal utilizando, por ejemplo, la función CopyTime

y estos datos no están en el terminal (no se han cargado todavía), el terminal descargará estos datos del servidor no en la cantidad solicitada (en el ejemplo de la ayuda son 100 barras),

sino tantas barras de la serie temporal solicitada como el parámetro "Máx barras en gráfico" permita "colocar" en la RAM.

Basta con solicitar una sola barra de un periodo superior, digamos PERIOD_W1, ya que se descargará todo el histórico del servidor.

La ayuda puede decir lo que quieras. Eres libre de hacer lo que creas conveniente. ;)

El ejemplo de la ayuda fue comentado en otro artículo: Cómo preparar cotizaciones de MetaTrader 5 para otros programas >>>.

 
tol64:

El certificado puede decir lo que tú quieras que diga. Eres libre de hacer lo que creas conveniente. ;)

El ejemplo de la ayuda lo comenté en otro artículo: Cómo preparar cotizaciones de MetaTrader 5 para otros programas >>>.

Eso es lo que hice yo. Acabo de ver el cálculo de las "barras descargadas" restantes del servidor en tu código.

Y pensé - al terminal le da igual, bombea todo lo que necesita para formarse.

 

Al final de tu artículo escribes:"Este indicador puede desarrollarse ilimitadamente para mejor".

En mi opinión, la contemplación de la divergencia de precios es poco útil para el ojo humano. ¡Un humano no es un robot!

Pero es un tema interesante para un robot.

Usted ha sugerido varias opciones de representación:

1. Desde la línea.

2. "día".

Actualmente estoy trabajando en algo similar, sólo que en modo "semana".

 
Fleder:

Al final de tu artículo escribes:"Este indicador puede desarrollarse ilimitadamente para mejor".

En mi opinión, la contemplación de la divergencia de precios es poco útil para el ojo humano. ¡Un humano no es un robot!

Pero es un tema interesante para un robot.

Usted ha sugerido varias opciones de representación:

1. Desde la línea.

2. "día".

Actualmente estoy trabajando en algo similar, sólo que en modo "semana".

No estoy seguro de si podré escribir algo más pronto, ya que estoy lidiando con otros asuntos. Pero según este artículo se supone que el desarrollo estaba todavía en los cálculos multidivisa y la visualización de estos cálculos en el lienzo.

Sí, el hombre no es un robot, pero a veces hay que ver el tema de estudio de otra manera para hacerse una idea. ;)