public static BacktestTradeModel ToTradeModel(this BacktestTrade trade) { if (trade == null) { return(null); } else { var model = new BacktestTradeModel() { CommissionUsd = trade.CommissionUsd, Cross = trade.Cross, OrderId = trade.OrderId, OrderOrigin = trade.OrderOrigin, Price = FormatUtils.FormatRate(trade.Cross, trade.Price), RealizedPnL = trade.RealizedPnL, RealizedPnlPips = trade.RealizedPnlPips, RealizedPnlUsd = trade.RealizedPnlUsd, Side = trade.Side, Size = trade.Size / 1000, SizeUsd = trade.SizeUsd.HasValue ? trade.SizeUsd.Value / 1000 : (double?)null, Timestamp = trade.Timestamp.ToLocalTime(), TradeId = trade.TradeId }; TimeSpan duration; if (TimeSpan.TryParse(trade.Duration, out duration)) { model.Duration = duration; } return(model); } }
public async Task TestPostNewTrade() { string controllerEndpoint = "https://localhost:44379/"; TradesConnector connector = TradesConnector.GetConnector(controllerEndpoint); BacktestTrade trade = new BacktestTrade() { Size = 1000, TradeId = "2", Timestamp = DateTime.Now, OrderId = 2, Price = 1.5, Side = ExecutionSide.BOUGHT, Cross = Cross.EURUSD, CommissionUsd = 15.58, Duration = "01:50:00", RealizedPnL = 100, RealizedPnlPips = 10.0, RealizedPnlUsd = 100 }; var result = await connector.PostTrade("RegTestJob", trade); Assert.IsTrue(result.Success, result.Message); }
internal GenericActionResult HandleNewTrade(string backtestJobName, BacktestTrade trade) { if (trade == null) { return(new GenericActionResult(false, "Invalid trade object: null")); } logger.Debug($"Processing new trade {trade.TradeId}"); return(jobsControllerUtils.AddTrade(backtestJobName, trade)); }
public async Task <GenericActionResult> PostTrade(string backtestJobName, BacktestTrade trade, CancellationToken ct = default(CancellationToken)) { try { ct.ThrowIfCancellationRequested(); if (string.IsNullOrEmpty(backtestJobName)) { throw new ArgumentNullException(nameof(backtestJobName)); } if (trade == null) { throw new ArgumentNullException(nameof(trade)); } logger.Info($"About to send POST request to {controllerEndpoint}/api/executions/{backtestJobName}"); return(await controllerEndpoint.AppendPathSegment($"/api/trades/{backtestJobName}").PostJsonAsync(trade, ct).ReceiveJson <GenericActionResult>()); } catch (OperationCanceledException) { string err = "Not posting trade: operation cancelled"; logger.Error(err); return(new GenericActionResult(false, err)); } catch (ArgumentNullException ex) { string err = $"Not posting new trade: missing or invalid parameter {ex.ParamName}"; logger.Error(err); return(new GenericActionResult(false, err)); } catch (Exception ex) { string err = "Failed to post new trade"; logger.Error(err, ex); return(new GenericActionResult(false, $"{err}: {ex.Message}")); } }
internal GenericActionResult AddTrade(string jobName, BacktestTrade trade) { //BacktestJob job; //if (activeJobs.TryGetValue(jobName, out job)) //{ // if (!job.Output.Trades.ContainsKey(trade.TradeId)) // job.Output.Trades.Add(trade.TradeId, trade); // else // job.Output.Trades[trade.TradeId] = trade; // activeJobs.AddOrUpdate(jobName, job, (key, oldValue) => job); // return new GenericActionResult(true, $"Added trade {trade.TradeId} to job {jobName}"); //} //else //{ // string err = $"Not adding trade to unknown job {jobName}"; // logger.Error(err); // return new GenericActionResult(false, err); //} return(new GenericActionResult(false, "Disabled")); }
public GenericActionResult Post(string backtestJobName, [FromBody] BacktestTrade trade) { return(utils.HandleNewTrade(backtestJobName, trade)); }