Добрый день. Подскажите нюансы покупки опциона роботом. Если я правильно понимаю, чтобы покупать выгодно, нужно покупать по цене ниже теоретической. Насколько знаю, эта цена меняется не часто и при резком изменении фьючерса может запаздывать.
Написал код в функции 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 вызывается при любом изменении параметра опциона? Как отследить изменение именно теории и тогда только смотреть стакан?
Или я мудрю и можно более лаконично набрать опционы по выгодной цене?
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 07:28:23
Я так понимаю, отследить изменение именно теоретической цены опциона нельзя или просто никто не знает? Что маловероятно)) Конечно, если она меняется явно, то это можно выловить, а если цена обновилась, но осталась прежней?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.08.2016 10:50:12
Цитата
Женя написал: Как отследить изменение именно теории и тогда только смотреть стакан?
Например проверять только нужный параметр через getItem.
Цитата
Женя написал: Я так понимаю, отследить изменение именно теоретической цены опциона нельзя или просто никто не знает?
Можно.
Цитата
Женя написал: Конечно, если она меняется явно, то это можно выловить, а если цена обновилась, но осталась прежней?
Смотрите в событии CreateDataSource по нужному параметру
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 11:17:15
Спасибо за направление
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 13:16:48
Цитата
Sergey Gorokhov написал: Например проверять только нужный параметр через getItem.
Если подскажите еще какую имеете в виду таблицу))
Цитата
Sergey Gorokhov написал: Смотрите в событии CreateDataSource по нужному параметру
Для этого нужно построить график теоретической цены опциона? А каким образом? Я не смог найти в терминале.
Пользователь
Сообщений: Регистрация: 23.01.2015
30.08.2016 13:20:43
Цитата
Женя написал: ЦитатаSergey Gorokhov написал: Например проверять только нужный параметр через getItem.Если подскажите еще какую имеете в виду таблицу))
тут имеет место ошибка. имелась ввиду функция getParamEx
Цитата
Женя написал: Sergey Gorokhov написал: Смотрите в событии CreateDataSource по нужному параметру Для этого нужно построить график теоретической цены опциона? А каким образом?
для CreateDataSource не нужно строить график. функция сама закачает нужные данные.
правой кнопкой мыши по значению в таблице текущих торгов и там выбрать график
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 13:42:35
Цитата
Sergey Gorokhov написал: тут имеет место ошибка. имелась ввиду функция getParamEx
Да, с ее помощью я получаю теоретическую цену. Но если цена обновилась и осталась прежней, то, простите, не могу сообразить, как с помощью getParamEx понять, что она обновилась?
Цитата
Sergey Gorokhov написал: правой кнопкой мыши по значению в таблице текущих торгов и там выбрать график
правой кнопкой мыши по значению в таблице текущих торгов и там выбрать график
Цитата
Женя написал: Да, с ее помощью я получаю теоретическую цену. Но если цена обновилась и осталась прежней, то, простите, не могу сообразить, как с помощью getParamEx понять, что она обновилась?
Цитата
Sergey Gorokhov написал: Смотрите в событии CreateDataSource по нужному параметру
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 14:30:00
Цитата
Sergey Gorokhov написал: правой кнопкой мыши по значению в таблице текущих торгов и там выбрать график
Не туда щелкнул, спасибо за терпение, нашел)) Только у меня график стоит и показывает до закрытия вчерашнего дня. У меня демо, это из-за него?
Цитата
Sergey Gorokhov написал: Смотрите в событии CreateDataSource по нужному параметру
Выдает закрытие вчерашнего дня. Теперь, проверяя параметр Size() на изменение, можно уверенно сказать, что прошло обновление теоретической цены? Из-за того, что график стоит, не могу проверить сам.
Пользователь
Сообщений: Регистрация: 23.01.2015
30.08.2016 14:37:58
Цитата
Женя написал: Не туда щелкнул, спасибо за терпение, нашел)) Только у меня график стоит и показывает до закрытия вчерашнего дня. У меня демо, это из-за него?
Проверьте настройки терминала меню Система - Настройки - Основные настройки в "Получение данных" установить галку "Исходя из настроек открытых пользователем таблиц" в "Сохранение данных" установить галку "Данные, отражающие текущее состояние и всю историю изменений" и "Получать пропущенные данные"
Цитата
Женя написал: Выдает закрытие вчерашнего дня. Теперь, проверяя параметр Size() на изменение, можно уверенно сказать, что прошло обновление теоретической цены?
Все проще, достаточно установить колбек через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 23.01.2015
30.08.2016 14:39:57
Про SetUpdateCallback следует отметить что в него будут поступать вообще все данные по нужному параметру, а не только текущие. Поэтому проверяйте индекс чтобы была последняя свеча.
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 15:09:22
Цитата
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 минуту.
Т.е. обновление теории на то же самое значение не бывает и я зря вас мучаю? Достаточно просто ждать актуального изменения и работать?
Пользователь
Сообщений: Регистрация: 23.01.2015
30.08.2016 15:15:25
Цитата
Женя написал: Выдают они в одно и то же время одно и то же значение.
А что должны выдавать разные? Изменился способ получения данных но не сами данные.
Цитата
Женя написал: Т.е. обновление теории на то же самое значение не бывает и я зря вас мучаю? Достаточно просто ждать актуального изменения и работать?
Спорный вопрос, тем более если говорить о демо сервере.
Пользователь
Сообщений: Регистрация: 27.08.2016
30.08.2016 15:42:16
Цитата
Sergey Gorokhov написал: А что должны выдавать разные? Изменился способ получения данных но не сами данные.
Ну да, просто второй код проще.
Цитата
Sergey Gorokhov написал: Спорный вопрос, тем более если говорить о демо сервере.
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 минуту.
Т.е. обновление теории на то же самое значение не бывает и я зря вас мучаю? Достаточно просто ждать актуального изменения и работать?
В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
Пользователь
Сообщений: Регистрация: 27.08.2016
31.08.2016 14:02:21
Цитата
Николай Камынин написал: В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
А можете подробней расписать, что могу пропустить? Значение теоретической цены? В каком случае? Запускал на проверку на полчаса и получал одинаковые данные от обоих вариантов в одно и то же время.
Николай Камынин написал: В первом случае Вы получаете все значения. Во втором лишь значения из срезов пришедших в ТТП. Т е во втором случае возможны пропуски.
А можете подробней расписать, что могу пропустить? Значение теоретической цены? В каком случае? Запускал на проверку на полчаса и получал одинаковые данные от обоих вариантов в одно и то же время.
Николай говорит о том что в SetUpdateCallback вы получаете поток данных, а getParamEx возвращает данные по запросу. а раз по запросу, значит есть шанс пропустить изменение значений. Другой вопрос защищена ли логика скрипта от пропусков. Если правильно вызывать getParamEx в OnParam то конечно риск сводится к минимуму или вообще отсутствует. Но возникает проблема когда предыдущее значение равно новому. И именно по этому Вам была дана рекомендация использовать SetUpdateCallback где если сработало значит изменение было. Конечно гуру форума могут поправить, что SetUpdateCallback или getParamEx на самом деле ловят не все изменения которые были на бирже. так как сами по себе данные по параметрам инструментов попадают на сервер также по запросу (раз в период)
Пользователь
Сообщений: Регистрация: 27.08.2016
31.08.2016 18:17:17
Sergey Gorokhov, все понял, спасибо. Мне в принципе не важен каждый тик, я просто не хотел упускать момент обновления теории по той же цене, что была до этого... Хотя в принципе и это уже не важно, поправил код.