Коллеги, привет! Написала функцию, которая проверяет количество дней до экспирации, чтобы контракт менялся сам, написала топорно в лоб: создала таблицу, где указала имена контрактов. Функция через 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 даёт ВЕСЬ список инструментов, а мой подход даёт только НУЖНЫЕ.
Владимир не вводи людей в заблуждения через разные понимания вами биржевых понятий :
Нужные у тебя ( это типа сейчас тобою желаемые ) , Твои / свои - это только те что в наличии в твоем портфеле , а вот Все - - это твой урезанный тобой список из существующих в торгах всех тикеров от брокера до твоего уровня ВСЕ - которые мне интересны . При твоем желании конечно можешь и Весь список торгуемых у брокера отслеживать с твоим скриптом и торговать ими но слава богу удалось уговорить тебя его урезать и отказаться от самых дерьмовых по оборотам и волатильности тикерам. Но не трави народ и особенно тех у кого скрипт максимум торгуемых способен отслеживать а при большем количестве умрет вместе с Квиком . Ведь просто от большинства посетителей этого форума я лично был свидетелем и теперь даже собственником твоего скрипта являюсь , но ведь не все на этом сайте смогли и способны добиться подобного и поэтому не стоит их изыскания тормозить на корню или как птичку в начале полета ,
Нужные в данном случае - это как раз все, за которыми следит скрипт, то есть "все" в твоей терминологии. А про те "нужные", про которые ты говоришь, никто не знает, кроме нас с тобой - к тому же, они в новой версии вообще отменены.
Да, "все" - это "мой урезанный мною список", который ещё до тебя был "урезан и без самых дерьмовых по оборотам и волатильности тикерам". Только мне не нравятся данные по объёмам (если бы свечи считались по-нормальному, как мат ожидание, а не дурацкие 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?
Спасибо - очень помогло. Но у меня заработало получение актуальных фьючерсов только после изменения изменения шаблона поиска для функции gmatch() for test_sec_code in string.gmatch(sec_list, "("..pref.."[^%s,]+)") do -- Перебираем список
Иван написал: Подскажите пожалуйста почему вы остановились именно на 3 днях до экспирации? А не на 1?
В первом посте задача стояла в три дня до экспирации Я лично за 1 до экспирации инструмент меняю.
Цитата
Иван написал: Но у меня заработало получение актуальных фьючерсов только после изменения изменения шаблона поиска для функции gmatch() for test_sec_code in string.gmatch(sec_list, "("..pref.."[^%s,]+)") do -- Перебираем список
У вас getClassSecurities(class_code) возвращает строку с пробелами?