OnDeinit в индикаторах - страница 7

 

 Разработчики, у вас 100% гдето ошибка.

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

 

Взгляните на скрин что Comment выдал после закрытия терминала и открытия его после 1-ной минуты.

Количество инициализированых елементов и то что первый ,второй,третий и четвёртый елемент буфера пустой.

Индикатор считает только 0-ой буфер. Так почему 2 свечи? 


 
А да. Ещё в английской справке написано что ArrayInitialize   ничего не возвращает.

 
eevviill:

 Разработчики, у вас 100% гдето ошибка.

 

Взгляните на скрин что Comment выдал после закрытия терминала и открытия его после 1-ной минуты.

Количество инициализированых елементов и то что первый ,второй,третий и четвёртый елемент буфера пустой.

Индикатор считает только 0-ой буфер. Так почему 2 свечи? 


Потому, что при анализе на новый бар, вы не проверяете количество баров, а ограничиваетесь лишь проверкой времени. При запуске терминала или обрыве связи с сервером в процессе работы, до прихода недостающих(до полной истории) баров, приходит тик. На этот тик создаётся новая свеча, но между ней и историей в терминале есть разрыв(недостающая история), которая будет выкачена с сервера и вставлена по месту, а так как вы не анализируйте количество баров, то на очередном расчёте будете думать, что нового бара нет, вот тогда и появляется вторая свеча. После открытия нового бара она исчезнет.
 
mql5:
Потому, что при анализе на новый бар, вы не проверяете количество баров, а ограничиваетесь лишь проверкой времени. При запуске терминала или обрыве связи с сервером в процессе работы, до прихода недостающих(до полной истории) баров, приходит тик. На этот тик создаётся новая свеча, но между ней и историей в терминале есть разрыв(недостающая история), которая будет выкачена с сервера и вставлена по месту, а так как вы не анализируйте количество баров, то на очередном расчёте будете думать, что нового бара нет, вот тогда и появляется вторая свеча. После открытия нового бара она исчезнет.

И не важно что в деините обнуление происходит при закрытии терминала?

 

Василий погоняй тестовый индикатор печатающий количество баров.

//+------------------------------------------------------------------+
//|                                                         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);
}//******************************************************************|

Вот что печатает в лог.

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


Может так поймёшь откуда проблема...

 
eevviill:

Прошу разработчиков дать ответ на простой ответ.

При закрытии терминала функция DeInit() выполняется в прикреплённых к графику программах? 

Строго говоря, нет

Выполняется OnDeinit. DeInit выполнится только в том случае, если Вы вызовите её явно из OnDeinit.

Если Вы имеете в виду старую функцию deinit, то также имейте в виду что названия функций - регистрозависимые. То есть, DeInit - неизвестно какая функция, deinit - стандартная точка входа на деинициализации (как и OnDeinit)

 
eevviill:

И не важно что в деините обнуление происходит при закрытии терминала?

 

 

Кому важно? На закрытии терминала эти буфера уже никому не нужны, так как они тотчас будут освобождены при выгрузке программы, которая происходит сразу после OnDeinit

Попробуйте просто сменить таймфрейм. OnDeinit отработает, буфера останутся (так как выгрузки программы не происходит в этом случае), но никто не гарантирует их содержимое из "прошлой жизни"

Прочитайте наконец документацию! https://docs.mql4.com/ru/runtime/running и https://docs.mql4.com/ru/runtime/event_fire#deinit

 
stringo:

Кому важно? На закрытии терминала эти буфера уже никому не нужны, так как они тотчас будут освобождены при выгрузке программы, которая происходит сразу после OnDeinit

Попробуйте просто сменить таймфрейм. OnDeinit отработает, буфера останутся (так как выгрузки программы не происходит в этом случае), но никто не гарантирует их содержимое из "прошлой жизни"

Прочитайте наконец документацию! https://docs.mql4.com/ru/runtime/running и https://docs.mql4.com/ru/runtime/event_fire#deinit

Тоесть в моём случае раздвоение буферов происходит уже при повторном открытии графика?
 
eevviill:
Тоесть в моём случае раздвоение буферов происходит уже при повторном открытии графика?

У Вас не происходит раздвоения буферов.

Это Вы так сами свой буфер заполняете. Первый раз на отрисовке, второй раз на приходе порции данных. Оба раза Вы оперируете с одним и тем же значением Time[0]

 
stringo:

У Вас не происходит раздвоения буферов.

Это Вы так сами свой буфер заполняете. Первый раз на отрисовке, второй раз на приходе порции данных. Оба раза Вы оперируете с одним и тем же значением Time[0]

ок.

 

Тогда исправте англ справку и всё 

Ещё в английской справке написано что ArrayInitialize   ничего не возвращает. 

Причина обращения: