From 05f8bb357fbfe999184c1ab74e12cd2a809a69fb Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 30 Mar 2024 14:29:58 +0100 Subject: [PATCH] Add Lock post endpoint (allows manual locking through API) closes #10018 --- freqtrade/rpc/api_server/api_schemas.py | 9 ++++++++- freqtrade/rpc/api_server/api_v1.py | 15 +++++++++++---- freqtrade/rpc/rpc.py | 9 +++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index af8d8ddf4..6d2c8a13d 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -1,7 +1,7 @@ from datetime import date, datetime from typing import Any, Dict, List, Optional, Union -from pydantic import BaseModel, RootModel, SerializeAsAny +from pydantic import AwareDatetime, BaseModel, RootModel, SerializeAsAny from freqtrade.constants import IntOrInf from freqtrade.enums import MarginMode, OrderTypeValues, SignalDirection, TradingMode @@ -378,6 +378,13 @@ class Locks(BaseModel): locks: List[LockModel] +class LocksPayload(BaseModel): + pair: str + side: str = '*' # Default to both sides + until: AwareDatetime + reason: Optional[str] = None + + class DeleteLockRequest(BaseModel): pair: Optional[str] = None lockid: Optional[int] = None diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index 99fc3d451..8146fe276 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -15,10 +15,10 @@ from freqtrade.rpc.api_server.api_schemas import (AvailablePairs, Balances, Blac DeleteLockRequest, DeleteTrade, Entry, ExchangeListResponse, Exit, ForceEnterPayload, ForceEnterResponse, ForceExitPayload, - FreqAIModelListResponse, Health, Locks, Logs, - MixTag, OpenTradeSchema, PairHistory, - PerformanceEntry, Ping, PlotConfig, Profit, - ResultMsg, ShowConfig, Stats, StatusMsg, + FreqAIModelListResponse, Health, Locks, + LocksPayload, Logs, MixTag, OpenTradeSchema, + PairHistory, PerformanceEntry, Ping, PlotConfig, + Profit, ResultMsg, ShowConfig, Stats, StatusMsg, StrategyListResponse, StrategyResponse, SysInfo, Version, WhitelistResponse) from freqtrade.rpc.api_server.deps import get_config, get_exchange, get_rpc, get_rpc_optional @@ -255,6 +255,13 @@ def delete_lock_pair(payload: DeleteLockRequest, rpc: RPC = Depends(get_rpc)): return rpc._rpc_delete_lock(lockid=payload.lockid, pair=payload.pair) +@router.post('/locks', response_model=Locks, tags=['info', 'locks']) +def add_locks(payload: List[LocksPayload], rpc: RPC = Depends(get_rpc)): + for lock in payload: + rpc._rpc_add_lock(lock.pair, lock.until, lock.reason, lock.side) + return rpc._rpc_locks() + + @router.get('/logs', response_model=Logs, tags=['info']) def logs(limit: Optional[int] = None): return RPC._rpc_get_logs(limit) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 8bb7f754f..0dbe12784 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1104,6 +1104,15 @@ class RPC: return self._rpc_locks() + def _rpc_add_lock(self, pair: str, until: datetime, reason: str, side: str) -> Dict[str, Any]: + lock = PairLocks.lock_pair( + pair=pair, + until=until, + reason=reason, + side=side, + ) + return lock + def _rpc_whitelist(self) -> Dict: """ Returns the currently active whitelist""" res = {'method': self._freqtrade.pairlists.name_list,