Рублёвый объём позиции фьючерсов с долларовыми пунктами

Страницы: 1
RSS
Рублёвый объём позиции фьючерсов с долларовыми пунктами, График рублёвой цены фьючерса по графикам фьючерса на индекс РТС и на курс доллара к рублю
 
Известно, что котировки ряда фьючерсов выражаются через доллар.
Например, фьючерс на золото примерно отражает в пунктах текущую цену унции в долларах. Это не очень удобно, т.к. на брокерском счёте размещены рубли. Ставить стопы на изменение фьючерса в долларовых пунктах тоже не всегда уместно. Например, при снижении котировки фьючерса на индекс РТС в долларовых пунктах на 33.33% и одновременном росте курса доллара на 50% рублевая стоимость фьючерса (объём позиции) не меняются.
Желательно иметь перед глазами график не долларовых котировок, а рублёвых. На текущий момент приходится использовать те возможности, которые даёт QLua для построения индикаторов.
Рублевая стоимость фьючерса получается с использованием двух параметров, которые в Quik'е показаны в "Таблице текущих параметров" в колонках "Шаг цены" и "Стоимость шага". К сожалению, история этих параметров дольше текущего дня недоступна. Поэтому, приближённую оценку рублёвой стоимости фьючерса можно получить из графика фьючерса на курс доллара к рублю (Si). Код индикатора прилагается.
Код
-- Перемножает Close'ы графиков RI на Si
-- При запуске на загрузке Quik'а работает код предыдущей загрузки
-- с последними свойствами, полученными из кода или интерактивно.
-- При запуске старые бары графика данных сканируются дважды,
-- только если есть подключение к серверу.
-- При смене тайм-фрейма старые бары сканируются только единожды.
-- При загрузке Quik'а первый скан до подключения к серверу.
FirstValid = nil
Settings = {
  Name = "_RIxSi"
  ,line = {
    {Name = "RIxSi"
    ,Color = RGB(255,255,0) -- Жёлтый
    ,Type = TYPE_POINT
    ,Width = 2}
  }
  ,GraphId1 = "RI-1" -- Перезадать оба после первой загрузки.
  ,GraphId2 = "Si-1" -- Сохраняются при последующих запусках.
  ,Factor   = 2e-5
}
function Init()
  return #Settings.line
end -- Init()

function CalcIt (index)
  local tbl1 = getCandlesByIndex (Settings.GraphId1, 0, index-1, 1)
  local tbl2 = getCandlesByIndex (Settings.GraphId2, 0, index-1, 1)
  if tbl1[0].close == 0 or tbl2[0].close == 0 then
    return nil -- Пропускаем бары с неполными данными.
  end
  local sum = tbl1[0].close * tbl2[0].close * Settings.Factor
  return sum
end -- CalcIt()

function OnCalculate(index)
  if index == 1 then
    FirstValid = nil
  end
  if (0 == getNumCandles (Settings.GraphId1) or
      0 == getNumCandles (Settings.GraphId2)) then
    if index == 1 then
      message ("GraphId error")
    end
    return nil
  end
  if not FirstValid then
    local tbl1 = getCandlesByIndex (Settings.GraphId1, 0, index-1, 1)
    local tbl2 = getCandlesByIndex (Settings.GraphId2, 0, index-1, 1)
    if tbl1[0].close ~= 0 and tbl2[0].close ~= 0 then
      FirstValid = index
      local count = getNumCandles (Settings.GraphId1)
      if FirstValid == count then
        for idx = 1, index-1 do
          SetValue (idx, 1, CalcIt (idx))
        end
      end
    end
  end
  return CalcIt (index)
end -- OnCalculate()

 
В работе Quik без подключения к серверу при смене тайм-фрейма наблюдается такая аномалия, что значения котировок close() и т.п. для второго графика Settings.GraphId2 оказываются все нулевые.
Это делает невозможным построение графика по двум другим сразу после смены тайм-фрейма. Для получения графика нужно открыть его диалог "Редактирование настроек графика" и нажать кнопку "OK".
 
