Индикаторы. OnCalculate. Количество полных проходов по всем свечам

Страницы: 1
RSS
Индикаторы. OnCalculate. Количество полных проходов по всем свечам
 
Доброго времени суток.

Вот код примитивного индикатора.
Код
name="light"

Settings = {}
Settings.Name = name;
Settings.line = {};
Settings.step = 0
Settings.secId = ''
Settings.size = 0

function OnCalculate(index)
  
  local _ds = nil
  
  if index == 1 then
    
    _ds = getDataSourceInfo()
    Settings.secId = _ds.sec_code
    
    Settings.size = getNumCandles(Settings.secId)    
    Settings.step = Settings.step + 1
    
  end

  PrintDbgStr('OnCalculate. Settings.secId '..Settings.secId..' Index '..index..' . Step : '..Settings.step..' size : '..Settings.size)
  
  return 0
  
end
--------
function Init()
  
  local t = Settings.line;
  
  t[#t+1] = { Name = 'zero', Color = RGB(0,128,255), Type = 0, Width = 1}
  
  return #t
  
end
Вопрос такой:

Если на график предварительно добавить этот индикатор, то при запуске терминала функция OnCalculate трижды пробегает по всем свечам.
Если при запущенном терминале добавить этот индикатор на график, функция OnCalculate пробегает по всем свечам дважды.

Функция OnInit всегда запускается один раз.

Это баг, фича или где-то настройки какие-то есть?

Какие возможны варианты для расчета показателя только один раз?

С уважением, Илья
 
Это такое поведение. Скорее баг, но ему уже лет 10. На графиках с очень большим число баров или на очень сложных "жадных" алгоритмах надо быть аккуратным.
 
Есть ли вариант сохранения состояния расчета между вызовами OnCalculate?

Вчера пытался в таблицу Settings  добавить свою таблицу рассчитанных при первом проходе значений, чтобы при следующих просто из нее вытащить. Знаю, что в руководстве написано "Типы пользовательских параметров: числа и строки"
До перезапуска терминала (накидал скрипт, пока терминал работал), вроде, получилось: значения и сохранялись, и выбирались.
Но при последующем запуске терминала выводилась ошибка об отсутствии моей таблицы.
Хотел сделать через замыкание, но, опять же, где хранить этот объект?
 
Цитата
Илья написал:
Хотел сделать через замыкание, но, опять же, где хранить этот объект?
Если речь про хранение между запусками, то во внешнем мире к терминалу.
Или, понимая, что вызовов будет не меньше двух, организовать кеш данных, рассчитанных на первом проходе (после применения настроек). Тогда последующий вызов будет "холостым".
Тогда можно будет организовать расчет только один раз. Иногда это существенно ускоряет вывод индикатора на график.
 
Цитата
Илья написал:
Есть ли вариант сохранения состояния расчета между вызовами OnCalculate?

Вчера пытался в таблицу Settings  добавить свою таблицу рассчитанных при первом проходе значений, чтобы при следующих просто из нее вытащить. Знаю, что в руководстве написано "Типы пользовательских параметров: числа и строки"
До перезапуска терминала (накидал скрипт, пока терминал работал), вроде, получилось: значения и сохранялись, и выбирались.
Но при последующем запуске терминала выводилась ошибка об отсутствии моей таблицы.
Хотел сделать через замыкание, но, опять же, где хранить этот объект?
Опишите переменную вне функции OnCalculate.  
Например, у Вас выше написано так:
Код
function OnCalculate(index)
  
  local _ds = nil
  
  if index == 1 then
    
    _ds = getDataSourceInfo()
 --....
    
  end
  
  return 0
  
end 

переменная _ds всегда затирается при входе в OnCalculate
чтобы этого не было сделайте так:
Код
local _ds;
function OnCalculate(index)
  if index == 1 then   
    _ds = getDataSourceInfo()
  --....
  end
 
  return 0
  
end
 
можно еще проще сделать:
Код
function OnCalculate(index)
 
  if index == 1 then
    
    _ds = getDataSourceInfo()
 --....
    
  end
  
  return 0
  
end 


вообще не определять, будет глобальным.
 
Илья, добрый день.

Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Илья,

Действительно, в описанных Вами ситуациях вызов OnCalculate происходит дважды.
Мы исправим данную ошибку в одной из очередных версий ПО.

Приносим извинения за причиненные неудобства.
 
Цитата
Anton Belonogov написал:
Илья,

Действительно, в описанных Вами ситуациях вызов OnCalculate происходит дважды.
Мы исправим данную ошибку в одной из очередных версий ПО.
Это сейчас серьезно? Почему же все эти годы не исправлялось. Сообщения были об этом очень-очень давно.
 
Цитата
Nikolay написал:
Цитата
Anton Belonogov написал:
Илья ,

Действительно, в описанных Вами ситуациях вызов OnCalculate происходит дважды.
Мы исправим данную ошибку в одной из очередных версий ПО.
Это сейчас серьезно? Почему же все эти годы не исправлялось. Сообщения были об этом очень-очень давно.
Вполне серьезно. проблема была выявлена при появлении VMLua  в КВИКЕ.
Пришлось сделать костыли.
 
Илья, это Вам ещё везёт, что свечи номера не меняют от прохода к проходу, как тут
Так-то стандартная идиома получается приводить индикатор к дефолтному состоянию при I == 1, но индексировать ничего по номеру свечи нельзя, если несколько инструментов на одном графике (поэтому я использую время)
Страницы: 1
Читают тему
Наверх