171 lines
8.3 KiB
C#
171 lines
8.3 KiB
C#
using Managing.Application.Abstractions;
|
|
using Managing.Application.Abstractions.Repositories;
|
|
using Managing.Application.Abstractions.Services;
|
|
using Managing.Application.Accounts;
|
|
using Managing.Application.Backtests;
|
|
using Managing.Application.MoneyManagements;
|
|
using Managing.Application.Scenarios;
|
|
using Managing.Application.Shared;
|
|
using Managing.Application.Synth;
|
|
using Managing.Application.Trading;
|
|
using Managing.Application.Users;
|
|
using Managing.Application.Whitelist;
|
|
using Managing.Domain.Statistics;
|
|
using Managing.Domain.Trades;
|
|
using Managing.Infrastructure.Databases;
|
|
using Managing.Infrastructure.Databases.InfluxDb;
|
|
using Managing.Infrastructure.Databases.InfluxDb.Abstractions;
|
|
using Managing.Infrastructure.Databases.InfluxDb.Models;
|
|
using Managing.Infrastructure.Databases.PostgreSql;
|
|
using Managing.Infrastructure.Databases.PostgreSql.Configurations;
|
|
using Managing.Infrastructure.Evm;
|
|
using Managing.Infrastructure.Evm.Services;
|
|
using Managing.Infrastructure.Evm.Subgraphs;
|
|
using Managing.Infrastructure.Exchanges;
|
|
using Managing.Infrastructure.Exchanges.Abstractions;
|
|
using Managing.Infrastructure.Exchanges.Exchanges;
|
|
using Managing.Infrastructure.Storage;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Options;
|
|
using static Managing.Common.Enums;
|
|
|
|
namespace Managing.Bootstrap;
|
|
|
|
/// <summary>
|
|
/// Bootstrap configuration for compute worker project (no Orleans)
|
|
/// </summary>
|
|
public static class ComputeBootstrap
|
|
{
|
|
public static IServiceCollection RegisterComputeDependencies(this IServiceCollection services,
|
|
IConfiguration configuration)
|
|
{
|
|
return services
|
|
.AddApplication()
|
|
.AddInfrastructure(configuration);
|
|
}
|
|
|
|
private static IServiceCollection AddApplication(this IServiceCollection services)
|
|
{
|
|
// Core services needed for backtest execution
|
|
services.AddScoped<ITradingService, TradingService>();
|
|
services.AddScoped<IScenarioService, ScenarioService>();
|
|
services.AddScoped<IMoneyManagementService, MoneyManagementService>();
|
|
services.AddScoped<IAccountService, AccountService>();
|
|
services.AddScoped<IUserService, UserService>();
|
|
|
|
// Services not needed for compute worker (depend on IBacktester/Orleans)
|
|
// services.AddScoped<IStatisticService, StatisticService>(); // Requires IBacktester
|
|
// services.AddScoped<ISettingsService, SettingsService>(); // Requires IBacktester
|
|
// services.AddScoped<IGeneticService, GeneticService>(); // Requires IBacktester
|
|
// services.AddScoped<IAgentService, AgentService>(); // May require Orleans
|
|
// services.AddScoped<IBotService, BotService>(); // May require Orleans
|
|
// services.AddScoped<IWorkerService, WorkerService>(); // May require Orleans
|
|
// services.AddScoped<IPricesService, PricesService>(); // May require Orleans
|
|
|
|
// Processors
|
|
// Note: IBacktester not needed for compute worker - BacktestExecutor is used directly
|
|
services.AddTransient<BacktestExecutor>();
|
|
services.AddTransient<IExchangeProcessor, EvmProcessor>();
|
|
|
|
services.AddTransient<ITradaoService, TradaoService>();
|
|
services.AddTransient<IExchangeService, ExchangeService>();
|
|
|
|
// Web3Proxy service (needed for EvmManager)
|
|
services.AddTransient<IWeb3ProxyService, Web3ProxyService>();
|
|
|
|
// Evm services (needed for ExchangeService)
|
|
services.AddGbcFeed();
|
|
services.AddUniswapV2();
|
|
services.AddChainlink();
|
|
services.AddChainlinkGmx();
|
|
services.AddSingleton<IEvmManager, EvmManager>();
|
|
|
|
services.AddTransient<IKaigenService, KaigenService>();
|
|
services.AddTransient<IWhitelistService, WhitelistService>();
|
|
|
|
// Synth services (needed for TradingService)
|
|
services.AddScoped<ISynthPredictionService, SynthPredictionService>();
|
|
services.AddScoped<ISynthApiClient, SynthApiClient>();
|
|
|
|
// No-op implementations for compute worker (no Discord needed)
|
|
services.AddSingleton<IDiscordService, NoOpDiscordService>();
|
|
// IGrainFactory is optional in UserService - register as null for compute workers
|
|
services.AddSingleton<IGrainFactory>(sp => null!);
|
|
|
|
// Webhook service (required for notifications)
|
|
services.AddHttpClient<IWebhookService, WebhookService>();
|
|
// MessengerService must be Scoped because it depends on IUserService which is Scoped
|
|
services.AddScoped<IMessengerService, MessengerService>();
|
|
|
|
return services;
|
|
}
|
|
|
|
private static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
// Database
|
|
services.AddSingleton<IPostgreSqlSettings>(sp =>
|
|
sp.GetRequiredService<IOptions<PostgreSqlSettings>>().Value);
|
|
|
|
services.AddSingleton<IInfluxDbSettings>(sp =>
|
|
sp.GetRequiredService<IOptions<InfluxDbSettings>>().Value);
|
|
|
|
services.Configure<KaigenSettings>(configuration.GetSection("Kaigen"));
|
|
services.Configure<Web3ProxySettings>(configuration.GetSection("Web3Proxy"));
|
|
|
|
// SQL Monitoring (required by repositories)
|
|
services.Configure<SqlMonitoringSettings>(configuration.GetSection("SqlMonitoring"));
|
|
services.AddSingleton<SentrySqlMonitoringService>();
|
|
|
|
// PostgreSql Repositories
|
|
services.AddTransient<IAccountRepository, PostgreSqlAccountRepository>();
|
|
services.AddTransient<IBacktestRepository, PostgreSqlBacktestRepository>();
|
|
services.AddTransient<IBacktestJobRepository, PostgreSqlJobRepository>();
|
|
services.AddTransient<IGeneticRepository, PostgreSqlGeneticRepository>();
|
|
services.AddTransient<ITradingRepository, PostgreSqlTradingRepository>();
|
|
services.AddTransient<ISettingsRepository, PostgreSqlSettingsRepository>();
|
|
services.AddTransient<IUserRepository, PostgreSqlUserRepository>();
|
|
services.AddTransient<IAgentSummaryRepository, AgentSummaryRepository>();
|
|
services.AddTransient<IStatisticRepository, PostgreSqlStatisticRepository>();
|
|
services.AddTransient<IBotRepository, PostgreSqlBotRepository>();
|
|
services.AddTransient<IWorkerRepository, PostgreSqlWorkerRepository>();
|
|
services.AddTransient<ISynthRepository, PostgreSqlSynthRepository>();
|
|
services.AddTransient<IWhitelistRepository, PostgreSqlWhitelistRepository>();
|
|
|
|
// InfluxDb Repositories
|
|
services.AddSingleton<IInfluxDbRepository, InfluxDbRepository>();
|
|
services.AddSingleton<ICandleRepository, CandleRepository>();
|
|
services.AddSingleton<IAgentBalanceRepository, AgentBalanceRepository>();
|
|
|
|
// Cache
|
|
services.AddDistributedMemoryCache();
|
|
services.AddTransient<ICacheService, CacheService>();
|
|
services.AddSingleton<ITaskCache, TaskCache>();
|
|
|
|
return services;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// No-op implementation of IDiscordService for compute workers
|
|
/// </summary>
|
|
internal class NoOpDiscordService : IDiscordService
|
|
{
|
|
public Task SendSignal(string message, TradingExchanges exchange, Ticker ticker, TradeDirection direction, Timeframe timeframe) => Task.CompletedTask;
|
|
public Task SendPosition(Position position) => Task.CompletedTask;
|
|
public Task SendClosingPosition(Position position) => Task.CompletedTask;
|
|
public Task SendMessage(string v) => Task.CompletedTask;
|
|
public Task SendTradeMessage(string message, bool isBadBehavior = false) => Task.CompletedTask;
|
|
public Task SendIncreasePosition(string address, Trade trade, string copyAccountName, Trade? oldTrade = null) => Task.CompletedTask;
|
|
public Task SendClosedPosition(string address, Trade oldTrade) => Task.CompletedTask;
|
|
public Task SendDecreasePosition(string address, Trade newTrade, decimal decreaseAmount) => Task.CompletedTask;
|
|
public Task SendBestTraders(List<Trader> traders) => Task.CompletedTask;
|
|
public Task SendBadTraders(List<Trader> traders) => Task.CompletedTask;
|
|
public Task SendDowngradedFundingRate(FundingRate oldRate) => Task.CompletedTask;
|
|
public Task SendNewTopFundingRate(FundingRate newRate) => Task.CompletedTask;
|
|
public Task SendFundingRateUpdate(FundingRate oldRate, FundingRate newRate) => Task.CompletedTask;
|
|
public Task SendDebugMessage(string message) => Task.CompletedTask;
|
|
}
|
|
|
|
|