Fix close position

This commit is contained in:
2025-05-12 13:07:43 +07:00
parent 0cf523c144
commit 4b0e87d48e
7 changed files with 20 additions and 16 deletions

View File

@@ -10,7 +10,6 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using static Managing.Common.Enums; using static Managing.Common.Enums;
using ApplicationTradingBot = Managing.Application.Bots.TradingBot;
using ApiTradingBot = Managing.Api.Models.Responses.TradingBot; using ApiTradingBot = Managing.Api.Models.Responses.TradingBot;
namespace Managing.Api.Controllers; namespace Managing.Api.Controllers;
@@ -454,7 +453,7 @@ public class BotController : BaseController
} }
var activeBots = _botService.GetActiveBots(); var activeBots = _botService.GetActiveBots();
var bot = activeBots.FirstOrDefault(b => b.Identifier == request.Identifier) as ApplicationTradingBot; var bot = activeBots.FirstOrDefault(b => b.Identifier == request.Identifier);
if (bot == null) if (bot == null)
{ {
@@ -498,7 +497,7 @@ public class BotController : BaseController
} }
var activeBots = _botService.GetActiveBots(); var activeBots = _botService.GetActiveBots();
var bot = activeBots.FirstOrDefault(b => b.Identifier == request.Identifier) as ApplicationTradingBot; var bot = activeBots.FirstOrDefault(b => b.Identifier == request.Identifier);
if (bot == null) if (bot == null)
{ {

View File

@@ -37,5 +37,6 @@
"RequestsChannelId": 1018589494968078356, "RequestsChannelId": 1018589494968078356,
"ButtonExpirationMinutes": 2 "ButtonExpirationMinutes": 2
}, },
"AllowedHosts": "*" "AllowedHosts": "*",
"EnableBotManager": true
} }

View File

@@ -1,5 +1,4 @@
using Managing.Application.Bots; using Managing.Core.FixedSizedQueue;
using Managing.Core.FixedSizedQueue;
using Managing.Domain.Accounts; using Managing.Domain.Accounts;
using Managing.Domain.Bots; using Managing.Domain.Bots;
using Managing.Domain.Candles; using Managing.Domain.Candles;
@@ -38,5 +37,8 @@ namespace Managing.Application.Abstractions
void UpdateStrategiesValues(); void UpdateStrategiesValues();
Task LoadAccount(); Task LoadAccount();
Task<Position> OpenPositionManually(TradeDirection direction); Task<Position> OpenPositionManually(TradeDirection direction);
Task CloseTrade(Signal signal, Position position, Trade tradeToClose, decimal lastPrice,
bool tradeClosingPosition = false);
} }
} }

View File

@@ -456,9 +456,11 @@ export const closeGmxPositionImpl = async (
// Find the specific position to close // Find the specific position to close
const positionKey = Object.keys(positionsInfo).find(key => { const positionKey = Object.keys(positionsInfo).find(key => {
const position = positionsInfo[key]; const position = positionsInfo[key];
return position.marketInfo.indexToken.symbol === ticker && position.isLong === (direction === TradeDirection.Short); return position.marketInfo.indexToken.symbol === ticker && position.isLong === (direction === TradeDirection.Long);
}); });
console.log("positionsInfo", positionsInfo);
if (!positionKey) { if (!positionKey) {
throw new Error(`No open ${direction} position found for ${ticker}`); throw new Error(`No open ${direction} position found for ${ticker}`);
} }
@@ -503,7 +505,7 @@ export const closeGmxPositionImpl = async (
marketInfo, marketInfo,
marketsInfoData, marketsInfoData,
tokensData, tokensData,
isLong: direction === TradeDirection.Short, isLong: direction === TradeDirection.Long,
allowedSlippage: 30, allowedSlippage: 30,
decreaseAmounts, decreaseAmounts,
collateralToken: position.marketInfo.shortToken, collateralToken: position.marketInfo.shortToken,

View File

@@ -1,7 +1,7 @@
import { test } from 'node:test' import {test} from 'node:test'
import assert from 'node:assert' import assert from 'node:assert'
import { getClientForAddress, closeGmxPositionImpl } from '../../src/plugins/custom/gmx' import {closeGmxPositionImpl, getClientForAddress} from '../../src/plugins/custom/gmx'
import { TradeDirection } from '../../src/generated/ManagingApiTypes' import {TradeDirection} from '../../src/generated/ManagingApiTypes'
test('GMX Position Closing', async (t) => { test('GMX Position Closing', async (t) => {
await t.test('should close a long position for BTC', async () => { await t.test('should close a long position for BTC', async () => {
@@ -9,7 +9,7 @@ test('GMX Position Closing', async (t) => {
const result = await closeGmxPositionImpl( const result = await closeGmxPositionImpl(
sdk, sdk,
'BTC', 'BNB',
TradeDirection.Long TradeDirection.Long
) )
console.log('Position closing result:', result) console.log('Position closing result:', result)

View File

@@ -1,7 +1,7 @@
import React from 'react' import React from 'react'
import { useForm } from 'react-hook-form' import {useForm} from 'react-hook-form'
import * as z from 'zod' import * as z from 'zod'
import { BotClient, TradeDirection } from '../../generated/ManagingApi' import {BotClient, TradeDirection} from '../../generated/ManagingApi'
import useApiUrlStore from '../../app/store/apiStore' import useApiUrlStore from '../../app/store/apiStore'
import Toast from './Toast/Toast' import Toast from './Toast/Toast'
@@ -33,7 +33,7 @@ function ManualPositionModal({ showModal, botName, onClose }: ManualPositionModa
const t = new Toast('Opening position...') const t = new Toast('Opening position...')
try { try {
await client.bot_OpenPositionManually({ await client.bot_OpenPositionManually({
botName: botName, identifier: botName,
direction: data.direction, direction: data.direction,
}) })
t.update('success', 'Position opened successfully') t.update('success', 'Position opened successfully')

View File

@@ -60,7 +60,7 @@ const TradesModal: React.FC<TradesModalProps> = ({
// Use BotClient instead of fetch // Use BotClient instead of fetch
const botClient = new BotClient({}, apiUrl) const botClient = new BotClient({}, apiUrl)
const request: ClosePositionRequest = { const request: ClosePositionRequest = {
identifier: agentName, identifier: strategyName,
positionId: position.identifier positionId: position.identifier
} }