Получение из таблицы текущих торгов всех доступных на текущий момент фьючерсов по инструменту

Страницы: 1
RSS
Получение из таблицы текущих торгов всех доступных на текущий момент фьючерсов по инструменту
 
Коллеги, привет!
Написала функцию, которая проверяет количество дней до экспирации, чтобы контракт менялся сам, написала топорно в лоб: создала таблицу, где указала имена контрактов. Функция через  getParamEx проверяет, сколько дней осталось до экспиры. Если дней меньше 3, то контракт сам меняется. Но сегодня утром столкнулась с тем, что предыдущий контракт по нефти (который вчера экспирировался) пропал из списка доступных в таблице "Текущие торги" и скрипт не может проверить по нему параметр остатка. Попытка проверить данный параметр на существование к нужному результату не привела. Скрипт с попыткой будет ниже.
Как я вижу, нужно забрать из таблицы текущих торгов все возможные контракты по баховому активу и посмотреть их даты экспирации, но вот как забрать эти данные, я не знаю...
Код
function contract()
local futdate = {} 
   local timedif = {}
   local idx = 0
      activename = "RTS"
      
      futnames = {"RIZ1", "RIH2", "RIM2", "RIU2", "RIZ2","RIH3", "RIM3", "RIU3", "RIZ3"}
      --message("futnames[1]"..futnames[1].."futnames[2]"..futnames[2])
      for i=1,12 do
         if idx==1 then break end
         --message("futnames"..futnames[i]..type(futnames[i]))
         if futnames[i] then
            futdate[i] = getParamEx(CLASSCODE, futnames[i], "DAYS_TO_MAT_DATE").param_image
            --message("futdate[i]"..futdate[i])
            --message(type(DATE).."date="..DATE)
            --timedif[i] = futdate[i]-tonumber(DATE)
            --message('timedif='..timedif[i])
               if tonumber(futdate[i])>2 then 
                  INSTRUMENT=futnames[i]
                  --message('actual futures is'..INSTRUMENT)
                  idx=1
               end
         end
      end
end
 
Яна, Ну, если не находит, почему бы не сделать предположение, что экспирация уже прошла? Тем более, что в приведённом примере это так и есть. И, насколько я знаю, любые параметры из ТТТ получают по getParamEx. И если хоть один из них (скажем, код инструмента) там есть, значит, должны быть и все остальные. В т.ч. DAYS_TO_MAT_DATE.
 
Цитата
Владимир написал:
Яна, Ну, если не находит, почему бы не сделать предположение, что экспирация уже прошла? Тем более, что в приведённом примере это так и есть. И, насколько я знаю, любые параметры из ТТТ получают по getParamEx. И если хоть один из них (скажем, код инструмента) там есть, значит, должны быть и все остальные. В т.ч. DAYS_TO_MAT_DATE.
Владимир, да, это безусловно так, но попытка объяснить роботу, что ненайденный параметр равно возьми следующее значение не увенчалась успехом. Возможно, у вас будет какая-нибудь идея, как это сделать, чтобы робот это понял.  
 
Решение найдено. Ошибка была уже традиционно во внимательности. Контрактом можно вставить, сколько душе угодно
Код
function contract()
--функция проверки актуальности контракта
   --if TP==0 then
   local futdate = {} 
   local timedif = {}
   local idx = 0
      activename = "BR"
      futnames = { "BRZ1","BRF2", "BRG2", "BRH2", "BRJ2","BRK2", "BRM2", "BRN2", "BRQ2", "BRU2", "BRV2","BRX2"}
      for i=1,12 do
         if idx==1 then break end
         --message("futnames"..futnames[1]..type(futnames[i]))
         if futnames[i] then
            futdate[i] = getParamEx(CLASSCODE, futnames[i], "DAYS_TO_MAT_DATE").param_value
            futstatus[i]= getParamEx(CLASSCODE, futnames[i], "STATUS").param_value
            --message("futdate[i]"..futdate[1])
            --message("futstatus[i]"..futstatus[1])
            --timedif[i] = futdate[i]-tonumber(DATE)
            --message('timedif='..timedif[i])
            if  futdate[i]~=nil then
               if tonumber(futdate[i])>2 then 
               INSTRUMENT=futnames[i]
               message('actual futures is'..INSTRUMENT)
               idx=1
               end
            end
         end
      end
