Skip to content

Commit 2a33e86

Browse files
committed
Gateways
1 parent 3c042b8 commit 2a33e86

10 files changed

Lines changed: 134 additions & 12 deletions

File tree

Core/Core/Enums/InstrumentEnum.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ namespace Core.Enums
22
{
33
public enum InstrumentEnum : byte
44
{
5-
Group,
65
Bonds,
76
Coins,
87
Shares,

Core/Core/Enums/OrderTimeSpanEnum.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ namespace Core.Enums
22
{
33
public enum OrderTimeSpanEnum : byte
44
{
5+
AM,
6+
PM,
57
DAY,
68
FOK,
79
GTC,

Gateways/Schwab/Libs/Grains/OptionsGrain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public override async Task<InstrumentsResponse> Options(Criteria criteria)
129129
case "OPTION": return InstrumentEnum.Options;
130130
}
131131

132-
return InstrumentEnum.Group;
132+
return null;
133133
}
134134

135135
/// <summary>

Gateways/Schwab/Libs/Grains/OrdersGrain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ protected virtual Order MapOrder(OrderMessage message)
179179
case "OPTION": return InstrumentEnum.Options;
180180
}
181181

182-
return InstrumentEnum.Group;
182+
return null;
183183
}
184184

185185
/// <summary>

Gateways/Schwab/Libs/Grains/PositionsGrain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ protected virtual Order MapPosition(PositionMessage message)
133133
case "OPTION": return InstrumentEnum.Options;
134134
}
135135

136-
return InstrumentEnum.Group;
136+
return null;
137137
}
138138

139139
/// <summary>

Gateways/Tradier/Libs/Grains/OptionsGrain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ protected virtual Instrument MapOption(OptionMessage message)
179179
case "OPTION": return InstrumentEnum.Options;
180180
}
181181

182-
return InstrumentEnum.Group;
182+
return null;
183183
}
184184
}
185185
}

Gateways/Tradier/Libs/Grains/OrderSenderGrain.cs

Lines changed: 125 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
using System.Linq;
44
using System.Threading;
55
using System.Threading.Tasks;
6+
using Tradier.Enums;
7+
using Tradier.Messages.Trading;
8+
using Tradier.Queries.Trading;
69

710
namespace 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
}

Gateways/Tradier/Libs/Grains/OrdersGrain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ protected virtual Order MapOrder(OrderMessage message)
179179
case "OPTION": return InstrumentEnum.Options;
180180
}
181181

182-
return InstrumentEnum.Group;
182+
return null;
183183
}
184184
}
185185
}

Gateways/Tradier/Libs/Grains/PositionsGrain.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public static Order MapPosition(PositionMessage message)
8383
Name = message.Symbol
8484
};
8585

86-
if (instrument.Derivative is not null)
86+
if (instrument.Name.Length > 10)
8787
{
8888
instrument = instrument with
8989
{

Gateways/Tradier/Libs/Tradier.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="TradierBroker" Version="0.0.1" />
11+
<PackageReference Include="TradierBroker" Version="0.0.5" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

0 commit comments

Comments
 (0)