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

 
Andrey Dik:

возвращаем 0, тем самым заявляя, что мы ещё ничего не посчитали и прев калк не будет увеличиваться на 1 на следующем баре.

то есть, будем на баре, на котором начали запрашивать данные со старшего тф до тех пор, пока не вернём return(rates_total)

из хелпа : "Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове."
 
mktr8591:
из хелпа : "Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове."

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

 
Сергей Таболин:

1. Спасибо всем - я стал маленько более грамотен в индикаторах )))

2. Андрей, если кто-то не понимает твоих измышлений (и я в том числе), то это значит только одно: ТЫ не правильно рисуешь картинку! Точнее - ты её рисуешь так, что многие не понимают...

истина важнее. не всегда и не всем это бывает понятно, к сожалению.

 

Andrey Dik:

возвращаем 0, тем самым заявляя, что мы ещё ничего не посчитали и прев калк не будет увеличиваться на 1 на следующем баре.

Тогда return(rates_total) должна увелилить prev_calc на  rates_total?

 
Andrey Dik:

возвращаем 0, тем самым заявляя, что мы ещё ничего не посчитали и прев калк не будет увеличиваться на 1 на следующем баре.

сам обнуляет расчет и жалуется что он обнуляется )

 
Andrey Dik:

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

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

тут, в общем, нужно какое-либо допущение:

- или мы самостоятельно строим OHLC внутри индикатора

- или терминал нам строит самостоятельно OHLC


если последнее, тогда мы должны учитывать, что терминал вот воообще не в курсе как взаимодействуют ТФ , кто там чему кратен и что происходит по событию "новый бар" , но мы должны давать терминалу самостоятельно строить необходимый ТФ 


такой код попробуйте в своем втором индикаторе:

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[])
{
   double buff [];
   if(prev_calculated == 0)
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
         Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
         return 0;
      }
   }
   else
   {
      if (rates_total == prev_calculated)
      {
         if(CopyBuffer (Handle, 0, 0, 1, buff)<0) return 0;
         return rates_total;
      }
   }

   ulong t = GetMicrosecondCount ();

...... далее без изменений
 
Andrei Trukhanovich:

сам обнуляет расчет и жалуется что он обнуляется )

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

 
Igor Makanu:

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

тут, в общем, нужно какое-либо допущение:

- или мы самостоятельно строим OHLC внутри индикатора

- или терминал нам строит самостоятельно OHLC


если последнее, тогда мы должны учитывать, что терминал вот воообще не в курсе как взаимодействуют ТФ , кто там чему кратен и что происходит по событию "новый бар"


такой код попробуйте в своем втором индикаторе:

Ваш код будет молотить расчеты на каждом тике, мне это не интересно, я даже запускать не буду. Мне нужно делать расчет только ОДИН раз на каждом баре, на всех используемых индикаторах, а не на каждом тике все используемые индикаторы.

 
Andrey Dik:

Ваш код будет молотить расчеты на каждом тике, мне это не интересно, я даже запускать не буду. Мне нужно делать расчет только ОДИН раз на каждом баре, на всех используемых индикаторах, а не на каждом тике все используемые индикаторы.

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

 if (rates_total == prev_calculated) return rates_total;

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

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

 
Andrey Dik:

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

замени

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

на

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

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

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