Skip to content

Commit 6bc81b5

Browse files
committed
Refactor
1 parent e2f9faf commit 6bc81b5

File tree

4 files changed

+75
-38
lines changed

4 files changed

+75
-38
lines changed

shipane_sdk/base_manager.py

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -161,22 +161,28 @@ def purchase_new_stocks(self):
161161
self._shipane_client.purchase_new_stocks()
162162

163163
def execute(self, order=None, **kwargs):
164-
if order is not None:
165-
self._execute(order)
164+
if order is None:
165+
common_order = Order.from_e_order(**kwargs)
166166
else:
167-
self._shipane_client.execute(**kwargs)
167+
common_order = self._normalize_order(order)
168+
169+
self._logger.info("[实盘易] 跟单:" + str(common_order))
170+
if not self._should_execute(common_order):
171+
return
172+
173+
try:
174+
actual_order = self._execute(common_order)
175+
return actual_order
176+
except Exception:
177+
self._logger.exception("[实盘易] 下单异常")
168178

169179
def cancel(self, order):
170180
if order is None:
171181
self._logger.info('[实盘易] 委托为空,忽略撤单请求')
172182
return
173183

174184
try:
175-
order_id = order if isinstance(order, int) else order.order_id
176-
if order_id in self._order_id_map:
177-
self._shipane_client.cancel(order_id=self._order_id_map[order_id])
178-
else:
179-
self._logger.warning('[实盘易] 未找到对应的委托编号')
185+
self._cancel(order)
180186
except:
181187
self._logger.exception("[实盘易] 撤单异常")
182188

@@ -219,33 +225,46 @@ def _sync_config(self):
219225
return self._config['sync']
220226

221227
def _execute(self, order):
222-
self._logger.info("[实盘易] 跟单:" + str(order))
223-
224-
if not self._should_execute(order):
225-
return
228+
common_order = self._normalize_order(order)
229+
e_order = common_order.to_e_order()
230+
actual_order = self._shipane_client.execute(**e_order)
231+
self._order_id_map[common_order.id] = actual_order['id']
232+
return actual_order
233+
234+
def _cancel(self, order):
235+
if isinstance(order, int):
236+
quant_order_id = order
237+
else:
238+
common_order = self._normalize_order(order)
239+
quant_order_id = common_order.id
226240

227241
try:
228-
e_order = self._strategy_context.convert_order(order)
229-
actual_order = self._shipane_client.execute(**e_order)
230-
self._order_id_map[order.order_id] = actual_order['id']
231-
return actual_order
232-
except:
233-
self._logger.exception("[实盘易] 下单异常")
242+
order_id = self._order_id_map.pop(quant_order_id)
243+
self._shipane_client.cancel(order_id=order_id)
244+
except KeyError:
245+
self._logger.warning('[实盘易] 未找到对应的委托编号')
246+
247+
def _normalize_order(self, order):
248+
if isinstance(order, Order):
249+
common_order = order
250+
else:
251+
common_order = self._strategy_context.convert_order(order)
252+
return common_order
234253

235-
def _should_execute(self, order):
254+
def _should_execute(self, common_order):
236255
if self._strategy_context.is_backtest():
237256
self._logger.info("[实盘易] 当前为回测环境,忽略下单请求")
238257
return False
239-
if order is None:
258+
if common_order is None:
240259
self._logger.info('[实盘易] 委托为空,忽略下单请求')
241260
return False
242-
if self._is_expired(order):
261+
if self._is_expired(common_order):
243262
self._logger.info('[实盘易] 委托已过期,忽略下单请求')
244263
return False
245264
return True
246265

247-
def _is_expired(self, order):
248-
return order.add_time < self._expire_before
266+
def _is_expired(self, common_order):
267+
return common_order.add_time < self._expire_before
249268

250269
def _pre_check(self):
251270
if not self._sync_config['enabled']:
@@ -308,8 +327,6 @@ def _execute_order(self, order):
308327
return
309328

