feat(app): add evaluation history, bot control panel, simulation visualizer, and vendored signalr_core

This commit is contained in:
2026-08-24 21:37:43 +02:00
parent 676496b77d
commit 0894c40f07
113 changed files with 12413 additions and 3613 deletions
@@ -35,16 +35,15 @@ class _TradeAcceptanceDialogState extends State<TradeAcceptanceDialog> {
@override
void initState() {
super.initState();
_entryPriceCtrl = TextEditingController(text: widget.trade.entryPrice.toStringAsFixed(2));
_entryPriceCtrl = TextEditingController(text: widget.trade.averageBuyIn.toStringAsFixed(2));
_positionSizeCtrl = TextEditingController(text: '1000');
final lev = widget.trade.maxLeverage > 0 ? widget.trade.maxLeverage : 1.0;
_leverageCtrl = TextEditingController(text: lev == lev.roundToDouble() ? lev.toInt().toString() : lev.toStringAsFixed(2));
_stopLossCtrl = TextEditingController(text: widget.trade.stopLoss.toStringAsFixed(2));
_takeProfitCtrl = TextEditingController(text: widget.trade.takeProfit.toStringAsFixed(2));
_leverageCtrl = TextEditingController(text: '1');
_stopLossCtrl = TextEditingController(text: widget.trade.currentStopLoss.toStringAsFixed(2));
_takeProfitCtrl = TextEditingController(text: (widget.trade.primaryTakeProfit ?? 0.0).toStringAsFixed(2));
_notesCtrl = TextEditingController();
_entryFeeCtrl = TextEditingController(text: '0.00');
_exitFeeCtrl = TextEditingController(text: '0.00');
double price = widget.trade.entryPrice;
double price = widget.trade.averageBuyIn;
_quantityCtrl = TextEditingController(text: (1000 / (price > 0 ? price : 1)).toStringAsFixed(4));
}
@@ -176,8 +175,7 @@ class _TradeAcceptanceDialogState extends State<TradeAcceptanceDialog> {
final dto = TradeAcceptanceDto(
userId: widget.userId,
tradeId: widget.trade.id,
analysisId: widget.trade.analysisId,
isin: widget.trade.isin,
isin: widget.trade.underlyingIsin,
symbol: widget.trade.symbol,
actualEntryPrice: _parseNum(_entryPriceCtrl.text),
positionSize: _parseNum(_positionSizeCtrl.text),
@@ -187,13 +185,11 @@ class _TradeAcceptanceDialogState extends State<TradeAcceptanceDialog> {
quantity: _parseNum(_quantityCtrl.text),
isRecurring: _isRecurring,
executionTimestamp: DateTime.now().toUtc(),
signalType: widget.trade.signalType,
entryPrice: widget.trade.entryPrice,
stopLoss: widget.trade.stopLoss,
takeProfit: widget.trade.takeProfit,
instrumentType: widget.trade.instrumentType,
timeframe: widget.trade.timeframe,
reasoning: widget.trade.reasoning,
signalType: widget.trade.direction.label,
entryPrice: widget.trade.averageBuyIn,
stopLoss: widget.trade.currentStopLoss,
takeProfit: widget.trade.primaryTakeProfit,
instrumentType: widget.trade.instrumentType.label,
);
Navigator.of(context).pop(dto);
},