end
 
Яна, у меня когда-то подобная задача стояла

В код зашивать список инструментов так себе идея, если необходимо несколько инструментов отслеживать, то грустно станет списки поддерживать в актуальном состоянии.
Динамически будет проще и красивее.
Код
function FindSecCode(class_code,pref,dtmd) -- Определяем инструмент для торговли
  local sec_list=getClassSecurities(class_code) -- Получаем список инструментов
  for test_sec_code in string.gmatch(sec_list,"("..pref.."[^,]+)") do -- Перебираем список
    local param=getParamEx(class_code,test_sec_code,"DAYS_TO_MAT_DATE")
    if(param.result=="1")and(param.param_image~="")and(param.param_type~="0")then -- Параметр получен корректно?
      if(tonumber(param.param_value)>=dtmd)then return test_sec_code end -- Проверяем дни до экспирации
    end
  end
end

sec_code=FindSecCode("SPBFUT","BR",3)
if(sec_code)then message("actual futures is "..sec_code) end

Возможно, стоило бы сортировку прикрутить, но сколько не наблюдал, от брокера сразу отсортированный по времени экспирации список прилетает.
 
BlaZed, Чего хорошего в такой "динамике"? Понятно, что список инструментов нужно вынести в отдельный файл, но получать динамически его от брокера... У меня этот список проходит довольно тщательную проверку, где-то раз в месяц повторяемую, и бОльшая часть инструментов эту проверку не проходит. А с оставшимися можно работать.
 
решается проблема очень просто.
Когда-то давно делал так:
Берем с биржи правила формирования имени фьючерса и на  основе этих правил и диапазона нужных дат формируете  имена фьючерсов для конкретной акции.
 
потом проверяем по таблице загруженных инструментов что есть а чего нет.
 
Цитата
BlaZed написал:
Яна, у меня когда-то подобная задача стояла

В код зашивать список инструментов так себе идея, если необходимо несколько инструментов отслеживать, то грустно станет списки поддерживать в актуальном состоянии.
Динамически будет проще и красивее.
Код
   function   FindSecCode (class_code,pref,dtmd)  -- Определяем инструмент для торговли 
   local  sec_list =  getClassSecurities (class_code)  -- Получаем список инструментов 
   for  test_sec_code  in   string.gmatch (sec_list,"( "..pref.." [^,] + )")  do   -- Перебираем список 
     local  param =  getParamEx (class_code,test_sec_code,"DAYS_TO_MAT_DATE")
     if (param.result =  =  "1" ) and (param.param_image~ =  "" ) and (param.param_type~ =  "0" ) then   -- Параметр получен корректно? 
       if (tonumber(param.param_value) >  = dtmd) then   return  test_sec_code  end   -- Проверяем дни до экспирации 
     end 
   end 
 end 

sec_code = FindSecCode( "SPBFUT" ,"BR", 3 )
 if (sec_code) then   message ( "actual futures is "  .. sec_code)  end   

Возможно, стоило бы сортировку прикрутить, но сколько не наблюдал, от брокера сразу отсортированный по времени экспирации список прилетает.
Вот это круто! ПОпробую. Выглядит как элегантно:) Блеск!
 
Цитата
Владимир написал:
BlaZed, Чего хорошего в такой "динамике"? Понятно, что список инструментов нужно вынести в отдельный файл, но получать динамически его от брокера... У меня этот список проходит довольно тщательную проверку, где-то раз в месяц повторяемую, и бОльшая часть инструментов эту проверку не проходит. А с оставшимися можно работать.
Если вы даже не поняли о чем разговор, то не стоит встревать с "умными" советами.
 
BlaZed, Я прекрасно понял, о чём разговор: getClassSecurities даёт ВЕСЬ список инструментов, а мой подход даёт только НУЖНЫЕ.
 
Цитата
Владимир написал:
BlaZed, Я прекрасно понял, о чём разговор: getClassSecurities даёт ВЕСЬ список инструментов, а мой подход даёт только НУЖНЫЕ.
Владимир не вводи людей в заблуждения   через разные понимания  вами биржевых понятий :

Нужные  у тебя ( это типа  сейчас тобою  желаемые ) ,  Твои / свои  - это  только те что в наличии   в твоем портфеле , а вот Все -  - это твой урезанный  тобой список   из существующих  в торгах всех  тикеров  от брокера   до твоего  уровня ВСЕ - которые мне интересны .     При твоем  желании  конечно можешь  и Весь список торгуемых у брокера  отслеживать  с твоим скриптом  и торговать ими   но  слава богу удалось  уговорить тебя  его урезать и отказаться от самых дерьмовых  по оборотам  и волатильности тикерам.  Но не трави народ и особенно тех у кого скрипт  максимум  торгуемых способен отслеживать а при большем количестве умрет вместе с Квиком  .   Ведь просто от большинства  посетителей этого форума  я лично  был свидетелем  и теперь  даже собственником твоего скрипта являюсь ,  но ведь не все  на этом сайте смогли и способны  добиться подобного и поэтому не стоит их изыскания тормозить   на корню  или как птичку в начале полета ,    
 
БорисД, Ты тоже не вводи. :smile:

Нужные  в данном случае - это как раз все, за которыми следит скрипт, то есть "все" в твоей терминологии. А про те "нужные", про которые ты говоришь, никто не знает, кроме нас с тобой - к тому же, они в новой версии вообще отменены.

Да, "все" - это "мой урезанный мною список", который ещё до тебя был "урезан и без самых дерьмовых  по оборотам  и волатильности тикерам". Только мне не нравятся данные по объёмам (если бы свечи считались по-нормальному, как мат ожидание, а не дурацкие OHLC, то туда бы органично вошли и объёмы естественным образом), так что я предпочитаю частоту сделок в единицу времени. Если там вообще народ ковыряется - значит, и нам можно.

Я дважды предлагал собрать нормальный "технический" набор утилит для торговли - один раз до тебя, один при тебе. Та знаешь, чем это закончилось. Так что меня больше не волнуют проблемы "большинства  посетителей этого форума", а ты прекрасно знаешь, что с несколькими тысячами тикеров МОЙ скрипт справится без проблем.
 
Цитата
BlaZed написал:
Яна, у меня когда-то подобная задача стояла

В код зашивать список инструментов так себе идея, если необходимо несколько инструментов отслеживать, то грустно станет списки поддерживать в актуальном состоянии.
Динамически будет проще и красивее.
Код
   function   FindSecCode (class_code,pref,dtmd)  -- Определяем инструмент для торговли 
   local  sec_list =  getClassSecurities (class_code)  -- Получаем список инструментов 
   for  test_sec_code  in   string.gmatch (sec_list,"( "..pref.." [^,] + )")  do   -- Перебираем список 
     local  param =  getParamEx (class_code,test_sec_code,"DAYS_TO_MAT_DATE")
     if (param.result =  =  "1" ) and (param.param_image~ =  "" ) and (param.param_type~ =  "0" ) then   -- Параметр получен корректно? 
       if (tonumber(param.param_value) >  = dtmd) then   return  test_sec_code  end   -- Проверяем дни до экспирации 
     end 
   end 
 end 

sec_code = FindSecCode( "SPBFUT" ,"BR", 3 )
 if (sec_code) then   message ( "actual futures is "  .. sec_code)  end   

Возможно, стоило бы сортировку прикрутить, но сколько не наблюдал, от брокера сразу отсортированный по времени экспирации список прилетает.
Подскажите пожалуйста почему вы остановились именно на 3 днях до экспирации? А не на 1?
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Спасибо - очень помогло.
Но у меня заработало получение актуальных фьючерсов только после изменения изменения шаблона поиска для функции gmatch()
for test_sec_code in string.gmatch(sec_list, "("..pref.."[^%s,]+)") do -- Перебираем список
Торговый привод на Lua: https://github.com/iv-litovchenko/Quik-Enter-Trade
 
Цитата
Иван написал:
Подскажите пожалуйста почему вы остановились именно на 3 днях до экспирации? А не на 1?
В первом посте задача стояла в три дня до экспирации
Я лично за 1 до экспирации инструмент меняю.

Цитата
Иван написал:
Но у меня заработало получение актуальных фьючерсов только после изменения изменения шаблона поиска для функции gmatch()
for test_sec_code in string.gmatch(sec_list, "("..pref.."[^%s,]+)") do -- Перебираем список
У вас getClassSecurities(class_code) возвращает строку с пробелами?
Страницы: 1
Читают тему (гостей: 1)
Наверх