Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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}"));
            }
        }
Beispiel #5
0
        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));
 }