Problemas com o operador /

 

Caríssimos,


Sou leigo em programação, mas após vários testes, percebi, por mais de uma vez, que ao usar o operador matemático / , tenho problemas quais não sou capaz de entender. Sendo direto ao assunto, dou-lhes exemplo.



   for(int i=0;i<rates_total;i++)

     {

      if(volume[i] != 0) {

      

      DeltaVolBuffer[i] = (high[i]-low[i])/volume[i] ;

      

     }}


E se quiserem, a versão de todo o arquivo 

//+------------------------------------------------------------------+

//|                                                    Delta%Vol.mq5 |

//|                                                  Daniel Bandeira |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Daniel Bandeira"

#property link      "https://www.mql5.com"

#property version   "1.00"

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_plots   1

//--- plot DeltaVol

#property indicator_label1  "DeltaVol"

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrRed

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- indicator buffers

double         DeltaVolBuffer[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,DeltaVolBuffer,INDICATOR_DATA);

   

//---

   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[])

  {

//---


   for(int i=0;i<rates_total;i++)

     {

      if(volume[i] != 0) {

      

      DeltaVolBuffer[i] = (high[i]-low[i])/volume[i] ;

      

     }}

   

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+





O que está acontecendo afinal? Até eu dar conta, este erro comeu tempo meu!

Agradeço antecipadamente a quem responder.


Até!

Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
  • www.mql5.com
Pergunte sobre análise técnica, converse sobre sistemas de negociação e melhore suas habilidades quanto a programação de estratégias de negociação em linguagem MQL5. Mantenha contato e compartilhe experiência com traders de todo o mundo e ajude com feedback os novatos no fórum - nossa comunidade está crescendo junto com você. Você tem alguma...
 

Bom dia,

Sua dúvida não está clara,

Qual o erro exatamente? É uma mensagem do MT5, um erro de compilação, etc.

O que você esperava obter e o que está obtendo? Um exemplo já ajudaria.

 
Gustavo Hennemann:

Bom dia,

Sua dúvida não está clara,

Qual o erro exatamente? É uma mensagem do MT5, um erro de compilação, etc.

O que você esperava obter e o que está obtendo? Um exemplo já ajudaria.

Obrigado pela ajuda, Gustavo.

Ao menos no meu computador, ao rodar as linhas acimas, não obtenho gráfico algum como resultado! Pelos vários testes que fiz, notei que a única coisa que me leva a um resultado inesperado (gráfico em branco) consta nesta linha :


 DeltaVolBuffer[i] = (high[i]-low[i])/volume[i]  


o que me levou a crer que aí estaria o erro, algo que não consegui dar sentido. Na verdade, se se substrai ou se multiplica (ou outra coisa qualquer), o gráfico apresentado é condizente com a operação.

Fui mais claro agora?

Alías, enquanto erro copilação ou de outra natureza enunciada, não percebi nenhum. Destaco que não é erro por haver operação com divisor 0.

 
AnarcoPhysic:

Caríssimos,


Olá

coloca a seguinte instrução no OnInit() que a linha do indicador vai aparecer:  IndicatorSetInteger(INDICATOR_DIGITS,8);

At.te

Rogério

 

Boa tarde

      Como você não especificou qual a mesagem de erro que está aparecendo na aba "Expert" da "Caixa de Ferramentas" e que sua conclusão foi que poderia ser a divisão "/", então deduzo que o erro por ser "divisão por zero", sendo assim, sugiro a possível solução abaixo :


DeltaVolBuffer[i] = (high[i]-low[i])/(volume[i]+1) ;





AnarcoPhysic:

Caríssimos,


Sou leigo em programação, mas após vários testes, percebi, por mais de uma vez, que ao usar o operador matemático / , tenho problemas quais não sou capaz de entender. Sendo direto ao assunto, dou-lhes exemplo.



   for(int i=0;i<rates_total;i++)

     {

      if(volume[i] != 0) {

      

      DeltaVolBuffer[i] = (high[i]-low[i])/volume[i] ;

      

     }}


E se quiserem, a versão de todo o arquivo 

//+------------------------------------------------------------------+

//|                                                    Delta%Vol.mq5 |

//|                                                  Daniel Bandeira |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Daniel Bandeira"

#property link      "https://www.mql5.com"

#property version   "1.00"

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_plots   1

//--- plot DeltaVol

#property indicator_label1  "DeltaVol"

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrRed

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- indicator buffers

double         DeltaVolBuffer[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,DeltaVolBuffer,INDICATOR_DATA);

   

//---

   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[])

  {

//---


   for(int i=0;i<rates_total;i++)

     {

      if(volume[i] != 0) {

      

      DeltaVolBuffer[i] = (high[i]-low[i])/volume[i] ;

      

     }}

   

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+





O que está acontecendo afinal? Até eu dar conta, este erro comeu tempo meu!

Agradeço antecipadamente a quem responder.


Até!

 
Rogerio Giannetti Torres:

Olá

coloca a seguinte instrução no OnInit() que a linha do indicador vai aparecer:  IndicatorSetInteger(INDICATOR_DIGITS,8);

At.te

Rogério

Grande tiro no centro do alvo.

Acreditava que o algoritmo de construção gráfica já o reescalaria. Jamais poderia imaginar isso!

MUITO MUITO OBRIGADO!

Quando as esperanças morriam...

 
Pedro Quina:

Foi uma das coisas que imaginei logo de início. Entre várias formas, tinha certeza que não era divisão por zero (algo que normalmente é avisado).

Obrigado pela ajuda. De qualquer forma, é sempre bom tomar esse cuidado.


Obrigado!

Razão: