#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/22 0022 13:18 # @Author : Hadrianl # @File : main.py # @Contact : 137150224@qq.com import click import os import importlib from huobitrade import setKey, setUrl, logger from urllib.parse import urlparse from huobitrade.handler import TimeHandler import time import traceback @click.group() @click.version_option('0.5.2') @click.help_option(help='HuoBiTrade命令行工具帮助') def cli(): click.secho('Welcome to HuoBiTrade!', fg='blue') @click.command() @click.option('-f', '--file', default=None, type=click.Path(exists=True), help='策略文件') @click.option('-a', '--access-key', prompt='Access-key', help='访问密钥') @click.option('-s', '--secret-key', prompt='Secret-key', help='私密密钥') @click.option('--url', help='火币服务器url,默认为api.huobi.br.com') @click.option('--reconn', type=click.INT, help='重连次数,默认为-1,即无限重连') def run(file, access_key, secret_key, **kwargs): """命令行运行huobitrade""" if file: import sys file_path, file_name = os.path.split(file) sys.path.append(file_path) strategy_module = importlib.import_module(os.path.splitext(file_name)[0]) init = getattr(strategy_module, 'init', None) handle_func = getattr(strategy_module, 'handle_func', None) schedule = getattr(strategy_module, 'schedule', None) else: init, handle_func, scedule = [None] * 3 setKey(access_key, secret_key) url = kwargs.get('url') hostname = 'api.huobi.br.com' if url: hostname = urlparse(url).hostname setUrl('https://' + hostname, 'https://' + hostname) reconn = kwargs.get('reconn', -1) from huobitrade import HBWebsocket, HBRestAPI from huobitrade.datatype import HBMarket, HBAccount, HBMargin restapi = HBRestAPI(get_acc=True) ws = HBWebsocket(host=hostname, reconn=reconn) auth_ws = HBWebsocket(host=hostname, auth=True, reconn=reconn) data = HBMarket() account = HBAccount() margin = HBMargin() ws_open = False ws_auth = False @ws.after_open def _open(): nonlocal ws_open click.echo('行情接口连接成功') ws_open = True @auth_ws.after_auth def _auth(): nonlocal ws_auth click.echo('鉴权接口鉴权成功') ws_auth = True ws.run() auth_ws.run() for i in range(10): time.sleep(3) click.echo(f'连接:第{i+1}次连接') if ws_open&ws_auth: break else: ws.stop() auth_ws.stop() raise Exception('连接失败') if init: init(restapi, ws, auth_ws) if handle_func: for k, v in handle_func.items(): if k.split('.')[0].lower() == 'market': ws.register_handle_func(k)(v) else: auth_ws.register_handle_func(k)(v) if schedule: print('testing') from huobitrade.handler import TimeHandler interval = scedule.__kwdefaults__['interval'] timerhandler = TimeHandler('scheduler', interval) timerhandler.handle = lambda msg: schedule(restapi, ws, auth_ws) timerhandler.start() while True: try: code = click.prompt('huobitrade>>') if code == 'exit': if click.confirm('是否要退出huobitrade'): break else: continue else: result = eval(code) click.echo(result) except Exception as e: click.echo(traceback.format_exc()) ws.stop() auth_ws.stop() @click.command('test_conn') @click.option('-a', '--access-key', prompt='Access-key', help='访问密钥') @click.option('-s', '--secret-key', prompt='Secret-key', help='私密密钥') def test_connection(access_key, secret_key): """通过查询账户信息测试密钥是否可用""" setKey(access_key, secret_key) from huobitrade import HBRestAPI api = HBRestAPI() try: account = api.get_accounts() if account['status'] == 'ok': click.secho('连接成功!', fg='blue') click.echo(account['data']) else: click.secho('连接失败!', fg='red') click.secho(account['err-msg'], fg='red') except Exception as e: click.echo(traceback.format_exc()) @click.command('doc') def document(): """打开huobitrade文档""" click.launch('https://hadrianl.github.io/huobi/') def entry_point(): cli.add_command(run) cli.add_command(test_connection) cli.add_command(document) cli()