From a97b5804a077a5cc8588a73f21e6ba6ff84263bc Mon Sep 17 00:00:00 2001 From: cryptooda Date: Sat, 4 Oct 2025 17:38:01 +0700 Subject: [PATCH] Update position saving and update --- .../Bots/TradingBotBase.cs | 36 +++++++++++++++++++ .../EvmManager.cs | 12 +++---- .../Services/Gmx/GmxV2Mappers.cs | 4 ++- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/Managing.Application/Bots/TradingBotBase.cs b/src/Managing.Application/Bots/TradingBotBase.cs index 22698316..0c192b5c 100644 --- a/src/Managing.Application/Bots/TradingBotBase.cs +++ b/src/Managing.Application/Bots/TradingBotBase.cs @@ -406,6 +406,32 @@ public class TradingBotBase : ITradingBot internalPosition.Open.SetStatus(TradeStatus.Filled); positionForSignal.Open.SetStatus(TradeStatus.Filled); + // Update Open trade ExchangeOrderId if broker position has one + if (brokerPosition.Open?.ExchangeOrderId != null && internalPosition.Open != null) + { + internalPosition.Open.SetExchangeOrderId(brokerPosition.Open.ExchangeOrderId); + positionForSignal.Open.SetExchangeOrderId(brokerPosition.Open.ExchangeOrderId); + } + + // Update Stop Loss and Take Profit trades with correct ExchangeOrderId from broker + if (brokerPosition.StopLoss != null && internalPosition.StopLoss != null) + { + internalPosition.StopLoss.SetExchangeOrderId(brokerPosition.StopLoss.ExchangeOrderId); + positionForSignal.StopLoss.SetExchangeOrderId(brokerPosition.StopLoss.ExchangeOrderId); + } + + if (brokerPosition.TakeProfit1 != null && internalPosition.TakeProfit1 != null) + { + internalPosition.TakeProfit1.SetExchangeOrderId(brokerPosition.TakeProfit1.ExchangeOrderId); + positionForSignal.TakeProfit1.SetExchangeOrderId(brokerPosition.TakeProfit1.ExchangeOrderId); + } + + if (brokerPosition.TakeProfit2 != null && internalPosition.TakeProfit2 != null) + { + internalPosition.TakeProfit2.SetExchangeOrderId(brokerPosition.TakeProfit2.ExchangeOrderId); + positionForSignal.TakeProfit2.SetExchangeOrderId(brokerPosition.TakeProfit2.ExchangeOrderId); + } + await UpdatePositionDatabase(internalPosition); if (previousPositionStatus != PositionStatus.Filled && @@ -503,12 +529,22 @@ public class TradingBotBase : ITradingBot if (internalPosition.Open != null) { internalPosition.Open.SetStatus(TradeStatus.Filled); + // Update Open trade ExchangeOrderId if broker position has one + if (brokerPosition.Open?.ExchangeOrderId != null) + { + internalPosition.Open.SetExchangeOrderId(brokerPosition.Open.ExchangeOrderId); + } } // Also update the position in the bot's positions dictionary if (positionForSignal.Open != null) { positionForSignal.Open.SetStatus(TradeStatus.Filled); + // Update Open trade ExchangeOrderId if broker position has one + if (brokerPosition.Open?.ExchangeOrderId != null) + { + positionForSignal.Open.SetExchangeOrderId(brokerPosition.Open.ExchangeOrderId); + } } await SetPositionStatus(signal.Identifier, PositionStatus.Filled); diff --git a/src/Managing.Infrastructure.Web3/EvmManager.cs b/src/Managing.Infrastructure.Web3/EvmManager.cs index 22b4acce..1a2a1f82 100644 --- a/src/Managing.Infrastructure.Web3/EvmManager.cs +++ b/src/Managing.Infrastructure.Web3/EvmManager.cs @@ -689,8 +689,8 @@ public class EvmManager : IEvmManager quantity, price, leverage ?? 1.0m, - account.Key, - "" + "", // ExchangeOrderId should be empty for requested trades + "" // Empty message for now ); } catch (Exception e) @@ -750,7 +750,7 @@ public class EvmManager : IEvmManager quantity, price, leverage ?? 1, - response.Hash, + response.Hash, // This should be the actual transaction hash/order ID "" ); @@ -819,7 +819,7 @@ public class EvmManager : IEvmManager if (position == null) return null; - // TODO: Map the position object to a Trade object + // Map the position object to a Trade object var trade = new Trade( position.Date, MiscExtensions.ParseEnum(position.Direction), @@ -829,8 +829,8 @@ public class EvmManager : IEvmManager (decimal)position.Quantity, (decimal)position.Price, (decimal?)position.Leverage, - account.Key, - position.ExchangeOrderId + position.ExchangeOrderId, // Use the actual exchange order ID from the position + "" // Empty message for now ); return trade; diff --git a/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs b/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs index c3a04b79..47efda4b 100644 --- a/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs +++ b/src/Managing.Infrastructure.Web3/Services/Gmx/GmxV2Mappers.cs @@ -171,9 +171,11 @@ internal static class GmxV2Mappers PositionInitiator.User, gmxPosition.Date, new User()); + // For the Open trade, use the Open trade's ExchangeOrderId if available, otherwise use a new GUID + var openExchangeOrderId = gmxPosition.Open?.ExchangeOrderId ?? Guid.NewGuid().ToString(); position.Open = new Trade(position.Date, direction, TradeStatus.Filled, TradeType.Market, ticker, (decimal)gmxPosition.Quantity, (decimal)gmxPosition.Price, (decimal)gmxPosition.Leverage, - gmxPosition.Open.ExchangeOrderId, ""); + openExchangeOrderId, ""); if (gmxPosition.TakeProfit1 != null) {