forked from alpacahq/alpaca-trade-api-csharp
/
NewOrderRequest.cs
161 lines (144 loc) · 4.9 KB
/
NewOrderRequest.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
namespace Alpaca.Markets;
/// <summary>
/// Encapsulates request parameters for <see cref="IAlpacaTradingClient.PostOrderAsync(NewOrderRequest,CancellationToken)"/> call.
/// </summary>
[UsedImplicitly]
public sealed class NewOrderRequest : Validation.IRequest
{
/// <summary>
/// Creates new instance of <see cref="NewOrderRequest"/> object.
/// </summary>
/// <param name="symbol">Order asset symbol.</param>
/// <param name="quantity">Order quantity.</param>
/// <param name="side">Order side (buy or sell).</param>
/// <param name="type">Order type.</param>
/// <param name="duration">Order duration.</param>
/// <exception cref="ArgumentNullException">
/// The <paramref name="symbol"/> argument is <c>null</c>.
/// </exception>
public NewOrderRequest(
String symbol,
OrderQuantity quantity,
OrderSide side,
OrderType type,
TimeInForce duration)
{
Symbol = symbol.EnsureNotNull();
Quantity = quantity;
Side = side;
Type = type;
Duration = duration;
}
/// <summary>
/// Gets the new order asset symbol.
/// </summary>
[UsedImplicitly]
public String Symbol { get; }
/// <summary>
/// Gets the new order quantity.
/// </summary>
[UsedImplicitly]
public OrderQuantity Quantity { get; }
/// <summary>
/// Gets the new order side (buy or sell).
/// </summary>
[UsedImplicitly]
public OrderSide Side { get; }
/// <summary>
/// Gets the new order type.
/// </summary>
[UsedImplicitly]
public OrderType Type { get; }
/// <summary>
/// Gets the new order duration.
/// </summary>
[UsedImplicitly]
public TimeInForce Duration { get; }
/// <summary>
/// Gets or sets the new order limit price.
/// </summary>
[UsedImplicitly]
public Decimal? LimitPrice { get; set; }
/// <summary>
/// Gets or sets the new order stop price.
/// </summary>
[UsedImplicitly]
public Decimal? StopPrice { get; set; }
/// <summary>
/// Gets or sets the new trailing order trail price offset in dollars.
/// </summary>
[UsedImplicitly]
public Decimal? TrailOffsetInDollars { get; set; }
/// <summary>
/// Gets or sets the new trailing order trail price offset in percent.
/// </summary>
[UsedImplicitly]
public Decimal? TrailOffsetInPercent { get; set; }
/// <summary>
/// Gets or sets the client order ID. This user-specified ID must be unique if set.
/// </summary>
[UsedImplicitly]
public String? ClientOrderId { get; set; }
/// <summary>
/// Gets or sets flag indicating that order should be allowed to execute during extended hours trading.
/// </summary>
[UsedImplicitly]
public Boolean? ExtendedHours { get; set; }
/// <summary>
/// Gets or sets the order class for advanced order types.
/// </summary>
[UsedImplicitly]
public OrderClass? OrderClass { get; set; }
/// <summary>
/// Gets or sets the profit taking limit price for advanced order types.
/// </summary>
[UsedImplicitly]
public Decimal? TakeProfitLimitPrice { get; set; }
/// <summary>
/// Gets or sets the stop loss stop price for advanced order types.
/// </summary>
[UsedImplicitly]
public Decimal? StopLossStopPrice { get; set; }
/// <summary>
/// Gets or sets the stop loss limit price for advanced order types.
/// </summary>
[UsedImplicitly]
public Decimal? StopLossLimitPrice { get; set; }
IEnumerable<RequestValidationException?> Validation.IRequest.GetExceptions()
{
ClientOrderId = ClientOrderId?.TrimClientOrderId();
yield return Symbol.TryValidateSymbolName();
yield return Quantity.TryValidateQuantity();
}
internal JsonNewOrder GetJsonRequest() =>
new()
{
Symbol = Symbol,
OrderSide = Side,
OrderType = Type,
StopPrice = StopPrice,
TimeInForce = Duration,
LimitPrice = LimitPrice,
OrderClass = OrderClass,
ClientOrderId = ClientOrderId,
ExtendedHours = ExtendedHours,
Notional = Quantity.AsNotional(),
Quantity = Quantity.AsFractional(),
TrailOffsetInDollars = TrailOffsetInDollars,
TrailOffsetInPercent = TrailOffsetInPercent,
TakeProfit = TakeProfitLimitPrice is not null
? new JsonNewOrderAdvancedAttributes
{
LimitPrice = TakeProfitLimitPrice
}
: null,
StopLoss = StopLossStopPrice is not null ||
StopLossLimitPrice is not null
? new JsonNewOrderAdvancedAttributes
{
StopPrice = StopLossStopPrice,
LimitPrice = StopLossLimitPrice
}
: null
};
}