Skip to content

Commit 2e3f265

Browse files
committed
ftx,huobi_future both ok
1 parent bcc63b6 commit 2e3f265

File tree

12 files changed

+449
-514
lines changed

12 files changed

+449
-514
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ alphahunter.egg-info
66
MANIFEST
77
test
88
scripts
9+
/my_strategy/

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ alphahunter量化全流程如下:
106106
- [FTX](example/ftx)
107107
- [火币现货](example/huobi)
108108
- [火币期货](example/huobi_future)
109-
- [OKEX] 正在接入中
109+
- [OKEX现货](example/okex)
110110
- To be continued ...
111111

112112
- 文档

collect/huobi/config.json

+11-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
"username": "guest",
66
"password": "guest"
77
},
8+
"LOG": {
9+
"console": true,
10+
"level": "WARN",
11+
"path": "C:/Users/Administrator/Desktop/log",
12+
"name": "quant_huobi_collect.log",
13+
"clear": false,
14+
"backup_count": 5
15+
},
816
"PLATFORMS": [
917
{
1018
"platform": "huobi"
@@ -13,9 +21,9 @@
1321
"MARKETS": {
1422
"huobi": {
1523
"symbols": [
16-
"eoseth",
17-
"trxeth",
18-
"ethusdt"
24+
"btcusdt",
25+
"ethusdt",
26+
"eosusdt"
1927
]
2028
}
2129
},

collect/okex/config.json

+10-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66
"password": "guest"
77
},
88
"PROXY": "http://127.0.0.1:6666",
9+
"LOG": {
10+
"console": true,
11+
"level": "WARN",
12+
"path": "C:/Users/Administrator/Desktop/log",
13+
"name": "quant_okex_collect.log",
14+
"clear": false,
15+
"backup_count": 5
16+
},
917
"PLATFORMS": [
1018
{
1119
"platform": "okex"
@@ -15,7 +23,8 @@
1523
"okex": {
1624
"symbols": [
1725
"BTC-USDT",
18-
"ETH-USDT"
26+
"ETH-USDT",
27+
"EOS-USDT"
1928
]
2029
}
2130
},

example/carrybrick/config.json

+8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
"username": "guest",
66
"password": "guest"
77
},
8+
"LOG": {
9+
"console": false,
10+
"level": "WARN",
11+
"path": "C:/Users/Administrator/Desktop/log",
12+
"name": "quant.log",
13+
"clear": false,
14+
"backup_count": 5
15+
},
816
"PROXY": "http://127.0.0.1:6666",
917
"ACCOUNTS": [
1018
{

example/ftx/main.py

+49-34
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ def __init__(self):
4141
self.account = config.accounts[0]["account"]
4242
self.access_key = config.accounts[0]["access_key"]
4343
self.secret_key = config.accounts[0]["secret_key"]
44-
target = config.markets[self.platform]
45-
self.symbols = target["symbols"]
44+
self.symbols = config.markets[self.platform]["symbols"]
4645
# 交易模块参数
4746
params = {
4847
"strategy": self.strategy,
@@ -66,26 +65,25 @@ def __init__(self):
6665
"direct_trade_update": False,
6766
"direct_ticker_update": False
6867
}
69-
#self.trader = self.create_gateway(**params)
68+
self.gw = self.create_gateway(**params)
7069

7170
#=====================================================
7271
#创建第二个交易接口
73-
self.platform1 = config.accounts[1]["platform"]
74-
self.account1 = config.accounts[1]["account"]
75-
self.access_key1 = config.accounts[1]["access_key"]
76-
self.secret_key1 = config.accounts[1]["secret_key"]
77-
self.subaccount_name1 = config.accounts[1]["subaccount_name"]
78-
target = config.markets[self.platform1]
79-
self.symbols1 = target["symbols"]
72+
self.platform2 = config.accounts[1]["platform"]
73+
self.account2 = config.accounts[1]["account"]
74+
self.access_key2 = config.accounts[1]["access_key"]
75+
self.secret_key2 = config.accounts[1]["secret_key"]
76+
self.subaccount_name2 = config.accounts[1]["subaccount_name"]
77+
self.symbols2 = config.markets[self.platform2]["symbols"]
8078
# 交易模块参数
81-
params1 = {
79+
params2 = {
8280
"strategy": self.strategy,
83-
"platform": self.platform1,
84-
"symbols": self.symbols1,
85-
"account": self.account1,
86-
"access_key": self.access_key1,
87-
"secret_key": self.secret_key1,
88-
"subaccount_name": self.subaccount_name1,
81+
"platform": self.platform2,
82+
"symbols": self.symbols2,
83+
"account": self.account2,
84+
"access_key": self.access_key2,
85+
"secret_key": self.secret_key2,
86+
"subaccount_name": self.subaccount_name2,
8987

9088
"enable_kline_update": True,
9189
"enable_orderbook_update": True,
@@ -101,35 +99,52 @@ def __init__(self):
10199
"direct_trade_update": False,
102100
"direct_ticker_update": False
103101
}
104-
self.trader1 = self.create_gateway(**params1)
102+
#self.gw2 = self.create_gateway(**params2)
105103

106104
# 注册定时器
107105
self.enable_timer() # 每隔1秒执行一次回调
108106

109107
async def on_time(self):
110108
""" 每秒钟执行一次. 因为是异步并发架构,这个函数执行的时候交易通道链接不一定已经建立好
111-
"""
112-
if not hasattr(self, "just_once"):
113-
self.just_once = 1
114-
#xx = self.get_orders(self.trader, "ETH-PERP")
115-
xx = self.get_position(self.trader1, "ETH-PERP")
116-
#xx = self.get_assets(self.trader)
117-
#xx = self.create_order(self.trader1, "ETH-PERP", ORDER_ACTION_SELL, "51", "-0.002")
118-
#xx = self.create_order(self.trader1, "ETH-PERP", ORDER_ACTION_SELL, "0", "-0.002", ORDER_TYPE_MARKET)
119-
#xx = self.revoke_order(self.trader, "ETH-PERP", "1017521392")
120-
#order1 = Strategy.TOrder(self.trader, "ETH-PERP", ORDER_ACTION_SELL, "351", "-0.02")
121-
#order2 = Strategy.TOrder(self.trader1, "ETH-PERP", ORDER_ACTION_SELL, "352", "-0.03")
122-
#xx = self.create_pair_order(order1, order2)
123-
#xx = self.get_symbol_info(self.trader, "ETH-PERP")
124-
yy, zz = await xx
125-
109+
"""
126110
logger.info("on_time ...", caller=self)
127-
#new_price = tools.float_to_str(price) # 将价格转换为字符串,保持精度
128111

129112
async def on_state_update_callback(self, state: State, **kwargs):
130113
""" 状态变化(底层交易所接口,框架等)通知回调函数
131114
"""
132115
logger.info("on_state_update_callback:", state, caller=self)
116+
117+
if state.code == State.STATE_CODE_READY: #收到此状态通知,证明底层环境一切准备就绪,策略可以开始工作
118+
#s, e = await self.get_orders(self.gw, "ETH-0327")
119+
#s, e = await self.get_position(self.gw, "ETH-0327")
120+
#s, e = await self.get_assets(self.gw)
121+
#s, e = await self.create_order(self.gw, "ETH-0327", ORDER_ACTION_SELL, 161, 0.001)
122+
#s, e = await self.create_order(self.gw, "ETH-0327", ORDER_ACTION_BUY, 0, 0.001, ORDER_TYPE_MARKET)
123+
#s, e = await self.create_order(self.gw, "ETH-0327", ORDER_ACTION_SELL, 0, 0.002, ORDER_TYPE_MARKET)
124+
#s, e = await self.create_order(self.gw, "ETH/USD", ORDER_ACTION_BUY, 0, 0.025, ORDER_TYPE_MARKET)
125+
#s, e = await self.create_order(self.gw, "ETH/USD", ORDER_ACTION_SELL, 0, 0.025, ORDER_TYPE_MARKET)
126+
#s, e = await self.revoke_order(self.gw, "ETH-PERP", "1017521392")
127+
#order1 = Strategy.TOrder(self.gw, "ETH-PERP", ORDER_ACTION_SELL, "351", "0.02")
128+
#order2 = Strategy.TOrder(self.gw2, "ETH-PERP", ORDER_ACTION_SELL, "352", "0.03")
129+
#s, e = await self.create_pair_order(order1, order2)
130+
s, e = await self.get_symbol_info(self.gw, "ETH-PERP")
131+
#s, e = await self.invalid_indicate(self.gw, "ETH-PERP", const.INDICATE_ASSET)
132+
#s, e = await self.invalid_indicate(self.gw, "ETH-PERP", const.INDICATE_ORDER)
133+
#s, e = await self.invalid_indicate(self.gw, "ETH-PERP", const.INDICATE_POSITION)
134+
135+
elif state.code == State.STATE_CODE_CONNECT_SUCCESS: #交易接口连接成功
136+
pass #仅仅是通知一下,实际策略可以不用过于关注此状态
137+
elif state.code == State.STATE_CODE_CONNECT_FAILED: #交易接口连接失败
138+
pass #不需要过于关注此状态,因为底层接口会自动重新连接
139+
elif state.code == State.STATE_CODE_DISCONNECT: #交易接口连接断开
140+
pass #不需要过于关注此状态,因为底层接口会自动重新连接
141+
elif state.code == State.STATE_CODE_RECONNECTING: #交易接口重新连接中
142+
pass #比如说可以记录重连次数,如果一段时间内一直在重连可能交易所出问题,可以酌情处理,如结束本策略进程等
143+
elif state.code == State.STATE_CODE_PARAM_MISS: #初始化过程缺少参数
144+
pass #收到此状态通知,证明无法正常初始化,应该结束本策略进程
145+
elif state.code == State.STATE_CODE_GENERAL_ERROR: #常规错误
146+
... #策略进程运行过程中如果收到某些错误通知,可以根据实际情况判断,比如可以做一些策略善后工作,然后结束本策略进程
147+
return
133148

134149
async def on_kline_update_callback(self, kline: Kline):
135150
""" 市场K线更新

example/huobi_future/main.py

+53-30
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from quant.utils import tools, logger
1717
from quant.config import config
1818
from quant.market import Market, Kline, Orderbook, Trade, Ticker
19-
from quant.order import Order, Fill, ORDER_ACTION_BUY, ORDER_ACTION_SELL, ORDER_STATUS_FILLED, ORDER_TYPE_MARKET
19+
from quant.order import Order, Fill, ORDER_ACTION_BUY, ORDER_ACTION_SELL, ORDER_STATUS_FILLED, ORDER_TYPE_MARKET, ORDER_TYPE_IOC
2020
from quant.position import Position
2121
from quant.asset import Asset
2222
from quant.tasks import LoopRunTask
@@ -36,13 +36,12 @@ def __init__(self):
3636
self.strategy = config.strategy
3737

3838
#=====================================================
39-
#创建第一个交易接口
39+
#创建交易网关
4040
self.platform = config.accounts[0]["platform"]
4141
self.account = config.accounts[0]["account"]
4242
self.access_key = config.accounts[0]["access_key"]
4343
self.secret_key = config.accounts[0]["secret_key"]
44-
target = config.markets[self.platform]
45-
self.symbols = target["symbols"]
44+
self.symbols = config.markets[self.platform]["symbols"]
4645
# 交易模块参数
4746
params = {
4847
"strategy": self.strategy,
@@ -61,40 +60,67 @@ def __init__(self):
6160
"enable_position_update": True,
6261
"enable_asset_update": True,
6362

64-
"direct_kline_update": True,
65-
"direct_orderbook_update": True,
66-
"direct_trade_update": True,
67-
"direct_ticker_update": True
63+
"direct_kline_update": False,
64+
"direct_orderbook_update": False,
65+
"direct_trade_update": False,
66+
"direct_ticker_update": False
6867
}
69-
self.trader = self.create_gateway(**params)
70-
68+
self.gw = self.create_gateway(**params)
7169
# 注册定时器
7270
self.enable_timer() # 每隔1秒执行一次回调
7371

7472
async def on_time(self):
7573
""" 每秒钟执行一次. 因为是异步并发架构,这个函数执行的时候交易通道链接不一定已经建立好
7674
"""
77-
if not hasattr(self, "just_once"):
78-
self.just_once = 1
79-
#xx = self.get_orders(self.trader, "ETH-PERP")
80-
#xx = self.get_position(self.trader1, "ETH-PERP")
81-
#xx = self.get_assets(self.trader)
82-
#xx = self.create_order(self.trader, "ETH-PERP", ORDER_ACTION_SELL, "51", "-0.002")
83-
#xx = self.create_order(self.trader, "ETH-PERP", ORDER_ACTION_SELL, "0", "-0.002", ORDER_TYPE_MARKET)
84-
#xx = self.revoke_order(self.trader, "ETH-PERP", "1017521392")
85-
#order1 = Strategy.TOrder(self.trader, "ETH-PERP", ORDER_ACTION_SELL, "351", "-0.02")
86-
#order2 = Strategy.TOrder(self.trader1, "ETH-PERP", ORDER_ACTION_SELL, "352", "-0.03")
87-
#xx = self.create_pair_order(order1, order2)
88-
#xx = self.get_symbol_info(self.trader, "trxeth")
89-
#yy, zz = await xx
90-
9175
logger.info("on_time ...", caller=self)
92-
#new_price = tools.float_to_str(price) # 将价格转换为字符串,保持精度
9376

9477
async def on_state_update_callback(self, state: State, **kwargs):
9578
""" 状态变化(底层交易所接口,框架等)通知回调函数
9679
"""
9780
logger.info("on_state_update_callback:", state, caller=self)
81+
82+
if state.code == State.STATE_CODE_READY: #收到此状态通知,证明底层环境一切准备就绪,策略可以开始工作
83+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_SELL, 307, -7) #卖出开空(限价单)
84+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_SELL, 0, -1, ORDER_TYPE_MARKET) #卖出开空(市价单)
85+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_SELL, 131, -1, ORDER_TYPE_IOC) #卖出开空(IOC单)
86+
87+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_BUY, 136, 2) #买入开多(限价单)
88+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_BUY, 0, 1, ORDER_TYPE_MARKET) #买入开多(市价单)
89+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_BUY, 150, 1, ORDER_TYPE_IOC) #买入开多(IOC单)
90+
91+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_SELL, 160, 2) #卖出平多(限价单)
92+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_SELL, 0, 1, ORDER_TYPE_MARKET) #卖出平多(市价单)
93+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_SELL, 130, 1, ORDER_TYPE_IOC) #卖出平多(IOC单)
94+
95+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_BUY, 105, -1) #买入平空(限价单)
96+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_BUY, 0, -1, ORDER_TYPE_MARKET) #买入平空(市价单)
97+
#s, e = await self.create_order(self.gw, "ETH200327", ORDER_ACTION_BUY, 130, -1, ORDER_TYPE_IOC) #买入平空(IOC单)
98+
99+
#s, e = await self.revoke_order(self.gw, "ETH200327") #撤销此合约下的所有挂单
100+
#s, e = await self.revoke_order(self.gw, "ETH200327", "688011256896319488") #撤销单个挂单
101+
#s, e = await self.revoke_order(self.gw, "ETH200327", "70873572342", "688009872595656704") #撤销多个挂单
102+
103+
s, e = await self.get_symbol_info(self.gw, "ETH200327")
104+
#s, e = await self.get_position(self.gw, "ETH200327")
105+
#s, e = await self.get_assets(self.gw)
106+
#s, e = await self.get_orders(self.gw, "ETH200327")
107+
#s, e = await self.invalid_indicate(self.gw, "ETH200327", const.INDICATE_ASSET)
108+
#s, e = await self.invalid_indicate(self.gw, "ETH200327", const.INDICATE_ORDER)
109+
#s, e = await self.invalid_indicate(self.gw, "ETH200327", const.INDICATE_POSITION)
110+
111+
elif state.code == State.STATE_CODE_CONNECT_SUCCESS: #交易接口连接成功
112+
pass #仅仅是通知一下,实际策略可以不用过于关注此状态
113+
elif state.code == State.STATE_CODE_CONNECT_FAILED: #交易接口连接失败
114+
pass #不需要过于关注此状态,因为底层接口会自动重新连接
115+
elif state.code == State.STATE_CODE_DISCONNECT: #交易接口连接断开
116+
pass #不需要过于关注此状态,因为底层接口会自动重新连接
117+
elif state.code == State.STATE_CODE_RECONNECTING: #交易接口重新连接中
118+
pass #比如说可以记录重连次数,如果一段时间内一直在重连可能交易所出问题,可以酌情处理,如结束本策略进程等
119+
elif state.code == State.STATE_CODE_PARAM_MISS: #初始化过程缺少参数
120+
pass #收到此状态通知,证明无法正常初始化,应该结束本策略进程
121+
elif state.code == State.STATE_CODE_GENERAL_ERROR: #常规错误
122+
... #策略进程运行过程中如果收到某些错误通知,可以根据实际情况判断,比如可以做一些策略善后工作,然后结束本策略进程
123+
return
98124

