Exemplo n.º 1
0
        public override async Task Publish()
        {
            var client = _marketMakerReportsClient.Client.LykkeTradesApi;

            var dataraw = await client.GetAsync(_lastTradeTime, DateTime.UtcNow, null, null);

            var data = dataraw.Entities.OrderBy(e => e.Time).ToList();

            Log.Info($"Found {data.Count} trades from {_lastTradeTime:yyyy-MM-dd HH:mm:ss}. Api: {_marketMakerReportsClient.ApiUrl}");

            try
            {
                foreach (var trade in data)
                {
                    var message = $"{trade.AssetPairId}, {trade.Type.ToString()}, price: {trade.Price}, Volume: {trade.Volume}; {trade.Time:HH:mm:ss}";
                    await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId, message);
                }
            }
            catch (Exception ex)
            {
                Log.Info("Error at sent trade message", exception: ex);
            }


            if (data.Any())
            {
                _lastTradeTime = data.Max(e => e.Time);
            }
        }
Exemplo n.º 2
0
        public override async Task Publish()
        {
            try
            {
                var balancesWithIssues = await FindBalancesWithIssues();

                if (balancesWithIssues.Count > 0)
                {
                    await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId,
                                                              await _externalBalanceWarningProvider.GetWarningMessageAsync(balancesWithIssues));
                }
            }
            catch (Exception ex)
            {
                await Log.WriteErrorAsync(nameof(BalancePublisher), nameof(Publish), "", ex);
            }
        }
Exemplo n.º 3
0
        public override async Task Publish()
        {
            EnsureInitialized();

            try
            {
                var snapshot = await GetCurrentInventorySnapshot();

                await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId,
                                                          await _nettingEngineStateProvider.GetStateMessageAsync(PrevSnapshot, snapshot));

                PrevSnapshot = snapshot;
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
        }
Exemplo n.º 4
0
        public override async Task Publish()
        {
            try
            {
                var warning = await GetWarningIfExists();

                if (warning == null)
                {
                    return;
                }

                await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId,
                                                          await _marketMakerArbitragesWarningProvider.GetWarningMessageAsync(warning));
            }
            catch (Exception ex)
            {
                await Log.WriteErrorAsync(nameof(MarketMakerArbitragesPublisher), nameof(Publish), "", ex);
            }
        }
        private async Task CheckApi(string indexName, IWarningsApi warningsApi)
        {
            if (!_lastTimes.TryGetValue(indexName, out var lastTime))
            {
                lastTime = DateTime.UtcNow;
                _lastTimes[indexName] = lastTime;
            }

            var fromDate = lastTime;
            var toDate   = DateTime.UtcNow;

            Log.Info($"Started requesting warning history. Api: {indexName}. LastTime: {lastTime:yyyy-MM-dd HH:mm:ss}");

            IReadOnlyCollection <Warning> warnings = new List <Warning>();

            try
            {
                warnings = await warningsApi.GetHistoryAsync(fromDate, toDate);

                foreach (var warning in warnings)
                {
                    var message = $"{indexName}: {warning.Message} {warning.Time.ToIsoDateTime()}";

                    await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId, message);

                    _lastTimes[indexName] = toDate;
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                _lastTimes[indexName] = DateTime.UtcNow;
            }

            Log.Info($"Finished request for warning history. Found: {warnings.Count} warnings. Api: {indexName}. LastTime: {lastTime:yyyy-MM-dd HH:mm:ss}");
        }
