Пример #1
0
        public IActionResult BuyDefault(BuyRequest buyRequest)
        {
            if (Application.Resolve <ICoreService>().Config.ReadOnlyMode)
            {
                return(new BadRequestResult());
            }

            if (!string.IsNullOrWhiteSpace(buyRequest.Pair))
            {
                ISignalsService signalsService = Application.Resolve <ISignalsService>();
                ITradingService tradingService = Application.Resolve <ITradingService>();

                tradingService.Buy(new BuyOptions(buyRequest.Pair)
                {
                    MaxCost        = tradingService.GetPairConfig(buyRequest.Pair).BuyMaxCost,
                    IgnoreExisting = true,
                    ManualOrder    = true,
                    Metadata       = new OrderMetadata
                    {
                        BoughtGlobalRating = signalsService.GetGlobalRating()
                    }
                });

                return(new OkResult());
            }
            else
            {
                return(new BadRequestResult());
            }
        }
Пример #2
0
 public TradingTimedTask(ILoggingService loggingService, INotificationService notificationService, IHealthCheckService healthCheckService, ISignalsService signalsService, TradingService tradingService)
 {
     this.loggingService      = loggingService;
     this.notificationService = notificationService;
     this.healthCheckService  = healthCheckService;
     this.signalsService      = signalsService;
     this.tradingService      = tradingService;
 }
 public SignalRulesTimedTask(ILoggingService loggingService, IHealthCheckService healthCheckService, ITradingService tradingService, IRulesService rulesService, ISignalsService signalsService)
 {
     this.loggingService     = loggingService;
     this.healthCheckService = healthCheckService;
     this.tradingService     = tradingService;
     this.rulesService       = rulesService;
     this.signalsService     = signalsService;
 }
 public BacktestingSaveSnapshotsTimedTask(ILoggingService loggingService, IHealthCheckService healthCheckService, ITradingService tradingService, ISignalsService signalsService, IBacktestingService backtestingService)
 {
     this.loggingService     = loggingService;
     this.healthCheckService = healthCheckService;
     this.tradingService     = tradingService;
     this.signalsService     = signalsService;
     this.backtestingService = backtestingService;
 }
Пример #5
0
 public TradingAccountBase(ILoggingService loggingService, INotificationService notificationService, IHealthCheckService healthCheckService, ISignalsService signalsService, ITradingService tradingService)
 {
     this.loggingService      = loggingService;
     this.notificationService = notificationService;
     this.healthCheckService  = healthCheckService;
     this.signalsService      = signalsService;
     this.tradingService      = tradingService;
 }
Пример #6
0
        public void Start()
        {
            loggingService.Info($"Start Trading service (Virtual: {Config.VirtualTrading})...");

            IsTradingSuspended = true;

            orderingService = Application.Resolve <IOrderingService>();
            rulesService    = Application.Resolve <IRulesService>();
            OnTradingRulesChanged();
            rulesService.RegisterRulesChangeCallback(OnTradingRulesChanged);
            Exchange.Start(Config.VirtualTrading);
            signalsService = Application.Resolve <ISignalsService>();

            if (!Config.VirtualTrading)
            {
                Account = new ExchangeAccount(loggingService, notificationService, healthCheckService, signalsService, this);
            }
            else
            {
                Account = new VirtualAccount(loggingService, notificationService, healthCheckService, signalsService, this);
            }

            accountRefreshTimedTask = tasksService.AddTask(
                name: nameof(AccountRefreshTimedTask),
                task: new AccountRefreshTimedTask(loggingService, healthCheckService, this),
                interval: Config.AccountRefreshInterval * 1000 / Application.Speed,
                startDelay: Constants.TaskDelays.ZeroDelay,
                startTask: false,
                runNow: true,
                skipIteration: 0);

            if (signalsService.Config.Enabled)
            {
                signalsService.Start();
            }

            tradingTimedTask = tasksService.AddTask(
                name: nameof(TradingTimedTask),
                task: new TradingTimedTask(loggingService, notificationService, healthCheckService, signalsService, orderingService, this),
                interval: Config.TradingCheckInterval * 1000 / Application.Speed,
                startDelay: Constants.TaskDelays.NormalDelay,
                startTask: false,
                runNow: false,
                skipIteration: 0);

            tradingRulesTimedTask = tasksService.AddTask(
                name: nameof(TradingRulesTimedTask),
                task: new TradingRulesTimedTask(loggingService, notificationService, healthCheckService, rulesService, signalsService, this),
                interval: RulesConfig.CheckInterval * 1000 / Application.Speed,
                startDelay: Constants.TaskDelays.MidDelay,
                startTask: false,
                runNow: false,
                skipIteration: 0);

            IsTradingSuspended = false;

            loggingService.Info("Trading service started");
        }
        public MarketSignalsResponse MarketSignals()
        {
            ISignalsService signalsService = Application.Resolve <ISignalsService>();

            return(new MarketSignalsResponse
            {
                Signals = signalsService.GetSignalNames()
            });
        }
