IB証券のAPIでIFO注文(アイエフオー注文、ブラケット注文)Bracket Orders

スポンサーリンク

IFO注文(アイエフオー注文)は、新規注文と同時に決済注文と損切注文(ストップロス)を出す方法です。

IB証券では、IFO注文をブラケット注文(Bracket Orders)と言います。
対応している取引可能商品は、株式、FX、CFD、投資信託、先物、オプションなど全てとなっています。
詳しくは以下の参照してください。

ホーム | Interactive Brokers Securities Japan Inc.
株式やオプション、先物、通貨、そして債券やファンドに直接アクセス可能な、トレーダー、投資家、およびアドバイザーのお客様のためのオンライン取引ソリューションです。透明性の高い低額な約定手数料と借入金利、そして最良約定のためのサポートです。
スポンサーリンク

前提

API接続

このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法

金融商品の設定

詳しくは以下を参照してください。
IB証券 API接続での商品情報の設定

基本的な注文・決済の方法

詳しくは以下を参照してください。
APIで注文、決済

IFO注文(ブラケット注文)Bracket Ordersの方法

基本的な注文の流れは、通常と同じですが、商品情報を作成する際に、新規注文と決済注文の利確と損切りをまとめます(Bracket)。

以下の例は、S&P 500ミニ(E-mini S&P 500)の2020年09月限の先物のIFO注文(ブラケット注文)です。

contract = Future(symbol='ES', lastTradeDateOrContractMonth='202009', exchange='GLOBEX', currency='USD')

limitPrice = 3220
takeProfitPrice = limitPrice + 5
stopLossPrice = limitPrice - 5

bracket = ib.bracketOrder(
    action = 'BUY', 
    quantity = 1.0, 
    limitPrice = limitPrice, 
    takeProfitPrice = takeProfitPrice, 
    stopLossPrice = stopLossPrice
)

for o in bracket:
    bracketTrade = ib.placeOrder(contract, o)
    
    print(bracketTrade)

解説

contract = Future(symbol='ES', lastTradeDateOrContractMonth='202009', exchange='GLOBEX', currency='USD')

商品を設定します。

limitPrice = 3220
takeProfitPrice = limitPrice + 5
stopLossPrice = limitPrice - 5

以下の価格を設定します。上記の場合、新規注文の指値に対し、利確と損切をそれぞれプラスマイナス5ドルにしています。

  • limitPrice:新規注文の指値
  • takeProfitPrice:利確の指値
  • stopLossPrice:損切の指値
bracket = ib.bracketOrder(
    action = 'BUY', 
    quantity = 1.0, 
    limitPrice = limitPrice, 
    takeProfitPrice = takeProfitPrice, 
    stopLossPrice = stopLossPrice
)

# Trade(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), order=LimitOrder(orderId=180, clientId=1002, action='BUY', totalQuantity=1.0, lmtPrice=3220, transmit=False, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 7, 17, 12, 4, 2, 607292, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])

# Trade(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), order=LimitOrder(orderId=181, clientId=1002, action='SELL', totalQuantity=1.0, lmtPrice=3225, transmit=False, parentId=180, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 7, 17, 12, 4, 2, 620564, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])

# Trade(contract=Future(conId=371749798, symbol='ES', lastTradeDateOrContractMonth='20200918', multiplier='50', exchange='GLOBEX', currency='USD', localSymbol='ESU0', tradingClass='ES'), order=StopOrder(orderId=182, clientId=1002, action='SELL', totalQuantity=1.0, auxPrice=3215, parentId=180, conditions=[], softDollarTier=SoftDollarTier()), orderStatus=OrderStatus(status='PendingSubmit'), fills=[], log=[TradeLogEntry(time=datetime.datetime(2020, 7, 17, 12, 4, 2, 626520, tzinfo=datetime.timezone.utc), status='PendingSubmit', message='')])

ブラケットを作成します。

  • action:買い(BUY)か売り(SELL)を設定します。
  • quantity:発注する数量を設定します。
for o in bracket:
    bracketTrade = ib.placeOrder(contract, o)

ブラケットをループで回して個別に発注します。

ポイント

orderIdとparentId

新規注文のorderIdが、決済注文のparentIdに設定されています。これにより紐付けがされています。

transmit

3つの発注のうち、初めの2つのtransmitはFalseになっており、これはサーバに送信しないという意味です。
最後の注文のみtransmitがTrueになっています。これによって、orderIdとparentIdによって紐づく3つの注文がサーバに送信され、3つまとめて注文されます。

 

コメント

タイトルとURLをコピーしました