Как работает OnCalculate?

Страницы: 1
RSS
Как работает OnCalculate?, При использование getParamEx в OnCalculate замечены пробелы в данных... Как быть?
 
Здравствуйте!
Захотел я посмотреть подробнее из чего состоит свеча графика "Количество открытых позиций". Сделал вот такой индикатор:
(Все эксперименты проводились на графике фьючерса на Сбербан SRU5)

Код
Settings= 
{  Name = "_OI_Separator",  
   line =   
   {
      {Name = "Увеличение открытого интереса", Color = RGB(0, 192, 0), Type = TYPE_HISTOGRAM, Width = 3},
      {Name = "Уменьшение открытого интереса", Color = RGB(192, 0, 0), Type = TYPE_HISTOGRAM, Width = 3}  
   } 
} 
-----------------------------------------------------------------------------
function Init()
  sec_code = "SRU5"
  class_code=getSecurityInfo("",sec_code).class_code

  oi_plus  = 0
  oi_minus = 0
  oi       = 0
  idx      = -1

  oi_prev = getParamEx (class_code, sec_code, "numcontracts").param_value
  oi_curr = oi_prev

  return 2
end
-----------------------------------------------------------------------------
function OnCalculate(index)

  if index ~= idx then
    oi_plus = 0
    oi_minus = 0
    idx = index
  end

  oi_prev = oi_curr
  oi_curr = getParamEx (class_code, sec_code, "numcontracts").param_value

  local d = oi_curr - oi_prev

  if d > 0 then
    oi_plus = oi_plus + d
  else
    oi_minus = oi_minus + d
  end

  return oi_plus, oi_minus
end  
-----------------------------------------------------------------------------

  return oi_plus, oi_minus
end  
-----------------------------------------------------------------------------

Запустил. Работает только с момента запуска, но это ладно. Когда вычел показания двух столбиков гистограммы одного бара (увеличение ОИ-уменьшение ОИ), то увидел, что эта разница не совпадает с разницей Close-Open стандартного графика  "Количество открытых позиций".

Тогда решил сделать, ну совсем простой тест с Объемом. Получается тоже ерунда.
Код
Settings= 
{  Name = "_test_vol",  
   line =   
   {
      {Name = "_Volume", Color = RGB(64, 64, 64), Type = TYPE_HISTOGRAM, Width = 3}  
   } 
} 
----------------------------------------------------
function Init()
  sec_code = "SRU5"
  class_code=getSecurityInfo("",sec_code).class_code

  vol = 0
  idx = 0

  return 1
end
----------------------------------------------------
function OnCalculate(index)
 
  if idx ~= index then
    vol = 0
    idx = index 
  end

  vol = vol + getParamEx (class_code, sec_code, "qty").param_value
  return vol 
end  
----------------------------------------------------
Предполагаю, что OnCalculate вызывается не так часто, как хотелось бы.
Попробовал поиграть с OnParam, но он, видимо, для индикаторов не применим.

В документации сказано, что OnCalcelate "вызывается при поступлении новой или изменении существующей свечки в источнике данных для индикатора". Ну, ладно ОИ, но на объем-то почему не всегда реагирует?

Подскажите как получать корректные данные?
Спасибо!
 
 OnCalculate вызывается на каждую обезличенную сделку,
а  getParamEx читает из срезов ТТП ,
ТТП обновляется илшь при изменении и если данные еще не устарели в пришедшем срезе
Т е расчет по OnCalculate и по getParamEx скорее будут не совпадать, а  иногда совпадать.
Страницы: 1
Читают тему
Наверх