![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Que tal apenas recalcular o indicador inteiro quando 0? Parece-me ser a melhor solução.
:) Isso é o que eu faço...
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":
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.
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.
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:
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".
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.
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.
"... 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:
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);
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
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?