pré_calculado - página 4

 
Alexey Viktorov:

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...

 
Karputov Vladimir:

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)?

 
Karputov Vladimir:

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.

Arquivos anexados:
00.zip  2614 kb
 
Alexey Viktorov:

Aqui está o código para o indicador

Você precisa fazer esta experiência: deixar apenas um gráfico aberto e colocar e remover o indicador nele. E você precisa de informações sobre o terminal e o sistema operacional (aba log do terminal).
 
Karputov Vladimir:
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        D:\MetaTrader 5\MetaTrader 5
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.)
 
Alexey Viktorov:
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?
  1. Estou tentando reduzir o problema.
  2. Eu não tenho esse problema. Minha configuração:
    2016.10.18 19:09:34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    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);
 
Karputov Vladimir:
  1. Estou tentando reduzir o problema.
  2. Eu não tenho este problema. Minha configuração:
    2016.10.18 19:09:34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    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:

1. Os indicadores não podem contar com a inicialização das matrizes de indicadores no OnInit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
...
   ArrayInitialize(balance, 0.0);    // принудительная
   ArrayInitialize(equityMax, 0.0);  // инициализация
   ArrayInitialize(equityMaxB, 0.0); // всех
   ArrayInitialize(equityMin, 0.0);  // буферов
   ArrayInitialize(equityMinB, 0.0); // индикатора

...
//---
   return(INIT_SUCCEEDED);
  }

2. Nos indicadores é obrigatório passar por toda a matriz ou somente elementos alterados na OnCalculate().

 
Karputov Vladimir:

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

Print("prev_calculated = ", prev_calculated);
Razão: