public override async Task <ExecutionReport> GetOrder(string id, Instrument instrument, TimeSpan timeout) { var filterObj = new { orderID = id }; var filterArg = JsonConvert.SerializeObject(filterObj); var cts = new CancellationTokenSource(timeout); var response = await _exchangeApi.OrdergetOrdersAsync(filter : filterArg, cancellationToken : cts.Token); var res = EnsureCorrectResponse(id, response); return(BitMexModelConverter.OrderToTrade(res[0])); }
public override async Task <ExecutionReport> CancelOrderAndWaitExecution(TradingSignal signal, TranslatedSignalTableEntity translatedSignal, TimeSpan timeout) { var ct = new CancellationTokenSource(timeout); var id = signal.OrderId; var response = await _exchangeApi.OrdercancelAsync(cancellationToken : ct.Token, orderID : id); if (response is Error error) { throw new ApiException(error.ErrorProperty.Message); } var res = EnsureCorrectResponse(id, response); return(BitMexModelConverter.OrderToTrade(res[0])); }
public override async Task <ExecutionReport> AddOrderAndWaitExecution(TradingSignal signal, TranslatedSignalTableEntity translatedSignal, TimeSpan timeout) { var symbol = "XBTUSD"; //HACK Hard code! var volume = BitMexModelConverter.ConvertVolume(signal.Volume); var orderType = BitMexModelConverter.ConvertOrderType(signal.OrderType); var side = BitMexModelConverter.ConvertTradeType(signal.TradeType); var price = (double?)signal.Price; var ct = new CancellationTokenSource(timeout); var response = await _exchangeApi.OrdernewAsync(symbol, orderQty : volume, price : price, clOrdID : signal.OrderId, ordType : orderType, side : side, cancellationToken : ct.Token); if (response is Error error) { throw new ApiException(error.ErrorProperty.Message); } var order = (Order)response; return(BitMexModelConverter.OrderToTrade(order)); }
private async Task HandleExecutionResponseAsync(TableResponse table) { if (_tradeHandler == null) { throw new InvalidOperationException("Acknowledgment handler or executed trader is not set."); } if (!ValidateOrder(table)) { await _log.WriteWarningAsync(nameof(BitMexExecutionHarvester), nameof(HandleExecutionResponseAsync), $"Ignoring invalid 'order' message: '{JsonConvert.SerializeObject(table)}'"); return; } switch (table.Action) { case Action.Insert: var acks = table.Data.Select(row => _mapper.OrderToTrade(row)); foreach (var ack in acks) { if (ack.ExecutionStatus != OrderExecutionStatus.Fill) { continue; } await _tradeHandler.Handle(ack); } break; case Action.Partial: // Just ignore break; default: await _log.WriteWarningAsync(nameof(HandleExecutionResponseAsync), "Execution response", $"Unexpected response {table.Action}"); break; } }
private async Task HandleResponseAsync(TableResponse table) { if (_tradeHandler == null) { throw new InvalidOperationException("Acknowledgement handler or executed trader is not set."); } if (!ValidateOrder(table)) { await _log.WriteWarningAsync(nameof(BitMexOrderHarvester), nameof(HandleResponseAsync), $"Ignoring invalid 'order' message: '{JsonConvert.SerializeObject(table)}'"); return; } switch (table.Action) { case Action.Insert: case Action.Update: foreach (var row in table.Data) { var trade = _mapper.OrderToTrade(row); if (trade.ExecutionStatus == OrderExecutionStatus.Unknown) { await _log.WriteWarningAsync(nameof(BitMexOrderHarvester), nameof(HandleResponseAsync), $"Can't convert trade status {row.OrdStatus} into ExecutionStatus. Converted item: {trade}. Don't call handlers."); } else { await _tradeHandler.Handle(trade); } } break; } }