Fix config update + remove messages + Summary fix for not open position
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 ? (
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -784,7 +784,7 @@ export enum BotSortableColumn {
|
||||
AgentName = "AgentName",
|
||||
}
|
||||
|
||||
export interface OpenPositionManuallyRequest {
|
||||
export interface CreateManualSignalRequest {
|
||||
identifier?: string;
|
||||
direction?: TradeDirection;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user