Пример #8
0
        public TradingViewCryptoSignalReceiver(string signalName, IConfigurationSection configuration,
                                               ILoggingService loggingService, IHealthCheckService healthCheckService, ISignalsService signalsService, ITradingService tradingService)
        {
            this.SignalName = signalName;
            this.Config     = configuration.Get <TradingViewCryptoSignalReceiverConfig>();

            this.loggingService     = loggingService;
            this.healthCheckService = healthCheckService;
            this.signalsService     = signalsService;
            this.tradingService     = tradingService;
        }
        public void Start()
        {
            loggingService.Info($"Start Backtesting service... (Replay: {this.Config.Replay})");

            signalsService = Application.Resolve <ISignalsService>();
            tradingService = Application.Resolve <ITradingService>();

            if (this.Config.Replay)
            {
                backtestingLoadSnapshotsTimedTask = tasksService.AddTask(
                    name: nameof(BacktestingLoadSnapshotsTimedTask),
                    task: new BacktestingLoadSnapshotsTimedTask(loggingService, healthCheckService, tradingService, this),
                    interval: this.Config.SnapshotsInterval / this.Config.ReplaySpeed * 1000,
                    startDelay: Constants.TaskDelays.HighDelay,
                    startTask: false,
                    runNow: false,
                    skipIteration: 0);
            }

            backtestingSaveSnapshotsTimedTask = tasksService.AddTask(
                name: nameof(BacktestingSaveSnapshotsTimedTask),
                task: new BacktestingSaveSnapshotsTimedTask(loggingService, healthCheckService, tradingService, signalsService, this),
                interval: this.Config.SnapshotsInterval * 1000,
                startDelay: Constants.TaskDelays.HighDelay,
                startTask: false,
                runNow: false,
                skipIteration: 0);

            if (this.Config.DeleteLogs)
            {
                loggingService.DeleteAllLogs();
            }

            string virtualAccountPath = Path.Combine(Directory.GetCurrentDirectory(), tradingService.Config.VirtualAccountFilePath);

            if (File.Exists(virtualAccountPath) && (this.Config.DeleteAccountData || !String.IsNullOrWhiteSpace(this.Config.CopyAccountDataPath)))
            {
                File.Delete(virtualAccountPath);
            }

            if (!String.IsNullOrWhiteSpace(this.Config.CopyAccountDataPath))
            {
                File.Copy(Path.Combine(Directory.GetCurrentDirectory(), this.Config.CopyAccountDataPath), virtualAccountPath, true);
            }

            if (this.Config.Replay)
            {
                Application.Speed = this.Config.ReplaySpeed;
            }

            Application.Resolve <ICoreService>().Started += this.OnCoreServiceStarted;

            loggingService.Info("Backtesting service started");
        }
Пример #10
0
        public void Start()
        {
            loggingService.Info($"Start Trading service (Virtual: {Config.VirtualTrading})...");

            IsTradingSuspended = true;

            rulesService = Application.Resolve <IRulesService>();
            OnTradingRulesChanged();
            rulesService.RegisterRulesChangeCallback(OnTradingRulesChanged);

            exchangeService.Start(Config.VirtualTrading);

            signalsService = Application.Resolve <ISignalsService>();

            if (!Config.VirtualTrading)
            {
                Account = new ExchangeAccount(loggingService, notificationService, healthCheckService, signalsService, this);
            }
            else
            {
                Account = new VirtualAccount(loggingService, notificationService, healthCheckService, signalsService, this);
            }

            accountTimedTask          = new AccountTimedTask(loggingService, healthCheckService, this);
            accountTimedTask.Interval = Config.AccountRefreshInterval * 1000 / Application.Speed;
            accountTimedTask.Run();
            Application.Resolve <ICoreService>().AddTask(nameof(AccountTimedTask), accountTimedTask);

            if (signalsService.Config.Enabled)
            {
                signalsService.Start();
            }

            tradingTimedTask                = new TradingTimedTask(loggingService, notificationService, healthCheckService, signalsService, this);
            tradingTimedTask.Interval       = Config.TradingCheckInterval * 1000 / Application.Speed;
            tradingTimedTask.StartDelay     = Constants.TimedTasks.StandardDelay;
            tradingTimedTask.LoggingEnabled = !isReplayingSnapshots;
            Application.Resolve <ICoreService>().AddTask(nameof(TradingTimedTask), tradingTimedTask);

            tradingRulesTimedTask          = new TradingRulesTimedTask(loggingService, notificationService, healthCheckService, rulesService, signalsService, this);
            tradingRulesTimedTask.Interval = RulesConfig.CheckInterval * 1000 / Application.Speed;
            Application.Resolve <ICoreService>().AddTask(nameof(TradingRulesTimedTask), tradingRulesTimedTask);

            IsTradingSuspended = false;

            loggingService.Info("Trading service started");
        }
Пример #11
0
        [HttpGet("status")] // TODO
        public StatusApiModel Status()
        {
            ILoggingService     loggingService     = Application.Resolve <ILoggingService>();
            ITradingService     tradingService     = Application.Resolve <ITradingService>();
            ISignalsService     signalsService     = Application.Resolve <ISignalsService>();
            IHealthCheckService healthCheckService = Application.Resolve <IHealthCheckService>();

            var status = new StatusApiModel
            {
                Balance          = tradingService.Account.GetBalance(),
                GlobalRating     = signalsService.GetGlobalRating()?.ToString("0.000") ?? "N/A",
                TrailingBuys     = tradingService.GetTrailingBuys(),
                TrailingSells    = tradingService.GetTrailingSells(),
                TrailingSignals  = signalsService.GetTrailingSignals(),
                TradingSuspended = tradingService.IsTradingSuspended,
                HealthChecks     = healthCheckService.GetHealthChecks().OrderBy(c => c.Name),
                LogEntries       = loggingService.GetLogEntries().Reverse().Take(5)
            };

            return(status);
        }
