Python 获取IB历史期权数据

Python 获取IB历史期权数据,python,api,ibpy,Python,Api,Ibpy,在下面的程序中,我可以获得合同的详细信息,但没有历史数据。不知道我做错了什么 from ib.ext.Contract import Contract from ib.ext.ContractDetails import ContractDetails from ib.opt import ibConnection, message import time import datetime from time import sleep, strftime twsPort = 7496 gate

在下面的程序中,我可以获得合同的详细信息,但没有历史数据。不知道我做错了什么

from ib.ext.Contract import Contract
from ib.ext.ContractDetails import ContractDetails
from ib.opt import ibConnection, message

import time
import datetime
from time import sleep, strftime

twsPort = 7496
gatewayPort = 4001

def watcher(msg):
    print("[watcher: ", msg, " ]")

def contractDetailsHandler(msg):
    print("[contractDetailsHandler:]")
    contractDetails = msg.contractDetails
    contract = msg.contractDetails.m_summary
    print(contractDetails.m_cusip, contractDetails.m_underConId, contractDetails.m_longName, contractDetails.m_industry,
          contractDetails.m_category, contractDetails.m_subcategory, contract.m_symbol, contract.m_secType, 
          contract.m_strike, contract.m_right, contract.m_exchange, 
          contract.m_currency, contract.m_secIdType, contract.m_secId, "\n")
    contracts.append(contractDetails.m_summary)

def contractDetailsEndHandler(msg):
    print("[contractDetailsEndHandler:]")


def contractHistDetailsHandler(msg):
    global DataWait
    print("[contractHistDetailsHandler:]")
    contracts.append(msg.historicalData)
    DataWait =  False


con = ibConnection()
con.host = "127.0.0.1"
con.port = gatewayPort
con.clientId = 5
con.registerAll(watcher)
con.register(contractDetailsHandler, 'ContractDetails')
con.register(contractDetailsEndHandler, 'ContractDetailsEnd')
con.register(contractHistDetailsHandler, message.historicalData)

con.connect()

contract = Contract()
contract.m_exchange     = "SMART"
contract.m_secType      = "OPT"
contract.m_symbol       = "SPY"
contract.m_currency     = "USD"
contract.m_strike       = 260
contract.m_right        = "PUT"
contract.m_expiry       = "20180615"
#contract.m_includeExpired = True

endtime = strftime('%Y%m%d %H:%M:%S')
#endtime = '20170102 01:00:00'

con.reqContractDetails(1, contract)

con.reqHistoricalData(2,contract,endtime,"14 D","30 min","MIDPOINT",0,1)

contracts = []

DataWait = True ;  i = 0
while DataWait and i < 90:
    i += 1 ; print(i),
    time.sleep(1)

time.sleep(1)

con.disconnect()
con.close()

print(contracts)
来自ib.ext.Contract导入合同
从ib.ext.ContractDetails导入ContractDetails
从ib.opt导入ibConnection,消息
导入时间
导入日期时间
从时间导入睡眠,strftime
twsPort=7496
网关端口=4001
def监视程序(msg):
打印(“[watcher:,msg,”))
def contractDetailsHandler(消息):
打印(“[ContractDetailsShandler:”)
contractDetails=msg.contractDetails
合同=msg.contractDetails.m\u摘要
打印(contractDetails.m_cusip、contractDetails.m_UnderNid、contractDetails.m_longName、contractDetails.m_industry、,
contractDetails.m_类别、contractDetails.m_子类别、contract.m_符号、contract.m_扇区类型、,
合同m_罢工,合同m_权利,合同m_交换,
contract.m_货币,contract.m_secId类型,contract.m_secId,“\n”)
合同。追加(合同详情。m_摘要)
def contractDetailsEndHandler(消息):
打印(“[contractDetailsEndHandler:”)
def contractHistDetailsHandler(消息):
全局数据等待
打印(“[ContractHistDetailsShandler:”)
contracts.append(msg.historicalData)
DataWait=False
con=ibConnection()
con.host=“127.0.0.1”
con.port=网关端口
con.clientId=5
监狱登记处(看守人)
合同登记册(合同详细资料“合同详细资料”)
con.register(contractDetailsEndHandler,'ContractDetailsEnd')
控制寄存器(contractHistDetailsHandler,message.historicalData)
con.connect()
合同
contract.m_exchange=“智能”
contract.m_secttype=“OPT”
contract.m_symbol=“间谍”
合同货币=美元
合同m_罢工=260
contract.m_right=“PUT”
合同到期日=“20180615”
#contract.m_includeExpired=真
endtime=strftime(“%Y%m%d%H:%m:%S”)
#结束时间='20170102 01:00:00'
合同详情(1,合同)
合同要求历史数据(2,合同,结束时间,“14天”,“30分钟”,“中点”,0,1)
合同=[]
DataWait=True;i=0
当数据等待且i<90时:
i+=1;印刷品(i),
时间。睡眠(1)
时间。睡眠(1)
con.disconnect()
con.close()
打印(合同)
程序的输出:

mm2:python ivan python ib_hist.py
Server Version: 76
TWS Time at connection:20180521 19:38:15 CST
20180521 19:38:16
1
[watcher:  <managedAccounts accountsList=F........>  ]
[watcher:  <nextValidId orderId=1>  ]
2
3
4
5
6
7
8
9
[watcher:  <error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:ushmds>  ]
[watcher:  <contractDetails reqId=1, contractDetails=<ib.ext.ContractDetails.ContractDetails object at 0x1024d8f60>>  ]
[contractDetailsHandler:]
 756733 SPDR S&P 500 ETF TRUST None None None SPY OPT 260.0 P SMART USD

[watcher:  <contractDetailsEnd reqId=1>  ]
[contractDetailsEndHandler:]
[watcher:  <error id=2, errorCode=165, errorMsg=Historical Market Data Service query message:HMDS server connection was successful.>  ]
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[watcher:  <connectionClosed>  ]
[<ib.ext.Contract.Contract object at 0x1027ba080>]
mm2:python ivan$
mm2:python-ivan-python-ib_-hist.py
服务器版本:76
连接时的TWS时间:20180521 19:38:15 CST
20180521 19:38:16
1.
[观察者:]
[观察者:]
2.
3.
4.
5.
6.
7.
8.
9
[观察者:]
[观察者:]
[ContractDetailsShandler:]
756733 SPDR标准普尔500 ETF信托无间谍选择260.0便士智能美元
[观察者:]
[contractDetailsEndHandler:]
[观察者:]
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[观察者:]
[]
mm2:python-ivan$

您必须订阅实时数据

你不能要求14天1分钟,必须至少“30分钟”

您在使用
msg.contractDetails
HistDetailsHandler
中出现错误,
msg
是历史数据

我真的不明白你在等待和使用全局变量。您拥有一个有效的合同,然后请求它,然后将其分配回自身,然后将其用于历史数据请求


只需请求您确定已订阅的历史数据,然后从中生成。

我终于获得了一些历史数据。我不得不减少天数。我使用了5天30分钟的数据。带着信息回来花了很长时间,平均60秒。

我做了更改。没有历史数据。见编辑后的文章。注意输出“errorMsg=历史市场数据服务…”。但我从未得到任何数据。