Add API endpoint to force trade reloading
This commit is contained in:
@@ -44,7 +44,8 @@ logger = logging.getLogger(__name__)
|
|||||||
# 2.24: Add cancel_open_order endpoint
|
# 2.24: Add cancel_open_order endpoint
|
||||||
# 2.25: Add several profit values to /status endpoint
|
# 2.25: Add several profit values to /status endpoint
|
||||||
# 2.26: increase /balance output
|
# 2.26: increase /balance output
|
||||||
API_VERSION = 2.26
|
# 2.27: Add /trades/<id>/reload endpoint
|
||||||
|
API_VERSION = 2.27
|
||||||
|
|
||||||
# Public API, requires no auth.
|
# Public API, requires no auth.
|
||||||
router_public = APIRouter()
|
router_public = APIRouter()
|
||||||
@@ -127,11 +128,17 @@ def trades_delete(tradeid: int, rpc: RPC = Depends(get_rpc)):
|
|||||||
|
|
||||||
|
|
||||||
@router.delete('/trades/{tradeid}/open-order', response_model=OpenTradeSchema, tags=['trading'])
|
@router.delete('/trades/{tradeid}/open-order', response_model=OpenTradeSchema, tags=['trading'])
|
||||||
def cancel_open_order(tradeid: int, rpc: RPC = Depends(get_rpc)):
|
def trade_cancel_open_order(tradeid: int, rpc: RPC = Depends(get_rpc)):
|
||||||
rpc._rpc_cancel_open_order(tradeid)
|
rpc._rpc_cancel_open_order(tradeid)
|
||||||
return rpc._rpc_trade_status([tradeid])[0]
|
return rpc._rpc_trade_status([tradeid])[0]
|
||||||
|
|
||||||
|
|
||||||
|
@router.get('/trades/{tradeid}/reload', response_model=OpenTradeSchema, tags=['trading'])
|
||||||
|
def trade_reload(tradeid: int, rpc: RPC = Depends(get_rpc)):
|
||||||
|
rpc._rpc_reload_trade_from_exchange(tradeid)
|
||||||
|
return rpc._rpc_trade_status([tradeid])[0]
|
||||||
|
|
||||||
|
|
||||||
# TODO: Missing response model
|
# TODO: Missing response model
|
||||||
@router.get('/edge', tags=['info'])
|
@router.get('/edge', tags=['info'])
|
||||||
def edge(rpc: RPC = Depends(get_rpc)):
|
def edge(rpc: RPC = Depends(get_rpc)):
|
||||||
|
|||||||
@@ -741,6 +741,18 @@ class RPC:
|
|||||||
|
|
||||||
return {'status': 'No more entries will occur from now. Run /reload_config to reset.'}
|
return {'status': 'No more entries will occur from now. Run /reload_config to reset.'}
|
||||||
|
|
||||||
|
def _rpc_reload_trade_from_exchange(self, trade_id: str) -> Dict[str, str]:
|
||||||
|
"""
|
||||||
|
Handler for reload_trade_from_exchange.
|
||||||
|
Reloads a trade from it's orders, should manual interaction have happened.
|
||||||
|
"""
|
||||||
|
trade = Trade.get_trades(trade_filter=[Trade.id == trade_id]).first()
|
||||||
|
if not trade:
|
||||||
|
raise RPCException(f"Could not find trade with id {trade_id}.")
|
||||||
|
|
||||||
|
self._freqtrade.handle_onexchange_order(trade)
|
||||||
|
return {'status': 'Reloaded from orders from exchange'}
|
||||||
|
|
||||||
def __exec_force_exit(self, trade: Trade, ordertype: Optional[str],
|
def __exec_force_exit(self, trade: Trade, ordertype: Optional[str],
|
||||||
amount: Optional[float] = None) -> None:
|
amount: Optional[float] = None) -> None:
|
||||||
# Check if there is there is an open order
|
# Check if there is there is an open order
|
||||||
|
|||||||
@@ -740,6 +740,33 @@ def test_api_delete_open_order(botclient, mocker, fee, markets, ticker, is_short
|
|||||||
assert cancel_mock.call_count == 1
|
assert cancel_mock.call_count == 1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('is_short', [True, False])
|
||||||
|
def test_api_trade_reload_trade(botclient, mocker, fee, markets, ticker, is_short):
|
||||||
|
ftbot, client = botclient
|
||||||
|
patch_get_signal(ftbot, enter_long=not is_short, enter_short=is_short)
|
||||||
|
stoploss_mock = MagicMock()
|
||||||
|
cancel_mock = MagicMock()
|
||||||
|
ftbot.handle_onexchange_order = MagicMock()
|
||||||
|
mocker.patch.multiple(
|
||||||
|
EXMS,
|
||||||
|
markets=PropertyMock(return_value=markets),
|
||||||
|
fetch_ticker=ticker,
|
||||||
|
cancel_order=cancel_mock,
|
||||||
|
cancel_stoploss_order=stoploss_mock,
|
||||||
|
)
|
||||||
|
|
||||||
|
rc = client_get(client, f"{BASE_URI}/trades/10/reload")
|
||||||
|
assert_response(rc, 502)
|
||||||
|
assert 'Could not find trade with id 10.' in rc.json()['error']
|
||||||
|
assert ftbot.handle_onexchange_order.call_count == 0
|
||||||
|
|
||||||
|
create_mock_trades(fee, is_short=is_short)
|
||||||
|
Trade.commit()
|
||||||
|
|
||||||
|
rc = client_get(client, f"{BASE_URI}/trades/5/reload")
|
||||||
|
assert ftbot.handle_onexchange_order.call_count == 1
|
||||||
|
|
||||||
|
|
||||||
def test_api_logs(botclient):
|
def test_api_logs(botclient):
|
||||||
ftbot, client = botclient
|
ftbot, client = botclient
|
||||||
rc = client_get(client, f"{BASE_URI}/logs")
|
rc = client_get(client, f"{BASE_URI}/logs")
|
||||||
|
|||||||
Reference in New Issue
Block a user