/// <summary> /// Send a New Order /// <see href="https://scrapbox.io/BitFlyerDotNet/SendChildOrder">Online help</see> /// </summary> /// <param name="productCode"></param> /// <param name="orderType"></param> /// <param name="side"></param> /// <param name="price"></param> /// <param name="size"></param> /// <param name="minuteToExpire"></param> /// <param name="timeInForce"></param> /// <returns></returns> public Task <BitFlyerResponse <BfChildOrderResponse> > SendChildOrderAsync( BfProductCode productCode, BfOrderType orderType, BfTradeSide side, decimal price, decimal size, int minuteToExpire, BfTimeInForce timeInForce, CancellationToken ct ) { var request = new BfChildOrderRequest { ProductCode = productCode, ChildOrderType = orderType, Side = side, Price = price, Size = size, MinuteToExpire = minuteToExpire, TimeInForce = timeInForce, }; Validate(ref request); return(SendChildOrderAsync(request, ct)); }
public void Update(IBfParentOrder order) { OrderId = order.OrderId; AcceptanceId = order.AcceptanceId; _orderMethod = order.OrderType; ExpireDate = order.ExpireDate; OrderDate = order.OrderDate; // API 仕様的に実質 Active 状態しか取得できない。 switch (order.State) { case BfOrderState.Active: ChangeState(BfxOrderState.Ordered); break; case BfOrderState.Completed: ChangeState(BfxOrderState.Completed); break; case BfOrderState.Canceled: ChangeState(BfxOrderState.Canceled); break; case BfOrderState.Expired: ChangeState(BfxOrderState.Expired); break; default: throw new ArgumentException("Unexpected parent order state."); } Update(order.Children); }
public void Update(BfParentOrderEvent poe) { _orderMethod = poe.ParentOrderType; LastUpdatedTime = poe.EventDate; switch (poe.EventType) { case BfOrderEventType.Order: OrderDate = poe.EventDate; // Is it same value to real ordered date ? ExpireDate = poe.ExpireDate; ChangeState(BfxOrderState.Ordered); break; case BfOrderEventType.OrderFailed: ChangeState(BfxOrderState.OrderFailed); break; case BfOrderEventType.Cancel: ChangeState(BfxOrderState.Canceled); break; case BfOrderEventType.CancelFailed: ChangeState(BfxOrderState.CancelFailed); break; case BfOrderEventType.Trigger: _childOrders[poe.ChildOrderIndex - 1].Update(poe); break; case BfOrderEventType.Expire: ChangeState(BfxOrderState.Expired); break; case BfOrderEventType.Complete: CompletedCount++; Log.Trace($"BfOrderEventType.Complete received. count = {CompletedCount}"); switch (OrderType) { case BfOrderType.IFD: case BfOrderType.IFDOCO: if (CompletedCount == 2) { ChangeState(BfxOrderState.Completed); } break; } break; case BfOrderEventType.Unknown: case BfOrderEventType.Execution: throw new NotSupportedException(); } }
public static int GetChildCount(this BfOrderType orderType) { return(orderType switch { BfOrderType.IFDOCO => 3, BfOrderType.IFD => 2, BfOrderType.OCO => 2, BfOrderType.Simple => 1, BfOrderType.Stop => 1, BfOrderType.StopLimit => 1, BfOrderType.Trail => 1, _ => 0 });
static void PlaceUnexecutableParentOrder(BfOrderType orderType, bool mte = false, bool fok = false) { var childOrder1 = _orderFactory.CreateLimitPriceOrder(BfTradeSide.Sell, _market.MinimumOrderSize, _market.BestAskPrice + 50000.0m); var childOrder2 = _orderFactory.CreateLimitPriceOrder(BfTradeSide.Buy, _market.MinimumOrderSize, _market.BestBidPrice - 50000.0m); BfParentOrderRequest request; switch (orderType) { case BfOrderType.IFD: request = _orderFactory.CreateIFD( childOrder1.ToParameter(), childOrder2.ToParameter(), mte ? TimeSpan.FromMinutes(1) : default(TimeSpan), fok ? BfTimeInForce.FOK : BfTimeInForce.NotSpecified ); break; case BfOrderType.OCO: request = _orderFactory.CreateOCO( childOrder1.ToParameter(), childOrder2.ToParameter(), mte ? TimeSpan.FromMinutes(1) : default(TimeSpan), fok ? BfTimeInForce.FOK : BfTimeInForce.NotSpecified ); break; default: throw new AggregateException(); } var transaction = _market.PlaceOrder(request).Result; if (transaction != null) { _parentOrderTransaction = transaction; Console.WriteLine("Order accepted."); } else { Console.WriteLine("Order failed."); } }
public BfxParentOrder(BfParentOrderRequest request) : this(request.OrderMethod) { Request = request; _orderMethod = request.OrderMethod; _childOrders = request.Parameters.Select(e => new BfxChildOrder(e)).ToArray(); ProductCode = _childOrders[0].ProductCode; if (request.OrderMethod == BfOrderType.Simple) { var childOrder = _childOrders[0]; OrderType = childOrder.OrderType; Side = childOrder.Side; OrderSize = childOrder.OrderSize; OrderPrice = childOrder.OrderPrice; TriggerPrice = childOrder.TriggerPrice; TrailOffset = childOrder.TrailOffset; } else { OrderType = request.OrderMethod; } }
/// <summary> /// Send a New Order /// <see href="https://scrapbox.io/BitFlyerDotNet/SendChildOrder">Online help</see> /// </summary> /// <param name="productCode"></param> /// <param name="orderType"></param> /// <param name="side"></param> /// <param name="price"></param> /// <param name="size"></param> /// <param name="minuteToExpire"></param> /// <param name="timeInForce"></param> /// <returns></returns> public BitFlyerResponse <BfChildOrderResponse> SendChildOrder( BfProductCode productCode, BfOrderType orderType, BfTradeSide side, decimal price, decimal size, int minuteToExpire = 0, BfTimeInForce timeInForce = BfTimeInForce.NotSpecified) { var request = new BfChildOrderRequest { ProductCode = productCode, ChildOrderType = orderType, Side = side, Price = price, Size = size, MinuteToExpire = minuteToExpire, TimeInForce = timeInForce, }; Validate(ref request); return(SendChildOrder(request)); }
public BfxParentOrder(BfOrderType orderType) { _childOrders = new BfxChildOrder[orderType.GetChildCount()]; }