Почему я получаю неправильные цены опционов от TWS для запросов в тот же день, запросы на следующий день возвращают правPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Почему я получаю неправильные цены опционов от TWS для запросов в тот же день, запросы на следующий день возвращают прав

Сообщение Гость »


Я создал алгоритм, который будет проверять мои исполнения на соответствие цене спроса и предложения определенного контракта в момент получения оповещения и в момент подачи ордера с помощью алгоритма. Однако при попытке получить эти цены в тот же день, когда произошла сделка, около половины полученных цен являются правильными, а другая половина иногда сильно отклоняется. При попытке того же запроса на следующий день все цены верны.

У кого-нибудь еще есть такая проблема? Как могло случиться, что TWS вернет НЕПРАВИЛЬНЫЕ цены опционов? Я бы предпочел, чтобы они ничего не возвращали, чтобы я мог повторить попытку позже, но, возвращая неверные цены, мне теперь нужно проверять каждую цену, чтобы убедиться, что она правильная.

Вот пример того, что мой скрипт возвращает при первом получении цены в тот же день:

Время оповещения: 20230920 19:50:36, контракт: Option(symbol='SPX', lastTradeDateOrContractMonth='20230920',strike=4415.0, right='C', Exchange='CBOE'), цена оповещения Bid: 11,8, цена продажи оповещения: 12,1 Полученные средние цены: время оповещения — 11,95, время выполнения сценария — 11,95. Выполнение запроса на обновление: UPDATE AllTrades SET средняя цена оповещения = 11,95, средняя цена отправки = 11,95

Вот второй рывок в тот день, через 30 минут после закрытия рынка:

Время оповещения: 20230920 19:50:36, контракт: Option(symbol='SPX', lastTradeDateOrContractMonth='20230920',strike=4415.0, right='C', Exchange='CBOE'), цена оповещения Bid: 21,5, цена продажи оповещения: 22,1 Полученные средние цены: время оповещения — 21,8, время выполнения сценария — 21,8. Выполнение запроса на обновление: UPDATE AllTrades SET средняя цена оповещения = 21,8, средняя цена отправки = 21,8

А вот тот же результат на следующий день перед открытием рынка:

Время оповещения: 20230920 19:50:36, контракт: Option(symbol='SPX', lastTradeDateOrContractMonth='20230920',strike=4415.0, right='C', Exchange='CBOE'), цена оповещения Bid: 1,25, цена продажи оповещения: 1,35 Получены средние цены: время оповещения — 1,3, время выполнения сценария — 1,425. Выполнение запроса на обновление: UPDATE AllTrades SET Средняя цена оповещения = 1,3, Отправить среднюю цену = 1,425

Мне интересно, является ли это ограничением TWS, а не проблемой моего кода ниже.
из импорта ib_insync * импортировать mysql.connector импортировать панд как pd из даты и времени импорта даты и времени, времени импортировать сигнал импортировать питц # Инициализируем соединение IBKR (это можно сделать один раз в основном скрипте) ИБ = ИБ() защита fetch_market_price(new_trade): пытаться: # Явное преобразование полей к ожидаемым типам символ = ул(new_trade['Символ']) # Преобразуем datetime.date в строку, а затем заменяем тире expiration_date_str = new_trade['Дата истечения срока действия'].strftime('%Y-%m-%d') LastTradeDateOrContractMonth = expiration_date_str.replace('-', '') вправо = ул(new_trade['Вправо']) страйк = float(new_trade['Цена исполнения']) # Определим контракт на основе new_trade контракт = Опция (символ = символ, LastTradeDateOrContractMonth = LastTradeDateOrContractMonth, право = право, страйк = страйк, обмен = 'CBOE') # Инициализируем среднюю цену как для времени оповещения, так и для времени выполнения сценария. Mid_price_alert_time = Нет Mid_price_script_run_time = Нет # Получение цены на основе времени оповещения query_time_alert = pd.to_datetime(new_trade['Alert Time']).strftime('%Y%m%d %H:%M:%S') Tickets_alert = ib.reqHistoricalTicks( договор, startDateTime=query_time_alert, endDateTime=query_time_alert, число тиков = 1, WhatToShow = 'BID_ASK', useRth = Ложь, ) если len(ticks_alert) > 0: тик = Tickets_alert[0] Mid_price_alert_time = (tick.priceBid + Ticket.priceAsk) / 2, если Ticket.priceBid не равен None и Ticket.priceAsk не имеет значения None иначе Нет print(f"Время оповещения: {query_time_alert}, Контракт: {contract}, Цена предложения для оповещения: {tick.priceBid}, Цена предложения для оповещения: {tick.priceAsk}") # Получение цены на основе времени выполнения сценария (если доступно) если «Время выполнения сценария» в new_trade и pd.notna(new_trade['Время выполнения сценария']): query_time_script = pd.to_datetime(new_trade['Script Run Time']).strftime('%Y%m%d %H:%M:%S') Tickets_script = ib.reqHistoricalTicks( договор, startDateTime=query_time_script, endDateTime=query_time_script, число тиков = 1, WhatToShow = 'BID_ASK', useRth = Ложь, ) если len(ticks_script) > 0: тик = тики_скрипт[0] Mid_price_script_run_time = (tick.priceBid + Ticket.priceAsk) / 2, если Ticket.priceBid не равен None и Ticket.priceAsk не имеет значения None иначе Нет print(f"Выбраны средние цены: время оповещения — {mid_price_alert_time}, время выполнения скрипта — {mid_price_script_run_time}") кроме исключения как e: print(f"Ошибка получения рыночной цены: {e}") return None, None # Устанавливается в 0, если возникает ошибка вернуть Mid_price_alert_time, Mid_price_script_run_time
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»