rpc refactor 7/
This commit is contained in:
parent
4af0b18af1
commit
64bbf3f9fb
@ -5,6 +5,7 @@ from decimal import Decimal
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame
|
||||||
import sqlalchemy as sql
|
import sqlalchemy as sql
|
||||||
|
# from sqlalchemy import and_, func, text
|
||||||
|
|
||||||
from freqtrade.persistence import Trade
|
from freqtrade.persistence import Trade
|
||||||
from freqtrade.misc import State, get_state, update_state
|
from freqtrade.misc import State, get_state, update_state
|
||||||
@ -64,6 +65,28 @@ def shorten_date(_date):
|
|||||||
return new_date
|
return new_date
|
||||||
|
|
||||||
|
|
||||||
|
def _exec_forcesell(trade: Trade) -> None:
|
||||||
|
# Check if there is there is an open order
|
||||||
|
if trade.open_order_id:
|
||||||
|
order = exchange.get_order(trade.open_order_id)
|
||||||
|
|
||||||
|
# Cancel open LIMIT_BUY orders and close trade
|
||||||
|
if order and not order['closed'] and order['type'] == 'LIMIT_BUY':
|
||||||
|
exchange.cancel_order(trade.open_order_id)
|
||||||
|
trade.close(order.get('rate') or trade.open_rate)
|
||||||
|
# TODO: sell amount which has been bought already
|
||||||
|
return
|
||||||
|
|
||||||
|
# Ignore trades with an attached LIMIT_SELL order
|
||||||
|
if order and not order['closed'] and order['type'] == 'LIMIT_SELL':
|
||||||
|
return
|
||||||
|
|
||||||
|
# Get current rate and execute sell
|
||||||
|
current_rate = exchange.get_ticker(trade.pair, False)['bid']
|
||||||
|
from freqtrade.main import execute_sell
|
||||||
|
execute_sell(trade, current_rate)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Below follows the RPC backend
|
# Below follows the RPC backend
|
||||||
# it is prefixed with rpc_
|
# it is prefixed with rpc_
|
||||||
@ -355,3 +378,30 @@ def rpc_stop():
|
|||||||
return (False, '`Stopping trader ...`')
|
return (False, '`Stopping trader ...`')
|
||||||
else:
|
else:
|
||||||
return (True, '*Status:* `already stopped`')
|
return (True, '*Status:* `already stopped`')
|
||||||
|
|
||||||
|
|
||||||
|
def rpc_forcesell(trade_id) -> None:
|
||||||
|
"""
|
||||||
|
Handler for forcesell <id>.
|
||||||
|
Sells the given trade at current price
|
||||||
|
:return: error or None
|
||||||
|
"""
|
||||||
|
if get_state() != State.RUNNING:
|
||||||
|
return (True, '`trader is not running`')
|
||||||
|
|
||||||
|
if trade_id == 'all':
|
||||||
|
# Execute sell for all open orders
|
||||||
|
for trade in Trade.query.filter(Trade.is_open.is_(True)).all():
|
||||||
|
_exec_forcesell(trade)
|
||||||
|
return (False, '')
|
||||||
|
|
||||||
|
# Query for trade
|
||||||
|
trade = Trade.query.filter(sql.and_(
|
||||||
|
Trade.id == trade_id,
|
||||||
|
Trade.is_open.is_(True)
|
||||||
|
)).first()
|
||||||
|
if not trade:
|
||||||
|
logger.warning('/forcesell: Invalid argument received')
|
||||||
|
return (True, 'Invalid argument. See `/help` to view usage')
|
||||||
|
|
||||||
|
_exec_forcesell(trade)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
from typing import Any, Callable
|
from typing import Any, Callable
|
||||||
|
|
||||||
from sqlalchemy import and_, func, text
|
from sqlalchemy import func, text
|
||||||
from tabulate import tabulate
|
from tabulate import tabulate
|
||||||
from telegram import Bot, ParseMode, ReplyKeyboardMarkup, Update
|
from telegram import Bot, ParseMode, ReplyKeyboardMarkup, Update
|
||||||
from telegram.error import NetworkError, TelegramError
|
from telegram.error import NetworkError, TelegramError
|
||||||
@ -13,7 +13,8 @@ from freqtrade.rpc.__init__ import (rpc_status_table,
|
|||||||
rpc_trade_statistics,
|
rpc_trade_statistics,
|
||||||
rpc_balance,
|
rpc_balance,
|
||||||
rpc_start,
|
rpc_start,
|
||||||
rpc_stop
|
rpc_stop,
|
||||||
|
rpc_forcesell,
|
||||||
)
|
)
|
||||||
|
|
||||||
from freqtrade import __version__, exchange
|
from freqtrade import __version__, exchange
|
||||||
@ -296,6 +297,7 @@ def _stop(bot: Bot, update: Update) -> None:
|
|||||||
send_msg(msg, bot=bot)
|
send_msg(msg, bot=bot)
|
||||||
|
|
||||||
|
|
||||||
|
# FIX: no test for this!!!!
|
||||||
@authorized_only
|
@authorized_only
|
||||||
def _forcesell(bot: Bot, update: Update) -> None:
|
def _forcesell(bot: Bot, update: Update) -> None:
|
||||||
"""
|
"""
|
||||||
@ -305,29 +307,13 @@ def _forcesell(bot: Bot, update: Update) -> None:
|
|||||||
:param update: message update
|
:param update: message update
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
if get_state() != State.RUNNING:
|
|
||||||
send_msg('`trader is not running`', bot=bot)
|
|
||||||
return
|
|
||||||
|
|
||||||
trade_id = update.message.text.replace('/forcesell', '').strip()
|
trade_id = update.message.text.replace('/forcesell', '').strip()
|
||||||
if trade_id == 'all':
|
(error, message) = rpc_forcesell(trade_id)
|
||||||
# Execute sell for all open orders
|
if error:
|
||||||
for trade in Trade.query.filter(Trade.is_open.is_(True)).all():
|
send_msg(message, bot=bot)
|
||||||
_exec_forcesell(trade)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# Query for trade
|
|
||||||
trade = Trade.query.filter(and_(
|
|
||||||
Trade.id == trade_id,
|
|
||||||
Trade.is_open.is_(True)
|
|
||||||
)).first()
|
|
||||||
if not trade:
|
|
||||||
send_msg('Invalid argument. See `/help` to view usage')
|
|
||||||
logger.warning('/forcesell: Invalid argument received')
|
|
||||||
return
|
|
||||||
|
|
||||||
_exec_forcesell(trade)
|
|
||||||
|
|
||||||
|
|
||||||
@authorized_only
|
@authorized_only
|
||||||
def _performance(bot: Bot, update: Update) -> None:
|
def _performance(bot: Bot, update: Update) -> None:
|
||||||
|
Loading…
Reference in New Issue
Block a user