Пример #12
0
        public void Start()
        {
            loggingService.Info($"Start Backtesting service... (Replay: {Config.Replay})");

            signalsService = Application.Resolve <ISignalsService>();
            tradingService = Application.Resolve <ITradingService>();

            if (Config.Replay)
            {
                backtestingLoadSnapshotsTimedTask            = new BacktestingLoadSnapshotsTimedTask(loggingService, healthCheckService, tradingService, this);
                backtestingLoadSnapshotsTimedTask.Interval   = Config.SnapshotsInterval / Config.ReplaySpeed * 1000;
                backtestingLoadSnapshotsTimedTask.StartDelay = Constants.TimedTasks.StandardDelay;
                Application.Resolve <ICoreService>().AddTask(nameof(BacktestingLoadSnapshotsTimedTask), backtestingLoadSnapshotsTimedTask);
            }

            backtestingSaveSnapshotsTimedTask            = new BacktestingSaveSnapshotsTimedTask(loggingService, healthCheckService, tradingService, signalsService, this);
            backtestingSaveSnapshotsTimedTask.Interval   = Config.SnapshotsInterval * 1000;
            backtestingSaveSnapshotsTimedTask.StartDelay = Constants.TimedTasks.StandardDelay;
            Application.Resolve <ICoreService>().AddTask(nameof(BacktestingSaveSnapshotsTimedTask), backtestingSaveSnapshotsTimedTask);

            if (Config.DeleteLogs)
            {
                loggingService.DeleteAllLogs();
            }

            string virtualAccountPath = Path.Combine(Directory.GetCurrentDirectory(), tradingService.Config.VirtualAccountFilePath);

            if (File.Exists(virtualAccountPath) && (Config.DeleteAccountData || !String.IsNullOrWhiteSpace(Config.CopyAccountDataPath)))
            {
                File.Delete(virtualAccountPath);
            }

            if (!String.IsNullOrWhiteSpace(Config.CopyAccountDataPath))
            {
                File.Copy(Path.Combine(Directory.GetCurrentDirectory(), Config.CopyAccountDataPath), virtualAccountPath, true);
            }

            loggingService.Info("Backtesting service started");
        }
 public ExchangeAccount(ILoggingService loggingService, INotificationService notificationService, IHealthCheckService healthCheckService, ISignalsService signalsService, ITradingService tradingService)
     : base(loggingService, notificationService, healthCheckService, signalsService, tradingService)
 {
 }
        public MarketPairsResponse MarketPairs(MarketPairsRequest request)
        {
            if (request?.SignalsFilter == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            ICoreService    coreService    = Application.Resolve <ICoreService>();
            ITradingService tradingService = Application.Resolve <ITradingService>();
            ISignalsService signalsService = Application.Resolve <ISignalsService>();

            IEnumerable <ISignal> allSignals = signalsService.GetAllSignals();

            if (allSignals != null)
            {
                if (request.SignalsFilter.Count > 0)
                {
                    allSignals = allSignals.Where(s => request.SignalsFilter.Contains(s.Name));
                }

                var groupedSignals = allSignals.GroupBy(s => s.Pair).ToDictionary(g => g.Key, g => g.AsEnumerable());

                IEnumerable <MarketPairApiModel> marketPairs = from signalGroup in groupedSignals
                                                               let pair = signalGroup.Key
                                                                          let pairConfig = tradingService.GetPairConfig(pair)
                                                                                           select new MarketPairApiModel
                {
                    Name             = pair,
                    TradingViewName  = $"{tradingService.Config.Exchange.ToUpperInvariant()}:{pair}",
                    VolumeList       = signalGroup.Value.Select(s => new NameValue <long?>(s.Name, s.Volume)),
                    VolumeChangeList = signalGroup.Value.Select(s => new NameValue <double?>(s.Name, s.VolumeChange)),
                    Price            = tradingService.GetPrice(pair).ToString("0.00000000"),
                    PriceChangeList  = signalGroup.Value.Select(s => new NameValue <decimal?>(s.Name, s.PriceChange)),
                    RatingList       = signalGroup.Value.Select(s => new NameValue <double?>(s.Name, s.Rating)),
                    RatingChangeList = signalGroup.Value.Select(s => new NameValue <double?>(s.Name, s.RatingChange)),
                    VolatilityList   = signalGroup.Value.Select(s => new NameValue <double?>(s.Name, s.Volatility)),
                    Spread           = tradingService.Exchange.GetPriceSpread(pair).ToString("0.00"),
                    ArbitrageList    = from market in Enum.GetNames(typeof(ArbitrageMarket)).Where(m => m != tradingService.Config.Market)
                                       let arbitrage = tradingService.Exchange.GetArbitrage(pair, tradingService.Config.Market, new List <ArbitrageMarket> {
                        Enum.Parse <ArbitrageMarket>(market)
                    })
                                                       select new ArbitrageInfo
                    {
                        Name      = $"{arbitrage.Market}-{arbitrage.Type.ToString()[0]}",
                        Arbitrage = arbitrage.IsAssigned ? arbitrage.Percentage.ToString("0.00") : "N/A"
                    },
                    SignalRules    = signalsService.GetTrailingInfo(pair)?.Select(ti => ti.Rule.Name) ?? Array.Empty <string>(),
                    HasTradingPair = tradingService.Account.HasTradingPair(pair),
                    Config         = pairConfig
                };

                return(new MarketPairsResponse
                {
                    MarketPairs = marketPairs.ToList()
                });
            }
            else
            {
                return(null);
            }
        }