Mi indicador desaparece cada vez que cambio a un nuevo cuadro de tiempo - página 2

 

Gracias por su explicación.

Ahora lo veo mejor.

SCFX

 

Hola,

Me rasco la cabeza con ese error loco.

Todavía este simple indicador de 4 filas código desaparece cuando cambio de marco de tiempo.

Locamente, apliqué las sugerencias publicadas aquí ya pero todavía falló.

Me siento tan mal...

Por favor, ayúdenme.

Muchas gracias,

SCFX

//+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
//--- indicator buffers
double         boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,boring);
   
          
//---
   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=300;
//---
 
 for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
scfx:

Hola,

Me rasco la cabeza con ese error loco.

Todavía este simple indicador de 4 filas código desaparece cuando cambio de marco de tiempo.

Locamente, apliqué las sugerencias publicadas aquí ya pero todavía falló.

Me siento tan mal...

Por favor, ayúdenme.

Muchas gracias,

SCFX



2014.06.15 11:26:39.908 división cero en 'test.mq4' (59,44)
 
angevoyageur:
2014.06.15 11:26:39.908 cero división en 'test.mq4' (59,44)


Gracias por responder.

En mi diario, no hay tal aviso pero cuando cambio de TF, este indicador se elimina.

Todavía no puedo solucionarlo.

SCFX

2014.05.18 08:41:31.080Indicador personalizado H_889_boring GBPUSD,H1: eliminado
2014.05.18 08:41:25.441 Indicador personalizado H_889_boring GBPUSD,H4: cargado con éxito

 
scfx:

Todavía no puedo arreglarlo.

SCFX

Eso es porque no te esfuerzas mucho.

No aprenderás nada si consigues que otras personas lo hagan por ti, la única manera es hacerlo tú mismo para entenderlo, la única manera de hacerlo tú mismo es examinar cada línea de código, descomponerlo y averiguar exactamente lo que está haciendo y hay varias maneras de hacerlo.

for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

Estas son todas las cosas que usted podría hacer que le ayudaría a encontrar la causa del problema

  • Has dicho que has comprobado la pestaña del diario, ¿has mirado en la pestaña de expertos que está al lado?
  • Ya te dije la semana pasada que tu código estaba causando array out of range ¿has mirado eso para saber lo que significa?
  • Hay un depurador en el metaeditor que podrías intentar aprender a usar para depurar tu código.
  • Podrías usar Print() para poder comprobar cuáles eran los valores de tus variables cuando el código se estaba ejecutando.

Si hubieras hecho click en la pestaña de expertos te diría que tu indicador hizo cero división en esta línea, el cambio de timeframes no tuvo nada que ver.

if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50

Así que eso tiene que significar que este High[i]-Low[i] era cero por alguna razón. Si miras el indicador en el gráfico puedes ver que el indicador dibujó algunos de sus valores y luego se detiene en una barra donde sólo hay un tick. Si sólo hay un tick high[i] == low[i] entonces eso causaría una división cero

Ahora asegúrese de que high[i]-low[i] no se utiliza si es cero.

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---
   for(int i=1;i<=limit  ;i++)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    
    if( MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ahora verás que la pestaña de expertos te dice que el código ya no dividió a cero pero genera un error de matriz fuera de rango en esta línea.

if(high[i] - low[i] == 0)  

¿Qué pasa si quitas todos los cálculos y condidciones para probar el bucle?

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ahora la pestaña de expertos informa de nuevo de que el array está fuera de rango, esta vez en esta línea:

boring[i]=Close[i];

Así que ahora sabes que tu código causa un array fuera de rango cada vez que se utiliza un array de precios en el bucle. Así que averigüe qué es lo que está mal en el bucle y por qué Close[i], Low[i], High[i] está fuera de rango. Puedes ver que el indicador dibuja todo el camino hasta el final del gráfico por lo que el error debe estar al final, los índices más altos de la matriz.

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

Parece que estás tratando de hacer un indicador sin aprender a codificar un bucle que funcione correctamente primero. Hay muchos ejemplos de cómo hacer esto. Mira el código de los indicadores incluidos y experimenta con ellos hasta que entiendas exactamente cómo funcionan, entonces intenta hacer un indicador para dibujar una simple línea que funcione correctamente antes de intentar hacer que realice cálculos.
 

@ scfx

La única persona que puede arreglar eres tú. O ir a https://www.mql5.com/en/job

y publicar el trabajo allí.

 
SDC:
...

Por favor, COSUDE, no hace falta ser tan duro, aunque tengas razón.
 
angevoyageur:

Por favor SDC, no es necesario ser tan duro, aunque tengas razón.

lol He reformulado un poco mi post ;)

 

Lo siento, me equivoqué, me disculpo, el indicador puede ser codificado así :

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

 for(int i=limit;  i>=0; i--)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

Si el gráfico tiene menos de 3000 barras seguirá estando fuera derango.