pré_calculado - página 9

 
Alexey Kozitsyn:
Sim, o loop provavelmente é demais. Mas se em pré-cálculo = 0 (quando o buffer está previamente cheio) alguns valores nesse buffer são zerados, talvez isso seja um bug. Vamos verificar agora...

Não é que eles sejam reiniciados, mas todo o indicador, toda a profundidade da história é recalculada. Portanto, se eu precisar preencher apenas o índice mais à direita do buffer, mas estes valores devem permanecer quando eu o deslocar para a esquerda, então eu tenho duas opções:

1. Ao inicializar o tampão indicador, ele está cheio de lixo e precisa ser limpo.

2. Eu o limpei, mas quando pré_calculado = 0, o buffer é limpo novamente e apaga todos os valores acumulados.


E em geral, a solução é insanamente simples. prev_calculado = 0 junto com uma bandeira resolve este problema.

 
Alexey Viktorov:

...

E em geral a solução é insanamente simples. prev_calculado = 0 junto com uma bandeira resolve este problema.

Não tem. Haverá uma quebra de conexão de várias barras de duração, várias barras acabarão não inicializadas com o lixo.
 
Alexey Viktorov:

Não finja... Está tudo claro, mas há uma imagem só para você.



O computador estava trabalhando sem desligar, o gráfico não estava fechado, o indicador não foi reinicializado...

Pergunta: Para onde desapareceram as barras de 2 minutos?

Você provavelmente tem um erro em seu código. Agora escrevi um indicador de teste, quando reajusto pelo botão de atualização o tamanho do buffer não muda, os dados no buffer não mudam...

#property indicator_buffers 1
#property indicator_plots 1
#property indicator_chart_window
#property indicator_type1 DRAW_NONE
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double buf[];
const double _price=98000;
bool _firstLaunch=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,buf);
//---
   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[])
  {
   if(prev_calculated==0)
     {
      if(_firstLaunch)
        {
         Print(__FUNCTION__,": Первый запуск! Размер буфера = ",ArraySize(buf));
         ArrayInitialize(buf,_price);
         _firstLaunch=false;
        }
      else
        {
         Print(__FUNCTION__,": prev_calculated после обновления = ",prev_calculated,". Размер буфера = ",ArraySize(buf));
         //--- Проверяем отличие значений от эталонного
         for(int i=rates_total-1; i>=0; i--)
            if(buf[i]!=_price)
               Print(__FUNCTION__,": Значение #",i," '"+DoubleToString(buf[i],_Digits)+
                     "' отличается от эталонного '"+DoubleToString(_price,_Digits));
        }
     }
   else
     {
      if(rates_total>prev_calculated)
         buf[rates_total-1]=_price;
     }
   return(rates_total);
  }
 

Depré_calculados a taxas_total, o tampão deve ser limpo.

 
Ou, como Dimitri disse acima, houve uma quebra na comunicação de algumas barras. A propósito, será que o retorno pré-calculado será 0 quando a conexão for quebrada também?
 
Dmitry Fedoseev:
Mostre-me o código. Vamos rir e explicar.

Eu já estou rindo.

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   6
#property indicator_plots     3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1    clrGold, clrGreen, clrRed
#property indicator_width1    2
#property indicator_label1    "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2    clrCrimson
#property indicator_width2    2
#property indicator_label2    "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3    clrDarkViolet
#property indicator_width3    2
#property indicator_label3    "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;

