Mi indicador desaparece cada vez que cambio a un nuevo cuadro de tiempo

 

Hola,

Comienzo con un indicador (La primera parte). Funciona bien, al cambiar de marco de tiempo.

Luego agrego la Segunda Parte que es: Si Close[i]-Close[i+1] es menor que la mediana del valor de la diferencia de las últimas 100 barras, asignaré el valor 0 a todo el buffer.

Ahora el indicador combinado funciona bien en 1 gráfico pero cuando cambio de marco temporal, ese indicador desaparece. Tengo que volver a colocarlo en el gráfico.

Creo que el problema es causado por el Array pero no sé cómo solucionarlo.

¿Alguien puede ayudarme con el error?

Muchas gracias.

SCFX

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 limit=rates_total-prev_calculated;
      
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=0; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
         
//SECOND PART         
   for(int j=0;j<=sample_roc_quartile;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
      
      if(   (Close[i]-Close[i+1])<roc_s[50]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    }     
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Posiblemente un error de matriz fuera de rango y el indicador está siendo eliminado

int limit=rates_total-prev_calculated;

for(int i=0; i<limit; i++)
iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))

Posiblemente esté recibiendo un mensaje en el registro sobre un fallo de inicialización global
Compruebe sus registros

 

Gracias por su sugerencia.

He comprobado el registro, no hay ningún error o aviso de advertencia.

No estoy seguro de que el (i+1) causar problemas, ya que de pie por sí solo (o simplemente la supresión de la segunda parte), este indicador funciona bien.

SCFX

 

Hay errores compilé su código y lo probé:

2014.05.22 22:39:43.936 Indicador personalizado Indicador de prueba 3 XAUUSD,M1: eliminado
2014.05.22 22:39:43.905 Indicador de prueba 3 XAUUSD,M1: inicialización global falló
2014.05.22 22:39:43.905 Indicador de prueba 3 XAUUSD,M5: uninit razón 3 //----------------------- cambiar gráfico
2014.05.22 22:39:17.323array fuera de rango en 'Test Indicator 3.mq4' (117,32)
2014.05.22 22:39:15.591 Indicador de prueba 3 XAUUSD,M5: inicializado
2014.05.22 22:39:09.570 Indicador personalizado Indicador de prueba 3 XAUUSD,M5: cargado con éxito

 
scfx:

Gracias por su sugerencia.

He comprobado el registro, no hay ningún error o aviso de advertencia.

No estoy seguro de que el (i+1) causar problemas, ya que de pie por sí solo (o simplemente la supresión de la segunda parte), este indicador funciona bien.

SCFX


Entonces probablemente sea esto

roc_s[j]=Close[i+j]-Close[i+j+1];

Usted está tratando de obtener el precio de cierre de las barras que no existen

 

Deberías añadir una línea cuando el indicador se inicia primero : prev_calculated == 0,

algo así :

 int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;
      

tampoco hay error en mi ordenador ;-)

 

Hola ffoorr,

Tu solución es realmente buena.

A decir verdad, anoche contraté a alguien para que lo arreglara. Sí lo hizo, pero el código es ineficiente, por favor, vea a continuación, ya que añade un for(i) más.

Te agradezco que me expliques qué significa eso de prev_calculado ==0. No lo entiendo.

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 limit=rates_total-prev_calculated;
          if(limit<=0)limit =2;
     
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=1; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
} 

    
//SECOND PART   

//--------------------------------------- HERE IS THE WHAT HE DID
int mid = (sample_roc_quartile +1)/2;
  
for(int i=1; i<limit&&(i+1)<rates_total; i++)
{    

//---------------------------------------------


  for(int j=0;j<=sample_roc_quartile&&(i+j+1)<rates_total;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
   }   
      
      if( (Close[i]-Close[i+1])<roc_s[mid]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    
 }    

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Hola a todos...


Estoy teniendo problemas para instalar el indicador tradicional IBFX MACD y otras plantillas en mi MT4.

En la versión anterior, sólo tenía que copiar y pegar mis archivos en la carpeta "indicator" ubicada en la carpeta "expert".

La actual sólo tiene la carpeta "MQL4" que consiste en una carpeta "expert" e "indicator" separadas.

He intentado pegar en ambas carpetas y reiniciar mi plataforma pero no funciona

no sucede.

¿Puede alguien por ahí, por favor, aconsejarme sobre este tema? o tal vez cualquier otra manera para mí conseguir el indicador MACD tradicional con 2 líneas EMA?

Gracias

Douglas
 
douglas beng tienes que dejar de poner tu pregunta en los temas de los demás cuando no está relacionada con su tema. EMPIEZA TU PROPIO TEMA.
 
douglas_heng: Estoy teniendo problemas para instalar el indicador tradicional IBFX MACD y otras plantillas en mi MT4.
No No múltiples (6) puestos. No secuestrar el puesto de otras personas.
 
scfx:

Hola ffoorr,

Tu solución es realmente buena.

A decir verdad, anoche contraté a alguien para que lo arreglara. Sí lo hizo, pero el código es ineficiente, por favor, vea a continuación, ya que añade un for(i) más.

Te agradezco que me expliques qué significa eso de prev_calculado ==0. No lo entiendo.


bueno scfx, no entiendo la segunda parte de tu indicador, por lo que no puedo decirlo.

Cuando un indicador se inicia por primera vez, (poner en un gráfico) previous_calculated es egal a Cero por construcción, por lo que se puede fijar el punto de partida desde el que el indicador comenzará a calcular .

if( prev_calculated == 0) limit = 100;

o

if( prev_calculado < 50) limit = 500:

o decir

if( prev_calculated < 500) limit = 3000: (todo es igual, no se utiliza el principio del gráfico)

int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;

at the first lauch of the indicator limit = 3000;

for(int i=1; i<3000; i++) // draw 3000 bars 

at the second lauch limit = 0; // ( because rates_total-prev_calculated = 0)  ;
for(int i=1; i<0; i++)    //   draw the last bars only, faster

muy buena idea esta indi ......