前提
このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法
取得できる過去データ(ヒストリカルデータ)
過去データ(ヒストリカルデータ)は購読しているマーケット・データによって取得できないものがあります。
IB証券のマーケットデータの購読は以下を参照してください。
IB証券 マーケットデータの購読
金融商品
contracts = Forex('USDJPY', exchange='IDEALPRO')
で注文、決済する金融商品を設定します。
詳しくは以下を参照してください。
IB証券 API接続での商品情報の設定
注文
注文方法の種類
以下を参照してください。
なお、以下の注文方法のすべてをAPIで実現できるかは不明です。たぶん全ては対応していないと思います。
注文の流れ
以下の4ステップで注文を送信することになります。
contract = Forex('EURUSD', exchange='IDEALPRO') ib.qualifyContracts(contract) order = MarketOrder('SELL', 100) trade = ib.placeOrder(contract, order)
contract = Forex('EURUSD', exchange='IDEALPRO')
- 商品情報を設定します。詳しくはこちら。API接続での商品情報の設定
ib.qualifyContracts(contract)
- 商品情報(コントラクト)の不足しているフィールドを補完します。特にconIdが入力されます。
order = MarketOrder('SELL', 100)
- 注文情報を作成します。
trade = ib.placeOrder(contract, order)
- 注文を送信します。
成行注文
MarketOrder(取引の種類, 枚数)
- 取引の種類:買い
'BUY'
、売り'SELL'
となります。 - 枚数:注文枚数を整数で設定します。100.1で注文すると100になるのですがバグの元ですので整数にした方が間違いないと思います。
または以下のような形式でも注文情報の作成が可能です。
Order(orderType='MKT', action='取引の種類', totalQuantity=枚数)
contract = Forex('EURUSD', exchange='IDEALPRO') ib.qualifyContracts(contract) # 成行 order = MarketOrder('SELL', 100) trade = ib.placeOrder(contract, order) trade # Trade(contract=Forex('EURUSD', conId=12087792, exchange='IDEALPRO', localSymbol='EUR.USD', tradingClass='EUR.USD'), order=MarketOrder(orderId=48, clientId=1002, action='SELL', totalQuantity=100, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 5, 20, 4, 49, 51, 926322, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])
以下のように、デスクトップTWSに反映されます。(表示している項目が異なる場合があります)
*上記はデモ画面(ペーパートレーディング)です。余計な建玉があってすいません。
約定の確認
IB証券だけではないですが、金融商品や数量などの理由により、即座に約定しないことがあります。また強制的にキャンセルされることもあります。シストレを構築する際は、この点も注意しないとバグの元になります。
美しくないかもしれませんが、作ってみました。
def get_log(log, units): final_units = 0 final_rates = 0 final_pl = 0 log_status = '' while True: if hasattr(log, 'fills') == True: # print(log) if type(log.fills) is list: if len(log.fills) != 0: for details in log.fills: final_units += details.execution.shares final_pl += details.commissionReport.realizedPNL if log.orderStatus.status == 'Filled': final_rates = details.execution.avgPrice log_status = 'Filled' break elif log.orderStatus.status == 'Cancelled': log_status = 'Cancelled' break ib.sleep(1) return log_status, final_units, final_rates, final_pl positions = 100 contract = Forex('EURUSD', exchange='IDEALPRO') ib.qualifyContracts(contract) # 成行 order = MarketOrder('SELL', positions) trade = ib.placeOrder(contract, order) log_status, final_units, final_rates, final_pl = get_log(trade, positions) print(log_status, final_units, final_rates, final_pl) # Filled 100.0 1.09422 0.0
関数のリターン値
- log_status:Filledは約定が完了、Cancelledは強制的にキャンセルされた。
- final_units:最終の約定数。
- final_rates:最終の約定価格。成行の場合、注文が一回で約定しない場合は単価が異なることがありますが、IBの場合は平均レートを返してくれます。
- final_pl:決済の場合の損益です。こちらもfinal_ratesと同じく平均の損益を返してくれます。
これらで約定の状況を判断できると思います。
指値注文
LimitOrder(取引の種類, 枚数, 指値)
- 取引の種類:買い
'BUY'
、売り'SELL'
となります。 - 枚数:注文枚数を整数で設定します。100.1で注文すると100になるのですがバグの元ですので整数にした方が間違いないと思います。
- 指値:指値です。
または以下のような形式でも注文情報の作成が可能です。
Order(orderType='LMT', action='取引の種類', totalQuantity=枚数)
contract = Forex('EURUSD', exchange='IDEALPRO') ib.qualifyContracts(contract) limitOrder = LimitOrder('BUY', 100, 1.05) limitTrade = ib.placeOrder(contract, limitOrder) limitTrade # Trade(contract=Forex('EURUSD', conId=12087792, exchange='IDEALPRO', localSymbol='EUR.USD', tradingClass='EUR.USD'), order=LimitOrder(orderId=54, clientId=1002, action='BUY', totalQuantity=100, lmtPrice=1.05, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 5, 20, 5, 8, 6, 291476, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])
市場クローズ注文
可能な限り終値に近い価格で実行するために送信される成行注文です。
- 対応商品:CFD, 先物, 株式, WAR
- 対応市場:Supported exchanges
Order(orderType='MOC', action='取引の種類', totalQuantity=枚数)
注文受付時間やキャンセル受付時間など、本注文に関しては以下を参照してください。
市場オープン注文
市場のオープン時に自動的に送信される成行注文です。
- 対応商品:CFD, 先物, 株式, WAR
- 対応市場:Supported exchanges
Order(orderType='MKT', action='取引の種類', totalQuantity=枚数, tif='OPG')
注文受付時間やキャンセル受付時間など、本注文に関しては以下を参照してください。
スプレッド注文(コンボ注文)
同時に複数の注文を送信するスプレッド注文(コンボ注文)については以下に詳細を記載しましたので参照してください。
IFO注文(アイエフオー注文、ブラケット注文)Bracket Orders
新規注文時に決済の利確と損切を注文するIFO注文(アイエフオー注文)をIB証券ではブラケット注文(Bracket Orders)と言います。
以下のページで詳細をまとめていますので参照してください。
APIでIFO注文(アイエフオー注文、ブラケット注文)Bracket Orders
OCO注文(オー・シー・オー注文)、OCA注文(One-Cancels-All)
OCO注文(One Cancels the Other)
新規注文時または決済注文時に、2つの指値を注文し、どちらか一方が約定したら、もう一方をキャンセルするのが、OCO注文(One Cancels the Other)になります。
このOCO注文はIB証券では用意されていません。その代わり以下のOCA注文(One Cancels All)があります。
OCA注文(One-Cancels-All)
OCA注文(One Cancels All)は、新規注文時または決済注文時に、複数の指値を注文し、1つが約定したら、その他の全ての注文をキャンセルします。
しかも、この場合、新規注文時では同じ金融商品である必要はなく、たとえば米国株式のGAFAの4つの株式を指値で注文して、そのうち1つが約定すれば、他の発注をキャンセルできるというものです。
全ての金融商品に対応しています。
OCA注文の詳細については以下を参照してください。
システムの仕様については以下のIB証券のサイトを参照してください。
ib_insyncではありませんが参考になると思います。
ib_insyncのサイトは詳しくは記載されていませんが、以下のページです。
トレール注文(トレイリング・ストップ注文)
IB証券のトレール注文は、利益の値幅に達すると逆指値の利確を発注します。そして、その利確の逆指値をレートの上昇とともに逆指値も上昇させるというものです。
もしかすると証券会社やFX会社によって仕様が少しことなるかもしれませんので注意してください。
IB証券ではトレール注文のことをトレイリング・ストップ注文と呼びます。
トレイリング・ストップ注文の方法については以下を参照してください。
システムの仕様についてはIB証券のサイトを参照してください。*ib_insyncではありません。
なお、ブラケット注文にトレイリング・ストップ注文を入れることはエラーがでて駄目なようです。
Invalid side field was entered
ib_insyncのサイトでは説明がなく、ib_insyncの仕様にはありません。
簡単ではありますが、以下のようにするだけです。
前半は新規の成行注文で、後半が利確のためのトレール注文になります。
contract = Forex('EURUSD', exchange='IDEALPRO') limitPrice = 1.05 percent = 0.01 quantity = 100 market = MarketOrder('BUY', quantity) trade = ib.placeOrder(contract, market) print(trade) # Trade(contract=Forex('EURUSD', exchange='IDEALPRO'), order=MarketOrder(orderId=232, clientId=1002, action='BUY', totalQuantity=100, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 7, 18, 4, 38, 14, 550890, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')]) trailingStop = Order() trailingStop.action = "SELL" trailingStop.orderType = "TRAIL" trailingStop.totalQuantity = quantity trailingStop.trailingPercent = percent trailingStop.trailStopPrice = limitPrice - (price * percent) trailingtrade = ib.placeOrder(contract, trailingStop) print(trailingtrade) # Trade(contract=Forex('EURUSD', exchange='IDEALPRO'), order=Order(orderId=233, clientId=1002, action='SELL', totalQuantity=100, orderType='TRAIL', trailStopPrice=1.0395, trailingPercent=0.01, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 7, 18, 4, 38, 14, 554615, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])
その他の注文方法
以下を参照してください。
キャンセル
上記の指値注文のlimitTrade
より注文チケットを取得し、それをキャンセルオーダーに渡しています。
ib.cancelOrder(limitTrade.order) # Trade(contract=Forex('EURUSD', conId=12087792, exchange='IDEALPRO', localSymbol='EUR.USD', tradingClass='EUR.USD'), order=LimitOrder(orderId=54, clientId=1002, permId=367282512, action='BUY', totalQuantity=100.0, lmtPrice=1.05, auxPrice=0.0, tif='DAY', ocaType=3, trailStopPrice=2.05, openClose='', eTradeOnly=False, firmQuoteOnly=False, volatilityType=0, deltaNeutralOrderType='None', referencePriceType=0, account='', clearingIntent='IB', orderComboLegs=[], adjustedOrderType='None', conditions=[], softDollarTier=SoftDollarTier(), cashQty=0.0, dontUseAutoPriceForHedge=True), orderStatus=OrderStatus(status='PendingCancel', remaining=100.0, permId=367282512, clientId=1002), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 5, 20, 5, 8, 6, 291476, tzinfo=datetime.timezone.utc), status='PendingSubmit', message=''), TradeLogEntry(time=datetime.datetime(2020, 5, 20, 5, 8, 6, 443736, tzinfo=datetime.timezone.utc), status='PreSubmitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 5, 20, 5, 8, 6, 660085, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 5, 20, 5, 27, 0, 472443, tzinfo=datetime.timezone.utc), status='PendingCancel', message='')])
途中まで約定している注文はキャンセルできるか?
結論、できます。
以下に、例をあげます。
S&P500の先物ミニを50枚注文しました。
contract = Future(symbol='ES', lastTradeDateOrContractMonth='202009', exchange='GLOBEX', currency='USD') ib.qualifyContracts(contract) marketOrder = MarketOrder('BUY', 50) marketTrade = ib.placeOrder(contract, marketOrder) print(marketTrade) # Trade(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), order=MarketOrder(orderId=28, clientId=2002, action='BUY', totalQuantity=50), orderStatus=OrderStatus(orderId=28, status='PendingSubmit', filled=0, remaining=0, avgFillPrice=0.0, permId=0, parentId=0, lastFillPrice=0.0, clientId=0, whyHeld='', mktCapPrice=0.0), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 25, 331353, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])
途中でキャンセルしました。38枚まで約定されていました。もちろん建玉は38枚になります。
キャンセル手数料は取られていないようです。
cancel = ib.cancelOrder(marketTrade.order) print(cancel) # Trade(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), order=MarketOrder(orderId=28, clientId=2002, permId=1286505716, action='BUY', totalQuantity=50), orderStatus=OrderStatus(orderId=28, status='PendingCancel', filled=38.0, remaining=12.0, avgFillPrice=3359.5, permId=1286505716, parentId=0, lastFillPrice=3359.5, clientId=2002, whyHeld='', mktCapPrice=0.0), fills=[Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a0.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 25, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=5.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=5.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a0.01.01', commission=10.5, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 25, 755596, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a1.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 26, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=3.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=8.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a1.01.01', commission=6.3, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 26, 164804, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a2.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 26, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=7.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=15.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a2.01.01', commission=14.7, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 26, 176047, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a3.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 26, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=1.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=16.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a3.01.01', commission=2.1, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 26, 307839, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a4.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 27, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=5.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=21.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a4.01.01', commission=10.5, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 27, 165368, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a5.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 27, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=1.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=22.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a5.01.01', commission=2.1, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 27, 648914, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a6.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 27, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=3.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=25.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a6.01.01', commission=6.3, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 27, 761611, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a7.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 27, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=2.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=27.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a7.01.01', commission=4.2, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 27, 772768, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0a8.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 27, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=3.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=30.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0a8.01.01', commission=6.3, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 28, 23791, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0aa.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 31, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=4.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=34.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0aa.01.01', commission=8.4, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 31, 963186, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0ac.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 35, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=2.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=36.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0ac.01.01', commission=4.2, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 35, 849475, tzinfo=datetime.timezone.utc)), Fill(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), execution=Execution(execId='0000e1a7.5f5ea0ad.01.01', time=datetime.datetime(2020, 9, 13, 11, 42, 35, tzinfo=datetime.timezone.utc), acctNumber='DU1580586', exchange='GLOBEX', side='BOT', shares=2.0, price=3359.5, permId=1286505716, clientId=2002, orderId=28, liquidation=0, cumQty=38.0, avgPrice=3359.5, orderRef='', evRule='', evMultiplier=0.0, modelCode='', lastLiquidity=1), commissionReport=CommissionReport(execId='0000e1a7.5f5ea0ad.01.01', commission=4.2, currency='USD', realizedPNL=0.0, yield_=0.0, yieldRedemptionDate=0), time=datetime.datetime(2020, 9, 14, 0, 42, 35, 885658, tzinfo=datetime.timezone.utc))], log=[TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 25, 331353, tzinfo=datetime.timezone.utc), status='PendingSubmit', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 25, 670503, tzinfo=datetime.timezone.utc), status='PreSubmitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 25, 755596, tzinfo=datetime.timezone.utc), status='PreSubmitted', message='Fill 5.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 25, 765697, tzinfo=datetime.timezone.utc), status='PreSubmitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 25, 770028, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 26, 164804, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 3.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 26, 165401, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 26, 176047, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 7.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 26, 176484, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 26, 307839, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 1.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 26, 308460, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 165368, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 5.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 166142, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 648914, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 1.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 649406, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 761611, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 3.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 763707, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 772768, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 2.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 27, 773198, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 28, 23791, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 3.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 28, 24349, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 31, 963186, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 4.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 31, 963186, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 35, 849475, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 2.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 35, 849475, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 35, 885658, tzinfo=datetime.timezone.utc), status='Submitted', message='Fill 2.0@3359.5'), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 35, 885658, tzinfo=datetime.timezone.utc), status='Submitted', message=''), TradeLogEntry(time=datetime.datetime(2020, 9, 14, 0, 42, 38, 963455, tzinfo=datetime.timezone.utc), status='PendingCancel', message='')])
決済
決済は保有ポジションの逆の売買を注文すればいいだけです。
IB証券は、注文を複数回して保有した金融商品について、注文個別にチケット番号などを保持していません。
決済の場合は、先入れ先出し方式になっています。また両建てもできません。
コメント