33using System . Linq ;
44using System . Threading ;
55using System . Threading . Tasks ;
6+ using Tradier . Enums ;
7+ using Tradier . Messages . Trading ;
8+ using Tradier . Queries . Trading ;
69
710namespace Tradier . Grains
811{
@@ -18,12 +21,130 @@ public class TradierOrderSenderGrain : TradierOrdersGrain, ITradierOrderSenderGr
1821 /// <param name="order"></param>
1922 public override async Task < OrderResponse > Send ( Order order )
2023 {
21- //var message = MapOrder(order);
22- //var accountCode = order.Account.Descriptor;
23- //var messageResponse = await connector.SendOrder(message, accountCode, CancellationToken.None);
24- //var response = new OrderResponse { Data = new() { Id = messageResponse.OrderId } };
24+ var message = MapOrder ( order ) ;
25+ var response = null as OrderResponseMessage ;
26+ var cleaner = new CancellationTokenSource ( state . Timeout ) ;
27+
28+ if ( order . Orders . Count is 0 )
29+ {
30+ switch ( order . Operation . Instrument . Type )
31+ {
32+ case InstrumentEnum . Shares : response = await connector . SendEquityOrder ( message , cleaner . Token ) ; break ;
33+ case InstrumentEnum . Options : response = await connector . SendOptionOrder ( message , cleaner . Token ) ; break ;
34+ }
35+ }
36+ else
37+ {
38+ var isBrace = order . Orders . Any ( o => o . Instruction is InstructionEnum . Brace ) ;
39+ var isCombo = order
40+ . Orders
41+ . Append ( order )
42+ . Where ( o => o ? . Amount is not null )
43+ . Any ( o => o ? . Operation ? . Instrument ? . Type is InstrumentEnum . Shares ) ;
44+
45+ switch ( true )
46+ {
47+ case true when isBrace : response = await connector . SendOtocoOrder ( message , cleaner . Token ) ; break ;
48+ case true when isCombo : response = await connector . SendComboOrder ( message , cleaner . Token ) ; break ;
49+ case true when isCombo is false : response = await connector . SendGroupOrder ( message , cleaner . Token ) ; break ;
50+ }
51+ }
52+
53+ if ( Equals ( response ? . Status ? . ToUpper ( ) , "OK" ) )
54+ {
55+ order = order with { Operation = order . Operation with { Id = $ "{ response ? . Id } " } } ;
56+ }
57+
58+ return new ( )
59+ {
60+ Data = order
61+ } ;
62+ }
63+
64+ /// <summary>
65+ /// Map order
66+ /// </summary>
67+ /// <param name="order"></param>
68+ protected virtual OpenOrderRequest MapOrder ( Order order )
69+ {
70+ OpenOrderRequest map ( Order o )
71+ {
72+ var response = new OpenOrderRequest ( ) ;
73+
74+ response . Price = o . Price ;
75+ response . Quantity = o . Amount ;
76+ response . AccountNumber = o . Account . Descriptor ;
77+ response . Duration = MapTimeSpan ( o ) ;
78+ response . Side = MapOrderSide ( o ) ;
79+
80+ if ( o ? . Operation ? . Instrument ? . Type is InstrumentEnum . Options )
81+ {
82+ response . OptionSymbol = o . Operation . Instrument . Name ;
83+ }
84+
85+ return response ;
86+ }
87+
88+ var response = new OpenOrderRequest ( ) ;
89+
90+ if ( order . Amount is not 0 )
91+ {
92+ response = map ( order ) ;
93+ }
94+
95+ foreach ( var o in order . Orders )
96+ {
97+ response . Legs . Add ( map ( o ) ) ;
98+ }
99+
100+ return response ;
101+ }
102+
103+ /// <summary>
104+ /// Order side
105+ /// </summary>
106+ /// <param name="order"></param>
107+ protected virtual Tradier . Enums . OrderSideEnum ? MapOrderSide ( Order order )
108+ {
109+ switch ( order . Side )
110+ {
111+ case Core . Enums . OrderSideEnum . Long : return Tradier . Enums . OrderSideEnum . BUY ;
112+ case Core . Enums . OrderSideEnum . Short : return Tradier . Enums . OrderSideEnum . SELL ;
113+ }
25114
26115 return null ;
27116 }
117+
118+ /// <summary>
119+ /// Order type
120+ /// </summary>
121+ /// <param name="order"></param>
122+ protected virtual string MapOrderType ( Order order )
123+ {
124+ switch ( order . Type )
125+ {
126+ case Core . Enums . OrderTypeEnum . Stop : return "stop" ;
127+ case Core . Enums . OrderTypeEnum . Limit : return "limit" ;
128+ case Core . Enums . OrderTypeEnum . StopLimit : return "stop_limit" ;
129+ }
130+
131+ return "market" ;
132+ }
133+
134+ /// <summary>
135+ /// Convert local time in force to remote
136+ /// </summary>
137+ /// <param name="order"></param>
138+ protected virtual OrderDurationEnum MapTimeSpan ( Order order )
139+ {
140+ switch ( order . TimeSpan )
141+ {
142+ case OrderTimeSpanEnum . AM : return OrderDurationEnum . PRE ;
143+ case OrderTimeSpanEnum . PM : return OrderDurationEnum . POST ;
144+ case OrderTimeSpanEnum . GTC : return OrderDurationEnum . GTC ;
145+ }
146+
147+ return OrderDurationEnum . DAY ;
148+ }
28149 }
29150}
0 commit comments