bool flag = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, balance, INDICATOR_DATA);
   SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, equityMin, INDICATOR_DATA);
   SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
   SetIndexBuffer(4, equityMax, INDICATOR_DATA);
   SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
   ArraySetAsSeries(balance, true);
   ArraySetAsSeries(clrBalance, true);
   ArraySetAsSeries(equityMax, true);
   ArraySetAsSeries(equityMaxB, true);
   ArraySetAsSeries(equityMin, true);
   ArraySetAsSeries(equityMinB, true);
   IndicatorSetInteger(INDICATOR_DIGITS, 2);
   IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
   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[])
  {
//---
if(prev_calculated == 0)
  {
   Print("prev_calculated = ", prev_calculated);
   if(flag)
    {
     ArrayInitialize(balance, 0.0);
      ArrayInitialize(equityMax, 0.0);
       ArrayInitialize(equityMaxB, 0.0);
      ArrayInitialize(equityMin, 0.0);
     ArrayInitialize(equityMinB, 0.0);
      flag = false;
    }
   return(rates_total);
  }
  double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
  double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
    balance[0] = bal;
    clrBalance[0] = 0.0;
    equityMinB[0] = balance[0];
    equityMin[0] = minEquity;
    equityMaxB[0] = balance[0];
    equityMax[0] = maxEquity;
    if(balance[0] > balance[1])
     clrBalance[0] = 1.0;
    if(balance[0] < balance[1])
     clrBalance[0] = 2.0;
    Comment(PositionsTotal());
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Durante a noite, houve este grande zeramento de pré-cálculo

2016.10.19 08:42:23.309 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 05:47:04.915 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 05:47:04.075 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:46:15.300 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:46:15.030 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:45:37.590 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 04:45:37.100 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 01:40:31.224 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 00:00:32.196 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.19 00:00:31.806 BalansEquityTest (EURUSD,M1)    prev_calculated = 0
2016.10.18 20:33:02.954 BalansEquityTest (EURUSD,M1)    prev_calculated = 0 // Это время последнего запуска индикатора.
 
Dmitry Fedoseev:

Depré_calculados a taxas_total, o tampão deve ser limpo.

Se esta for minha resposta, então no primeiro início do indicador o buffer é totalmente rubricado com o valor dado. Quando uma nova barra é formada, novos valores são sobregravados.
 
Alexey Kozitsyn:
Ou, como Dmitriy disse acima, houve uma falha de conexão em vários bares. A propósito, o cálculo prévio também retornará 0 quando a conexão for quebrada?

Costumava ser que com todos os problemas pré_calculados voltava 0. Depois houve uma discussão no fórum de que seria possível não sempre zerar para 0, mas em alguns casos você poderia zerar para o último valor contado, no tópico Slava participou e prometeu analisar a questão.

Depois de um tempo notei que os valores pré_calculados às vezes têm valores intermediários. Agora eu não sei, não vejo todos os dias o que retornos pré_calculados.

 
Alexey Kozitsyn:
Se esta é minha resposta, na primeira vez que o indicador é iniciado, o buffer é totalmente rubricado com o valor definido. Quando uma nova barra é formada - os novos valores são sobregravados.
Não você.
 
Alexey Viktorov:

Eu já estou rindo.

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link      "v4forex@yandex.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers   6
#property indicator_plots     3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1    clrGold, clrGreen, clrRed
#property indicator_width1    2
#property indicator_label1    "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2    clrCrimson
#property indicator_width2    2
#property indicator_label2    "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3    clrDarkViolet
#property indicator_width3    2
#property indicator_label3    "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;

bool flag = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, balance, INDICATOR_DATA);
   SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2, equityMin, INDICATOR_DATA);
   SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
   SetIndexBuffer(4, equityMax, INDICATOR_DATA);
   SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
   ArraySetAsSeries(balance, true);
   ArraySetAsSeries(clrBalance, true);
   ArraySetAsSeries(equityMax, true);
   ArraySetAsSeries(equityMaxB, true);
   ArraySetAsSeries(equityMin, true);
   ArraySetAsSeries(equityMinB, true);
   IndicatorSetInteger(INDICATOR_DIGITS, 2);
   IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
   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[])
  {
//---
if(prev_calculated == 0)
  {
   Print("prev_calculated = ", prev_calculated);
   if(flag)
    {
     ArrayInitialize(balance, 0.0);
      ArrayInitialize(equityMax, 0.0);
       ArrayInitialize(equityMaxB, 0.0);
      ArrayInitialize(equityMin, 0.0);
     ArrayInitialize(equityMinB, 0.0);
      flag = false;
    }
   return(rates_total);
  }
  double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
  double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
  if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
    balance[0] = bal;
    clrBalance[0] = 0.0;
    equityMinB[0] = balance[0];
    equityMin[0] = minEquity;
    equityMaxB[0] = balance[0];
    equityMax[0] = maxEquity;
    if(balance[0] > balance[1])
     clrBalance[0] = 1.0;
    if(balance[0] < balance[1])
     clrBalance[0] = 2.0;
    Comment(PositionsTotal());
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Potencialmente, a falha pode estar aqui:

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Quando uma nova barra chega, você repõe os valores para 0 - multa. Mas então você verifica minEquidade e 0 para igualdade, de uma forma que não é recomendada.

Em confirmação das minhas palavras - sua imagem. Você pode ver que os valores do "lixo", como você disse, estão em torno de zero.

E é melhor, é claro, adicionar a janela de dados com o valor de "lixo" à figura.