1
+ from typing import Any , Optional
1
2
2
3
from vnpy .event import EventEngine , Event
3
4
from vnpy .trader .engine import BaseEngine , MainEngine
4
5
from vnpy .trader .event import (
5
- EVENT_TICK , EVENT_TIMER , EVENT_ORDER , EVENT_TRADE )
6
- from vnpy .trader .constant import (Direction , Offset , OrderType )
7
- from vnpy .trader .object import (SubscribeRequest , OrderRequest , LogData )
6
+ EVENT_TICK ,
7
+ EVENT_TIMER ,
8
+ EVENT_ORDER ,
9
+ EVENT_TRADE
10
+ )
11
+ from vnpy .trader .constant import Direction , Offset , OrderType
12
+ from vnpy .trader .object import (
13
+ SubscribeRequest ,
14
+ OrderRequest ,
15
+ LogData ,
16
+ ContractData ,
17
+ OrderData ,
18
+ TickData ,
19
+ CancelRequest
20
+ )
8
21
from vnpy .trader .utility import load_json , save_json , round_to
9
- from vnpy .trader .setting import SETTINGS
10
22
11
23
from .template import AlgoTemplate
12
24
from .base import (
13
- EVENT_ALGO_LOG , EVENT_ALGO_PARAMETERS ,
14
- EVENT_ALGO_SETTING , EVENT_ALGO_VARIABLES ,
25
+ EVENT_ALGO_LOG ,
26
+ EVENT_ALGO_PARAMETERS ,
27
+ EVENT_ALGO_SETTING ,
28
+ EVENT_ALGO_VARIABLES ,
15
29
APP_NAME
16
30
)
17
31
18
32
19
33
class AlgoEngine (BaseEngine ):
20
34
""""""
21
- setting_filename = "algo_trading_setting.json"
35
+ setting_filename : str = "algo_trading_setting.json"
22
36
23
37
def __init__ (self , main_engine : MainEngine , event_engine : EventEngine ):
24
38
"""构造函数"""
25
39
super ().__init__ (main_engine , event_engine , APP_NAME )
26
40
27
- self .algos = {}
28
- self .symbol_algo_map = {}
29
- self .orderid_algo_map = {}
41
+ self .algos : dict = {}
42
+ self .symbol_algo_map : dict = {}
43
+ self .orderid_algo_map : dict = {}
30
44
31
- self .algo_templates = {}
32
- self .algo_settings = {}
45
+ self .algo_templates : dict = {}
46
+ self .algo_settings : dict = {}
33
47
34
48
self .load_algo_template ()
35
49
self .register_event ()
36
50
37
- def init_engine (self ):
51
+ def init_engine (self ) -> None :
38
52
""""""
39
53
self .write_log ("算法交易引擎启动" )
40
54
self .load_algo_setting ()
41
55
42
- def close (self ):
56
+ def close (self ) -> None :
43
57
""""""
44
58
pass
45
59
46
- def load_algo_template (self ):
60
+ def load_algo_template (self ) -> None :
47
61
""""""
48
62
from .algos .twap_algo import TwapAlgo
49
63
from .algos .iceberg_algo import IcebergAlgo
@@ -63,94 +77,94 @@ def load_algo_template(self):
63
77
self .add_algo_template (DmaAlgo )
64
78
self .add_algo_template (ArbitrageAlgo )
65
79
66
- def add_algo_template (self , template : AlgoTemplate ):
80
+ def add_algo_template (self , template : AlgoTemplate ) -> None :
67
81
""""""
68
82
self .algo_templates [template .__name__ ] = template
69
83
70
- def load_algo_setting (self ):
84
+ def load_algo_setting (self ) -> None :
71
85
""""""
72
- self .algo_settings = load_json (self .setting_filename )
86
+ self .algo_settings : dict = load_json (self .setting_filename )
73
87
74
88
for setting_name , setting in self .algo_settings .items ():
75
89
self .put_setting_event (setting_name , setting )
76
90
77
91
self .write_log ("算法配置载入成功" )
78
92
79
- def save_algo_setting (self ):
93
+ def save_algo_setting (self ) -> None :
80
94
""""""
81
95
save_json (self .setting_filename , self .algo_settings )
82
96
83
- def register_event (self ):
97
+ def register_event (self ) -> None :
84
98
""""""
85
99
self .event_engine .register (EVENT_TICK , self .process_tick_event )
86
100
self .event_engine .register (EVENT_TIMER , self .process_timer_event )
87
101
self .event_engine .register (EVENT_ORDER , self .process_order_event )
88
102
self .event_engine .register (EVENT_TRADE , self .process_trade_event )
89
103
90
- def process_tick_event (self , event : Event ):
104
+ def process_tick_event (self , event : Event ) -> None :
91
105
""""""
92
- tick = event .data
106
+ tick : Any = event .data
93
107
94
- algos = self .symbol_algo_map .get (tick .vt_symbol , None )
108
+ algos : Any = self .symbol_algo_map .get (tick .vt_symbol , None )
95
109
if algos :
96
110
for algo in algos :
97
111
algo .update_tick (tick )
98
112
99
- def process_timer_event (self , event : Event ):
113
+ def process_timer_event (self , event : Event ) -> None :
100
114
""""""
101
115
# 生成列表避免字典改变
102
- algos = list (self .algos .values ())
116
+ algos : list = list (self .algos .values ())
103
117
104
118
for algo in algos :
105
119
algo .update_timer ()
106
120
107
- def process_trade_event (self , event : Event ):
121
+ def process_trade_event (self , event : Event ) -> None :
108
122
""""""
109
- trade = event .data
123
+ trade : Any = event .data
110
124
111
- algo = self .orderid_algo_map .get (trade .vt_orderid , None )
125
+ algo : Optional [ AlgoTemplate ] = self .orderid_algo_map .get (trade .vt_orderid , None )
112
126
if algo :
113
127
algo .update_trade (trade )
114
128
115
- def process_order_event (self , event : Event ):
129
+ def process_order_event (self , event : Event ) -> None :
116
130
""""""
117
- order = event .data
131
+ order : Any = event .data
118
132
119
- algo = self .orderid_algo_map .get (order .vt_orderid , None )
133
+ algo : Optional [ AlgoTemplate ] = self .orderid_algo_map .get (order .vt_orderid , None )
120
134
if algo :
121
135
algo .update_order (order )
122
136
123
- def start_algo (self , setting : dict ):
137
+ def start_algo (self , setting : dict ) -> str :
124
138
""""""
125
139
template_name : str = setting ["template_name" ]
126
- algo_template = self .algo_templates [template_name ]
140
+ algo_template : AlgoTemplate = self .algo_templates [template_name ]
127
141
128
- algo = algo_template .new (self , setting )
142
+ algo : AlgoTemplate = algo_template .new (self , setting )
129
143
algo .start ()
130
144
131
145
self .algos [algo .algo_name ] = algo
132
146
return algo .algo_name
133
147
134
- def stop_algo (self , algo_name : str ):
148
+ def stop_algo (self , algo_name : str ) -> None :
135
149
""""""
136
- algo = self .algos .get (algo_name , None )
150
+ algo : Optional [ AlgoTemplate ] = self .algos .get (algo_name , None )
137
151
if algo :
138
152
algo .stop ()
139
153
self .algos .pop (algo_name )
140
154
141
- def stop_all (self ):
155
+ def stop_all (self ) -> None :
142
156
""""""
143
157
for algo_name in list (self .algos .keys ()):
144
158
self .stop_algo (algo_name )
145
159
146
- def subscribe (self , algo : AlgoTemplate , vt_symbol : str ):
160
+ def subscribe (self , algo : AlgoTemplate , vt_symbol : str ) -> None :
147
161
""""""
148
- contract = self .main_engine .get_contract (vt_symbol )
162
+ contract : Optional [ ContractData ] = self .main_engine .get_contract (vt_symbol )
149
163
if not contract :
150
164
self .write_log (f'订阅行情失败,找不到合约:{ vt_symbol } ' , algo )
151
165
return
152
166
153
- algos = self .symbol_algo_map .setdefault (vt_symbol , set ())
167
+ algos : Any = self .symbol_algo_map .setdefault (vt_symbol , set ())
154
168
155
169
if not algos :
156
170
req = SubscribeRequest (
@@ -170,18 +184,18 @@ def send_order(
170
184
volume : float ,
171
185
order_type : OrderType ,
172
186
offset : Offset
173
- ):
187
+ ) -> str :
174
188
""""""
175
- contract = self .main_engine .get_contract (vt_symbol )
189
+ contract : Optional [ ContractData ] = self .main_engine .get_contract (vt_symbol )
176
190
if not contract :
177
191
self .write_log (f'委托下单失败,找不到合约:{ vt_symbol } ' , algo )
178
192
return
179
193
180
- volume = round_to (volume , contract .min_volume )
194
+ volume : float = round_to (volume , contract .min_volume )
181
195
if not volume :
182
196
return ""
183
197
184
- req = OrderRequest (
198
+ req : OrderRequest = OrderRequest (
185
199
symbol = contract .symbol ,
186
200
exchange = contract .exchange ,
187
201
direction = direction ,
@@ -191,73 +205,73 @@ def send_order(
191
205
offset = offset ,
192
206
reference = f"{ APP_NAME } _{ algo .algo_name } "
193
207
)
194
- vt_orderid = self .main_engine .send_order (req , contract .gateway_name )
208
+ vt_orderid : str = self .main_engine .send_order (req , contract .gateway_name )
195
209
196
210
self .orderid_algo_map [vt_orderid ] = algo
197
211
return vt_orderid
198
212
199
- def cancel_order (self , algo : AlgoTemplate , vt_orderid : str ):
213
+ def cancel_order (self , algo : AlgoTemplate , vt_orderid : str ) -> None :
200
214
""""""
201
- order = self .main_engine .get_order (vt_orderid )
215
+ order : Optional [ OrderData ] = self .main_engine .get_order (vt_orderid )
202
216
203
217
if not order :
204
218
self .write_log (f"委托撤单失败,找不到委托:{ vt_orderid } " , algo )
205
219
return
206
220
207
- req = order .create_cancel_request ()
221
+ req : CancelRequest = order .create_cancel_request ()
208
222
self .main_engine .cancel_order (req , order .gateway_name )
209
223
210
- def get_tick (self , algo : AlgoTemplate , vt_symbol : str ):
224
+ def get_tick (self , algo : AlgoTemplate , vt_symbol : str ) -> Optional [ TickData ] :
211
225
""""""
212
- tick = self .main_engine .get_tick (vt_symbol )
226
+ tick : Optional [ TickData ] = self .main_engine .get_tick (vt_symbol )
213
227
214
228
if not tick :
215
229
self .write_log (f"查询行情失败,找不到行情:{ vt_symbol } " , algo )
216
230
217
231
return tick
218
232
219
- def get_contract (self , algo : AlgoTemplate , vt_symbol : str ):
233
+ def get_contract (self , algo : AlgoTemplate , vt_symbol : str ) -> Optional [ ContractData ] :
220
234
""""""
221
- contract = self .main_engine .get_contract (vt_symbol )
235
+ contract : Optional [ ContractData ] = self .main_engine .get_contract (vt_symbol )
222
236
223
237
if not contract :
224
238
self .write_log (f"查询合约失败,找不到合约:{ vt_symbol } " , algo )
225
239
226
240
return contract
227
241
228
- def write_log (self , msg : str , algo : AlgoTemplate = None ):
242
+ def write_log (self , msg : str , algo : AlgoTemplate = None ) -> None :
229
243
""""""
230
244
if algo :
231
245
msg = f"{ algo .algo_name } :{ msg } "
232
246
233
- log = LogData (msg = msg , gateway_name = APP_NAME )
234
- event = Event (EVENT_ALGO_LOG , data = log )
247
+ log : LogData = LogData (msg = msg , gateway_name = APP_NAME )
248
+ event : Event = Event (EVENT_ALGO_LOG , data = log )
235
249
self .event_engine .put (event )
236
250
237
- def put_setting_event (self , setting_name : str , setting : dict ):
251
+ def put_setting_event (self , setting_name : str , setting : dict ) -> None :
238
252
""""""
239
- event = Event (EVENT_ALGO_SETTING )
253
+ event : Event = Event (EVENT_ALGO_SETTING )
240
254
event .data = {
241
255
"setting_name" : setting_name ,
242
256
"setting" : setting
243
257
}
244
258
self .event_engine .put (event )
245
259
246
- def update_algo_setting (self , setting_name : str , setting : dict ):
260
+ def update_algo_setting (self , setting_name : str , setting : dict ) -> None :
247
261
""""""
248
262
self .algo_settings [setting_name ] = setting
249
263
250
264
self .save_algo_setting ()
251
265
252
266
self .put_setting_event (setting_name , setting )
253
267
254
- def remove_algo_setting (self , setting_name : str ):
268
+ def remove_algo_setting (self , setting_name : str ) -> None :
255
269
""""""
256
270
if setting_name not in self .algo_settings :
257
271
return
258
272
self .algo_settings .pop (setting_name )
259
273
260
- event = Event (EVENT_ALGO_SETTING )
274
+ event : Event = Event (EVENT_ALGO_SETTING )
261
275
event .data = {
262
276
"setting_name" : setting_name ,
263
277
"setting" : None
@@ -266,18 +280,18 @@ def remove_algo_setting(self, setting_name: str):
266
280
267
281
self .save_algo_setting ()
268
282
269
- def put_parameters_event (self , algo : AlgoTemplate , parameters : dict ):
283
+ def put_parameters_event (self , algo : AlgoTemplate , parameters : dict ) -> None :
270
284
""""""
271
- event = Event (EVENT_ALGO_PARAMETERS )
285
+ event : Event = Event (EVENT_ALGO_PARAMETERS )
272
286
event .data = {
273
287
"algo_name" : algo .algo_name ,
274
288
"parameters" : parameters
275
289
}
276
290
self .event_engine .put (event )
277
291
278
- def put_variables_event (self , algo : AlgoTemplate , variables : dict ):
292
+ def put_variables_event (self , algo : AlgoTemplate , variables : dict ) -> None :
279
293
""""""
280
- event = Event (EVENT_ALGO_VARIABLES )
294
+ event : Event = Event (EVENT_ALGO_VARIABLES )
281
295
event .data = {
282
296
"algo_name" : algo .algo_name ,
283
297
"variables" : variables
0 commit comments