310329
e_order = order.to_e_order()
311-
e_order['type'] = 'MARKET'
312-
e_order['priceType'] = 4
313330
self._shipane_client.execute(**e_order)
314331
except:
315332
self._logger.exception("[%s] 客户端下单失败", self.id)

shipane_sdk/jobs/online_quant_sync.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,6 @@ def _execute_order(self, order, client):
8181
self._logger.info(order)
8282
return
8383
e_order = order.to_e_order()
84-
e_order['type'] = 'MARKET'
85-
e_order['priceType'] = 4
8684
self._shipane_client.execute(client=client, **e_order)
8785
except Exception as e:
8886
self._logger.error('客户端[%s]下单失败\n%s', client, e)

shipane_sdk/joinquant/manager.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,15 @@ def get_portfolio(self):
4343
return portfolio
4444

4545
def convert_order(self, quant_order):
46-
order_type = 'LIMIT' if quant_order.limit > 0 else 'MARKET'
47-
e_order = dict(
48-
action=('BUY' if quant_order.is_buy else 'SELL'),
49-
symbol=quant_order.security,
50-
type=order_type,
51-
priceType=(0 if order_type == 'LIMIT' else 4),
46+
common_order = Order(
47+
id=quant_order.order_id,
48+
action=(OrderAction.OPEN if quant_order.is_buy else OrderAction.CLOSE),
49+
security=quant_order.security,
5250
price=quant_order.limit,
53-
amount=quant_order.amount
51+
amount=quant_order.amount,
52+
style=(OrderStyle.LIMIT if quant_order.limit > 0 else OrderStyle.MARKET),
5453
)
55-
return e_order
54+
return common_order
5655

5756
def has_open_orders(self):
5857
return bool(get_open_orders())

shipane_sdk/models.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ def rebalance(self):
254254
self._available_cash = 0
255255
self._total_value = self._positions_value
256256

257+
257258
class Position(object):
258259
@staticmethod
259260
def to_json(instance):
@@ -334,11 +335,23 @@ def from_json(json):
334335
order = Order()
335336
order.action = OrderAction.OPEN if json['action'] == 'BUY' else OrderAction.CLOSE
336337
order.security = json['symbol']
338+
order.style = OrderStyle(json['type'])
337339
order.price = json['price']
338340
order.amount = json['amount']
339341
return order
340342

341-
def __init__(self, action=None, security=None, amount=None, price=None, style=None):
343+
@staticmethod
344+
def from_e_order(**kwargs):
345+
order = Order()
346+
order.action = OrderAction.OPEN if kwargs['action'] == 'BUY' else OrderAction.CLOSE
347+
order.security = kwargs['symbol']
348+
order.style = OrderStyle(kwargs['type'])
349+
order.price = kwargs['price']
350+
order.amount = kwargs['amount']
351+
return order
352+
353+
def __init__(self, id=None, action=None, security=None, amount=None, price=None, style=None):
354+
self._id = id
342355
self._action = action
343356
self._security = security
344357
self._amount = amount
@@ -357,9 +370,11 @@ def __str__(self):
357370

358371
def to_e_order(self):
359372
e_order = dict(
360-
action='BUY' if self._action == OrderAction.OPEN else 'SELL',
373+
action=('BUY' if self._action == OrderAction.OPEN else 'SELL'),
361374
symbol=self._security,
362-
type=self._style,
375+
type=self._style.name,
376+
priceType=(0 if self._style == OrderStyle.LIMIT else 4),
377+
price=self._price,
363378
amount=self._amount
364379
)
365380
return e_order
@@ -368,6 +383,14 @@ def to_e_order(self):
368383
def value(self):
369384
return self._amount * self._price
370385

386+
@property
387+
def id(self):
388+
return self._id
389+
390+
@id.setter
391+
def id(self, value):
392+
self._id = value
393+
371394
@property
372395
def action(self):
373396
return self._action

0 commit comments

Comments
 (0)