OnDeinit em indicadores - página 7

 

Desenvolvedores, você tem um erro em algum lugar.

void OnDeinit(const int reason)
{
 //Comment("");
 Comment(ArrayInitialize(body_down,EMPTY_VALUE),"  ",body_down[0],"  ",body_down[1],"  ",body_down[2],"  ",body_down[3]);
}

Veja a captura de tela do Comentário após fechar o terminal e abri-lo após 1 minuto.

Número de elementos inicializados e que o primeiro, segundo, terceiro e quarto elemento do buffer está vazio.

O indicador conta apenas o 0° tampão. Então, por que 2 velas?


 
Ah, sim. A ajuda inglesa também diz queo ArrayInitialize não devolve nada.

 
eevviill:

Desenvolvedores, você tem um erro em algum lugar.

Veja a captura de tela do Comentário após fechar o terminal e abri-lo após 1 minuto.

Número de elementos inicializados e que o primeiro, segundo, terceiro e quarto elemento do buffer está vazio.

O indicador conta apenas o 0° tampão. Então, por que 2 velas?


Porque quando você analisa para uma nova barra, você não verifica o número de barras, mas apenas o tempo. Quando você inicia o terminal ou quebra a conexão com o servidor durante a operação, antes que as barras em falta (até o histórico completo) cheguem, um tique vem. Neste tick, uma nova vela é criada, mas há uma lacuna (falta de histórico) entre ela e o histórico no terminal, que será baixada do servidor e inserida no sistema, e como você não analisa o número de barras, você vai pensar que não há uma nova barra no próximo cálculo, e é aí que a segunda vela aparece. Após a abertura de um novo bar, ele desaparecerá.
 
mql5:
Porque quando você analisa para uma nova barra, você não verifica o número de barras, mas se limita a verificar o tempo. Quando você inicia o terminal ou quebra a conexão com o servidor durante a operação, um tique vem antes que as barras que faltam (ao histórico completo) cheguem. Neste tick, uma nova vela é criada, mas há uma lacuna (falta de histórico) entre ela e o histórico no terminal, que será baixada do servidor e inserida no sistema, e como você não analisa o número de barras, você vai pensar que não há uma nova barra no próximo cálculo, e é aí que a segunda vela aparece. Após a abertura de um novo bar, ele desaparecerá.

E não importa que no deinit a zeragem ocorra quando o terminal é fechado?

 

Vasily, execute um indicador de teste que imprime o número de barras.

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int      rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   if(NewBar(PERIOD_CURRENT, lb))
    {
     Print("rates_total = ", rates_total);
     rates_ = rates_total;
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//if(reason == REASON_CLOSE)
Print("OnDeinit сработал ", rates_);
}

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|

Isto é o que se imprime no tronco.

0       22:52:04.765    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:52:04.795    test EURUSD.z,M1: initialized
0       22:52:04.795    test EURUSD.z,M1: rates_total = 75183
0       22:52:11.902    test EURUSD.z,M1: rates_total = 75184
0       22:52:28.712    test EURUSD.z,M1: uninit reason 9
0       22:52:28.712    test EURUSD.z,M1: OnDeinit сработал 75184
0       22:52:28.832    Custom indicator test EURUSD.z,M1: removed
0       22:57:10.366    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:57:10.396    test EURUSD.z,M1: initialized
0       22:57:10.396    test EURUSD.z,M1: rates_total = 75184
0       22:57:14.972    test EURUSD.z,M1: rates_total = 75185
0       22:57:59.167    test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0       22:58:34.237    test EURUSD.z,M1: uninit reason 1
0       22:58:34.237    test EURUSD.z,M1: OnDeinit сработал 75190
0       22:58:34.247    Custom indicator test EURUSD.z,M1: removed


Talvez isto lhe diga de onde vem o problema...

 
eevviill:

Por favor, peça uma resposta simples aos desenvolvedores.

Quando o terminal é fechado, a função DeInit() é executada nos programas anexados à carta?

A rigor, não.

OnDeinit é executado. O DeInit só será executado se você o chamar explicitamente da OnDeinit.

Se você estiver se referindo à antiga função deinit, tenha também em mente que os nomes das funções são sensíveis a maiúsculas e minúsculas. Ou seja, deInit é uma função desconhecida, deinit é um ponto de entrada padrão na desinicialização (como OnDeinit)

 
eevviill:

E não importa que no deinit a zeragem ocorra quando o terminal é fechado?

Quem se importa? Quando o terminal é fechado, esses buffers não são mais necessários, pois serão imediatamente liberados quando o programa for descarregado, o que ocorre imediatamente após o OnDeinit

Tente apenas mudar o cronograma. OnDeinit funcionará, os amortecedores permanecerão (porque a descarga do programa não acontece neste caso), mas ninguém garante seu conteúdo da "vida passada".

Leia, finalmente, a documentação! https://docs.mql4.com/ru/runtime/running e https://docs.mql4.com/ru/runtime /event_fire#deinit

 
stringo:

Quem se importa? Quando o terminal é fechado, esses buffers não são mais necessários, pois serão imediatamente liberados quando o programa for descarregado, o que ocorre imediatamente após o OnDeinit

Tente apenas mudar o cronograma. OnDeinit funcionará, os amortecedores permanecerão (como o programa não é descarregado neste caso), mas ninguém garante seu conteúdo da "vida passada".

Leia, finalmente, a documentação! https://docs.mql4.com/ru/runtime/running e https://docs.mql4.com/ru/runtime /event_fire#deinit

Então, no meu caso, os amortecedores já estão sendo divididos quando a tabela é reaberta?
 
eevviill:
Então, no meu caso, os amortecedores são bifurcados quando o gráfico é reaberto?

Você não tem bifurcação tampão.

É assim que você mesmo preenche seu buffer. A primeira vez, quando você o desenha; a segunda vez, quando você recebe uma porção de dados. Ambas as vezes você opera com o mesmo valor de Tempo[0].

 
stringo:

Você não está tendo uma divisão tampão.

É assim que você mesmo preenche seu buffer. A primeira vez na renderização e a segunda vez na chegada dos dados. Ambas as vezes você opera com o mesmo valor de Tempo[0].

OK.

Por favor, corrija a ajuda em inglês e pronto.

Também a ajuda inglesa diz quea ArrayInitialize não devolve nada.