fix position initiator + pnl for trade
This commit is contained in:
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +96,7 @@ namespace Managing.Domain.Bots
|
|||||||
{
|
{
|
||||||
return Name;
|
return Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the total runtime of the bot since it was started
|
/// Gets the total runtime of the bot since it was started
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -103,7 +105,7 @@ namespace Managing.Domain.Bots
|
|||||||
{
|
{
|
||||||
if (Status != BotStatus.Up || StartupTime == DateTime.MinValue)
|
if (Status != BotStatus.Up || StartupTime == DateTime.MinValue)
|
||||||
return TimeSpan.Zero;
|
return TimeSpan.Zero;
|
||||||
|
|
||||||
return DateTime.UtcNow - StartupTime;
|
return DateTime.UtcNow - StartupTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user