Добрый день. Подскажите нюансы покупки опциона роботом. Если я правильно понимаю, чтобы покупать выгодно, нужно покупать по цене ниже теоретической. Насколько знаю, эта цена меняется не часто и при резком изменении фьючерса может запаздывать.
Написал код в функции OnQuote
Код
function OnQuote(class_code, sec_code)
if class_code == CLASS_CODE_OPT and sec_code == SEC_CODE_OPT and MayOpt then
ql2 = getQuoteLevel2(class_code, sec_code)
if tonumber(ql2.offer[1].price+0) ~= nil and tonumber(ql2.offer[1].price+0) <= tonumber(getParamEx(class_code, sec_code, "theorprice").param_value+0) then
PRICE_OPT = ql2.offer[1].price+0
MayOpt = false
end
end
end
и в OnParam.
Код
function OnParam(class, sec)
-- если изменилась цена опциона, включить флаг, чтобы посмотреть стакан
if class == CLASS_CODE_OPT and sec == SEC_CODE_OPT and not MayOpt then
MayOpt = true
end
end
Т.е., как думал, если меняется параметр опциона, иду в стакан и сравниваю офер с теоретической ценой. Но OnParam вызывается при любом изменении параметра опциона? Как отследить изменение именно теории и тогда только смотреть стакан?
Или я мудрю и можно более лаконично набрать опционы по выгодной цене?
Я так понимаю, отследить изменение именно теоретической цены опциона нельзя или просто никто не знает? Что маловероятно)) Конечно, если она меняется явно, то это можно выловить, а если цена обновилась, но осталась прежней?
Женя написал: ЦитатаSergey Gorokhov написал: Например проверять только нужный параметр через getItem.Если подскажите еще какую имеете в виду таблицу))
тут имеет место ошибка. имелась ввиду функция getParamEx
Цитата
Женя написал: Sergey Gorokhov написал: Смотрите в событии CreateDataSource по нужному параметру Для этого нужно построить график теоретической цены опциона? А каким образом?
для CreateDataSource не нужно строить график. функция сама закачает нужные данные.
Sergey Gorokhov написал: тут имеет место ошибка. имелась ввиду функция getParamEx
Да, с ее помощью я получаю теоретическую цену. Но если цена обновилась и осталась прежней, то, простите, не могу сообразить, как с помощью getParamEx понять, что она обновилась?
Цитата
Sergey Gorokhov написал: правой кнопкой мыши по значению в таблице текущих торгов и там выбрать график
правой кнопкой мыши по значению в таблице текущих торгов и там выбрать график
Цитата
Женя написал: Да, с ее помощью я получаю теоретическую цену. Но если цена обновилась и осталась прежней, то, простите, не могу сообразить, как с помощью getParamEx понять, что она обновилась?
Цитата
Sergey Gorokhov написал: Смотрите в событии CreateDataSource по нужному параметру
Выдает закрытие вчерашнего дня. Теперь, проверяя параметр Size() на изменение, можно уверенно сказать, что прошло обновление теоретической цены? Из-за того, что график стоит, не могу проверить сам.
Женя написал: Не туда щелкнул, спасибо за терпение, нашел)) Только у меня график стоит и показывает до закрытия вчерашнего дня. У меня демо, это из-за него?
Проверьте настройки терминала меню Система - Настройки - Основные настройки в "Получение данных" установить галку "Исходя из настроек открытых пользователем таблиц" в "Сохранение данных" установить галку "Данные, отражающие текущее состояние и всю историю изменений" и "Получать пропущенные данные"
Цитата
Женя написал: Выдает закрытие вчерашнего дня. Теперь, проверяя параметр Size() на изменение, можно уверенно сказать, что прошло обновление теоретической цены?
Все проще, достаточно установить колбек через SetUpdateCallback
Про SetUpdateCallback следует отметить что в него будут поступать вообще все данные по нужному параметру, а не только текущие. Поэтому проверяйте индекс чтобы была последняя свеча.
Sergey Gorokhov написал: Проверьте настройки терминала меню Система - Настройки - Основные настройки в "Получение данных" установить галку "Исходя из настроек открытых пользователем таблиц" в "Сохранение данных" установить галку "Данные, отражающие текущее состояние и всю историю изменений" и "Получать пропущенные данные"
Спасибо, все появилось.
Цитата
Sergey Gorokhov написал: Все проще, достаточно установить колбек через SetUpdateCallback
Ок, я сделал так:
Код
ds = CreateDataSource("SPBOPT", "RI95000BI6", INTERVAL_M1, "theorprice")
lastCandleIndex = ds:Size()
ds:SetUpdateCallback(ddd)
function ddd(idx)
if idx > lastCandleIndex then
message('Свеча закрылась. Ее цена закрытия Close = '..ds:C(idx))
lastCandleIndex = idx
end
end
Но чем предыдущий код отличается от этого:
Код
new = getParamEx("SPBOPT", "RI95000BI6", "theorprice").param_value+0
if new ~= last then
message("новое значение "..new)
end
last = new
Выдают они в одно и то же время одно и то же значение. Или я опять в коде с CreateDataSource намудрил? Если посмотреть на график теоретической цены, то на нем нет горизонтальных линий. Лишь экстремумы, правда не с интервалом в 1 минуту.
Т.е. обновление теории на то же самое значение не бывает и я зря вас мучаю? Достаточно просто ждать актуального изменения и работать?
Sergey Gorokhov написал: Проверьте настройки терминала меню Система - Настройки - Основные настройки в "Получение данных" установить галку "Исходя из настроек открытых пользователем таблиц" в "Сохранение данных" установить галку "Данные, отражающие текущее состояние и всю историю изменений" и "Получать пропущенные данные"
Спасибо, все появилось.
Цитата
Sergey Gorokhov написал: Все проще, достаточно установить колбек через SetUpdateCallback
Ок, я сделал так:
Код
ds = CreateDataSource ( "SPBOPT" , "RI95000BI6" , INTERVAL_M1, "theorprice" )
lastCandleIndex = ds: Size ()
ds: SetUpdateCallback (ddd)
function ddd (idx)
if idx > lastCandleIndex then
message ( 'Свеча закрылась. Ее цена закрытия Close = ' .. ds:C(idx))
lastCandleIndex = idx
end
end
Но чем предыдущий код отличается от этого:
Код
new = getParamEx ( "SPBOPT" , "RI95000BI6" , "theorprice" ).param_value + 0
if new ~ = last then
message ( "новое значение " .. new)
end
last = new
Выдают они в одно и то же время одно и то же значение. Или я опять в коде с CreateDataSource намудрил? Если посмотреть на график теоретической цены, то на нем нет горизонтальных линий. Лишь экстремумы, правда не с интервалом в 1 минуту.
Т.е. обновление теории на то же самое значение не бывает и я зря вас мучаю? Достаточно просто ждать актуального изменения и работать?
В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
Николай Камынин написал: В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
А можете подробней расписать, что могу пропустить? Значение теоретической цены? В каком случае? Запускал на проверку на полчаса и получал одинаковые данные от обоих вариантов в одно и то же время.
Николай Камынин написал: В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
А можете подробней расписать, что могу пропустить? Значение теоретической цены? В каком случае? Запускал на проверку на полчаса и получал одинаковые данные от обоих вариантов в одно и то же время.
Николай говорит о том что в SetUpdateCallback вы получаете поток данных, а getParamEx возвращает данные по запросу. а раз по запросу, значит есть шанс пропустить изменение значений. Другой вопрос защищена ли логика скрипта от пропусков. Если правильно вызывать getParamEx в OnParam то конечно риск сводится к минимуму или вообще отсутствует. Но возникает проблема когда предыдущее значение равно новому. И именно по этому Вам была дана рекомендация использовать SetUpdateCallback где если сработало значит изменение было. Конечно гуру форума могут поправить, что SetUpdateCallback или getParamEx на самом деле ловят не все изменения которые были на бирже. так как сами по себе данные по параметрам инструментов попадают на сервер также по запросу (раз в период)
Sergey Gorokhov, все понял, спасибо. Мне в принципе не важен каждый тик, я просто не хотел упускать момент обновления теории по той же цене, что была до этого... Хотя в принципе и это уже не важно, поправил код.