// Parent orders public void Insert(BfProductCode productCode, BfParentOrderRequest req, BfParentOrderResponse resp) { ParentOrders.Add(new DbParentOrder(productCode, req, resp)); for (int childOrderIndex = 0; childOrderIndex < req.Parameters.Count; childOrderIndex++) { ChildOrders.Add(new DbChildOrder(req, resp, childOrderIndex)); } }
/// <summary> /// 指定範囲の未消化の注文をキャンセルする /// </summary> /// <param name="minPrice"></param> /// <param name="maxPrice"></param> protected void CancelOrderAsync(double minPrice, double maxPrice) { if (ParentOrders != null) { var list = ParentOrders.Where(e => e.Price > minPrice && e.Price < maxPrice && e.Size == e.OutstandingSize); foreach (var item in list) { Client.AddCancelParentOrderList(item); } } else { Console.WriteLine("注文情報取得失敗のため、注文のキャンセルをしません"); } }
/// <summary> /// 一定時間経過した注文を強制決済する /// </summary> /// <returns></returns> protected async Task OrderStopLoss(int stopLossMinute, OrderSide side) { try { if (ParentOrders != null) { var now = DateTime.Now; var list = ParentOrders.Where(e => (now - e.Date).TotalMinutes > stopLossMinute && e.Side == side); double totalCancelSize = 0; foreach (var item in list) { var cancelSize = item.Size - item.OutstandingSize; if (!IsBuyOrder(item)) { // 売りの時はマイナスする cancelSize = cancelSize *= -1; } Console.WriteLine(stopLossMinute + "分経過のため決済:" + item.Price + ":" + cancelSize); totalCancelSize += cancelSize; } if (totalCancelSize != 0) { totalCancelSize = NonApiUtility.ToRoundDown(totalCancelSize, OrderFigures); Console.WriteLine("決済:" + totalCancelSize); if (totalCancelSize > 0) { await Client.Sell(totalCancelSize); } else { await Client.Buy(-totalCancelSize); } } foreach (var item in list) { Client.AddCancelParentOrderList(item); } } else { Console.WriteLine("注文情報取得失敗のため、強制決済をしません"); } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } }
/// <summary> /// IFDで買い建ての注文を削除する /// 決済はしないので注意 /// 値段でのフィルタもしていないので注意 /// </summary> /// <returns></returns> protected void BuyOrderForceCancel(double minPrice) { if (ParentOrders != null) { var list = ParentOrders.Where(e => e.Price > minPrice && e.Side == OrderSide.BUYSELL); foreach (var item in list) { Console.WriteLine("買い建て注文を強制キャンセル:" + item.Price); Client.AddCancelParentOrderList(item); } } else { Console.WriteLine("注文情報取得失敗のため、注文のキャンセルをしません"); } }
/// <summary> /// 一定時間経過した注文の取消を行う /// </summary> /// <returns></returns> protected void OrderCancel(int cancelMinute, OrderSide side) { if (ParentOrders != null) { var now = DateTime.Now; var list = ParentOrders.Where(e => (now - e.Date).TotalMinutes > cancelMinute && e.Side == side); foreach (var item in list) { if (item.Size == item.OutstandingSize) { Console.WriteLine(cancelMinute + "分経過のためキャンセル:" + item.Price); Client.AddCancelParentOrderList(item); } } } else { Console.WriteLine("注文情報取得失敗のため、注文のキャンセルをしません"); } }
public DbParentOrder FindParentOrder(BfProductCode productCode, string acceptanceId) => ParentOrders.Find(productCode, acceptanceId);
// EF Core 3.0 bugs cause conflicts System.Linq.Async public IQueryable <DbParentOrder> GetParentOrders() => ParentOrders.AsQueryable();