-
Open Position Manually for {botName}
+
Create Signal Manually
diff --git a/src/Managing.WebApp/src/components/organism/CustomMoneyManagement/CustomMoneyManagement.tsx b/src/Managing.WebApp/src/components/organism/CustomMoneyManagement/CustomMoneyManagement.tsx
index e8c11adf..5952345c 100644
--- a/src/Managing.WebApp/src/components/organism/CustomMoneyManagement/CustomMoneyManagement.tsx
+++ b/src/Managing.WebApp/src/components/organism/CustomMoneyManagement/CustomMoneyManagement.tsx
@@ -18,15 +18,15 @@ const CustomMoneyManagement: React.FC
= ({
const { moneyManagement, setCustomMoneyManagement } = useCustomMoneyManagement()
const [leverage, setLeverage] = useState(moneyManagement?.leverage || 1)
- const [takeProfit, setTakeProfit] = useState(moneyManagement?.takeProfit || 2)
- const [stopLoss, setStopLoss] = useState(moneyManagement?.stopLoss || 1)
+ const [takeProfit, setTakeProfit] = useState((moneyManagement?.takeProfit || 0.02) * 100) // Convert decimal to percentage
+ const [stopLoss, setStopLoss] = useState((moneyManagement?.stopLoss || 0.01) * 100) // Convert decimal to percentage
const handleCreateMoneyManagement = () => {
const moneyManagement: MoneyManagement = {
leverage,
name: 'custom',
- stopLoss,
- takeProfit,
+ stopLoss: stopLoss / 100, // Convert percentage to decimal
+ takeProfit: takeProfit / 100, // Convert percentage to decimal
timeframe,
}
onCreateMoneyManagement(moneyManagement)
@@ -37,6 +37,15 @@ const CustomMoneyManagement: React.FC = ({
handleCreateMoneyManagement()
}, [leverage, takeProfit, stopLoss])
+ // Update local state when global moneyManagement changes
+ useEffect(() => {
+ if (moneyManagement) {
+ setLeverage(moneyManagement.leverage)
+ setTakeProfit(moneyManagement.takeProfit * 100) // Convert decimal to percentage
+ setStopLoss(moneyManagement.stopLoss * 100) // Convert decimal to percentage
+ }
+ }, [moneyManagement])
+
return (
<>
{showCustomMoneyManagement ? (
diff --git a/src/Managing.WebApp/src/components/organism/UnifiedTradingModal/UnifiedTradingModal.tsx b/src/Managing.WebApp/src/components/organism/UnifiedTradingModal/UnifiedTradingModal.tsx
index 4673a9f4..0a76f353 100644
--- a/src/Managing.WebApp/src/components/organism/UnifiedTradingModal/UnifiedTradingModal.tsx
+++ b/src/Managing.WebApp/src/components/organism/UnifiedTradingModal/UnifiedTradingModal.tsx
@@ -7,25 +7,25 @@ import useBacktestStore from '../../../app/store/backtestStore'
import {useCustomMoneyManagement} from '../../../app/store/customMoneyManagement'
import {useCustomScenario} from '../../../app/store/customScenario'
import {
- AccountClient,
- BacktestClient,
- BotClient,
- DataClient,
- LightBacktestResponse,
- LightScenario,
- MoneyManagement,
- MoneyManagementClient,
- RiskManagement,
- RiskToleranceLevel,
- RunBacktestRequest,
- ScenarioClient,
- ScenarioRequest,
- SignalType,
- StartBotRequest,
- Ticker,
- Timeframe,
- TradingBotConfigRequest,
- UpdateBotConfigRequest,
+ AccountClient,
+ BacktestClient,
+ BotClient,
+ DataClient,
+ LightBacktestResponse,
+ LightScenario,
+ MoneyManagement,
+ MoneyManagementClient,
+ RiskManagement,
+ RiskToleranceLevel,
+ RunBacktestRequest,
+ ScenarioClient,
+ ScenarioRequest,
+ SignalType,
+ StartBotRequest,
+ Ticker,
+ Timeframe,
+ TradingBotConfigRequest,
+ UpdateBotConfigRequest,
} from '../../../generated/ManagingApi'
import type {IUnifiedTradingConfigInput, UnifiedTradingModalProps} from '../../../global/type'
import {Loader} from '../../atoms'
@@ -142,7 +142,7 @@ const UnifiedTradingModal: React.FC = ({
const { apiUrl } = useApiUrlStore();
const { addBacktest } = useBacktestStore();
- const { setCustomMoneyManagement: setGlobalCustomMoneyManagement } = useCustomMoneyManagement();
+ const { moneyManagement: globalCustomMoneyManagement, setCustomMoneyManagement: setGlobalCustomMoneyManagement } = useCustomMoneyManagement();
const { setCustomScenario: setGlobalCustomScenario } = useCustomScenario();
// API clients
@@ -620,7 +620,7 @@ const UnifiedTradingModal: React.FC = ({
let moneyManagement: MoneyManagement | undefined = undefined;
if (showCustomMoneyManagement || (mode === 'createBot' && backtest)) {
- moneyManagement = customMoneyManagement;
+ moneyManagement = globalCustomMoneyManagement || customMoneyManagement;
} else {
const selectedMM = moneyManagements?.find(mm => mm.name === selectedMoneyManagement);
if (selectedMM) {
@@ -712,7 +712,7 @@ const UnifiedTradingModal: React.FC = ({
useForSignalFiltering: form.useForSignalFiltering ?? true,
useForDynamicStopLoss: form.useForDynamicStopLoss ?? true,
moneyManagementName: showCustomMoneyManagement ? undefined : selectedMoneyManagement,
- moneyManagement: customMoneyManagement,
+ moneyManagement: globalCustomMoneyManagement || customMoneyManagement,
flipPosition: form.flipPosition || false,
};
diff --git a/src/Managing.WebApp/src/generated/ManagingApi.ts b/src/Managing.WebApp/src/generated/ManagingApi.ts
index 0b7241da..474c214a 100644
--- a/src/Managing.WebApp/src/generated/ManagingApi.ts
+++ b/src/Managing.WebApp/src/generated/ManagingApi.ts
@@ -1591,8 +1591,8 @@ export class BotClient extends AuthorizedApiBase {
return Promise.resolve(null as any);
}
- bot_OpenPositionManually(request: OpenPositionManuallyRequest): Promise {
- let url_ = this.baseUrl + "/Bot/OpenPosition";
+ bot_CreateManualSignal(request: CreateManualSignalRequest): Promise {
+ let url_ = this.baseUrl + "/Bot/CreateManualSignal";
url_ = url_.replace(/[?&]$/, "");
const content_ = JSON.stringify(request);
@@ -1609,17 +1609,17 @@ export class BotClient extends AuthorizedApiBase {
return this.transformOptions(options_).then(transformedOptions_ => {
return this.http.fetch(url_, transformedOptions_);
}).then((_response: Response) => {
- return this.processBot_OpenPositionManually(_response);
+ return this.processBot_CreateManualSignal(_response);
});
}
- protected processBot_OpenPositionManually(response: Response): Promise {
+ protected processBot_CreateManualSignal(response: Response): Promise {
const status = response.status;
let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
if (status === 200) {
return response.text().then((_responseText) => {
let result200: any = null;
- result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as Position;
+ result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver) as LightSignal;
return result200;
});
} else if (status !== 200 && status !== 204) {
@@ -1627,7 +1627,7 @@ export class BotClient extends AuthorizedApiBase {
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
});
}
- return Promise.resolve(null as any);
+ return Promise.resolve(null as any);
}
bot_ClosePosition(request: ClosePositionRequest): Promise {
@@ -4309,7 +4309,7 @@ export enum BotSortableColumn {
AgentName = "AgentName",
}
-export interface OpenPositionManuallyRequest {
+export interface CreateManualSignalRequest {
identifier?: string;
direction?: TradeDirection;
}
diff --git a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts
index 14ea3e1e..49559ee7 100644
--- a/src/Managing.WebApp/src/generated/ManagingApiTypes.ts
+++ b/src/Managing.WebApp/src/generated/ManagingApiTypes.ts
@@ -784,7 +784,7 @@ export enum BotSortableColumn {
AgentName = "AgentName",
}
-export interface OpenPositionManuallyRequest {
+export interface CreateManualSignalRequest {
identifier?: string;
direction?: TradeDirection;
}