99125
async def on_kline_update_callback(self, kline: Kline):
100126
""" 市场K线更新
@@ -117,16 +143,13 @@ async def on_orderbook_update_callback(self, orderbook: Orderbook):
117143
""" 订单薄更新
118144
"""
119145
logger.info("orderbook:", orderbook, caller=self)
120-
#ask1_price = float(orderbook.asks[0][0]) # 卖一价格
121-
#bid1_price = float(orderbook.bids[0][0]) # 买一价格
122-
#self.current_price = (ask1_price + bid1_price) / 2 # 为了方便,这里假设盘口价格为 卖一 和 买一 的平均值
123146
"""
124147
假设策略在本回调函数里面判断开平仓条件,并且条件达到可以进行开平仓的情况下,最好是把接下来的开平仓逻辑单独
125148
放在一个函数里面,并且加上'不等待类型的锁',比如下面这个函数这样.
126149
"""
127150
#if 开平仓条件达到:
128151
await self.can_do_open_close_pos_demo()
129-
print("##################################")
152+
#print("##################################")
130153

131154
async def on_trade_update_callback(self, trade: Trade):
132155
""" 市场最新成交更新
@@ -167,7 +190,7 @@ def main():
167190
if not config_file.lower().endswith("config.json"):
168191
logger.error("config.json miss")
169192
return
170-
193+
171194
from quant.quant import quant
172195
quant.initialize(config_file)
173196
DemoStrategy()

example/statarb/config.json

-23
This file was deleted.

0 commit comments

Comments
 (0)