Phase 3: Trading-Kern (Risk, Execution, Portfolio) mit sicherem Broker-Default - Core/Trading/TradingModels: Signal, Order(Request/Result), RiskContext/Decision, Account, Position, Quote, ExecutionResult, Enums (Side/OrderType/Mode) - IBrokerClient + NullBrokerClient (sicherer Default, handelt NIE bis IBKR-Adapter verifiziert) - RiskService (+IRiskService): Sizing nach MaxTrade%, Modul-Limit, Slippage; Buy/Sell - PortfolioService (+IPortfolioService): core_position + core_trade_history + core_budget - ExecutionService (+IExecutionService): Signal -> Kurs -> Konto -> Risiko -> Order -> Buchung - TradingSettings in AppSettings (Paper/Live, TradingEnabled, Risikoparameter) - CoreMigrations: core_position; DI-Registrierung der Trading-Services - Tests: RiskService (11) + ExecutionService (6, NSubstitute) -> 38/38 gruen Offen (bewusst gekapselt): echter IbkrBrokerClient gegen Client-Portal-Gateway (manuell verifizieren). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
30 lines
1.1 KiB
C#
30 lines
1.1 KiB
C#
using IBKRTrader.Core.Logging;
|
||
|
||
namespace IBKRTrader.Core.Trading;
|
||
|
||
/// <summary>
|
||
/// Sicherer Standard-Broker: handelt NIEMALS.
|
||
/// Wird registriert, bis der echte IBKR-Adapter angebunden und gegen den
|
||
/// Paper-Gateway verifiziert ist. So kann keine Order versehentlich rausgehen.
|
||
/// </summary>
|
||
public sealed class NullBrokerClient : IBrokerClient
|
||
{
|
||
private readonly LoggingService _logger;
|
||
|
||
public NullBrokerClient(LoggingService logger) => _logger = logger;
|
||
|
||
public Task<Quote?> GetQuoteAsync(string symbol, CancellationToken ct = default)
|
||
=> Task.FromResult<Quote?>(null);
|
||
|
||
public Task<AccountState> GetAccountStateAsync(CancellationToken ct = default)
|
||
=> Task.FromResult(new AccountState(0m, 0m));
|
||
|
||
public Task<OrderResult> PlaceOrderAsync(OrderRequest request, CancellationToken ct = default)
|
||
{
|
||
_logger.Warn("Core",
|
||
$"NullBrokerClient: Order NICHT ausgeführt ({request.Side} {request.Quantity}x {request.Symbol}) " +
|
||
"– echter IBKR-Broker noch nicht angebunden.");
|
||
return Task.FromResult(OrderResult.Fail("Broker nicht angebunden (NullBrokerClient)."));
|
||
}
|
||
}
|