Exemplo n.º 6
0
        private async Task CheckApi(string key, IReportsApi reportsApi)
        {
            if (_lastTime == default(DateTime))
            {
                _lastTime = DateTime.UtcNow;
                return;
            }

            var fromDate = _lastTime;
            var toDate   = DateTime.UtcNow;

            Log.Info($"Check api Start. summary. Api: {key}. LastTime: {_lastTime:yyyy-MM-dd HH:mm:ss}");

            var sb = new StringBuilder();

            sb.AppendLine($"=== {fromDate:yyyy/MM/dd HH:mm:ss} ===");
            sb.AppendLine($"=== {toDate:yyyy/MM/dd HH:mm:ss} ===");
            sb.Append(Environment.NewLine);
            sb.AppendLine("Liquidity Engine Summary Statistics");
            sb.Append(Environment.NewLine);

            var countTrade = 0;

            try
            {
                var report = (await reportsApi.GetPositionsReportAsync(fromDate, toDate, int.MaxValue))
                             .Where(x => x.IsClosed)
                             .Where(x => x.CloseDate > fromDate)
                             .Where(x => x.CloseDate <= toDate)
                             .ToList();

                if (report.Count == 0)
                {
                    return;
                }

                var grouped = report.GroupBy(x => x.AssetPairId).OrderBy(x => x.Key);

                var result = new List <string>();
                foreach (var assetPairTrades in grouped)
                {
                    var assetPairId = assetPairTrades.Key;
                    var count       = assetPairTrades.Count();
                    var buyVolume   = assetPairTrades.Where(x => x.Type == PositionType.Long).Sum(x => x.Volume);
                    var sellVolume  = assetPairTrades.Where(x => x.Type == PositionType.Short).Sum(x => x.Volume);
                    var isPnLInUsd  = assetPairTrades.All(x => x.PnLUsd.HasValue);
                    var pnLInUsd    = isPnLInUsd ? assetPairTrades.Sum(x => x.PnLUsd.Value) : (decimal?)null;
                    var pnL         = assetPairTrades.Sum(x => x.PnL.Value);

                    var assetPair = await _assetsServiceWithCache.TryGetAssetPairAsync(assetPairId);

                    var quoteAssetId = assetPair?.QuotingAssetId;
                    var asset        = await _assetsServiceWithCache.TryGetAssetAsync(quoteAssetId);

                    var quoteAssetDisplayId = quoteAssetId == null ? null : asset.Id;
                    var quoteAssetStr       = string.IsNullOrWhiteSpace(quoteAssetDisplayId) ? "[quote asset]" : quoteAssetDisplayId;

                    var pnLStr = pnLInUsd.HasValue ? $"{Math.Round(pnLInUsd.Value, 4)}$" : $"{Math.Round(pnL, 4)} {quoteAssetStr}";

                    var assetPairMessage = $"{assetPairId}; " +
                                           $"PL={pnLStr}; " +
                                           $"Count: {count}; " +
                                           $"Sell: {Math.Round(sellVolume, 6)}; " +
                                           $"Buy: {Math.Round(buyVolume, 6)}; ";
                    result.Add(assetPairMessage);
                }

                sb.AppendLine(string.Join(Environment.NewLine, result));

                _lastTime = DateTime.UtcNow;

                await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId, sb.ToString());
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }

            Log.Info($"Check api complete. Found: {countTrade} asset pairs. Api: {key}. LastTime: {_lastTime:yyyy-MM-dd HH:mm:ss}");
        }
        private async Task CheckApi(string key, ILiquidityEngineClient client)
        {
            var fromDate = DateTime.UtcNow.Date.AddDays(-1);
            var toDate   = DateTime.UtcNow.Date.AddDays(+1);

            if (!_lastClose.TryGetValue(key, out var lastClose))
            {
                lastClose       = DateTime.UtcNow;
                _lastClose[key] = lastClose;
            }

            Log.Info($"Check api started. Trades. Api: {key}. LastTime: {lastClose:yyyy-MM-dd HH:mm:ss}");

            var countTrade = 0;

            try
            {
                var data = await client.Reports.GetPositionsReportAsync(fromDate, toDate, 5000);

                var markups = await client.InstrumentMarkupsApi.GetAllAsync();

                var positions = data.Where(e => e.CloseDate > lastClose).ToList();

                foreach (var position in positions.OrderBy(e => e.CloseDate))
                {
                    var assetPair = await _assetsServiceWithCache.TryGetAssetPairAsync(position.AssetPairId);

                    var quoteAssetId = assetPair?.QuotingAssetId;
                    var asset        = await _assetsServiceWithCache.TryGetAssetAsync(quoteAssetId);

                    var quoteAssetDisplayId = quoteAssetId == null ? null : asset.Id;
                    var quoteAssetStr       = string.IsNullOrWhiteSpace(quoteAssetDisplayId) ? "[quote asset]" : quoteAssetDisplayId;

                    var markupModel = markups.Single(x => x.AssetPairId == position.AssetPairId);
                    var markupValue = position.Type == PositionType.Short ? markupModel.TotalAskMarkup : markupModel.TotalBidMarkup;
                    var markup      = markupValue == -1 ? "stopped" : (markupValue * 100).ToString("0.##") + "%";

                    var pnL        = position.PnL ?? 0;
                    var closePrice = position.ClosePrice ?? 0;
                    var pnLStr     = position.PnLUsd.HasValue ? $"{Math.Round(position.PnLUsd.Value, 4)}$" : $"{Math.Round(pnL, 4)} {quoteAssetStr}";

                    var message =
                        $"{position.AssetPairId}; " +
                        $"PL={pnLStr}; " +
                        $"{(position.Type == PositionType.Short ? "Sell" : "Buy")}; " +
                        $"Volume: {Math.Round(position.Volume, 6)}; " +
                        $"OpenPrice: {Math.Round(position.Price, 6)}; " +
                        $"ClosePrice: {Math.Round(closePrice, 6)}; " +
                        $"Close: {position.CloseDate:MM-dd HH:mm:ss}; " +
                        $"Markup: {markup}";

                    if (positions.Count >= 4800)
                    {
                        message += "; !!!max count of position in day, please add limit!!!";
                    }
                    await TelegramSender.SendTextMessageAsync(PublisherSettings.ChatId, message);

                    if (position.CloseDate.HasValue)
                    {
                        _lastClose[key] = position.CloseDate.Value;
                    }

                    countTrade++;
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                _lastClose[key] = DateTime.UtcNow;
            }

            Log.Info($"Check api completed. Found: {countTrade} trades. Api: {key}. LastTime: {lastClose:yyyy-MM-dd HH:mm:ss}");
        }