diff --git a/freqtrade/rpc/api_server/api_schemas.py b/freqtrade/rpc/api_server/api_schemas.py index 10f181bb6..bbd858795 100644 --- a/freqtrade/rpc/api_server/api_schemas.py +++ b/freqtrade/rpc/api_server/api_schemas.py @@ -277,6 +277,7 @@ class ForceBuyPayload(BaseModel): pair: str price: Optional[float] ordertype: Optional[OrderTypeValues] + stakeamount: Optional[float] class ForceSellPayload(BaseModel): diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index 648ec6c57..4c430dd46 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -31,7 +31,8 @@ logger = logging.getLogger(__name__) # Version increments should happen in "small" steps (1.1, 1.12, ...) unless big changes happen. # 1.11: forcebuy and forcesell accept ordertype # 1.12: add blacklist delete endpoint -API_VERSION = 1.12 +# 1.13: forcebuy supports stake_amount +API_VERSION = 1.13 # Public API, requires no auth. router_public = APIRouter() @@ -134,7 +135,9 @@ def show_config(rpc: Optional[RPC] = Depends(get_rpc_optional), config=Depends(g @router.post('/forcebuy', response_model=ForceBuyResponse, tags=['trading']) def forcebuy(payload: ForceBuyPayload, rpc: RPC = Depends(get_rpc)): ordertype = payload.ordertype.value if payload.ordertype else None - trade = rpc._rpc_forcebuy(payload.pair, payload.price, ordertype) + stake_amount = payload.stakeamount if payload.stakeamount else None + + trade = rpc._rpc_forcebuy(payload.pair, payload.price, ordertype, stake_amount) if trade: return ForceBuyResponse.parse_obj(trade.to_json()) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 2232496de..c78ff1079 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -707,8 +707,8 @@ class RPC: self._freqtrade.wallets.update() return {'result': f'Created sell order for trade {trade_id}.'} - def _rpc_forcebuy(self, pair: str, price: Optional[float], - order_type: Optional[str] = None) -> Optional[Trade]: + def _rpc_forcebuy(self, pair: str, price: Optional[float], order_type: Optional[str] = None, + stake_amount: Optional[float] = None) -> Optional[Trade]: """ Handler for forcebuy Buys a pair trade at the given or current price @@ -733,14 +733,15 @@ class RPC: if not self._freqtrade.strategy.position_adjustment_enable: raise RPCException(f'position for {pair} already open - id: {trade.id}') - # gen stake amount - stakeamount = self._freqtrade.wallets.get_trade_stake_amount(pair) + if not stake_amount: + # gen stake amount + stake_amount = self._freqtrade.wallets.get_trade_stake_amount(pair) # execute buy if not order_type: order_type = self._freqtrade.strategy.order_types.get( 'forcebuy', self._freqtrade.strategy.order_types['buy']) - if self._freqtrade.execute_entry(pair, stakeamount, price, + if self._freqtrade.execute_entry(pair, stake_amount, price, ordertype=order_type, trade=trade): Trade.commit() trade = Trade.get_trades([Trade.is_open.is_(True), Trade.pair == pair]).first() diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py index fd43df019..27c509c94 100644 --- a/tests/rpc/test_rpc.py +++ b/tests/rpc/test_rpc.py @@ -1108,9 +1108,14 @@ def test_rpcforcebuy(mocker, default_conf, ticker, fee, limit_buy_order_open) -> with pytest.raises(RPCException, match=r'Wrong pair selected. Only pairs with stake-currency.*'): rpc._rpc_forcebuy('LTC/ETH', 0.0001) - pair = 'XRP/BTC' + + # Test with defined stake_amount + pair = 'LTC/BTC' + trade = rpc._rpc_forcebuy(pair, 0.0001, order_type='limit', stake_amount=0.05) + assert trade.stake_amount == 0.05 # Test not buying + pair = 'XRP/BTC' freqtradebot = get_patched_freqtradebot(mocker, default_conf) freqtradebot.config['stake_amount'] = 0 patch_get_signal(freqtradebot)