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

 
Koldun Zloy #:

Там не должно быть ошибки.

Как минимум, так было всегда.

 
Индикатор имеет 2 буфера.
Первый заполняется в таймере, значением 555.
Второй в тиках, значением 999.

Подключаем индикатор в советник и в втором буфере 999 а в первом 0,0. Это нормальное поведение? Я и ресурс убирал и в другом конце массива данные получал и массивы разворачивал и тип инд.буферов менял - из таймера данные не передаются, в индикаторе есть, а в советнике нету. 

Индикатор
#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);
   
   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()
{
   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);   
}
Результат
 
Попробуйте проверить результат вызва функции создания таймера. Может, таймер по каким-то причинам не создается?
 
Pavel Verveyko #:

#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()
{
   ind_buf_test_timer[0]=555;   
}

--

#resource "\\Indicators\\test_ind.ex5"
int OnInit()
{
   handle = iCustom(NULL,0,"::Indicators\\test_ind.ex5");
   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
   
      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);   
}
 
Vasiliy Pushkaryov #:

Спасибо за свое решение.

Я подал эту проблему для "лечения" в ветку с текущим билдом. Но вот Алексей стал уверять, что у него есть решение, поэтому пока жду.

Кстати, в процессе дискусси и проверок выяснилось, что с младшего ТФ можно получить данные на первом тике.Что для меня - тоже странно и склоняет в сторону того, что это все-таки "поломка", а не особенность.

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

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

    Print(zz, progName, zz, currTime);
    bufTime[rt] = (double)currTime;

В рабочем

    SymbolInfoTick(_Symbol, tick);
    msc = tick.time_msc%1000;
//--------------------------------
    CopyBuffer(handleInd, 0, 0, 1, test_Buffer);
    CopyTicks(_Symbol, mqlTick, COPY_TICKS_ALL, 0, 2);
    tick_0 = (string)mqlTick[0].time+"."+string(mqlTick[0].time_msc%1000);
    tick_1 = (string)mqlTick[1].time+"."+string(mqlTick[1].time_msc%1000);
    Print(zz, progName, zz, (datetime)test_Buffer[0], zz, time_0[0]); // CopyTime(_Symbol, inpTF, 0, 1, time_0);
//---------------------------------

  Comment(tick_0, "\n", // Время предпоследнего тика с миллисекундами
          tick_1, "\n", // Время последнего тика с миллисекундами
          msc);         // Миллисекунды первого тика нового бара

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

2024.06.24 13:19:59.822 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 13:20:00
2024.06.24 13:19:59.822 Test_MTF (EURUSD,M1)     ***** Test_MTF ***** 2024.06.24 13:20:00 ***** 2024.06.24 13:20:00
2024.06.24 13:24:59.534 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 13:25:00
2024.06.24 13:24:59.534 Test_MTF (EURUSD,M1)     ***** Test_MTF ***** 2024.06.24 13:25:00 ***** 2024.06.24 13:25:00
2024.06.24 13:30:00.154 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 13:30:00
2024.06.24 13:30:00.154 Test_MTF (EURUSD,M1)     ***** Test_MTF ***** 2024.06.24 13:30:00 ***** 2024.06.24 13:30:00
2024.06.24 13:34:59.674 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 13:35:00
2024.06.24 13:34:59.674 Test_MTF (EURUSD,M1)     ***** Test_MTF ***** 2024.06.24 13:35:00 ***** 2024.06.24 13:35:00
2024.06.24 13:39:59.643 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 13:40:00
2024.06.24 13:39:59.643 Test_MTF (EURUSD,M1)     ***** Test_MTF ***** 2024.06.24 13:40:00 ***** 2024.06.24 13:40:00
2024.06.24 13:45:00.026 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 13:45:00
2024.06.24 13:45:00.026 Test_MTF (EURUSD,M1)     ***** Test_MTF ***** 2024.06.24 13:45:00 ***** 2024.06.24 13:45:00

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

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

2024.06.24 14:03:14.218 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:00:00
2024.06.24 14:03:14.254 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 1970.01.01 00:00:00 ***** 2024.06.24 14:00:00 // это момент переключения
2024.06.24 14:04:59.719 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:05:00
2024.06.24 14:04:59.719 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 2024.06.24 14:05:00 ***** 2024.06.24 14:05:00
2024.06.24 14:09:59.729 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:10:00
2024.06.24 14:09:59.729 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 2024.06.24 14:10:00 ***** 2024.06.24 14:10:00
2024.06.24 14:15:00.059 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:15:00
2024.06.24 14:15:00.059 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 2024.06.24 14:15:00 ***** 2024.06.24 14:15:00
2024.06.24 14:19:59.616 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:20:00
2024.06.24 14:19:59.616 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 2024.06.24 14:20:00 ***** 2024.06.24 14:20:00
2024.06.24 14:25:03.192 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:25:00
2024.06.24 14:25:03.192 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 2024.06.24 14:25:00 ***** 2024.06.24 14:25:00
2024.06.24 14:30:00.057 Test_MTF.ex5::test-R (EURUSD,M5)         ***** Test_MTF.ex5::test-R ***** 2024.06.24 14:30:00
2024.06.24 14:30:00.057 Test_MTF (EURUSD,H1)     ***** Test_MTF ***** 2024.06.24 14:30:00 ***** 2024.06.24 14:30:00
 
Vitaly Muzichenko #:

--

Виталий спасибо за идею.
Хэндл в инициализации, я пробовал. С вызовом таймера идея интересная. Но так тоже не работает, это попытка заполнить массив в таймере, когда он ещё имеет 0 размер.


 
Yuriy Bykov #:
Попробуйте проверить результат вызва функции создания таймера. Может, таймер по каким-то причинам не создается?

В индикаторе данные есть. Они просто, на улицу не хотят выходить))

 
Vitaly Muzichenko #:

--

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Vitaly Muzichenko, 2024.06.24 09:39

#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()
{
   ind_buf_test_timer[0]=555;   
}

--

#resource "\\Indicators\\test_ind.ex5"
int OnInit()
{
   handle = iCustom(NULL,0,"::Indicators\\test_ind.ex5");
   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
   
      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);   
}

Что-то меня гложат сомнения, разве можно получить какие-то данные по такому handle

Вы просто не всё поправили.

 
Alexey Viktorov #:

Что-то меня гложат сомнения, разве можно получить какие-то данные по такому handle

Вы просто не всё поправили.

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

 
Pavel Verveyko #:

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

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