diff --git a/src/Managing.Api/Controllers/BotController.cs b/src/Managing.Api/Controllers/BotController.cs index 9361429..69cf95a 100644 --- a/src/Managing.Api/Controllers/BotController.cs +++ b/src/Managing.Api/Controllers/BotController.cs @@ -10,7 +10,6 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using static Managing.Common.Enums; -using ApplicationTradingBot = Managing.Application.Bots.TradingBot; using ApiTradingBot = Managing.Api.Models.Responses.TradingBot; namespace Managing.Api.Controllers; @@ -454,7 +453,7 @@ public class BotController : BaseController } 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) { @@ -498,7 +497,7 @@ public class BotController : BaseController } 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) { diff --git a/src/Managing.Api/appsettings.Oda.json b/src/Managing.Api/appsettings.Oda.json index cf0af0d..e76087f 100644 --- a/src/Managing.Api/appsettings.Oda.json +++ b/src/Managing.Api/appsettings.Oda.json @@ -37,5 +37,6 @@ "RequestsChannelId": 1018589494968078356, "ButtonExpirationMinutes": 2 }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "EnableBotManager": true } \ No newline at end of file diff --git a/src/Managing.Application/Abstractions/ITradingBot.cs b/src/Managing.Application/Abstractions/ITradingBot.cs index c954780..37e5381 100644 --- a/src/Managing.Application/Abstractions/ITradingBot.cs +++ b/src/Managing.Application/Abstractions/ITradingBot.cs @@ -1,5 +1,4 @@ -using Managing.Application.Bots; -using Managing.Core.FixedSizedQueue; +using Managing.Core.FixedSizedQueue; using Managing.Domain.Accounts; using Managing.Domain.Bots; using Managing.Domain.Candles; @@ -38,5 +37,8 @@ namespace Managing.Application.Abstractions void UpdateStrategiesValues(); Task LoadAccount(); Task OpenPositionManually(TradeDirection direction); + + Task CloseTrade(Signal signal, Position position, Trade tradeToClose, decimal lastPrice, + bool tradeClosingPosition = false); } } \ No newline at end of file diff --git a/src/Managing.Web3Proxy/src/plugins/custom/gmx.ts b/src/Managing.Web3Proxy/src/plugins/custom/gmx.ts index 1f9e04c..2bf7694 100644 --- a/src/Managing.Web3Proxy/src/plugins/custom/gmx.ts +++ b/src/Managing.Web3Proxy/src/plugins/custom/gmx.ts @@ -456,9 +456,11 @@ export const closeGmxPositionImpl = async ( // Find the specific position to close const positionKey = Object.keys(positionsInfo).find(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) { throw new Error(`No open ${direction} position found for ${ticker}`); } @@ -503,7 +505,7 @@ export const closeGmxPositionImpl = async ( marketInfo, marketsInfoData, tokensData, - isLong: direction === TradeDirection.Short, + isLong: direction === TradeDirection.Long, allowedSlippage: 30, decreaseAmounts, collateralToken: position.marketInfo.shortToken, diff --git a/src/Managing.Web3Proxy/test/plugins/close-position.test.ts b/src/Managing.Web3Proxy/test/plugins/close-position.test.ts index 36a879d..fb98bc9 100644 --- a/src/Managing.Web3Proxy/test/plugins/close-position.test.ts +++ b/src/Managing.Web3Proxy/test/plugins/close-position.test.ts @@ -1,7 +1,7 @@ -import { test } from 'node:test' +import {test} from 'node:test' import assert from 'node:assert' -import { getClientForAddress, closeGmxPositionImpl } from '../../src/plugins/custom/gmx' -import { TradeDirection } from '../../src/generated/ManagingApiTypes' +import {closeGmxPositionImpl, getClientForAddress} from '../../src/plugins/custom/gmx' +import {TradeDirection} from '../../src/generated/ManagingApiTypes' test('GMX Position Closing', async (t) => { 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( sdk, - 'BTC', + 'BNB', TradeDirection.Long ) console.log('Position closing result:', result) diff --git a/src/Managing.WebApp/src/components/mollecules/ManualPositionModal.tsx b/src/Managing.WebApp/src/components/mollecules/ManualPositionModal.tsx index f7363d1..c037200 100644 --- a/src/Managing.WebApp/src/components/mollecules/ManualPositionModal.tsx +++ b/src/Managing.WebApp/src/components/mollecules/ManualPositionModal.tsx @@ -1,7 +1,7 @@ import React from 'react' -import { useForm } from 'react-hook-form' +import {useForm} from 'react-hook-form' import * as z from 'zod' -import { BotClient, TradeDirection } from '../../generated/ManagingApi' +import {BotClient, TradeDirection} from '../../generated/ManagingApi' import useApiUrlStore from '../../app/store/apiStore' import Toast from './Toast/Toast' @@ -33,7 +33,7 @@ function ManualPositionModal({ showModal, botName, onClose }: ManualPositionModa const t = new Toast('Opening position...') try { await client.bot_OpenPositionManually({ - botName: botName, + identifier: botName, direction: data.direction, }) t.update('success', 'Position opened successfully') diff --git a/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx b/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx index f250b5f..dd8a07b 100644 --- a/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx +++ b/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx @@ -60,7 +60,7 @@ const TradesModal: React.FC = ({ // Use BotClient instead of fetch const botClient = new BotClient({}, apiUrl) const request: ClosePositionRequest = { - identifier: agentName, + identifier: strategyName, positionId: position.identifier }