private void RemoveRefId(FZOrder order) { if (_syncOrderAction.ContainsKey(order.Symbol)) { _syncOrderAction[order.Symbol].RemoveRefId(order.RefId); } }
protected void AddRefId(FZOrder order) { if (!_syncOrderAction.ContainsKey(order.Symbol)) { Func <long> fun = () => this.GetCurrentTime().GetUnixTimeFromUTC(); var s = new SyncStatus(300, fun); _syncOrderAction.TryAdd(order.Symbol, s); } _syncOrderAction[order.Symbol].AddRefId(order.RefId); }
public void SubmitOrder(CommandId commandId, FZOrder order) { if (commandId == CommandId.PlaceOrder) { this.PlaceOrder(order); } else if (commandId == CommandId.CancelOrder) { this.CancelOrder(order); } }
public bool CancelOrder(FZOrder order) { this.LogDebug($"CancelOrder: {ConvertOrderToStr(order)}"); var r = _trade.CancelOrder(order.Symbol, order.OrderId).Result; if (!_isSimulationMode) { Thread.Sleep(50); } this.AddRefId(order); return(r); }
public FZOrder PlaceOrder(FZOrder order) { this.LogDebug($"PlaceOrder: {ConvertOrderToStr(order)}"); var r = _trade.PlaceOrder(order).Result; this.AddRefId(order); if (!_isSimulationMode) { Thread.Sleep(50); } return(r); }
public static bool IsOrderOpen(this FZOrder order) { if (order.State == OrderState.none || order.State == OrderState.open || order.State == OrderState.summitting || order.State == OrderState.partial_filled || order.State == OrderState.cancelling) { return(true); } else { return(false); } }
protected string ConvertOrderToStr(FZOrder o) { return($"{o.RefId} {o.OrderId} {o.Ordertype} {o.Symbol} price={o.Price} amount={o.Amount} {o.State} {o.TimeCreated} {o.TimeLast}"); }
private bool CheckOrderLocal(FZOrder o, bool isTriggerEvent) { if (o == null) { return(false); } lock (this) { this.RemoveRefId(o); var isUpdated = false; var isExistingOpen = OpenOrders.ContainsKey(o.OrderId); var isExistingClose = ClosedOrders.ContainsKey(o.OrderId); var isNewOrder = !isExistingOpen && !isExistingClose; var isOrderChanged = isExistingOpen ? !OpenOrders[o.OrderId].Equals(o) : (isExistingClose ? !ClosedOrders[o.OrderId].Equals(o) : false); var isOrderOpen = o.IsOrderOpen(); //existOpen existClose isOpen isChanged //Y N Y Y => existing open order updated //Y N N - => existing open order closed //N Y Y - => invalid //N Y N Y => existing order updated //N N Y - => new order opened //N N N - => missed order closed if (isExistingOpen && !isExistingClose && isOrderOpen && isOrderChanged) { this.LogDebug($"existing open order updated: {ConvertOrderToStr(o)}"); this.OpenOrders[o.OrderId].Copy(o); if (isTriggerEvent) { OnOrderUpdated(this, o); } isUpdated = true; this.SetDumpFile(true); } else if (isExistingOpen && !isExistingClose && !isOrderOpen) { this.OpenOrders[o.OrderId].Copy(o); if (isTriggerEvent) { OnOrderClosed(this, o); } FZOrder order; if (OpenOrders.TryRemove(o.OrderId, out order)) { //if (o.OrderId == "orderId_10") // Console.WriteLine(); this.LogDebug($"order removed from open order list: {ConvertOrderToStr(o)}"); //if (isTriggerEvent) this.OnOpenOrderListChanged?.Invoke(this, OpenOrders.Values.ToList().ConvertAll(t => new FZOrder(t))); if (isTriggerEvent) { this.OnOpenOrderListChanged?.Invoke(this, null); } } if (ClosedOrders.TryAdd(o.OrderId, o)) { this.LogDebug($"order added to closed order list: {ConvertOrderToStr(o)}"); //if (isTriggerEvent) this.OnClosedOrderListChanged?.Invoke(this, ClosedOrders.Values.ToList().ConvertAll(t => new FZOrder(t))); if (isTriggerEvent) { this.OnClosedOrderListChanged?.Invoke(this, null); } } isUpdated = true; this.SetDumpFile(true); } else if (!isExistingOpen && isExistingClose && isOrderOpen) { this.LogDebug($"order exist in close list while it is still open: {ConvertOrderToStr(o)}"); FZOrder order; if (ClosedOrders.TryRemove(o.OrderId, out order)) { //if (isTriggerEvent) this.OnClosedOrderListChanged?.Invoke(this, ClosedOrders.Values.ToList().ConvertAll(t => new FZOrder(t))); if (isTriggerEvent) { this.OnClosedOrderListChanged?.Invoke(this, null); } } if (OpenOrders.TryAdd(o.OrderId, o)) { if (isTriggerEvent) { this.OnOrderOpened?.Invoke(this, o); //this.OnOpenOrderListChanged?.Invoke(this, OpenOrders.Values.ToList().ConvertAll(t => new FZOrder(t))); this.OnOpenOrderListChanged?.Invoke(this, null); } } isUpdated = true; this.SetDumpFile(true); } else if (!isExistingOpen && isExistingClose && !isOrderOpen && isOrderChanged) { this.LogDebug($"existing closed order updated: {ConvertOrderToStr(o)}"); this.ClosedOrders[o.OrderId].Copy(o); if (isTriggerEvent) { OnOrderUpdated(this, o); } isUpdated = true; this.SetDumpFile(true); } else if (!isExistingOpen && !isExistingClose && isOrderOpen) { //this.LogDebug($"new order opened: {ConvertOrderToStr(o)}"); if (isTriggerEvent) { this.OnOrderOpened?.Invoke(this, o); } if (this.OpenOrders.TryAdd(o.OrderId, o)) { this.LogDebug($"new order added to open order list: {ConvertOrderToStr(o)}"); //if (isTriggerEvent) this.OnOpenOrderListChanged?.Invoke(this, OpenOrders.Values.ToList().ConvertAll(t => new FZOrder(t))); if (isTriggerEvent) { this.OnOpenOrderListChanged?.Invoke(this, null); } } isUpdated = true; this.SetDumpFile(true); } else if (!isExistingOpen && !isExistingClose && !isOrderOpen) { //this.LogDebug($"missed order closed: {ConvertOrderToStr(o)}"); if (isTriggerEvent) { OnOrderClosed(this, o); } if (ClosedOrders.TryAdd(o.OrderId, o)) { this.LogDebug($"missed order added to closed order list: {ConvertOrderToStr(o)}"); //if (isTriggerEvent) this.OnClosedOrderListChanged?.Invoke(this, ClosedOrders.Values.ToList().ConvertAll(t => new FZOrder(t))); if (isTriggerEvent) { this.OnClosedOrderListChanged?.Invoke(this, null); } } isUpdated = true; this.SetDumpFile(true); } //if (!isUpdated && !o.IsOrderOpen()) //{ // this.LogDebug($"order not updated: {o.Symbol} {o.Ordertype} isInOpenList = {isExistingOpen}, isInCloseList = {isExistingClose}, isOrderChanged = {isOrderChanged}, isOrderOpen = {isOrderOpen}"); //} return(isUpdated); } }
public ServiceResult <FZOrder> PlaceOrder(FZOrder order) { return(ServiceResult <FZOrder> .CallAsyncFunction(() => _apiOrder.PlaceOrder(order)).Result); }