Skip to content

Commit

Permalink
[bug fix] 修复股指对锁的bug
Browse files Browse the repository at this point in the history
  • Loading branch information
msincenselee committed Oct 12, 2020
1 parent b32ca3b commit dd5a9fc
Showing 1 changed file with 28 additions and 31 deletions.
59 changes: 28 additions & 31 deletions vnpy/app/cta_strategy_pro/template_spread.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ class CtaSpreadTemplate(CtaTemplate):
force_trading_close = False # 强制平仓
history_orders = {}


# 逻辑过程日志
dist_fieldnames = ['datetime', 'symbol', 'volume', 'price',
'operation', 'signal', 'stop_price', 'target_price',
Expand Down Expand Up @@ -378,7 +377,6 @@ def get_positions(self):
self.write_log(u'当前持仓:{}'.format(pos_list))
return pos_list


def on_start(self):
"""启动策略(必须由用户继承实现)"""
# 订阅主动腿/被动腿合约
Expand Down Expand Up @@ -415,11 +413,11 @@ def on_trade(self, trade: TradeData):
if not order_info:
if trade.vt_orderid in self.history_orders.keys():
order_info = self.history_orders.get(trade.vt_orderid)
# 找到委托记录
# 找到委托记录
if order_info is not None:
# 委托单记录 =》 找到 Grid
grid = order_info.get('grid')
if grid:
if grid and order_info.get('offset', None) == Offset.OPEN:
# 更新平均开仓/平仓得价格,数量
self.update_grid_trade(trade, grid)

Expand Down Expand Up @@ -452,8 +450,8 @@ def update_pos(self, price, volume, operation, dt):
self.position.open_pos(Direction.LONG, volume=volume)
dist_record['long_pos'] = self.position.long_pos
dist_record['short_pos'] = self.position.short_pos
trade.offset=Offset.OPEN
trade.direction=Direction.LONG
trade.offset = Offset.OPEN
trade.direction = Direction.LONG

if operation == 'short':
self.position.open_pos(Direction.SHORT, volume=volume)
Expand Down Expand Up @@ -481,7 +479,6 @@ def update_pos(self, price, volume, operation, dt):
if self.backtesting:
self.cta_engine.append_trade(trade)


def save_dist(self, dist_data):
"""
保存策略逻辑过程记录=》 csv文件按
Expand Down Expand Up @@ -660,7 +657,7 @@ def on_order_all_traded(self, order: OrderData):
grid.traded_volume = 0

# 平仓完毕(cover, sell)
if order.offset != Offset.OPEN:
if order_info.get("offset", None) != Offset.OPEN:
grid.open_status = False
grid.close_status = True

Expand Down Expand Up @@ -753,7 +750,7 @@ def on_order_open_canceled(self, order: OrderData):
grid.order_ids.remove(order.vt_orderid)

# 网格的所有委托单已经执行完毕
#if len(grid.order_ids) == 0:
# if len(grid.order_ids) == 0:
# grid.order_status = False

self.gt.save()
Expand Down Expand Up @@ -785,7 +782,7 @@ def on_order_open_canceled(self, order: OrderData):
vt_orderids = self.buy(price=buy_price,
volume=order_volume,
vt_symbol=order_vt_symbol,
lock=order_exchange==Exchange.CFFEX,
lock=order_exchange == Exchange.CFFEX,
order_type=OrderType.FAK,
order_time=self.cur_datetime,
grid=grid)
Expand Down Expand Up @@ -827,7 +824,7 @@ def on_order_open_canceled(self, order: OrderData):
vt_orderids = self.short(price=short_price,
volume=order_volume,
vt_symbol=order_vt_symbol,
lock=order_exchange==Exchange.CFFEX,
lock=order_exchange == Exchange.CFFEX,
order_type=OrderType.FAK,
order_time=self.cur_datetime,
grid=grid)
Expand Down Expand Up @@ -860,7 +857,7 @@ def on_order_open_canceled(self, order: OrderData):
self.write_log(f'移除grid中order_ids:{order.vt_orderid}')
grid.order_ids.remove(order.vt_orderid)

#if not grid.order_ids:
# if not grid.order_ids:
# grid.order_status = False

self.gt.save()
Expand All @@ -886,7 +883,7 @@ def on_order_close_canceled(self, order: OrderData):
old_order['traded'] = order.traded
# order_time = old_order['order_time']
order_vt_symbol = copy(old_order['vt_symbol'])
order_symbol,order_exchange = extract_vt_symbol(order_vt_symbol)
order_symbol, order_exchange = extract_vt_symbol(order_vt_symbol)

order_volume = old_order['volume'] - old_order['traded']
if order_volume <= 0:
Expand All @@ -900,7 +897,7 @@ def on_order_close_canceled(self, order: OrderData):

order_price = old_order['price']
order_type = old_order.get('order_type', OrderType.LIMIT)
order_retry = old_order.get('retry',1)
order_retry = old_order.get('retry', 1)
grid = old_order.get('grid', None)
if order_retry > 10:
msg = u'{} 平仓撤单 {}/{}手, 重试平仓次数{}>10' \
Expand All @@ -911,7 +908,7 @@ def on_order_close_canceled(self, order: OrderData):
if order.vt_orderid in grid.order_ids:
self.write_log(f'移除grid中order_ids:{order.vt_orderid}')
grid.order_ids.remove(order.vt_orderid)
#if not grid.order_ids:
# if not grid.order_ids:
# grid.order_status = False
self.gt.save()
self.write_log(u'更新网格=>{}'.format(grid.__dict__))
Expand Down Expand Up @@ -940,7 +937,7 @@ def on_order_close_canceled(self, order: OrderData):
vt_orderids = self.cover(price=cover_price,
volume=order_volume,
vt_symbol=order_vt_symbol,
lock=order_exchange==Exchange.CFFEX,
lock=order_exchange == Exchange.CFFEX,
order_type=OrderType.FAK,
order_time=self.cur_datetime,
grid=grid)
Expand Down Expand Up @@ -977,7 +974,7 @@ def on_order_close_canceled(self, order: OrderData):
vt_orderids = self.sell(price=sell_price,
volume=order_volume,
vt_symbol=order_vt_symbol,
lock=order_exchange==Exchange.CFFEX,
lock=order_exchange == Exchange.CFFEX,
order_type=OrderType.FAK,
order_time=self.cur_datetime,
grid=grid)
Expand Down Expand Up @@ -1006,7 +1003,7 @@ def on_order_close_canceled(self, order: OrderData):
if order.vt_orderid in grid.order_ids:
self.write_log(f'移除grid中order_ids:{order.vt_orderid}')
grid.order_ids.remove(order.vt_orderid)
#if len(grid.order_ids) == 0:
# if len(grid.order_ids) == 0:
# grid.order_status = False
self.gt.save()
self.active_orders.update({order.vt_orderid: old_order})
Expand Down Expand Up @@ -1061,7 +1058,7 @@ def cancel_logic(self, dt, force=False, reopen=False):
if vt_orderid in order_grid.order_ids:
self.write_log(f'{vt_orderid}存在网格委托队列{order_grid.order_ids}中,移除')
order_grid.order_ids.remove(vt_orderid)
#if len(order_grid.order_ids) == 0:
# if len(order_grid.order_ids) == 0:
# order_grid.order_status = False
continue

Expand Down Expand Up @@ -1178,7 +1175,7 @@ def check_liquidity(self, direction=None, ask_volume=1, bid_volume=1):
return False

# 如果设置了方向和volume,检查是否满足
if direction==Direction.LONG:
if direction == Direction.LONG:
if self.cur_act_tick.ask_volume_1 < ask_volume:
self.write_log(f'主动腿的卖1委量:{self.cur_act_tick.ask_volume_1}不满足:{ask_volume}')
return False
Expand All @@ -1189,7 +1186,7 @@ def check_liquidity(self, direction=None, ask_volume=1, bid_volume=1):
if self.cur_act_tick.bid_volume_1 < bid_volume:
self.write_log(f'主动腿的买1委量:{self.cur_act_tick.bid_volume_1}不满足:{bid_volume}')
return False
if self.cur_pas_tick.ask_volume_1 < ask_volume :
if self.cur_pas_tick.ask_volume_1 < ask_volume:
self.write_log(f'被动腿的卖1委量:{self.cur_pas_tick.ask_volume_1}不满足:{ask_volume}')
return False

Expand Down Expand Up @@ -1247,10 +1244,10 @@ def spd_short(self, grid: CtaGrid, force: bool = False):
self.write_log(f'{self.cur_datetime}强制平仓日,不开仓')
return []
# 检查流动性缺失
if not self.check_liquidity( direction=Direction.SHORT,
ask_volume=grid.volume * self.pas_vol_ratio,
bid_volume=grid.volume * self.act_vol_ratio
) and not force:
if not self.check_liquidity(direction=Direction.SHORT,
ask_volume=grid.volume * self.pas_vol_ratio,
bid_volume=grid.volume * self.act_vol_ratio
) and not force:
return []
# 检查涨跌停距离
if self.check_near_up_nor_down():
Expand All @@ -1275,7 +1272,7 @@ def spd_short(self, grid: CtaGrid, force: bool = False):

# 开多被动腿(FAK或者限价单)
pas_vt_orderids = self.buy(vt_symbol=self.pas_vt_symbol,
lock=self.pas_exchange==Exchange.CFFEX,
lock=self.pas_exchange == Exchange.CFFEX,
price=self.cur_pas_tick.ask_price_1,
volume=grid.volume * self.pas_vol_ratio,
order_type=self.order_type,
Expand Down Expand Up @@ -1320,7 +1317,7 @@ def spd_buy(self, grid: CtaGrid, force: bool = False):
direction=Direction.LONG,
ask_volume=grid.volume * self.act_vol_ratio,
bid_volume=grid.volume * self.pas_vol_ratio
) \
) \
and not force:
return []
# 检查涨跌停距离
Expand All @@ -1333,7 +1330,7 @@ def spd_buy(self, grid: CtaGrid, force: bool = False):

# 开多主动腿(FAK 或者限价单)
act_vt_orderids = self.buy(vt_symbol=self.act_vt_symbol,
lock=self.act_exchange==Exchange.CFFEX,
lock=self.act_exchange == Exchange.CFFEX,
price=self.cur_act_tick.ask_price_1,
volume=grid.volume * self.act_vol_ratio,
order_type=self.order_type,
Expand All @@ -1346,7 +1343,7 @@ def spd_buy(self, grid: CtaGrid, force: bool = False):

# 开空被动腿
pas_vt_orderids = self.short(vt_symbol=self.pas_vt_symbol,
lock=self.pas_exchange==Exchange.CFFEX,
lock=self.pas_exchange == Exchange.CFFEX,
price=self.cur_pas_tick.bid_price_1,
volume=grid.volume * self.pas_vol_ratio,
order_type=self.order_type,
Expand Down Expand Up @@ -1425,7 +1422,7 @@ def spd_sell(self, grid: CtaGrid, force: bool = False):

# 主动腿多单平仓
act_vt_orderids = self.sell(vt_symbol=self.act_vt_symbol,
lock=self.act_exchange==Exchange.CFFEX,
lock=self.act_exchange == Exchange.CFFEX,
price=self.cur_act_tick.bid_price_1,
volume=grid.volume * self.act_vol_ratio,
order_type=self.order_type,
Expand Down Expand Up @@ -1502,7 +1499,7 @@ def spd_cover(self, grid: CtaGrid, force: bool = False):

# 主动腿空单平仓
act_vt_orderids = self.cover(vt_symbol=self.act_vt_symbol,
lock=self.act_exchange==Exchange.CFFEX,
lock=self.act_exchange == Exchange.CFFEX,
price=self.cur_act_tick.ask_price_1,
volume=grid.volume * self.act_vol_ratio,
order_type=self.order_type,
Expand Down

0 comments on commit dd5a9fc

Please sign in to comment.