qsq加密货币量化系统:使用火币api进行自动交易

前言

在先前的几篇文章中我在自己的量化框架中实现了几种策略,但是这些策略并没有经过实战的检验。而想要通过自动交易来参与实战,首先我就得在我的框架中加入api接口,连入交易所进行交易。所以,这里我在qsq中加入了火币的api,并且通过过程的截图给大家演示如何自动化交易。

项目地址

https://github.com/qiushui777/qsq

本文位于qs_papers目录下,建议使用jupter notebook打开学习。

火币接口

实现火币接口的过程中,我使用了火币的python SDK,所以使用者需要在这个github地址安装sdk。
https://github.com/HuobiRDCenter/huobi_Python
同时我也参考了火币api文档。
huobiapi.github.io/docs/spot/v1/cn/
最终在qsq/ThirdptQs中添加了QsHuobi类,关键的几个函数如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from ..CoreQs import QsEnv

from huobi import RequestClient, SubscriptionClient
from huobi.base.printobject import PrintMix
from huobi.model import *
from configparser import ConfigParser

class QsHuobi(object):
"""
qsq系统提供的火币接口,可通过此接口获取数据和交易等
要想进行交易,必须在qs/config/config.ini中设置好自己的火币api密钥
"""
def get_24h_trade_statistics(self, pair="btcusdt"):
"""
param: pair 想要获取的交易对,默认为btcusdt

获取24小时的市场数据,返回结构体成员包括有
timestamp, high, low, open, close, volume
可使用trade_statistics.high这样的方式获取对应数据
"""


def get_latest_candlestick(self, pair="btcusdt", interval=CandlestickInterval.MIN1, size=10):
"""
param: pair 想要获取的交易对,默认为btcusdt
param: interval 时间间隔,默认为MIN1, 可选有MIN1 MIN5 MIN15 MIN30 MIN60 DAY1 MON1 WEEK1 YEAR1
param: size 获取的数据条数,默认为10,选择范围为[1,2000]

获取最近一段时间的K线数据,返回一个list,这个list的每一项的结构体成员包括有
timestamp, high, low, open, close, volume
可使用member.high这样的方式获取对应数据
"""


def get_exchange_currencies(self):
"""
获取火币所有交易币种
"""


def get_exchange_info(self):
"""
获取交易所信息,返回交易对和支持币种,使用案例
for symbol in exchange_info.symbol_list:
print(symbol.symbol)

for currency in exchange_info.currencies:
print(currency)
"""


def get_fee_rate(self, symbol="btcusdt"):
"""
获取交易手续费,返回一个FeeRate对象,成员包括
symbol 对应币种 maker_fee 卖方手续费 taker_fee 买方手续费
实际使用中,symbol也为一个费率
"""

def get_historical_orders(self, symbol="ethusdt", order_state=OrderState.CANCELED, order_type=None, start_date=None, end_date=None, start_id=None, size=None):
"""
param: symbol 符号(必须)
param: order_state 订单状态(必须),可选参数有SUBMITTED PARTIAL_FILLED CANCELLING PARTIAL_CANCELED FILLED CANCELED INVALID
param: order_type 订单类型(可选),可选参数有SELL_LIMIT BUY_LIMIT BUY_MARKET SELL_MARKET BUY_IOC SELL_IOC BUY_LIMIT_MAKER SELL_LIMIT_MAKER BUY_STOP_LIMIT SELL_STOP_LIMIT INVALID
param: start_date 开始日期(可选) 格式为 yyyy-mm-dd
param: end_date 结束日期(可选) 格式为 yyyy-mm-dd
param: start_id(可选) 订单起始id,暂时忽略
param: size(可选) 大小,暂时忽略

获取历史订单
"""

def get_historical_trade(self, symbol="btcusdt", size=5):
"""
param: symbol 符号(必须)
param: size 交易列表的大小(必须)
获取历史交易数据,返回trade_list对象列表,每个对象有如下几个成员
timestamp trade_id price amount direction
"""

