IFO注文(アイエフオー注文)は、新規注文と同時に決済注文と損切注文(ストップロス)を出す方法です。
IB証券では、IFO注文をブラケット注文(Bracket Orders)と言います。
対応している取引可能商品は、株式、FX、CFD、投資信託、先物、オプションなど全てとなっています。
詳しくは以下の参照してください。
ホーム | インタラクティブ・ブローカーズ証券株式会社
株式やオプション、先物、通貨、そして債券やファンドに直接アクセス可能な、トレーダー、投資家、およびアドバイザーのお客様のためのオンライン取引ソリューションです。透明性の高い低額な約定手数料と借入金利、そして最良約定のためのサポートです。
前提
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つまとめて注文されます。
コメント