Цитата
Ростислав Дм. Кудряшов написал:
В работе Quik без подключения к серверу при смене тайм-фрейма наблюдается такая аномалия, что значения котировок close() и т.п. для второго графика Settings.GraphId2 оказываются все нулевые.
Это делает невозможным построение графика по двум другим сразу после смены тайм-фрейма. Для получения графика нужно открыть его диалог "Редактирование настроек графика" и нажать кнопку "OK".
Уточните версию терминала QUIK
 
Цитата
Sergey Gorokhov написал:
Цитата
Ростислав Дм. Кудряшов написал:
В работе Quik без подключения к серверу при смене тайм-фрейма наблюдается такая аномалия, что значения котировок close() и т.п. для второго графика Settings.GraphId2 оказываются все нулевые.
Это делает невозможным построение графика по двум другим сразу после смены тайм-фрейма. Для получения графика нужно открыть его диалог "Редактирование настроек графика" и нажать кнопку "OK".
Уточните версию терминала QUIK
в любой.

зависит от очередности построения индикаторов терминалом.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Ростислав Дм. Кудряшов,

Для решения, добавьте такой код:
Код
   if #tbl1 == 0 and #tbl2 == 0 and Size()==index then
        for idx = 1, index-1 do
          SetValue (idx, 1, CalcIt (idx))
        end
   end
 
После переноса строк local tbl1 = и tbl2 == из блока if not FirstValid ... перед этим блоком опробовано три варианта добавления рекомендованного кода.
1) После блока блока if tbl1[0].close ~= 0 ...
2) Перед строкой return CalcIt (index)
3) Перед строкой return CalcIt (index) с удалением блока if not FirstValid ...
Все варианты при отключенном сервере брокера после смены тайм фрейма с дневок на 5-минутки или наоборот приводят к стиранию графика, нарисованного после загрузки индикатора.
Эффект наблюдается в Quik'ах 7.19.0.51, полученных от брокеров Церих Кэпитал и БКС.
Если перед строкой return CalcIt (index) вставить следующий код и удалять файл D:\TMP\Log.txt перед каждой сменой фрейма, видно, что колонка второго исходного графика даёт нулевые close().,
Код
do
    local log = io.open ("D:\\TMP\\Log.txt", "a+")
    local tbl1 = getCandlesByIndex (Settings.GraphId1, 0, index-1, 1)
    local tbl2 = getCandlesByIndex (Settings.GraphId2, 0, index-1, 1)
    local dt = tbl1[0].datetime;
    if index == 1 then log:write("***") end
    local s = string.format ("%4d.%02d.%02d %02d:%02d"
      ,dt.year, dt.month, dt.day, dt.hour, dt.min)
    log:write (string.format("\n%4d;%4d;%6d;%6d;%s"
      ,index, Size(), tbl1[0].close, tbl2[0].close, s))
    log:close()
end
 
Цитата
Ростислав Дм. Кудряшов написал:
После переноса строк local tbl1 = и tbl2 == из блока if not FirstValid ...
А зачем надо было переносить строки?
Видимо перенесли строки и по этому предложенный код не работает.
посмотрите как оно должно было быть
Скрытый текст


Цитата
Ростислав Дм. Кудряшов написал:
видно, что колонка второго исходного графика даёт нулевые close().,
Это не дает никакой новой информации, проблема и так предельно ясна, лишний раз ее показывать нет смысла.
 
"надо было переносить строки" затем, чтобы сработал мой второй вариант "добавления".  Последний код в "скрытом тексте" равноценен моему первому варианту "добавления".
Хотя никоим образом не может быть "видимо", что "по этому предложенный код не работает", я запустил у себя последний предложенный код из "скрытого текста" и получил тот же неудовлетворительный результат.
 
Обращаю внимание, что смена тайм-фрейма ведёт к стиранию графика индикатора только при ОТКЛЮЧЕННОМ сервере брокера!
Страницы: 1
Читают тему
Наверх