Meu indicador desaparece sempre que eu mudo para um novo gráfico de tempo - página 2

 

Obrigado por sua explicação.

Vejo isso melhor agora.

SCFX

 

Hi,

Eu coço minha cabeça com esse erro louco.

Ainda assim este simples indicador de 4 linhas de código desaparece quando mudo de prazo.

Loucamente, já apliquei as sugestões postadas aqui, mas ainda assim falhei.

Eu me sinto tão mal...

Por favor, me ajude.

Muito obrigado,

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:

Hi,

Eu coço minha cabeça com esse erro louco.

Ainda assim este simples indicador de 4 linhas de código desaparece quando mudo de prazo.

Loucamente, já apliquei as sugestões postadas aqui, mas ainda assim falhei.

Eu me sinto tão mal...

Por favor, me ajude.

Muito obrigado,

SCFX



2014.06.15 11:26:39.908 divisão zero em 'test.mq4' (59,44)
 
angevoyageur:
2014.06.15 11:26:39.908 divisão zero em 'test.mq4' (59,44)


Obrigado por responder.

Em meu diário, não há tal aviso, mas quando eu troco de TF, este indicador é removido.

Eu ainda não posso corrigi-lo.

SCFX

2014.05.18 08:41:31.080Indicador personalizado H_889_boring GBPUSD,H1: removido
2014.05.18 08:41:25.441 Indicador personalizado H_889_boring GBPUSD,H4: carregado com sucesso

 
scfx:

Ainda não consigo consertá-lo.

SCFX

Isso porque você não está se esforçando muito.

Você não aprenderá nada se conseguir que outras pessoas o façam por você, a única maneira é fazê-lo por si mesmo para que você o entenda, a única maneira de fazê-lo você mesmo é examinar cada linha de código, quebrá-lo e descobrir exatamente o que ele está fazendo e há várias maneiras de fazer isso.

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];
    
}  

Essas são todas as coisas que você poderia fazer que o ajudariam a encontrar a causa do problema

  • Você disse que verificou a guia do diário, você olhou na guia dos especialistas ao lado?
  • Eu já lhe disse na semana passada que seu código estava causando uma série fora de alcance, você procurou isso para descobrir o que significa?
  • Há um depurador no metaeditor que você poderia tentar aprender como usá-lo para depurar seu código.
  • Você poderia usar Print() para verificar quais eram os valores de suas variáveis quando o código estava rodando
  • .

Se você tivesse clicado na aba de especialistas, ele lhe diria que seu indicador fez divisão zero nesta linha, mudar os prazos não tinha nada a ver com isso.

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

Portanto, isso tem que significar que este Alto[i]-Baixo[i] foi zero por alguma razão. Se você olhar para o indicador no gráfico, você pode ver que o indicador desenhou alguns de seus valores, então pára em uma barra onde há apenas um tick. Se houver apenas um tick alto[i] ==baixo[i] de modo que causaria uma divisão zero

Agora certifique-se de que o alto[i]-baixo[i] não seja usado se for zero.

   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);
  }

Agora você verá que a guia de especialistas lhe diz que o código não zerou mais a divisão, mas gera uma matriz fora do intervalo de erro nesta linha.

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

Então o que acontece se você retirar todos os cálculos e condidições para testar o laço?

   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);
  }

Agora os relatórios de tabulação dos especialistas estão novamente fora de alcance, desta vez nesta linha:

boring[i]=Close[i];

Portanto, agora você sabe que seu código causa um array fora do alcance cada vez que um array de preços é usado no loop. Então descubra o que está errado com o laço e porque Fechar[i], Baixo[i], Alto[i] está fora de alcance. Você pode ver o indicador desenhar até o final do gráfico, então o erro deve estar no final, os índices mais altos da 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 você está tentando fazer um indicador sem aprender a codificar primeiro um laço que funciona corretamente. Há muitos exemplos de como fazer isso. Veja o código para os indicadores incluídos e experimente com eles até entender exatamente como funcionam e depois tente fazer um indicador para desenhar uma linha simples que funcione corretamente antes de tentar fazer os cálculos.
 

@ scfx

A única pessoa que pode consertar é você. Ou acesse https://www.mql5.com/en/job

e afixar o trabalho lá.

 
SDC:
...

Por favor, SDC, não é preciso ser tão duro, mesmo que você esteja certo.
 
angevoyageur:

Por favor SDC, não é preciso ser tão duro, mesmo que você esteja certo.

rs reescrevi um pouco meu posto ;)

 

Desculpe, eu o orientei mal, peço desculpas, o indicador pode ser codificado assim :

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
 

Se o gráfico tiver menos de 3000 barras, ele ainda estará forade alcance.