Cambiar el TF es un problema - página 5

 

Este es un indicador:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.42"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 clrLightBlue
#property  indicator_color2 clrRed
#property  indicator_width1 2
#property  indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
      limit=rates_total-1;
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   datetime temp;
   for(i=0; i<limit; i++)
     {
      temp=time[i];
      if(close[i]>close[i+1])
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
      if(close[i]<close[i+1])
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

Sólo hay que tener en cuenta que, según sus condiciones, el indicador puede dibujar ambos buffers en la barra cero.

Archivos adjuntos:
 
Karputov Vladimir:

Este es un indicador:

Tenga en cuenta que, según sus condiciones, el indicador puede dibujar ambos tampones a cero bar.

Para evitar que se dibujen dos búferes, es necesario poner a cero el otro búfer cuando uno esté lleno

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }
 
Vasyl Nosal:
¿Tiene un código de solución?

Como muchos otros, tengo más de una solución a su pregunta. Porque los indicadores pueden ser diferentes en matices (las tareas que realizan/código/intervalos de cálculo, en general, muchos factores).

 
Karputov Vladimir:

Este es un indicador:

solo hay que tener en cuenta que según tus condiciones, el indicador puede dibujar ambos buffers a barra cero.

¿Me estáis tomando el pelo o realmente no tenéis ni idea de cuál es el problema?

Este es su indicador cuando cambia el TF en la historia descargada.

:)))))))))))))))))))))))))))))))))))))))))))

 
Dina Paches:

Como muchos otros, tengo más de una solución a su pregunta. Porque los indicadores pueden ser diferentes en matices (las tareas que realizan/código/intervalos de cálculo, en general, muchos factores).

Bla, bla, bla...
 
Vasyl Nosal:

¿Me estáis tomando el pelo o realmente no tenéis ni idea de cuál es el problema?

Aquí está su indicador para el cambio de TF en la historia descargada.

:)))))))))))))))))))))))))))))))))))))))))))

¿Puede decirme qué manipulaciones utiliza para conseguir una imagen tan interesante? Y espero que seas más reticente en el futuro.

Añadido: Ya he mencionado que hay que pensar en el contenido de los búferes de los indicadores por sí mismo cuando se bombea la historia:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

El cambio de TFs es un problema

Karputov Vladimir, 2015.12.07 10:09

Tiene dos variables a su disposición: prev_calculado y rates_total. Al controlar la carga del historial (con prev_calculated==0) hay que pensar qué hacer con los buffers de los indicadores - el comportamiento habitual en estos casos es equiparar la carga del historial al primer evento de carga del indicador.

Pero lo ignoraste por alguna razón y no quisiste hacer ediciones.

En cualquier caso, aquí está la versión 1.43 (aquí están mis correcciones y las deAlexey Viktorov):

Foro sobre trading, sistemas de trading automatizados y comprobador de estrategias

Cambio de TF - problema

Alexey Viktorov, 2015.12.07 12:52

Si quieres evitar dibujar dos búferes, tienes que poner a cero uno de ellos cuando esté lleno.

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }

:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.43"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 clrLightBlue
#property  indicator_color2 clrRed
#property  indicator_width1 2
#property  indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      ArrayInitialize(up_arr,EMPTY_VALUE);
      ArrayInitialize(down_arr,EMPTY_VALUE);
     }
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   for(i=0; i<limit; i++)
     {
      if(close[i]>close[i+1])
        {
         down_arr[i]=EMPTY_VALUE;
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
        }
      if(close[i]<close[i+1])
        {
         up_arr[i]=EMPTY_VALUE;
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
Karputov Vladimir:

¿Podría decirnos qué manipulaciones utiliza para conseguir una imagen tan interesante? Y espero que sea más reticente en el futuro.

Abro un gráfico de un par de divisas que nunca he abierto antes. M1, por ejemplo. Adjunto su indicador. Lo cambio a M5.

¿Así que tenía razón? ¿Necesitamos restablecer los topes de las flechas?

 
Vasyl Nosal:

mql4

No. Aquí está su diseño en un par donde no hay historia.

¿Qué es esto?

if(i>Bars-20) i=Bars-20;

Como pensaba, el bucle está enraizado internamente. Además, como en el cuerpo del bucle se accede a la barra anterior ([i+1]), se debe comenzar el cálculo no antes de la segunda barra del historial (contando desde la izquierda). Y los topes deben llenarse en cada barra TODA, no sólo una. Bueno, o inicializarlos de antemano en OnInit().

int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],
                const double &low[],const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
{
   int nStartBar = rates_total - MathMax(prev_calculated, 2);

   for(int i = nStartBar; i >= 0; i--)
   {
      if(Close[i] > Close[i+1])
      {
         up_arr[i] = Low[i] - arrow_indent * _Point; //up arrow
         down_arr[i] = 0;
      }
         
      if(Close[i] < Close[i+1])
      {
         up_arr[i] = 0;
         down_arr[i] = High[i] + arrow_indent * _Point; //down arrow
      }
   }

   return(rates_total);
}
 
Karputov Vladimir:

De todos modos, aquí está la versión 1.43 (mis correcciones ylas de Alexey Viktorov aquí):


:

Vladimir, ¿por qué haces esto dentro de OnCalculate()? Me refiero a las dos últimas líneas: reinicialización de arrays. Ambos topes se calculan en cada barra, es una acción innecesaria.

if(prev_calculated==0)
{
   limit=rates_total-1;
   ArrayInitialize(up_arr,EMPTY_VALUE);
   ArrayInitialize(down_arr,EMPTY_VALUE);
}
 
Sergei Vladimirov:

¿QUÉ ES ESTO?

Como pensaba, el bucle está corrompido internamente. Además, si se accede a la barra anterior en el cuerpo del bucle ([i+1]), entonces el cálculo debe comenzar no antes de la segunda barra del historial (contando desde la izquierda). Y los topes deben llenarse en cada barra TODA, no sólo una. Bueno, o inicializarlos de antemano en OnInit().

¿Eso es todo? ¿No hay fallos?