Skip to content

Commit 238fe58

Browse files
committed
Added support for zero strike
1 parent fda1fc7 commit 238fe58

File tree

6 files changed

+47
-15
lines changed

6 files changed

+47
-15
lines changed

client.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func (me *MsgEncoder) encodeContract(v *Contract) *MsgEncoder {
204204
me.encodeString(v.Symbol)
205205
me.encodeString(v.SecType)
206206
me.encodeString(v.LastTradeDateOrContractMonth)
207-
me.encodeFloat64(v.Strike)
207+
me.encodeFloatMax(v.Strike)
208208
me.encodeString(v.Right)
209209
me.encodeString(v.Multiplier)
210210
me.encodeString(v.Exchange)
@@ -663,7 +663,7 @@ func (c *EClient) ReqMktData(reqID TickerID, contract *Contract, genericTickList
663663
me.encodeString(contract.Symbol)
664664
me.encodeString(contract.SecType)
665665
me.encodeString(contract.LastTradeDateOrContractMonth)
666-
me.encodeFloat64(contract.Strike)
666+
me.encodeFloatMax(contract.Strike)
667667
me.encodeString(contract.Right)
668668
me.encodeString(contract.Multiplier) // srv v15 and above
669669
me.encodeString(contract.Exchange)
@@ -839,7 +839,7 @@ func (c *EClient) ReqTickByTickData(reqID int64, contract *Contract, tickType st
839839
me.encodeString(contract.Symbol)
840840
me.encodeString(contract.SecType)
841841
me.encodeString(contract.LastTradeDateOrContractMonth)
842-
me.encodeFloat64(contract.Strike)
842+
me.encodeFloatMax(contract.Strike)
843843
me.encodeString(contract.Right)
844844
me.encodeString(contract.Multiplier)
845845
me.encodeString(contract.Exchange)
@@ -912,7 +912,7 @@ func (c *EClient) CalculateImpliedVolatility(reqID int64, contract *Contract, op
912912
me.encodeString(contract.Symbol)
913913
me.encodeString(contract.SecType)
914914
me.encodeString(contract.LastTradeDateOrContractMonth)
915-
me.encodeFloat64(contract.Strike)
915+
me.encodeFloatMax(contract.Strike)
916916
me.encodeString(contract.Right)
917917
me.encodeString(contract.Multiplier)
918918
me.encodeString(contract.Exchange)
@@ -992,7 +992,7 @@ func (c *EClient) CalculateOptionPrice(reqID int64, contract *Contract, volatili
992992
me.encodeString(contract.Symbol)
993993
me.encodeString(contract.SecType)
994994
me.encodeString(contract.LastTradeDateOrContractMonth)
995-
me.encodeFloat64(contract.Strike)
995+
me.encodeFloatMax(contract.Strike)
996996
me.encodeString(contract.Right)
997997
me.encodeString(contract.Multiplier)
998998
me.encodeString(contract.Exchange)
@@ -1099,7 +1099,7 @@ func (c *EClient) ExerciseOptions(reqID TickerID, contract *Contract, exerciseAc
10991099
me.encodeString(contract.Symbol)
11001100
me.encodeString(contract.SecType)
11011101
me.encodeString(contract.LastTradeDateOrContractMonth)
1102-
me.encodeFloat64(contract.Strike)
1102+
me.encodeFloatMax(contract.Strike)
11031103
me.encodeString(contract.Right)
11041104
me.encodeString(contract.Multiplier)
11051105
me.encodeString(contract.Exchange)
@@ -1397,7 +1397,7 @@ func (c *EClient) PlaceOrder(orderID OrderID, contract *Contract, order *Order)
13971397
me.encodeString(contract.Symbol)
13981398
me.encodeString(contract.SecType)
13991399
me.encodeString(contract.LastTradeDateOrContractMonth)
1400-
me.encodeFloat64(contract.Strike)
1400+
me.encodeFloatMax(contract.Strike)
14011401
me.encodeString(contract.Right)
14021402
me.encodeString(contract.Multiplier) // srv v15 and above
14031403
me.encodeString(contract.Exchange)
@@ -2495,7 +2495,7 @@ func (c *EClient) ReqContractDetails(reqID int64, contract *Contract) {
24952495
me.encodeString(contract.Symbol)
24962496
me.encodeString(contract.SecType)
24972497
me.encodeString(contract.LastTradeDateOrContractMonth)
2498-
me.encodeFloat64(contract.Strike)
2498+
me.encodeFloatMax(contract.Strike)
24992499
me.encodeString(contract.Right)
25002500
me.encodeString(contract.Multiplier) // srv v15 and above
25012501

@@ -2607,7 +2607,7 @@ func (c *EClient) ReqMktDepth(reqID int64, contract *Contract, numRows int, isSm
26072607
me.encodeString(contract.Symbol)
26082608
me.encodeString(contract.SecType)
26092609
me.encodeString(contract.LastTradeDateOrContractMonth)
2610-
me.encodeFloat64(contract.Strike)
2610+
me.encodeFloatMax(contract.Strike)
26112611
me.encodeString(contract.Right)
26122612
me.encodeString(contract.Multiplier) // srv v15 and above
26132613
me.encodeString(contract.Exchange)
@@ -2878,7 +2878,7 @@ func (c *EClient) ReqHistoricalData(reqID int64, contract *Contract, endDateTime
28782878
me.encodeString(contract.Symbol)
28792879
me.encodeString(contract.SecType)
28802880
me.encodeString(contract.LastTradeDateOrContractMonth)
2881-
me.encodeFloat64(contract.Strike)
2881+
me.encodeFloatMax(contract.Strike)
28822882
me.encodeString(contract.Right)
28832883
me.encodeString(contract.Multiplier)
28842884
me.encodeString(contract.Exchange)
@@ -3219,7 +3219,7 @@ func (c *EClient) ReqRealTimeBars(reqID int64, contract *Contract, barSize int,
32193219
me.encodeString(contract.Symbol)
32203220
me.encodeString(contract.SecType)
32213221
me.encodeString(contract.LastTradeDateOrContractMonth)
3222-
me.encodeFloat64(contract.Strike)
3222+
me.encodeFloatMax(contract.Strike)
32233223
me.encodeString(contract.Right)
32243224
me.encodeString(contract.Multiplier)
32253225
me.encodeString(contract.Exchange)

client_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,9 @@ func TestOrderOperations(t *testing.T) {
441441

442442
// Imbalance only order
443443
ib.PlaceOrder(nextID(), USStockAtSmart(), LimitOnCloseOrderWithImbalanceOnly("BUY", StringToDecimal("100"), 44.44))
444+
445+
// zero strike order
446+
ib.PlaceOrder(nextID(), OptForecastxZeroStrike(), LimitOrder("BUY", StringToDecimal("1"), 0.05))
444447
}
445448

446449
func TestOcaSamples(t *testing.T) {

contract.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ type Contract struct {
6161
SecType string
6262
LastTradeDateOrContractMonth string
6363
LastTradeDate string
64-
Strike float64 // float64 !!
64+
Strike float64 // UNSET_FLOAT
6565
Right string
6666
Multiplier string
6767
Exchange string
@@ -84,7 +84,9 @@ type Contract struct {
8484
}
8585

8686
func NewContract() *Contract {
87-
return &Contract{}
87+
return &Contract{
88+
Strike: UNSET_FLOAT,
89+
}
8890
}
8991

9092
func (c *Contract) Equal(other *Contract) bool {

contract_samples.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,3 +772,29 @@ func Fund() *Contract {
772772

773773
return contract
774774
}
775+
776+
func OptForecastx() *Contract {
777+
778+
contract := NewContract()
779+
contract.Symbol = "CPIY"
780+
contract.SecType = "OPT"
781+
contract.LastTradeDateOrContractMonth = "202612"
782+
contract.Exchange = "FORECASTX"
783+
contract.Currency = "USD"
784+
785+
return contract
786+
}
787+
788+
func OptForecastxZeroStrike() *Contract {
789+
790+
contract := NewContract()
791+
contract.Symbol = "CPIY"
792+
contract.SecType = "OPT"
793+
contract.LastTradeDateOrContractMonth = "202612"
794+
contract.Exchange = "FORECASTX"
795+
contract.Currency = "USD"
796+
contract.Strike = 0
797+
contract.Right = "C"
798+
799+
return contract
800+
}

server_versions.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,11 @@ const (
148148
MIN_SERVER_VER_IMBALANCE_ONLY Version = 199
149149
MIN_SERVER_VER_PARAMETRIZED_DAYS_OF_EXECUTIONS Version = 200
150150
MIN_SERVER_VER_PROTOBUF Version = 201
151+
MIN_SERVER_VER_ZERO_STRIKE_PRICE Version = 202
151152

152153
// 100+ messaging
153154
// 100 = enhanced handshake, msg length prefixes
154155

155156
MIN_CLIENT_VER = 100
156-
MAX_CLIENT_VER = MIN_SERVER_VER_PROTOBUF
157+
MAX_CLIENT_VER = MIN_SERVER_VER_ZERO_STRIKE_PRICE
157158
)

wrapper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ func (w Wrapper) OrderStatus(orderID OrderID, status string, filled Decimal, rem
325325
func (w Wrapper) OpenOrder(orderID OrderID, contract *Contract, order *Order, orderState *OrderState) {
326326
logger := log.Info().Str("PermID", LongMaxString(order.PermID)).Str("ClientID", IntMaxString(order.ClientID)).Str("OrderID", IntMaxString(order.OrderID))
327327
logger = logger.Str("Account", order.Account).Str("Symbol", contract.Symbol).Str("SecType", contract.SecType)
328-
logger = logger.Str("Exchange", contract.Exchange).Str("Action", order.Action).Str("OrderType", order.OrderType)
328+
logger = logger.Str("Exchange", contract.Exchange).Float64("Strike", contract.Strike).Str("Action", order.Action).Str("OrderType", order.OrderType)
329329
logger = logger.Str("TotalQuantity", DecimalMaxString(order.TotalQuantity)).Str("CashQty", FloatMaxString(order.CashQty))
330330
logger = logger.Str("LmtPrice", FloatMaxString(order.LmtPrice)).Str("AuxPrice", FloatMaxString(order.AuxPrice)).Str("Status", orderState.Status)
331331
logger = logger.Str("MinTradeQty", IntMaxString(order.MinTradeQty)).Str("MinCompeteSize", IntMaxString(order.MinCompeteSize))

0 commit comments

Comments
 (0)