Erros, bugs, perguntas - página 3148

 
Roman #:

Isto porque o IndBuff não é atribuído a taxas_total + 1
e o ArrayResize não é aplicável a ele.
Partiram o para construção. Temos de usar o if-arses agora?

for(int i=limit - 1;....

pelo menos...

 
Roman #:

Isto porque o IndBuff não é atribuído a taxas_total + 1
e o ArrayResize não lhe é aplicável.


É aqui que precisa do menos 1 :))
A impressão mostra que as dimensões são OK.
Usar a lógica:
Se limite = 0, então é um novo tick.
Se limite = 1, significa uma nova barra (o último elemento do buffer de taxas_total é -1 e tem taxas_total - daí o transbordamento)
Se limite > 1, então é melhor recalcular o indicador inteiro
 
Maxim Kuznetsov #:

for(int i=limit - 1;....

no mínimo...

Sabe o que é mais irritante? Que qualquer comportamento seja enganado silenciosamente, sem aviso prévio.
E depois as pessoas ficam feridas. Estou farto deste metatarraxador.

 
Roman #:

Sabe o que é mais irritante? Que qualquer comportamento seja enganado silenciosamente, sem aviso prévio.
E depois as pessoas ficam feridas. Estou farto deste metatarraxador.

Tudo é como era antes.
A culpa é sua.
Dica - aprenda a usar o depurador e não tem de fazer revisões, verá todas as suas falhas de uma só vez.
 
Roman #:

Sabe o que é mais irritante? Que qualquer comportamento seja enganado silenciosamente, sem aviso prévio.
E depois as pessoas ficam feridas. Estou farto deste metatarraxador.

Não notei quaisquer alterações no cálculo dos indicadores. Como viu acima, Nikolay explicou correctamente o que os valores-limite calculados como taxas_total-prev_média calculada.

E tem estado a funcionar há anos - desde o quarto terminal.

 
Nikolai Semko #:
É aqui que precisa do menos um :))
A impressão mostra que as dimensões são OK.
Usar a lógica:
Se limite = 0, então um novo tick
Se limite = 1, significa uma nova barra (o último elemento do buffer de taxas_total é -1, e tem taxas_total, daí o transbordamento)
Se limite > 1, então é melhor recalcular o indicador inteiro

Nikolay I know constructions se e por exemplo,
mas sempre trabalhei para, acabei de me habituar, é mais conveniente.
Mas há muito tempo que tenho notado algumas coisas estranhas e tenho vindo a adiar a tentativa de o descobrir.
Costumava funcionar bem antes

para i>=0 carrapatos
para i>0 barras

E não foram necessários "se".

 
Roman #:



Passo 1: Criar um modelo usando o 'MQL5 Wizard':

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Passo 2: Soletra 'limite' correctamente e UTILIZE a matriz fechada - NÃO a chamada iClose!!!

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,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[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      CloseBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Resultado:

E não há erros.

Arquivos anexados:
Simple.mq5  5 kb
 
Vladimir Karputov #:

Passo 1: Criar um modelo usando o 'MQL5 Wizard':


Passo 2: soletrar 'limite' correctamente e UTILIZAR a matriz fechada - NÃO a chamada iClose!!!


Resultado:

e não há erros.

Obrigado pelo exemplo directo do i+++, claro.
Mas o facto de eu ter um laço invertido, ainda não se apercebeu.
E se o iClose for citado como exemplo, deve ser utilizado para mostrar que o índice i será subsequentemente utilizado noutras funções.

 
Roman #:

Nikolai I conheço as construções de se e para um,

caso contrário, se

Nikolai Semko #:
Usar a lógica:
Se limite = 0, então um novo tick
Se limite = 1, significa uma nova barra (o último elemento do buffer de taxas_total é -1, e tem taxas_total, daí o transbordamento)
Se limite > 1, então é melhor recalcular o indicador inteiro

aqui é onde
está errado - melhor usar
se limite != 1

Portanto, toda a lógica é, grosso modo, o que é:

limit = rates_total - prev_calculated;
if (limit == 0) {..} // новый тик
else if ( limit == 1) {..} // новый бар
else {..} // полный пересчет всего индикатора
Compreendo que algumas pessoas ficarão indignadas e dizem porque devo recalcular tudo se limite == 2,
mas quando o limite não é igual a 1 e não é igual a 0, significa que esta é a primeira inicialização do indicador ou algo correu mal (por exemplo, falha de ligação ou falha do servidor)
Além disso, muitas vezes deparei-me com situações em que o cálculo prévio era maior do que as taxas_totais. Provavelmente, era alguma falha antes e foi corrigida agora, mas desde então utilizo este desenho como precaução de segurança.
 
Nikolai Semko #:

se limite != 1

Que diferença faz? Pode ser inferior a zero?