Ошибки, баги, вопросы - страница 3545

 
Alexey Viktorov #:

Вы отладчиком пользоваться умеете?

Что предлагаете? В отладчике ответ найдётся? Код кажется довольно простым, для отладчика. Если я не прав, поправьте пожалуйста.

 
Pavel Verveyko #:

Это не так важно. Перенос объявления переменных, в глобальное пространство всё равно не поможет, я уже попробовал.

Как раз это очень важно. Если вы присваиваете значение переменной handle в OnInit(), а потом его надо использовать в другой функции - OnTimer(), то эта переменная должна быть глобальной и она не должна заново объявляться в OnTimer(). Алексей вам правильно выделил красным строку 

int handle = INVALID_HANDLE;

которую надо перенести из OnTimer() в глобальную область. То есть в OnTimer() её быть не должно.

 
Pavel Verveyko #:

Что предлагаете? В отладчике ответ найдётся? Код кажется довольно простым, для отладчика. Если я не прав, поправьте пожалуйста.

Именно в отладчике и находятся такие простые ошибки. Виталий достаточно опытный программист, но вот пропустил… В отладчике, в функции OnInit() handle будет равен 10, а в OnTick() после выделенной строки будет -1. И это значение будет поставлено в функцию CopyBuffer().

 
Yuriy Bykov #:

Как раз это очень важно. Если вы присваиваете значение переменной handle в OnInit(), а потом его надо использовать в другой функции - OnTimer(), то эта переменная должна быть глобальной и она не должна заново объявляться в OnTimer(). Алексей вам правильно выделил красным строку 

которую надо перенести из OnTimer() в глобальную область. То есть в OnTimer() её быть не должно.

Я поправил этот момент и попробовал, это не решает проблемы. Виталий имел ввиду, что нужно попробовать 2-й вариант. Посмотрите код который прикреплён мной изначально, там реализован 1 вариант.

1 хэндл можно получить перед использованием.
2 хэндл лучше получать в oninit. конечно объявив переменные в глобальном пространстве.
Оба способа не дают результат.
 
Alexey Viktorov #:

Именно в отладчике и находятся такие простые ошибки. Виталий достаточно опытный программист, но вот пропустил… В отладчике, в функции OnInit() handle будет равен 10, а в OnTick() после выделенной строки будет -1. И это значение будет поставлено в функцию CopyBuffer().

Извините я без кода, могу неверно Вас понять. Вы имеете ввиду что отладчик показывает, утерю хэндла, это код который написал Виталий? 
Если да, так это и без отладчика понятно.
Опустим вопрос хэндла, он реализован правильно, даже 2 варианта пробовал (в сообщении выше).

В отладчике и с вторым вариантом хэндла, вместо 0, отрицательное значение.


 
Похоже, есть проблема с вызовом функции обработчика таймера. Если индикатор подключен как ресурс, то вызывая в его функции OnInit() функцию EventSetTimer(1), далее будет пытаться запуститься обработчик OnTimer() из советника, а не из индикатора. Если такого обработчика в советнике нет, то обработчик из индикатора просто игнорируется. Если такой обработчик в советник добавить, то при инициализации таймера из индикатора (а не из советника) обработчик из советника срабатывает, а обработчик из индикатора по-прежнему игнорируется.
Файлы:
test_ind.mq5  6 kb
ex2.mq5  3 kb
 
Yuriy Bykov #:
Похоже, есть проблема с вызовом функции обработчика таймера. Если индикатор подключен как ресурс, то вызывая в его функции OnInit() функцию EventSetTimer(1), далее будет пытаться запуститься обработчик OnTimer() из советника, а не из индикатора. Если такого обработчика в советнике нет, то обработчик из индикатора просто игнорируется. Если такой обработчик в советник добавить, то при инициализации таймера из индикатора (а не из советника) обработчик из советника срабатывает, а обработчик из индикатора по-прежнему игнорируется.

Если таймер вызвать в Oninit(как предложил Виталий) и проконтролировать размер массива. ТО будет так)

индикатор

#property indicator_chart_window
#property indicator_plots 0
#property indicator_buffers 2
double ind_buf_test_timer[];
double ind_buf_test_calc[];
int OnInit()
{
   ArraySetAsSeries(ind_buf_test_timer,true);
   SetIndexBuffer(0,ind_buf_test_timer,INDICATOR_CALCULATIONS);
   ArrayInitialize(ind_buf_test_timer,0.0);
   ArraySetAsSeries(ind_buf_test_calc,true);
   SetIndexBuffer(1,ind_buf_test_calc,INDICATOR_CALCULATIONS);
   ArrayInitialize(ind_buf_test_calc,0.0);
   
   EventSetTimer(1);

   OnTimer();

   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{ 
   EventKillTimer();
}
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[])
{
   ind_buf_test_calc[0]=999;  
   
   return(rates_total);
}
void OnTimer()
{
   if (ArraySize(ind_buf_test_timer) > 0)
   ind_buf_test_timer[0]=555;   
}


советник

#resource "\\Indicators\\test_ind.ex5"
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{

}
void OnTick()
{
   int handle = INVALID_HANDLE;
   int rest = -2;
   double temp[]; 
   double timer = 0.0; // 555
   double calc = 0.0; // 999
   
      handle = iCustom(NULL,0,"::Indicators\\test_ind.ex5");
   
      rest = CopyBuffer(handle,0,0,1,temp);
      timer = temp[0];
      rest = CopyBuffer(handle,1,0,1,temp);
      calc = temp[0];
      
      Print("timer = ",timer," calc = ",calc);   
}


РЕЗУЛЬТАТ))



И не важно, ресурс не ресурс, где там хэндл.

НО, если перегрузить терминал, то печать меняется.



PS/ Интересно было бы почитать мысли от разработчиков.

 
Alexey Viktorov #:

Разобрался я в этой проблеме. Никакая это не поломка, а обычная особенность. Такая-же особенность как недоступность свойств графического объекта сразу после создания.

В ресурсном индикаторе есть такие строки

В рабочем

И вот что в распечатке

Это доказывает, что можно получить данные с ресурсного индикатора на первом тике нового бара.

зы: И вот я переключил ТФ на Н1 оставив время для ресурсного индикатора М5

У меня не получилось повторить с теми кусками кода, которые вы выложили. Вышлите, пожалуйста, в личку полный код.
 
Vasiliy Pushkaryov #:
У меня не получилось повторить с теми кусками кода, которые вы выложили. Вышлите, пожалуйста, в личку полный код.
Хотя, кажется, есть. Сейчас еще перепроверю.
 
Vasiliy Pushkaryov #:
У меня не получилось повторить с теми кусками кода, которые вы выложили. Вышлите, пожалуйста, в личку полный код.

Вы когда нибудь пользовательское событие CHARTEVENT_CUSTOM делали?