@@ -513,18 +513,18 @@ public void SerializeLegAttributes()
513513 Assert . AreEqual ( expectedLegAttributes , actualLegAttributes ) ;
514514 }
515515
516- [ TestCase ( OrderType . Market , InstrumentType . Equity , OrderAction . BuyToOpen , TimeInForce . Day , null , null , null , null ) ]
517- [ TestCase ( OrderType . Market , InstrumentType . EquityOption , OrderAction . Sell , TimeInForce . Day , null , null , null , null ) ]
518- [ TestCase ( OrderType . Limit , InstrumentType . Future , OrderAction . BuyToOpen , TimeInForce . GoodTillCancel , null , 100 , null , Orders . OrderDirection . Buy ) ]
519- [ TestCase ( OrderType . Limit , InstrumentType . FutureOption , OrderAction . SellToClose , TimeInForce . GoodTillCancel , null , 200 , null , Orders . OrderDirection . Sell ) ]
520- [ TestCase ( OrderType . Stop , InstrumentType . Equity , OrderAction . BuyToOpen , TimeInForce . GoodTilDate , "2025/05/30" , null , 210 , null ) ]
521- [ TestCase ( OrderType . Stop , InstrumentType . EquityOption , OrderAction . SellToOpen , TimeInForce . GoodTillCancel , null , null , 190 , null ) ]
522- [ TestCase ( OrderType . Stop , InstrumentType . Equity , OrderAction . Buy , TimeInForce . Day , null , null , 190 , null ) ]
523- [ TestCase ( OrderType . StopLimit , InstrumentType . Equity , OrderAction . Buy , TimeInForce . GoodTilDate , "2025/05/30" , 180 , 190 , Orders . OrderDirection . Buy ) ]
524- [ TestCase ( OrderType . StopLimit , InstrumentType . EquityOption , OrderAction . SellToOpen , TimeInForce . Day , null , 200 , 190 , Orders . OrderDirection . Sell ) ]
525- public void SerializeVariousOrderTypeRequestMessage ( OrderType orderType , InstrumentType instrumentType , OrderAction legOrderAction , TimeInForce timeInForce , DateTime ? expiryDateTime , decimal ? limitPrice , decimal ? stopPrice , Orders . OrderDirection ? leanOrderDirection )
526- {
527- var legAttributes = new List < LegAttributes > { new LegAttributes ( legOrderAction , instrumentType , 1m , "AAPL 230818C00197500" ) } ;
516+ [ TestCase ( OrderType . Market , InstrumentType . Equity , OrderAction . BuyToOpen , TimeInForce . Day , null , null , null , 1 , null ) ]
517+ [ TestCase ( OrderType . Market , InstrumentType . EquityOption , OrderAction . Sell , TimeInForce . Day , null , null , null , 1 , null ) ]
518+ [ TestCase ( OrderType . Limit , InstrumentType . Future , OrderAction . BuyToOpen , TimeInForce . GoodTillCancel , null , 100 , null , 1 , PriceEffect . Debit ) ]
519+ [ TestCase ( OrderType . Limit , InstrumentType . FutureOption , OrderAction . SellToClose , TimeInForce . GoodTillCancel , null , 200 , null , - 1 , PriceEffect . Credit ) ]
520+ [ TestCase ( OrderType . Stop , InstrumentType . Equity , OrderAction . BuyToOpen , TimeInForce . GoodTilDate , "2025/05/30" , null , 210 , 1 , null ) ]
521+ [ TestCase ( OrderType . Stop , InstrumentType . EquityOption , OrderAction . SellToOpen , TimeInForce . GoodTillCancel , null , null , 190 , 1 , null ) ]
522+ [ TestCase ( OrderType . Stop , InstrumentType . Equity , OrderAction . Buy , TimeInForce . Day , null , null , 190 , 1 , null ) ]
523+ [ TestCase ( OrderType . StopLimit , InstrumentType . Equity , OrderAction . Buy , TimeInForce . GoodTilDate , "2025/05/30" , 180 , 190 , 1 , PriceEffect . Debit ) ]
524+ [ TestCase ( OrderType . StopLimit , InstrumentType . EquityOption , OrderAction . SellToOpen , TimeInForce . Day , null , 200 , 190 , - 1 , PriceEffect . Credit ) ]
525+ public void SerializeVariousOrderTypeRequestMessage ( OrderType orderType , InstrumentType instrumentType , OrderAction legOrderAction , TimeInForce timeInForce , DateTime ? expiryDateTime , decimal ? limitPrice , decimal ? stopPrice , decimal quantity , PriceEffect ? expectedPriceEffect )
526+ {
527+ var legAttributes = new List < LegAttributes > { new LegAttributes ( legOrderAction , instrumentType , quantity , "AAPL 230818C00197500" ) } ;
528528
529529 var order = default ( OrderBaseRequest ) ;
530530 switch ( orderType )
@@ -533,18 +533,60 @@ public void SerializeVariousOrderTypeRequestMessage(OrderType orderType, Instrum
533533 order = new MarketOrderRequest ( legAttributes ) ;
534534 break ;
535535 case OrderType . Limit :
536- order = new LimitOrderRequest ( timeInForce , expiryDateTime , legAttributes , limitPrice . Value , leanOrderDirection . Value ) ;
536+ var lo = new Orders . LimitOrder ( default , quantity , limitPrice . Value , default ) ;
537+ order = new LimitOrderRequest ( timeInForce , expiryDateTime , legAttributes , limitPrice . Value , lo . GetPriceEffect ( ) ) ;
537538 break ;
538539 case OrderType . Stop :
539540 order = new StopMarketOrderRequest ( timeInForce , expiryDateTime , legAttributes , stopPrice . Value , instrumentType ) ;
540541 break ;
541542 case OrderType . StopLimit :
542- order = new StopLimitOrderRequest ( timeInForce , expiryDateTime , legAttributes , limitPrice . Value , stopPrice . Value , leanOrderDirection . Value ) ;
543+ var slo = new Orders . StopLimitOrder ( default , quantity , default , default , default ) ;
544+ order = new StopLimitOrderRequest ( timeInForce , expiryDateTime , legAttributes , limitPrice . Value , stopPrice . Value , slo . GetPriceEffect ( ) ) ;
543545 break ;
544546 default :
545547 throw new NotSupportedException ( ) ;
546548 }
547549
550+ if ( expectedPriceEffect != null )
551+ {
552+ Assert . AreEqual ( expectedPriceEffect . Value , order . PriceEffect . Value ) ;
553+ }
554+
555+ var orderJson = order . ToJson ( ) ;
556+
557+ AssertIsNotNullAndIsNotEmpty ( orderJson ) ;
558+ }
559+
560+ [ TestCase ( true , 0.65 , PriceEffect . Debit ) ]
561+ [ TestCase ( false , - 0.65 , PriceEffect . Credit ) ]
562+ public void SerializeComboLimitOrderTypeRequestMessage ( bool isLong , decimal limitPrice , PriceEffect expectedPriceEffect )
563+ {
564+ var buyToOpen = new LegAttributes ( OrderAction . BuyToOpen , InstrumentType . EquityOption , 1m , "AAPL 251107C00275000" ) ;
565+ var sellToOpen = new LegAttributes ( OrderAction . SellToOpen , InstrumentType . EquityOption , 1m , "AAPL 251107C00270000" ) ;
566+
567+ var legs = default ( List < LegAttributes > ) ;
568+ var groupOrderManager = default ( Orders . GroupOrderManager ) ;
569+ if ( isLong )
570+ {
571+ // Vertical: Long
572+ legs = [ buyToOpen , sellToOpen ] ;
573+ groupOrderManager = new Orders . GroupOrderManager ( legs . Count , quantity : 1 , limitPrice ) ;
574+ }
575+ else
576+ {
577+ // Vertical: Short
578+ legs = [ sellToOpen , buyToOpen ] ;
579+ groupOrderManager = new Orders . GroupOrderManager ( legs . Count , quantity : 1 , limitPrice ) ;
580+ }
581+
582+ var clo = new Orders . ComboLimitOrder ( default , 1 , limitPrice , default , groupOrderManager ) ;
583+
584+ var order = new LimitOrderRequest ( TimeInForce . GoodTillCancel , default , legs , groupOrderManager . LimitPrice , clo . GetPriceEffect ( ) ) ;
585+
586+ Assert . AreEqual ( expectedPriceEffect , order . PriceEffect ) ;
587+ Assert . True ( order . Price . HasValue ) ;
588+ Assert . False ( decimal . IsNegative ( order . Price . Value ) ) ;
589+
548590 var orderJson = order . ToJson ( ) ;
549591
550592 AssertIsNotNullAndIsNotEmpty ( orderJson ) ;
0 commit comments