Fix config update + remove messages + Summary fix for not open position

This commit is contained in:
2025-10-08 02:52:11 +07:00
parent ff7e4ed3d3
commit 67065469a6
17 changed files with 209 additions and 159 deletions

View File

@@ -30,17 +30,17 @@ function ManualPositionModal({ showModal, botName, onClose }: ManualPositionModa
const onSubmit = async (data: ManualPositionFormValues) => {
if (!botName) return
const t = new Toast('Opening position...')
const t = new Toast('Creating signal...')
try {
await client.bot_OpenPositionManually({
await client.bot_CreateManualSignal({
identifier: botName,
direction: data.direction,
})
t.update('success', 'Position opened successfully')
t.update('success', 'Signal created successfully')
reset()
onClose()
} catch (error: any) {
t.update('error', `Failed to open position: ${error.message || error}`)
t.update('error', `Failed to create signal: ${error.message || error}`)
}
}
@@ -49,7 +49,7 @@ function ManualPositionModal({ showModal, botName, onClose }: ManualPositionModa
return (
<dialog open={showModal} className="modal modal-bottom sm:modal-middle modal-open">
<div className="modal-box">
<h3 className="font-bold text-lg">Open Position Manually for {botName}</h3>
<h3 className="font-bold text-lg">Create Signal Manually</h3>
<form onSubmit={handleSubmit(onSubmit)}>
<div className="form-control w-full max-w-xs py-2">
<label className="label">
@@ -63,7 +63,7 @@ function ManualPositionModal({ showModal, botName, onClose }: ManualPositionModa
</div>
<div className="modal-action">
<button type="submit" className="btn btn-primary">Open Position</button>
<button type="submit" className="btn btn-primary">Create Signal</button>
<button type="button" className="btn" onClick={() => { reset(); onClose(); }}>Cancel</button>
</div>
</form>

View File

@@ -18,15 +18,15 @@ const CustomMoneyManagement: React.FC<ICustomMoneyManagement> = ({
const { moneyManagement, setCustomMoneyManagement } = useCustomMoneyManagement()
const [leverage, setLeverage] = useState<number>(moneyManagement?.leverage || 1)
const [takeProfit, setTakeProfit] = useState<number>(moneyManagement?.takeProfit || 2)
const [stopLoss, setStopLoss] = useState<number>(moneyManagement?.stopLoss || 1)
const [takeProfit, setTakeProfit] = useState<number>((moneyManagement?.takeProfit || 0.02) * 100) // Convert decimal to percentage
const [stopLoss, setStopLoss] = useState<number>((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<ICustomMoneyManagement> = ({
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 ? (

View File

@@ -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<UnifiedTradingModalProps> = ({
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<UnifiedTradingModalProps> = ({
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<UnifiedTradingModalProps> = ({
useForSignalFiltering: form.useForSignalFiltering ?? true,
useForDynamicStopLoss: form.useForDynamicStopLoss ?? true,
moneyManagementName: showCustomMoneyManagement ? undefined : selectedMoneyManagement,
moneyManagement: customMoneyManagement,
moneyManagement: globalCustomMoneyManagement || customMoneyManagement,
flipPosition: form.flipPosition || false,
};

View File

@@ -1591,8 +1591,8 @@ export class BotClient extends AuthorizedApiBase {
return Promise.resolve<PaginatedResponseOfTradingBotResponse>(null as any);
}
bot_OpenPositionManually(request: OpenPositionManuallyRequest): Promise<Position> {
let url_ = this.baseUrl + "/Bot/OpenPosition";
bot_CreateManualSignal(request: CreateManualSignalRequest): Promise<LightSignal> {
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<Position> {
protected processBot_CreateManualSignal(response: Response): Promise<LightSignal> {
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<Position>(null as any);
return Promise.resolve<LightSignal>(null as any);
}
bot_ClosePosition(request: ClosePositionRequest): Promise<Position> {
@@ -4309,7 +4309,7 @@ export enum BotSortableColumn {
AgentName = "AgentName",
}
export interface OpenPositionManuallyRequest {
export interface CreateManualSignalRequest {
identifier?: string;
direction?: TradeDirection;
}

View File

@@ -784,7 +784,7 @@ export enum BotSortableColumn {
AgentName = "AgentName",
}
export interface OpenPositionManuallyRequest {
export interface CreateManualSignalRequest {
identifier?: string;
direction?: TradeDirection;
}