Общие вопросы
Цепочки опционов или доски опционов или, в более общем смысле, список деривативов на базовый индекс, акции или фьючерсы можно запросить из API. Это можно сделать с помощью функции reqContractDetails или функции reqSecDefOptParams. Каждый метод имеет преимущества в различных ситуациях.
reqContractDetails
Функция reqContractDetails вызывается с объектом класса Contract в качестве аргумента, и в ответ возвращается полная информация о сопоставлении контрактов в базе данных Interactive Brokers. Это единственная функция в API, которую можно использовать с не полностью определенными объектами контракта. Из одного запроса reqContractDetails можно получить:
- Если имеется один соответствующий контракт, полная информация об этом контракте (включая такую информацию, как основная биржа, название инструмента, действительные типы ордеров и часы торговли) будет возвращена в функцию обратного вызова contractDetails в EWrapper.
- Если есть несколько совпадающих контрактов, например. опционов с одним и тем же базовым символом и датой истечения, но разными ценами исполнения, будут отдельные обратные вызовы к contractDetails с подробностями для каждого отдельного опционного контракта.
- Если соответствующих контрактов нет, будет возвращена ошибка «200: No security definition has been found».
Важно отметить, что некоторые базовые инструменты могут иметь тысячи деривативов. В этом случае было бы невозможно запросить сразу полную цепочку с подробным описанием всех деривативов на андерлаинг. Вместо этого необходимо максимально сузить запрошенную цепочку опционов, например, определив дату истечения срока действия и возвращая только контракты, срок действия которых истекает в эту конкретную дату или месяц. Запросы цепочек опционов с использованием reqContractDetails, которые используют объект Contract без таких полей, как срок действия, забастовка или право, будут регулироваться, так что для возврата результатов потребуется больше времени, чем если бы все поля были определены. По этой причине также лучше создать локальный кеш с возвращаемыми сведениями о контракте, а не повторять одни и те же запросы. Ниже приведен пример reqContractDetails для запроса цепочки опций на предмет опций AAPL, срок действия которых истекает в июне 2020 года.
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from threading import Timer
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print("Error: ", reqId, " ", errorCode, " ", errorString)
def nextValidId(self, orderId):
self.start()
def contractDetails(self, reqId, contractDetails):
print("contractDetails: ", reqId, " ", contractDetails, "\n")
def contractDetailsEnd(self, reqId):
print("\ncontractDetails End\n")
def start(self):
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "OPT"
contract.exchange = "SMART"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "202203" # June 2022
self.reqContractDetails(1, contract)
def stop(self):
self.done = True
self.disconnect()
def main():
app = TestApp()
app.nextOrderId = 0
app.connect("127.0.0.1", 7497, 0)
Timer(4, app.stop).start()
app.run()
if __name__ == "__main__":
main()
Чтобы запросить список сроков истечения и страйков для деривативов по базовому инструменту, вместо этого можно использовать функцию reqSecDefOptParams.
reqSecDefOptParams
Когда функция reqSecDefOptParams вызывается для базового инструмента, возвращается список всех возможных страйков и список всех возможных экспираций. Затем reqContractDetails можно использовать для запроса конкретных индивидуальных комбинаций исполнения и истечения срока действия. Это позволяет избежать любого возможного регулирования, поскольку reqContractDetails будет использоваться только с объектами Contract, которые определяют не более одного уникального контракта.
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.common import SetOfString
from ibapi.common import SetOfFloat
from threading import Timer
class TestApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def error(self, reqId, errorCode, errorString):
print("Error: ", reqId, " ", errorCode, " ", errorString)
def nextValidId(self, orderId):
self.start()
def securityDefinitionOptionParameter(self, reqId:int, exchange:str,
underlyingConId:int, tradingClass:str, multiplier:str,
expirations:SetOfString, strikes:SetOfFloat):
print("SecurityDefinitionOptionParameter.",
"ReqId:", reqId, "Exchange:", exchange, "Underlying conId:", underlyingConId, "TradingClass:", tradingClass, "Multiplier:", multiplier,
"Expirations:", expirations, "Strikes:", str(strikes),"\n")
def securityDefinitionOptionParameterEnd(self, reqId:int):
print("SecurityDefinitionOptionParameterEnd. ReqId:", reqId)
def start(self):
# 265598 is the conId (contract ID) for AAPL Nasdaq stock
self.reqSecDefOptParams(1, "AAPL", "", "STK", 265598)
def stop(self):
self.done = True
self.disconnect()
def main():
app = TestApp()
app.nextOrderId = 0
app.connect("127.0.0.1", 7497, 0)
Timer(4, app.stop).start()
app.run()
if __name__ == "__main__":
main()
В приведенном выше примере мы вызываем reqSecDefOptParams, используя символ базового, базового типа безопасности и идентификатора контракта (или conId) базового. ConId можно найти, щелкнув правой кнопкой мыши список наблюдения TWS и выбрав «Информация о финансовом инструменте» -> «Подробности» (Financial Instrument Info -> Details), или воспользовавшись функцией reqContractDetails, как в приведенном выше примере с биржевым контрактом.