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

 
Igor Makanu:

мой код будет "молотить на каждом тике" только Ваш индикатор №1, где у Вас же прописано :

это позволит терминалу самостоятельно строить "старший ТФ"

по мне - это "дешевле", чем производить полный перерасчет индикатора №1 , что происходит в Вашем коде при синхронизации истории на "старшем ТФ"

да, но почему прев калк сбрасывается на младшем ТФ?

 
Andrey Dik:

да, но почему прев калк сбрасывается на младшем ТФ?

потому что return 0;
 
Andrey Dik:

да, но почему прев калк сбрасывается на младшем ТФ?

много вариантов, мы же реализацию не знаем


по МТ4 в прошлом году было похожее обсуждение кто то из разработчиков (кажется Слава) сказал, что каждое обращение к "старшему ТФ" инициирует синхронизацию данных если это требуется....

думаю что и в МТ5 терминал самостоятельно строит ТФ при необходимости, но если были сетевые задержки или ..... реализацию не знаем?... то терминал прежде чем отдать данные индикатору на старшем ТФ производит синхронизацию историческим данных с сервером, когда это происходит моментально, а когда, может быть, и долго , вот тогда возможно и будет прев_калкулайтед = 0

 
Igor Makanu:

много вариантов, мы же реализацию не знаем

если закачка изменит исторические данные младшего тф, счетчик младшего ТФ принудительно обнулится самим терминалом, не надо выдумывать проблемы на ровном месте

 
Andrey Dik:

вы ж подтверждаете мои слова, товарисч.

Я …кодеру не товарищ. Это не подтверждение, а подсказка, не надо возвращать 0. От этого все ваши проблемы. Вы сами вызываете полный пересчёт индикатора.

 


prev_calculated вообще то не увеличивается, он всегда будет такой как мы вернем в конце расчета 

return(rates_total);


т.е. что вернули по выходу из OnCalculated() то и получим на следующем тике в prev_calculated   (за исключением prev_calculated  == 0    , это терминал делает при запуске индикатора или при синхронизации ТФ......)


Andrei Trukhanovich:

если закачка изменит исторические данные младшего тф, счетчик младшего ТФ принудительно обнулится самим терминалом, не надо выдумывать проблемы на ровном месте

ну я и пишу ему об этом второй день - возьми индикаторы от  Младен и изучи - работают же , и без какой там сложной синхронизации между ТФ, а тут вот ... экономим ресурсы и не даем терминалу формировать вызываемые ТФ

 
Andrei Trukhanovich:

замени

на

и протестируй.

Не подсказывать… Всё равно не поверит.

 
Alexey Viktorov:

Я …кодеру не товарищ. Это не подтверждение, а подсказка, не надо возвращать 0. От этого все ваши проблемы. Вы сами вызываете полный пересчёт индикатора.

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

 
Andrei Trukhanovich:

замени

на

и протестируй.

Спасибо, Андрей. Ты единственный кто полностью вник в вопрос.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) Индикатор на периоде 3 ещё не рассчитан

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) Индикатор на периоде 3 ещё не рассчитан

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 sec, расcчитано 50046 баров, всего баров 50046

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 sec, расcчитано 50000 баров, всего баров 50000

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Индикатор на периоде 3 ещё не рассчитан

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 sec, расcчитано 1 баров, всего баров 50047

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 sec, расcчитано 1 баров, всего баров 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 sec, расcчитано 1 баров, всего баров 50002

теперь всё работает как и задумано, индикаторы полностью рассчитались только один раз при первом запуске а далее - только один раз кааждый на своем новом баре.


итоговый код второго индикатора, будет полезно кому-то надеюсь:

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[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

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

Посчитайте сколько дураков вам подсказывают… только один умник не слышит никого и упёрся……………

Куда ещё разворачивать совет от Andrei Trukhanovich там и дураку всё понятно… Сам себе создали проблему и пытаетесь выставить свой …код как баг mql.

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