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
Talvez os desenvolvedores devam prestar atenção ao problema da inicialização de buffers indicadores? Por que não existe tal problema no MT4? Talvez não seja o entendimento completo? O problema é que mesmo após a inicialização obrigatória dos amortecedores depois de tirar um indicador de um gráfico em CADA um deles, nem todos os amortecedores contêm lixo e você não pode tirá-lo de lá...
Pessoalmente, não me importo com muletas, mas somente se estas muletas não forem muito complicadas e com efeito positivo. Mas escrever em um arquivo e depois lê-lo é uma migalha.
Como você imagina: "...depois de remover o indicador do gráfico em alguns, não todos os amortecedores..."? De que forma, após a remoção do indicador do gráfico, você tem acesso a seus buffers indicadores?
Vamos tentar encontrar o problema em detalhes. Você precisa de um conjunto padrão: código + o que você fez + o que você tem...
Como você imagina: "...depois de remover o indicador do gráfico em alguns, não todos os amortecedores..."? De que forma, após a exclusão do indicador do gráfico, você tem acesso a seus buffers indicadores?
Vamos tentar encontrar o problema em detalhes. Você precisa de um conjunto padrão: código + o que você fez + o que você tem...
Pura suposição: pode estar entrando na mesma área de memória durante o acesso ao buffer atual, que foi ocupado pelos buffers anteriores.
Eu não entrei na conversa, não chute, Alexey quer que os dados em buffers permaneçam no reinício (interruptor on/off do terminal) ou somente quando pré-calculados = 0 (no caso de pré-calculados > 0 antes)?
Como você imagina: "...depois de remover o indicador do gráfico em alguns, não todos os amortecedores..."? De que forma, após a remoção do indicador do gráfico, você tem acesso a seus buffers indicadores?
Vamos tentar encontrar o problema em detalhes. Você precisa de um conjunto padrão: código + o que você fez + o que você tem...
Aqui está o código de indicador
| 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;
//+------------------------------------------------------------------+
//| 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);
ArrayInitialize(balance, 0.0); // принудительная
ArrayInitialize(equityMax, 0.0); // инициализация
ArrayInitialize(equityMaxB, 0.0); // всех
ArrayInitialize(equityMin, 0.0); // буферов
ArrayInitialize(equityMinB, 0.0); // индикатора
ArraySetAsSeries(balance, true); // все
ArraySetAsSeries(clrBalance, true); // буферы
ArraySetAsSeries(equityMax, true); // индикатора
ArraySetAsSeries(equityMaxB, true); // имеют
ArraySetAsSeries(equityMin, true); // флаг
ArraySetAsSeries(equityMinB, true); // AS_SERIES
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)
return(rates_total);
double bal = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
if(rates_total > prev_calculated)
{
minEquity = 0;
maxEquity = 0;
}
minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity);
maxEquity = fmax(maxEquity, equity);
balance[0] = AccountInfoDouble(ACCOUNT_BALANCE);
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);
}
//+------------------------------------------------------------------+
Vou postar um vídeo um pouco mais tarde, ficará claro então. Não consigo explicar isso com mais clareza nos dedos do que antes.
Espero que você não se importe de baixar e descompactar o vídeo.
Infelizmente, o fato de ter sido retirado do gráfico e anexado a ele não foi registrado, mas tem o fato de que o indicador está lá, depois desapareceu e depois está lá novamente. Está apenas apagando e anexando-o de volta.
Preste atenção à janela de dados após reinstalar o indicador. Mesmo após a inicialização forçada dos amortecedores, ainda há lá detritos espaciais.
Aqui está o código para o indicador
Gostaria de fazer uma experiência: deixar apenas um gráfico aberto e usá-lo para colocar e remover o indicador. E você precisa de informações sobre o terminal e o sistema operacional (guia "Log" do terminal).
O que um gráfico tem a ver com isso? O fato de o indicador estar apenas em um gráfico não é suficiente?
acrescentou:
Embora eu não acredite que o sistema operacional possa afetar o comportamento do indicador, aqui estão as informações sobre o sistema e o terminal
2016.10.16 20:56:34.904 Terminal Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:00
2016.10.16 20:56:34.904 Terminal MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
O que um gráfico tem a ver com isso? O fato de o indicador não estar apenas em um gráfico não é suficiente?
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962
Então... A situação está começando a tomar forma. Adicione este código:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962
Comecei a executar, mas quando inicio o indicador, há números de pragas em um buffer quase todo o histórico.
Depois de remover o indicador e colocá-lo de volta após algum tempo, os amortecedores estão vazios.
Vou repetir a remoção e colocá-lo de volta mais tarde.
Conclusões preliminares:
Então... A situação está começando a tomar forma. Adicione um código como este:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
Adicionado desta forma