16
16
from quant .utils import tools , logger
17
17
from quant .config import config
18
18
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
20
20
from quant .position import Position
21
21
from quant .asset import Asset
22
22
from quant .tasks import LoopRunTask
@@ -36,13 +36,12 @@ def __init__(self):
36
36
self .strategy = config .strategy
37
37
38
38
#=====================================================
39
- #创建第一个交易接口
39
+ #创建交易网关
40
40
self .platform = config .accounts [0 ]["platform" ]
41
41
self .account = config .accounts [0 ]["account" ]
42
42
self .access_key = config .accounts [0 ]["access_key" ]
43
43
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" ]
46
45
# 交易模块参数
47
46
params = {
48
47
"strategy" : self .strategy ,
@@ -61,40 +60,67 @@ def __init__(self):
61
60
"enable_position_update" : True ,
62
61
"enable_asset_update" : True ,
63
62
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
68
67
}
69
- self .trader = self .create_gateway (** params )
70
-
68
+ self .gw = self .create_gateway (** params )
71
69
# 注册定时器
72
70
self .enable_timer () # 每隔1秒执行一次回调
73
71
74
72
async def on_time (self ):
75
73
""" 每秒钟执行一次. 因为是异步并发架构,这个函数执行的时候交易通道链接不一定已经建立好
76
74
"""
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
-
91
75
logger .info ("on_time ..." , caller = self )
92
- #new_price = tools.float_to_str(price) # 将价格转换为字符串,保持精度
93
76
94
77
async def on_state_update_callback (self , state : State , ** kwargs ):
95
78
""" 状态变化(底层交易所接口,框架等)通知回调函数
96
79
"""
97
80
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
98
124
99
125
async def on_kline_update_callback (self , kline : Kline ):
100
126
""" 市场K线更新
@@ -117,16 +143,13 @@ async def on_orderbook_update_callback(self, orderbook: Orderbook):
117
143
""" 订单薄更新
118
144
"""
119
145
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 # 为了方便,这里假设盘口价格为 卖一 和 买一 的平均值
123
146
"""
124
147
假设策略在本回调函数里面判断开平仓条件,并且条件达到可以进行开平仓的情况下,最好是把接下来的开平仓逻辑单独
125
148
放在一个函数里面,并且加上'不等待类型的锁',比如下面这个函数这样.
126
149
"""
127
150
#if 开平仓条件达到:
128
151
await self .can_do_open_close_pos_demo ()
129
- print ("##################################" )
152
+ # print("##################################")
130
153
131
154
async def on_trade_update_callback (self , trade : Trade ):
132
155
""" 市场最新成交更新
@@ -167,7 +190,7 @@ def main():
167
190
if not config_file .lower ().endswith ("config.json" ):
168
191
logger .error ("config.json miss" )
169
192
return
170
-
193
+
171
194
from quant .quant import quant
172
195
quant .initialize (config_file )
173
196
DemoStrategy ()
0 commit comments