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);
}
Fee = TradingService.GetFee(Account, IsForBacktest);
// Fee = TradingService.GetFee(Account, IsForBacktest);
}
public async Task LoadAccount()
@@ -249,14 +249,14 @@ public class TradingBot : Bot, ITradingBot
private async Task AddSignal(Signal signal)
{
Signals.Add(signal);
// if (!IsForBacktest)
// TradingService.InsertSignal(signal);
if (IsForWatchingOnly || (ExecutionCount < 1 && !IsForBacktest))
signal.Status = SignalStatus.Expired;
Signals.Add(signal);
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}";
@@ -285,9 +285,6 @@ public class TradingBot : Bot, ITradingBot
private async Task ManagePositions()
{
if (!IsForBacktest && ExecutionCount < 1)
return;
// Update position
foreach (var signal in Signals.Where(s => s.Status == SignalStatus.PositionOpen))
{
@@ -346,11 +343,26 @@ public class TradingBot : Bot, ITradingBot
if (!IsForBacktest)
{
position = positionsExchange.FirstOrDefault(p => p.Ticker == Ticker);
if (position != null)
var brokerPosition = positionsExchange.FirstOrDefault(p => p.Ticker == Ticker);
if (brokerPosition != 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,
signal.Direction,
Ticker,
IsForBacktest ? PositionInitiator.PaperTrading : PositionInitiator.Bot,
PositionInitiator.Bot,
signal.Date,
User,
IsForBacktest,
@@ -587,6 +599,8 @@ public class TradingBot : Bot, ITradingBot
private bool CanOpenPosition(Signal signal)
{
if (ExecutionCount < 1)
return false;
if (Positions.Count == 0)
return true;
@@ -625,6 +639,7 @@ public class TradingBot : Bot, ITradingBot
}
else
{
position.Initiator = PositionInitiator.Bot;
var command = new ClosePositionCommand(position, lastPrice);
try
{
@@ -826,7 +841,7 @@ public class TradingBot : Bot, ITradingBot
IsForWatchingOnly = IsForWatchingOnly,
WalletBalances = WalletBalances,
MoneyManagement = MoneyManagement,
StartupTime = DateTime.Now
StartupTime = StartupTime,
};
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.Trading.Commands;
using Managing.Application.Trading;
using Managing.Application.Trading.Commands;
using Managing.Domain.Accounts;
using Managing.Domain.Candles;
using Managing.Domain.Strategies;
using Managing.Domain.Trades;
using Managing.Domain.Workflows;
using Newtonsoft.Json;
using static Managing.Common.Enums;
using Managing.Domain.Candles;
using Managing.Application.Abstractions.Repositories;
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 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);
_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;
namespace Managing.Domain.Bots
@@ -16,10 +15,12 @@ namespace Managing.Domain.Bots
public int Interval { get; set; }
public BotStatus Status { get; set; }
public User User { get; set; }
/// <summary>
/// The time when the bot was started
/// </summary>
public DateTime StartupTime { get; private set; }
private CancellationTokenSource CancellationToken { get; set; }
public Bot(string name)
@@ -62,14 +63,15 @@ namespace Managing.Domain.Bots
}
catch (Exception ex)
{
SentrySdk.CaptureException(ex);
Console.WriteLine(ex.Message);
}
}
}, 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 System.ComponentModel.DataAnnotations;
using static Managing.Common.Enums;
namespace Managing.Domain.Trades
@@ -34,7 +34,7 @@ namespace Managing.Domain.Trades
[Required] public PositionStatus Status { get; set; }
public string SignalIdentifier { 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; }
public bool IsFinished()

View File

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