mirror of
https://github.com/freqtrade/freqtrade.git
synced 2024-11-10 10:21:59 +00:00
Add API endpoint to force trade reloading
This commit is contained in:
parent
f2696c9609
commit
0c22710ddd
|
@ -44,7 +44,8 @@ logger = logging.getLogger(__name__)
|
|||
# 2.24: Add cancel_open_order endpoint
|
||||
# 2.25: Add several profit values to /status endpoint
|
||||
# 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.
|
||||
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'])
|
||||
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)
|
||||
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
|
||||
@router.get('/edge', tags=['info'])
|
||||
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.'}
|
||||
|
||||
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],
|
||||
amount: Optional[float] = None) -> None:
|
||||
# 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
|
||||
|
||||
|
||||
@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):
|
||||
ftbot, client = botclient
|
||||
rc = client_get(client, f"{BASE_URI}/logs")
|
||||
|
|
Loading…
Reference in New Issue
Block a user