def get_market_trade(self,symbol="btcusdt"):
"""
param: symbol 符号,默认为btcusdt
获取当前市场上的交易,返回一个trade对象组成的tradelist列表,每个trade对象的成员有
price, amount, trade_id timestamp, direction
"""

def get_open_orders(self,symbol="htusdt", account_type=AccountType.SPOT, direct="next"):
"""
获取自己账户当前开放的交易,返回order数组,每个Order对象有
order_id, symbol, price, amount, account_type, created_timestamp, order_type, filled_amount, filled_cash_amount, filled_fees, source, state
"""

def get_order_recent_48hour(self,symbol=None, start_time=None, end_time=None, size=None, direct=None):
"""
获取自己账户48小时内的交易记录,返回order数组
"""

def get_price_depth(self,symbol,size):
"""
获取当前市场的交易深度,symbol 为交易对,size为头部的几个交易,一个用例如下
i = 0
for entry in depth.bids:
i = i + 1
print(str(i) + ": price: " + str(entry.price) + ", amount: " + str(entry.amount))

i = 0
for entry in depth.asks:
i = i + 1
print(str(i) + ": price: " + str(entry.price) + ", amount: " + str(entry.amount))
"""


def order(self, symbol="btcusdt", account_type=AccountType.SPOT, order_type=OrderType.SELL_LIMIT, amount=1.0, price=None, stop_price=None, operator=None):
"""
下单函数,谨慎使用
必须提供的参数为symbol,account_type,order_type,amount
param: account_type 账户类型,包括有SPOT MARGIN OTC POINT
param: order_type 订单类型,包括有SELL_LIMIT BUY_LIMIT BUY_MARKET SELL_MARKET BUY_IOC SELL_IOC
"""


def cancle_order(self, symbol="btcusdt", order_id="00000"):
"""
取消某笔订单
"""


def get_order(self, symbol="btcusdt", order_id="000000"):
"""
根据order_id获取某笔交易,每个Order对象有
order_id, symbol, price, amount, account_type, created_timestamp, order_type, filled_amount, filled_cash_amount, filled_fees, source, state
"""

def get_order_by_client_order_id(self):
"""
根据client_order_id来获取订单, 每个Order对象有
order_id, symbol, price, amount, account_type, created_timestamp, order_type, filled_amount, filled_cash_amount, filled_fees, source, state
"""


def cancel_client_order(self):
"""
根据client_order_id取消某笔交易
"""

使用火币api进行交易

获取火币交易key

进入火币账户,点击创建api,如下。你可以根据自己的需求来选择这个api的功能,例如你要交易的话,那个交易的勾必须打上才行。

获取到密钥后,在C:\Users\你的用户名\qsq\config\config.ini中添加如下内容

1
2
3
4
[huobi]
huobiapi_key=***
huobisecret_key=***
client_order_id=12345678

把你获取到的key填到对应位置,这里的client_order_id则是每次交易都需要改变下,每个交易都需要一个不同的id。后面使用QsHuobi类的时候我们动态调整那个对应的类变量就行。

进行交易

接下来就是实操了,调用order函数来进行交易。恰好我账户里面有几个跌的快归零的比原,所以就用他们来试着交易下。
1
2
3
4
5
6
7
8
9
10
11
12
import os
import sys
# 使用insert 0即只使用github,避免交叉使用了pip安装的abupy,导致的版本不一致问题
sys.path.insert(0, os.path.abspath('../'))

from qsq import QsHuobi
from huobi.model import *

qshuobi = QsHuobi()

order_id = qshuobi.order(symbol="btmbtc", account_type=AccountType.SPOT, order_type=OrderType.SELL_MARKET, amount=10)
print("after order, we have order id: " + str(order_id))

查看交易结果

这个时候登陆我们的账户看下交易。

我们成功用火币api完成了一次交易,即将走上量化交易实现财富自由的白日梦了!

总结

这次我们实现了火币的api接口和自动交易。然而,先前我实现的几个策略并没有得到比较好的优化,所以后面的文章中,我会对先前的策略或者一些新的策略进行更深入的研究,然后进行实战。