fix position initiator + pnl for trade

This commit is contained in:
2025-04-27 22:49:49 +07:00
parent 0b1710cd69
commit 68618a8628
5 changed files with 43 additions and 31 deletions

View File

@@ -126,7 +126,7 @@ public class TradingBot : Bot, ITradingBot
await InitWorker(Run); await InitWorker(Run);
} }
Fee = TradingService.GetFee(Account, IsForBacktest); // Fee = TradingService.GetFee(Account, IsForBacktest);
} }
public async Task LoadAccount() public async Task LoadAccount()
@@ -249,14 +249,14 @@ public class TradingBot : Bot, ITradingBot
private async Task AddSignal(Signal signal) private async Task AddSignal(Signal signal)
{ {
Signals.Add(signal);
// if (!IsForBacktest) // if (!IsForBacktest)
// TradingService.InsertSignal(signal); // TradingService.InsertSignal(signal);
if (IsForWatchingOnly || (ExecutionCount < 1 && !IsForBacktest)) if (IsForWatchingOnly || (ExecutionCount < 1 && !IsForBacktest))
signal.Status = SignalStatus.Expired; signal.Status = SignalStatus.Expired;
Signals.Add(signal);
var signalText = $"{ScenarioName} trigger a signal. Signal told you " + var signalText = $"{ScenarioName} trigger a signal. Signal told you " +
$"to {signal.Direction} {Ticker} on {Timeframe}. The confidence in this signal is {signal.Confidence}. Identifier : {signal.Identifier}"; $"to {signal.Direction} {Ticker} on {Timeframe}. The confidence in this signal is {signal.Confidence}. Identifier : {signal.Identifier}";
@@ -285,9 +285,6 @@ public class TradingBot : Bot, ITradingBot
private async Task ManagePositions() private async Task ManagePositions()
{ {
if (!IsForBacktest && ExecutionCount < 1)
return;
// Update position // Update position
foreach (var signal in Signals.Where(s => s.Status == SignalStatus.PositionOpen)) foreach (var signal in Signals.Where(s => s.Status == SignalStatus.PositionOpen))
{ {
@@ -346,11 +343,26 @@ public class TradingBot : Bot, ITradingBot
if (!IsForBacktest) if (!IsForBacktest)
{ {
position = positionsExchange.FirstOrDefault(p => p.Ticker == Ticker); var brokerPosition = positionsExchange.FirstOrDefault(p => p.Ticker == Ticker);
if (brokerPosition != null)
if (position != null)
{ {
UpdatePositionPnl(positionForSignal.Identifier, position.ProfitAndLoss.Realized); UpdatePositionPnl(positionForSignal.Identifier, brokerPosition.ProfitAndLoss.Realized);
if (position.Status.Equals(PositionStatus.New))
{
await SetPositionStatus(position.SignalIdentifier, PositionStatus.Filled);
}
position = brokerPosition;
}
else
{
// No position, position close on the broker
if (!position.Status.Equals(PositionStatus.New))
{
// Setup the previous status of the position
position.Status = PositionStatus.Filled;
}
} }
} }
@@ -540,7 +552,7 @@ public class TradingBot : Bot, ITradingBot
MoneyManagement, MoneyManagement,
signal.Direction, signal.Direction,
Ticker, Ticker,
IsForBacktest ? PositionInitiator.PaperTrading : PositionInitiator.Bot, PositionInitiator.Bot,
signal.Date, signal.Date,
User, User,
IsForBacktest, IsForBacktest,
@@ -587,6 +599,8 @@ public class TradingBot : Bot, ITradingBot
private bool CanOpenPosition(Signal signal) private bool CanOpenPosition(Signal signal)
{ {
if (ExecutionCount < 1)
return false;
if (Positions.Count == 0) if (Positions.Count == 0)
return true; return true;
@@ -625,6 +639,7 @@ public class TradingBot : Bot, ITradingBot
} }
else else
{ {
position.Initiator = PositionInitiator.Bot;
var command = new ClosePositionCommand(position, lastPrice); var command = new ClosePositionCommand(position, lastPrice);
try try
{ {
@@ -826,7 +841,7 @@ public class TradingBot : Bot, ITradingBot
IsForWatchingOnly = IsForWatchingOnly, IsForWatchingOnly = IsForWatchingOnly,
WalletBalances = WalletBalances, WalletBalances = WalletBalances,
MoneyManagement = MoneyManagement, MoneyManagement = MoneyManagement,
StartupTime = DateTime.Now StartupTime = StartupTime,
}; };
BotService.SaveOrUpdateBotBackup(Name, BotType, JsonConvert.SerializeObject(data)); BotService.SaveOrUpdateBotBackup(Name, BotType, JsonConvert.SerializeObject(data));
} }

View File

@@ -1,16 +1,15 @@
using InfluxDB.Client.Api.Domain; using Managing.Application.Abstractions;
using Managing.Application.Abstractions; using Managing.Application.Abstractions.Repositories;
using Managing.Application.Abstractions.Services; using Managing.Application.Abstractions.Services;
using Managing.Application.Trading.Commands;
using Managing.Application.Trading; using Managing.Application.Trading;
using Managing.Application.Trading.Commands;
using Managing.Domain.Accounts; using Managing.Domain.Accounts;
using Managing.Domain.Candles;
using Managing.Domain.Strategies; using Managing.Domain.Strategies;
using Managing.Domain.Trades; using Managing.Domain.Trades;
using Managing.Domain.Workflows; using Managing.Domain.Workflows;
using Newtonsoft.Json; using Newtonsoft.Json;
using static Managing.Common.Enums; using static Managing.Common.Enums;
using Managing.Domain.Candles;
using Managing.Application.Abstractions.Repositories;
namespace Managing.Application.Workflows.Flows.Trading; namespace Managing.Application.Workflows.Flows.Trading;
@@ -64,10 +63,6 @@ public class OpenPosition : FlowBase
var Positions = JsonConvert.DeserializeObject<List<Position>>(_cacheService.GetValue(POSITIONS_KEY)); var Positions = JsonConvert.DeserializeObject<List<Position>>(_cacheService.GetValue(POSITIONS_KEY));
var Signals = JsonConvert.DeserializeObject<HashSet<Signal>>(_cacheService.GetValue(POSITIONS_KEY)); var Signals = JsonConvert.DeserializeObject<HashSet<Signal>>(_cacheService.GetValue(POSITIONS_KEY));
Fee = _cacheService.GetOrSave(FEE_KEY,
() => { return _tradingService.GetFee(Account, OpenPositionParameters.IsForBacktest); },
TimeSpan.FromDays(1));
await ExecuteOpenPosition(signal, Positions, Signals, Candles, Account); await ExecuteOpenPosition(signal, Positions, Signals, Candles, Account);
_cacheService.SaveValue(POSITIONS_KEY, JsonConvert.SerializeObject(Positions)); _cacheService.SaveValue(POSITIONS_KEY, JsonConvert.SerializeObject(Positions));

View File

@@ -1,5 +1,4 @@
using System.Collections.Concurrent; using Managing.Domain.Users;
using Managing.Domain.Users;
using static Managing.Common.Enums; using static Managing.Common.Enums;
namespace Managing.Domain.Bots namespace Managing.Domain.Bots
@@ -16,10 +15,12 @@ namespace Managing.Domain.Bots
public int Interval { get; set; } public int Interval { get; set; }
public BotStatus Status { get; set; } public BotStatus Status { get; set; }
public User User { get; set; } public User User { get; set; }
/// <summary> /// <summary>
/// The time when the bot was started /// The time when the bot was started
/// </summary> /// </summary>
public DateTime StartupTime { get; private set; } public DateTime StartupTime { get; private set; }
private CancellationTokenSource CancellationToken { get; set; } private CancellationTokenSource CancellationToken { get; set; }
public Bot(string name) public Bot(string name)
@@ -62,14 +63,15 @@ namespace Managing.Domain.Bots
} }
catch (Exception ex) catch (Exception ex)
{ {
SentrySdk.CaptureException(ex);
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
} }
} }
}, CancellationToken.Token); }, CancellationToken.Token);
} }
catch (TaskCanceledException) catch (TaskCanceledException ex)
{ {
Console.WriteLine(); Console.WriteLine($"Bot was cancelled: {ex.Message}");
} }
} }

