prev_calculated - страница 3

 
Alexey Viktorov:

Потрясающая способность отвечать не на тот вопрос который задан...

Теперь объясни мне что произойдёт если:

1. Пересчиталось 100 баров, внесено в буферы от 0 по 99 включительно (давайте считать направление как таймсерию) значение 1.03

2. Вдруг подгрузилась история и prev_calculated стало равно 0

С какого бара в индикаторе будет значение 1.03???

  1. Чтобы учитывать индексацию как в таймсерии, нужно в OnInit() индикаторному буферу установить флаг AS_SERIES - именно поэтому я предпочитаю оперировать понятиями "самый правый бар" - так никто не будет ошибочно информирован.
  2. Вот же ответ:
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    при "prev_calculated==0" абсолютно все элементы индикаторного буфера будут проинициализированы заново значениями "1.01" и сразу выход по "return(rates_total);". То есть в индикаторном буфере и следа не останется от предыдущих значений "1.03".
 
Alexey Viktorov:

Лучше объясни как избавиться от мусора ПРИ ПЕРВОМ запуске индикатора.

Дак просто же - забейте на prev_calculated, создайте собственный дубликат без 'дырочки в боку'. Если надо вести учёт ранее просчитанных баров - как у fxsaber в примере
fxsaber:
Ни разу не костыль. Так и делаю.
Если достаточно простого флага первый запуск / уже не первый, замените prev_calculated на static bool b_First_Run. А можно инициализацию буферов вынести в OnInint
 
Karputov Vladimir:
  1. Чтобы учитывать индексацию как в таймсерии, нужно в OnInit() индикаторному буферу установить флаг AS_SERIES - именно поэтому я предпочитаю оперировать понятиями "самый правый бар" - так никто не будет ошибочно информирован.
  2. Вот же ответ:
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    при "prev_calculated==0" абсолютно все элементы индикаторного буфера будут проинициализированы заново значениями "1.01" и сразу выход по "return(rates_total);". То есть в индикаторном буфере и следа не останется от предыдущих значений "1.03".

Так вот это и есть та проблема которую надо-бы устранить. Мне не нужен мусор (не то чтобы не нужен, а мешает отображению), но нужно сохранить предыдущие вычисления индикатора. При ПЕРВОМ запуске индикатора в буфер попадает мусор, а при подгрузке истории всё что было в буферы всунуто надо-бы сохранить... и желательно без записи в файл или тем более в GV.


добавлено:

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

 
Alexander Puzanov:
Если достаточно простого флага первый запуск / уже не первый, замените prev_calculated на static bool b_First_Run. А можно инициализацию буферов вынести в OnInint
Нет, цели там не столь примитивны.
 
fxsaber:
Нет, цели там не столь примитивны.
Тут вам не там - это не вам предложение, Alexey Viktorov как я понимаю нужно только это - обнулить буфера при 1м запуске, а при всяких подкачках ничего в них не трогать
 
Alexey Viktorov:

Так вот это и есть та проблема которую надо-бы устранить. Мне не нужен мусор (не то чтобы не нужен, а мешает отображению), но нужно сохранить предыдущие вычисления индикатора. При ПЕРВОМ запуске индикатора в буфер попадает мусор, а при подгрузке истории всё что было в буферы всунуто надо-бы сохранить... и желательно без записи в файл или тем более в GV.


добавлено:

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

О! Теперь более понятно. К вечеру отвечу.
 
Alexander Puzanov:
Тут вам не там - это не вам предложение, Alexey Viktorov как я понимаю нужно только это - обнулить буфера при 1м запуске, а при всяких подкачках ничего в них не трогать
Конечно я начал с того что инициализировал буферы в OnInit(), но что-то было не так, не помню что и я вынес инициализацию в OnCalculate при prev_calculated == 0
 

Поновой перепроверил что происходит если проводить инициализацию массивов буферов в OnInit().

Даже при удалении индикатора с графика и новой установки НЕ ВО ВСЕХ, а в некоторых буферах остаются старые значения. Даже не точно те которые были до того как, а одно из тех значений распространяется на несколько баров.

 
Karputov Vladimir:
О! Теперь более понятно. К вечеру отвечу.
Извините за задержку с ответом. Единственный вариант сохранения рассчитанных значений для данного таймфрейма - это сохранять в файл. При этом нужно озаботиться синхронизацией - чтобы при чтении из файла данные разместились по своим барам. Самое логичное - это синхронизация по времени открытия бара, но здесь могут быть нюансы: например время открытия бара (сохранённое в файл) было 2016.09.05. 25:02, а теперь на графике есть бар у которого время равно 2016.09.05. 25:01.
 
Karputov Vladimir:
Извините за задержку с ответом. Единственный вариант сохранения рассчитанных значений для данного таймфрейма - это сохранять в файл. При этом нужно озаботиться синхронизацией - чтобы при чтении из файла данные разместились по своим барам. Самое логичное - это синхронизация по времени открытия бара, но здесь могут быть нюансы: например время открытия бара (сохранённое в файл) было 2016.09.05. 25:02, а теперь на графике есть бар у которого время равно 2016.09.05. 25:01.

А может лучше обратить внимание разработчиков на проблему инициализации индикаторных буферов? Почему-же в МТ4 такой проблемы нет? Может опять не полное понимание? Проблема в том что даже при принудительной инициализации буферов после снятия индикатора с чарта в НЕКОТОРЫХ, не во всех буферах остаётся мусор и ничем оттуда его не выковырять...

Лично я не против костылей, но только если эти костыли не слишком сложны и с положительным эффектом. Но запись в файл с последующим чтением это корявый костыль.