2020-12-26 16:33:27 +00:00
|
|
|
from typing import List, Optional
|
2020-12-26 15:43:15 +00:00
|
|
|
|
2020-12-25 12:08:25 +00:00
|
|
|
from fastapi import APIRouter, Depends
|
2020-12-24 05:55:19 +00:00
|
|
|
|
2020-12-25 12:11:01 +00:00
|
|
|
from freqtrade import __version__
|
2020-12-26 14:54:22 +00:00
|
|
|
from freqtrade.rpc import RPC
|
2020-12-26 16:00:30 +00:00
|
|
|
from freqtrade.rpc.rpc import RPCException
|
2020-12-25 12:11:01 +00:00
|
|
|
|
2020-12-26 16:33:27 +00:00
|
|
|
from .api_models import (Balances, BlacklistPayload, BlacklistResponse, Count, Daily, DeleteTrade, ForceBuyPayload, ForceSellPayload, Locks, Logs, PerformanceEntry, Ping, Profit, ResultMsg, Stats,
|
|
|
|
StatusMsg, Version, WhitelistResponse)
|
2020-12-25 12:11:01 +00:00
|
|
|
from .deps import get_config, get_rpc
|
|
|
|
|
2020-12-24 05:55:19 +00:00
|
|
|
|
2020-12-25 12:08:25 +00:00
|
|
|
# Public API, requires no auth.
|
|
|
|
router_public = APIRouter()
|
2020-12-25 12:11:01 +00:00
|
|
|
# Private API, protected by authentication
|
2020-12-24 05:55:19 +00:00
|
|
|
router = APIRouter()
|
|
|
|
|
|
|
|
|
2020-12-25 12:08:25 +00:00
|
|
|
@router_public.get('/ping', response_model=Ping)
|
|
|
|
def ping():
|
2020-12-26 16:48:19 +00:00
|
|
|
"""simple ping"""
|
2020-12-24 05:55:19 +00:00
|
|
|
return {"status": "pong"}
|
|
|
|
|
|
|
|
|
2020-12-25 19:07:12 +00:00
|
|
|
@router.get('/version', response_model=Version, tags=['info'])
|
2020-12-25 14:57:05 +00:00
|
|
|
def version():
|
2020-12-26 16:48:19 +00:00
|
|
|
""" Bot Version info"""
|
2020-12-25 14:57:05 +00:00
|
|
|
return {"version": __version__}
|
|
|
|
|
|
|
|
|
2020-12-25 19:07:12 +00:00
|
|
|
@router.get('/balance', response_model=Balances, tags=['info'])
|
|
|
|
def balance(rpc: RPC = Depends(get_rpc), config=Depends(get_config)):
|
2020-12-26 16:48:19 +00:00
|
|
|
"""Account Balances"""
|
2020-12-25 12:08:25 +00:00
|
|
|
return rpc._rpc_balance(config['stake_currency'], config.get('fiat_display_currency', ''),)
|
2020-12-25 12:11:01 +00:00
|
|
|
|
|
|
|
|
2020-12-26 14:54:22 +00:00
|
|
|
@router.get('/count', response_model=Count, tags=['info'])
|
|
|
|
def count(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_count()
|
|
|
|
|
|
|
|
|
2020-12-26 15:43:15 +00:00
|
|
|
@router.get('/performance', response_model=List[PerformanceEntry], tags=['info'])
|
|
|
|
def performance(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_performance()
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/profit', response_model=Profit, tags=['info'])
|
|
|
|
def profit(rpc: RPC = Depends(get_rpc), config=Depends(get_config)):
|
|
|
|
return rpc._rpc_trade_statistics(config['stake_currency'],
|
|
|
|
config.get('fiat_display_currency')
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/stats', response_model=Stats, tags=['info'])
|
|
|
|
def stats(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_stats()
|
|
|
|
|
|
|
|
|
2020-12-26 16:33:27 +00:00
|
|
|
@router.get('/daily', response_model=Daily, tags=['info'])
|
|
|
|
def daily(timescale: int = 7, rpc: RPC = Depends(get_rpc), config=Depends(get_config)):
|
|
|
|
return rpc._rpc_daily_profit(timescale, config['stake_currency'],
|
|
|
|
config.get('fiat_display_currency', ''))
|
|
|
|
|
|
|
|
|
2020-12-26 16:00:30 +00:00
|
|
|
# TODO: Missing response model
|
|
|
|
@router.get('/status', tags=['info'])
|
|
|
|
def status(rpc: RPC = Depends(get_rpc)):
|
|
|
|
try:
|
|
|
|
return rpc._rpc_trade_status()
|
|
|
|
except RPCException:
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
2020-12-26 16:33:27 +00:00
|
|
|
# TODO: Missing response model
|
2020-12-26 16:48:19 +00:00
|
|
|
@router.get('/trades', tags=['info', 'trading'])
|
2020-12-26 16:33:27 +00:00
|
|
|
def trades(limit: Optional[int] = 0, rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_trade_history(limit)
|
|
|
|
|
|
|
|
|
|
|
|
@router.delete('/trades/{tradeid}', response_model=DeleteTrade, tags=['info', 'trading'])
|
|
|
|
def trades_delete(tradeid: int, rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_delete(tradeid)
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: Missing response model
|
|
|
|
@router.get('/edge', tags=['info'])
|
|
|
|
def edge(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_edge()
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: Missing response model
|
2020-12-26 14:54:22 +00:00
|
|
|
@router.get('/show_config', tags=['info'])
|
|
|
|
def show_config(rpc: RPC = Depends(get_rpc), config=Depends(get_config)):
|
|
|
|
return RPC._rpc_show_config(config, rpc._freqtrade.state)
|
|
|
|
|
2020-12-26 16:33:27 +00:00
|
|
|
|
|
|
|
# TODO: Missing response model
|
2020-12-26 16:00:30 +00:00
|
|
|
@router.post('/forcebuy', tags=['trading'])
|
|
|
|
def forcebuy(payload: ForceBuyPayload, rpc: RPC = Depends(get_rpc)):
|
|
|
|
trade = rpc._rpc_forcebuy(payload.pair, payload.price)
|
|
|
|
|
|
|
|
if trade:
|
|
|
|
return trade.to_json()
|
|
|
|
else:
|
|
|
|
return {"status": f"Error buying pair {payload.pair}."}
|
|
|
|
|
|
|
|
|
2020-12-26 16:33:27 +00:00
|
|
|
@router.post('/forcesell', response_model=ResultMsg, tags=['trading'])
|
2020-12-26 16:00:30 +00:00
|
|
|
def forcesell(payload: ForceSellPayload, rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_forcesell(payload.tradeid)
|
|
|
|
|
2020-12-26 14:54:22 +00:00
|
|
|
|
2020-12-26 16:33:27 +00:00
|
|
|
@router.get('/blacklist', response_model=BlacklistResponse, tags=['info', 'pairlist'])
|
|
|
|
def blacklist(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_blacklist()
|
|
|
|
|
|
|
|
|
|
|
|
@router.post('/blacklist', response_model=BlacklistResponse, tags=['info', 'pairlist'])
|
|
|
|
def blacklist_post(payload: BlacklistPayload, rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_blacklist(payload.blacklist)
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/whitelist', response_model=WhitelistResponse, tags=['info', 'pairlist'])
|
|
|
|
def whitelist(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_whitelist()
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/locks', response_model=Locks, tags=['info'])
|
|
|
|
def locks(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_locks()
|
|
|
|
|
|
|
|
|
|
|
|
@router.get('/logs', response_model=Logs, tags=['info'])
|
|
|
|
def logs(limit: Optional[int] = None, rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_get_logs(limit)
|
|
|
|
|
|
|
|
|
2020-12-25 19:07:12 +00:00
|
|
|
@router.post('/start', response_model=StatusMsg, tags=['botcontrol'])
|
|
|
|
def start(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_start()
|
|
|
|
|
|
|
|
|
|
|
|
@router.post('/stop', response_model=StatusMsg, tags=['botcontrol'])
|
|
|
|
def stop(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_stop()
|
2020-12-26 14:54:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
@router.post('/stopbuy', response_model=StatusMsg, tags=['botcontrol'])
|
|
|
|
def stop_buy(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_stopbuy()
|
|
|
|
|
|
|
|
|
|
|
|
@router.post('/reload_config', response_model=StatusMsg, tags=['botcontrol'])
|
|
|
|
def reload_config(rpc: RPC = Depends(get_rpc)):
|
|
|
|
return rpc._rpc_reload_config()
|