前提
このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法
取得
ib.positions()
のみで取得できます。
ib.positions() # [Position(account='XXX', contract=Stock(conId=393728477, symbol='TVIX', exchange='NASDAQ', currency='USD', localSymbol='TVIX', tradingClass='NMS'), position=-350.0, avgCost=56.3837137), # Position(account='XXX', contract=CFD(conId=111987469, symbol='IBJP225', currency='JPY', localSymbol='IBJP225', tradingClass='IBJP225'), position=500.0, avgCost=20641.823976), # Position(account='XXX', contract=Option(conId=349549716, symbol='VXX', lastTradeDateOrContractMonth='20210115', strike=20.0, right='C', multiplier='100', currency='USD', localSymbol='VXX 210115C00020000', tradingClass='VXX'), position=28.0, avgCost=400.7438), # Position(account='XXX', contract=Forex('EURUSD', conId=12087792, localSymbol='EUR.USD', tradingClass='EUR.USD'), position=-300.0, avgCost=1.06905665)]
建玉の内容の解析?
上記のように取得できたデータ形式は、Pythonではすんなりと取得ができません。util.df
を使ってみました。
util.df(ib.positions())
少し分かりやすくなりました。4種類のポジションがあり、それぞれの建玉数と平均価格が表示されています。(オプションだけデスクトップTWSの価格と異なりますが。。。)
でも、欲しい情報がcontractに詰め込まれてしまいます。ちょっと難しです。
結局は何の情報が欲しいかということになりますが。
結論
少し強引ですが、以下で必要な内容を取得していると思います。
for details in ib.positions(): text = str(details.contract).split('(') print("種類:{} シンボル:{} 通貨:{} 数量:{} 平均価格:{}".format(text[0], details.contract.symbol, details.contract.currency, details.position, details.avgCost)) # 種類:Stock シンボル:TVIX 通貨:USD 数量:-350.0 平均価格:56.3837137 # 種類:CFD シンボル:IBJP225 通貨:JPY 数量:500.0 平均価格:20641.823976 # 種類:Option シンボル:VXX 通貨:USD 数量:28.0 平均価格:400.7438 # 種類:Forex シンボル:EUR 通貨:USD 数量:-300.0 平均価格:1.06905665
EUR/USDはシンボルが「EUR」通貨が「USD」となっていたりと注意が必要ですね。
EUR/USDは売り100枚を3回していたのですが、このように個別に情報を取得できません。また個別に取得ができないためか、注文日などの日時に関する情報もありません。
コメント