IB API butterfly

Discussion in 'App Development' started by 2rosy, Oct 28, 2013.

  1. 2rosy

    2rosy

    anyone know how to create a butterfly spread through IB's api (java or python)?

    I can create a 2 legged BAG. I can create a 3 legged BAG but not at different ratio sizes.

    here's what I have

    Code:
    class BagBuilder(object):
        def __init__(self):
            self.addAllLegs = []
    
        def addLeg (self,cid,ratio,side,exchange):
            leg =  ComboLeg()
            #print "conid in bag %s" % (cid)
            leg.m_conId = cid
            leg.m_ratio = ratio
            leg.m_action = side
            leg.m_exchange = exchange
            leg.m_openClose = 0
            leg.m_shortSaleSlot = 0
            leg.m_designatedLocation = ""
            self.addAllLegs.append(leg)
    
        def create(self,symbol):
            contract = Contract()
            contract.m_symbol = "USD"     # For combo order use ?USD? as the symbol value all the time
            contract.m_secType = "BAG"   # BAG is the security type for COMBO order
            contract.m_exchange = self.addAllLegs[0].m_exchange
            contract.m_currency = "USD"
            contract.m_comboLegs = self.addAllLegs #including combo order in contract object
            contract.m_symbol = symbol
            return contract
    
    bb = BagBuilder()
    bb.addLeg(113982825,1,"SELL",'ECBOT')
    bb.addLeg(113982910,1,"SELL",'ECBOT')
    bb.addLeg(113983022,2,"BUY",'ECBOT')
    bg = bb.create('ZN')
    
    
     
  2. Here's some vba that does it - translating it to java should be pretty straightforward. There are four legs here that allow sending either an iron condor or butterfly (depending on arguments passed for conId2 and conId3 - the meat strikes).

    Code:
    
    Sub SubmitOrder(sym As String, exch As String, lmt As Double, qty As Long, conId1 As Long, conId2 As Long, conId3 As Long, conId4 As Long, ratio2 As Integer, ratio3 As Integer, ref As String)
    
    Dim comboLeg1 As TWSLib.IComboLeg
    Dim comboLeg2 As TWSLib.IComboLeg
    Dim comboLeg3 As TWSLib.IComboLeg
    Dim comboLeg4 As TWSLib.IComboLeg
                                      
        ' create contract structure
        Set objTWSControl.m_contractInfo = objTWSControl.m_TWSControl.createContract()
        ' create order structure
        Set objTWSControl.m_orderInfo = objTWSControl.m_TWSControl.createOrder()
        
            ' contract info
        With objTWSControl.m_contractInfo
            .symbol = sym
            .secType = "BAG"
            .exchange = exch
            .currency = "USD"
        End With
    
        ' order info
        With objTWSControl.m_orderInfo
            .action = "BUY"
            .totalQuantity = qty
            .orderType = "LMT"
            .lmtPrice = lmt
            .timeInForce = "DAY"
            .orderRef = ref
            .transmit = True
        End With
    
        ' create combo leg list
        objTWSControl.m_contractInfo.comboLegs = objTWSControl.m_TWSControl.createComboLegList()
            
        ' create order combo leg list
        'objTWSControl.m_orderInfo.orderComboLegs = objTWSControl.m_TWSControl.createOrderComboLegList()
        
        If conId1 > 0 Then
            Set comboLeg1 = objTWSControl.m_contractInfo.comboLegs.Add()
            comboLeg1.conId = conId1
            comboLeg1.ratio = 1
            comboLeg1.action = "BUY"
            comboLeg1.exchange = exch
        End If
        
        If conId2 > 0 Then
            Set comboLeg2 = objTWSControl.m_contractInfo.comboLegs.Add()
            comboLeg2.conId = conId2
            comboLeg2.ratio = ratio2
            comboLeg2.action = "SELL"
            comboLeg2.exchange = exch
        End If
        
        If conId3 > 0 Then
            Set comboLeg3 = objTWSControl.m_contractInfo.comboLegs.Add()
            comboLeg3.conId = conId3
            comboLeg3.ratio = ratio3
            comboLeg3.action = "SELL"
            comboLeg3.exchange = exch
        End If
        
        If conId4 > 0 Then
            Set comboLeg4 = objTWSControl.m_contractInfo.comboLegs.Add()
            comboLeg4.conId = conId4
            comboLeg4.ratio = 1
            comboLeg4.action = "BUY"
            comboLeg4.exchange = exch
        End If
                                
        orderId = objTWSControl.m_orderId
        objTWSControl.m_orderId = orderId + 1
            
        'place order
        Call objTWSControl.m_TWSControl.placeOrderEx(orderId, objTWSControl.m_contractInfo, objTWSControl.m_orderInfo)
        
    End Sub