rpc refactor 7/

This commit is contained in:
kryofly 2018-01-26 11:28:55 +01:00
parent 4af0b18af1
commit 64bbf3f9fb
2 changed files with 57 additions and 21 deletions

View File

@ -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)

View File

@ -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: