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
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.
...
E em geral a solução é insanamente simples. prev_calculado = 0 junto com uma bandeira resolve este problema.
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_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.
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 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 // Это время последнего запуска индикатора.
Depré_calculados a taxas_total, o tampão deve ser limpo.
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.
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.
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:
{
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.