View File

@@ -1,6 +1,6 @@
using Managing.Domain.MoneyManagements; using System.ComponentModel.DataAnnotations;
using Managing.Domain.MoneyManagements;
using Managing.Domain.Users; using Managing.Domain.Users;
using System.ComponentModel.DataAnnotations;
using static Managing.Common.Enums; using static Managing.Common.Enums;
namespace Managing.Domain.Trades namespace Managing.Domain.Trades
@@ -34,7 +34,7 @@ namespace Managing.Domain.Trades
[Required] public PositionStatus Status { get; set; } [Required] public PositionStatus Status { get; set; }
public string SignalIdentifier { get; set; } public string SignalIdentifier { get; set; }
[Required] public string Identifier { get; set; } [Required] public string Identifier { get; set; }
[Required] public PositionInitiator Initiator { get; } [Required] public PositionInitiator Initiator { get; set; }
[Required] public User User { get; set; } [Required] public User User { get; set; }
public bool IsFinished() public bool IsFinished()

View File

@@ -451,7 +451,7 @@ export const closeGmxPositionImpl = async (
indexPrice: 0n, indexPrice: 0n,
collateralPrice: 0n, collateralPrice: 0n,
acceptablePrice: position.markPrice, acceptablePrice: position.markPrice,
triggerOrderType: OrderType.LimitDecrease, triggerOrderType: OrderType.MarketDecrease,
triggerPrice: position.markPrice, triggerPrice: position.markPrice,
} }