pré_calculado - página 2

 
Alexey Kozitsyn:
Que tal apenas recalcular o indicador inteiro quando 0? Parece-me ser a melhor solução.
Para um indicador pesado com toneladas de gráficos - não é o melhor. Não, a solução é simples - usar sua própria variável em vez de pré_calculada, estática ou global. Mas é uma muleta e nós queremos algo mais.
 
Alexey Kozitsyn:
:) Isso é o que eu faço...
Foi o que entendi, eu estava apenas citando sua pergunta, mas na verdade eu estava respondendoAlexander Puzanov.:)
 
Alexander Puzanov:
Para um indicador pesado com toneladas de gráficos não é a melhor solução. A solução é simples - usar sua própria variável em vez de pré_calculada, estática ou global. Mas é uma muleta e nós queremos algo mais.

Uma pessoa que usa a palavra "muleta":

  • ou é preguiçoso demais para ler a documentação
  • ou ainda não sabe como deve ser correto.
A única solução correta: em prev_calculate==0 recalcular o indicador.

 
Alexander Puzanov:
Para um indicador pesado com toneladas de gráficos - não é o melhor. Não, a solução é simples - utilizar variável própria em vez de pré_calculada, estática ou global. Mas é uma muleta e nós queremos algo mais.
Nem uma muleta. É assim que eu faço.
 
Karputov Vladimir:
E se a história foi trocada, isso significa que pode haver novas barras que tenham sido perdidas ou não calculadas antes - ou seja, as leituras dos indicadores já estarão erradas.

Slawa:

Se pré_calculado=0, significa que um recálculo completo tem que ser feito. Neste caso, todos os indicadores padrão são totalmente recalculados.

Está tudo claro, mas, infelizmente, tudo não cancela isto:

Alexander Puzanov:

Tudo isso é útil, mas não pode ser usado de acordo com seu propósito direto - mostrar quantas "barras foram processadas na chamada anterior" - pré_calculadas

Os indicadores são diferentes; alguns não precisam de barras para cálculos, alguns precisam apenas de carrapatos vivos, alguns têm limitações na profundidade de conversão - eles não se importam com o que mudou em seguida na história, alguns precisam rastrear objetos gráficos, etc. Eles não precisam de funções adicionais para acompanhar as mudanças na história anexadas ao pré-cálculo, eles só precisam disto - "barras processadas na chamada anterior". Eles não precisam disso.

De qualquer forma, Sr. programador, por favor não distraia o marceneiro de "pegar o evento".

 
Alexey Kozitsyn:
E se eu simplesmente recalcular o indicador inteiro a 0? Na minha opinião, é a melhor solução.

Eu não diria que é a melhor solução. Pelo menos ainda não.

Decidi escrever um indicador que registra o saque atual na conta, para não ter que recalcular nada na história. A primeira linha era parecida com esta no início.

if(prev_calculated == 0)  return(rates_total);
Mas depois de começar, descobri que os amortecedores não estão vazios e nem zerados. Há algum preço nos amortecedores de origem desconhecida. Tive que forçar os amortecedores a zerar... A seguir, outro problema foi descoberto. O pré-cálculo é zerado e o indicador é recalculado, respectivamente, zerando todos os amortecedores até a última barra. De qualquer forma, eu desisti da idéia por enquanto.
 
Alexey Viktorov:

Eu não diria que é a melhor solução. Pelo menos ainda não.

Decidi escrever um indicador que registra o saque atual na conta, para não ter que recalcular nada na história. No início, a primeira linha era parecida com esta.

if(prev_calculated == 0)  return(rates_total);
Mas após a partida, descobri que os amortecedores não estão vazios e não estão zerados. Há um preço nos amortecedores que eu não sei de onde veio. Teve que forçar os amortecedores a zerar... A seguir, outro problema foi descoberto. O pré-cálculo é zerado e o indicador é recalculado, respectivamente, zerando todos os amortecedores até a última barra. De qualquer forma, eu desisti da idéia por enquanto.

"... algum preço que eu não sei de onde ele veio... " - isso é lixo de elementos UNINITIALIZADOS da matriz tampão de indicadores. O que deve ser feito:

  • em prev_calculate==0 passar por todos os elementos do buffer indicador no laço e atribuir valores a eles. Neste caso, você precisa monitorar a situação quando uma nova barra aparece (taxas_total menos pré-cálculo será maior que zero) - o buffer indicador aumenta de acordo e este novo elemento também deve ser inicializado.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Bichos, insetos, perguntas

Alexey Viktorov, 2016.10.17 09:58

Você entende o que você escreveu?

Explique melhor como se livrar do lixo PRIMEIRO funcionamento do indicador. De onde vem este lixo? Não deveria haver inicialização ao ligar o buffer à matriz? Ou é durante a inicialização que o lixo espacial entra na matriz?? Por que não existe tal lixo em mql4?

Dê-me um exemplo de como peneirar o lixo dos valores normais sem utilizar variáveis estáticas adicionais ou globais estranhas.

Todos são suficientemente bons para citar a documentação.


 

Ninguém deve nada a ninguém. Portanto, haverá lixo no tampão indicador, após a ligação, até que você mesmo rubrique todos os elementos da matriz.

Adicionado:

Vou criar agora um exemplo...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,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[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Execute-o no M1. Você verá que apenas a barra mais à direita é recalculada.
Arquivos anexados:
 
Karputov Vladimir:

Ninguém deve nada a ninguém. Portanto, haverá lixo no tampão indicador, após a ligação, até que você mesmo rubrique todos os elementos da matriz.

Adicionado:

Vou criar agora um exemplo...

//+------------------------------------------------------------------+
//|                                              prev_calculated.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_label1  "prev_calculated"
//---- buffers
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer,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[])
  {
//---
   if(prev_calculated==0)
     {
      //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
      for(int i=0;i<rates_total;i++)
         ExtBuffer[i]=1.01;
      return(rates_total);
     }
//--- пересчитываем самый правый бар или самый правый бар и один предыдущий при появлении нового бара
   int limit=rates_total-prev_calculated+1;
   for(int i=rates_total-limit;i<rates_total;i++)
     {
      //--- визуализация пересчёта самого правого бара
      static bool drive=false;
      if(!drive)
         ExtBuffer[i]=1.03;
      else
         ExtBuffer[i]=1.02;
      drive=!drive;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Execute-o no M1. Você verá que apenas a barra mais à direita é recalculada.

Incrível capacidade de responder à pergunta errada...

Agora me explique o que acontece se:

1. Contou 100 barras, entrou em buffers de 0 a 99 inclusive (vamos considerar direção como série temporal) valor 1,03

2. De repente, a história é carregada e pré-calculada torna-se 0

De qual barra será 1.03?