MTF wrote:
贴下具体的策略代码?
```
def on_tick(self, tick: TickData):
# self.cancel_all()
self.pbg.update_tick(tick)
nm = tick.symbol+'.'+str(tick.exchange).split('.')[1]
self.last_tick_price[nm] = tick.last_price ##后期可以加上时间限制,不用一直记录
if self.pre_close[nm]==0:
self.pre_close[nm] = tick.pre_close
# pos = self.strategy_engine.main_engine.get_all_positions()
# print(pd.DataFrame(pos))
# print('nm',nm,self.pre_close[nm])
# while self.circle>0:
# print('nmpreclose',self.pre_close[nm])
# self.circle -= 1
def on_bars(self, bars: Dict[str, BarData]):
# print(bars.items())
self.cancel_all()
for vt_symbol, bar in bars.items():
am: ArrayManager = self.ams[vt_symbol]
am.update_bar(bar)
for vt_symbol, bar in bars.items():
am: ArrayManager = self.ams[vt_symbol]
if not am.inited:
return
# vt_symbol = bar.symbol+'.'+str(bar.exchange).split('.')[1]
ava_cash = self.percent*5000000 #0.1*(self.get_account(self).balance-self.get_account(self).frosen)#
#self.cta_engine.main_engine.get_account("12345.CTP")
#self.get_account(self).balance-self.get_account(self).frosen
if vt_symbol in self.vt_symbols:
if len(self.pdata[vt_symbol])<20:
self.pdata[vt_symbol].append(bar.close_price)
else:
self.pdata[vt_symbol].pop(0)
self.pdata[vt_symbol].append(bar.close_price)
# pos_data = pd.DataFrame(self.strategy_engine.main_engine.get_all_positions())#self.get_pos(vt_symbol)
# pos_dict = dict(zip(list(pos)))
current_pos = self.get_pos(vt_symbol)
print(vt_symbol,"当前持仓:",current_pos,self.sig[vt_symbol])
if current_pos==0 and self.sig[vt_symbol]==0:#self.sig[vt_symbol]==0:
#self.sig[vt_symbol]==0
#判断是否开仓
if (bar.datetime.time() >= datetime.time(10,0) and bar.datetime.time()<= datetime.time(15,0))\
or (bar.datetime.time() >= datetime.time(21,10)):
if vt_symbol in self.up_pool:
# print("一些信息:",vt_symbol,bar.close_price,self.up_threshold[vt_symbol])
if bar.close_price>self.up_threshold[vt_symbol]:# and (self.pre_close[vt_symbol]<self.up_threshold[vt_symbol]):
# print(vt_symbol,'cross') #and self.pre_close[vt_symbol]<=self.up_threshold[vt_symbol]:
# print(max(self.pdata[vt_symbol]),self.up_threshold[vt_symbol])
bid_price = bar.close_price
#np.ceil(bar.close_price + min(self.orderstep*self.get_pricetick(vt_symbol),np.mean(np.diff(self.pdata[vt_symbol]))))
bid_vol = math.floor(self.percent*ava_cash/(self.get_size(vt_symbol)*bid_price*self.up_margin[vt_symbol]))
self.buy_price[vt_symbol] = bid_price
print('信号值:',self.sig[vt_symbol])
self.sig[vt_symbol] = 1
self.targets[vt_symbol] = bid_vol
# order = self.buy(vt_symbol, bid_price, max(1,bid_vol))
print(bar.datetime,'做多:',vt_symbol,'当前仓位:',current_pos,'开仓手数',bid_vol,'开仓价格:',bid_price,'信号值:',self.sig[vt_symbol])
elif vt_symbol in self.dn_pool:
if bar.close_price<self.dn_threshold[vt_symbol]:# and (self.pre_close[vt_symbol]>self.dn_threshold[vt_symbol]):
# print(min(self.pdata[vt_symbol]),self.up_threshold[vt_symbol])
# ask_price = math.ceil(tick.last_price - min(self.orderstep*self.get_pricetick(vt_symbol),np.mean(np.diff(self.pdata[vt_symbol]))))
ask_price = bar.close_price
ask_vol = math.floor(self.percent*ava_cash/(self.get_size(vt_symbol)*ask_price*self.dn_margin[vt_symbol]))
self.targets[vt_symbol] = -ask_vol
self.sell_price[vt_symbol] = ask_price
# self.short(vt_symbol, ask_price, max(ask_vol,1))
print('信号值:',self.sig[vt_symbol])
self.sig[vt_symbol] = -1
print(bar.datetime,'做空:',vt_symbol,'当前仓位:',current_pos,'开仓手数:',ask_vol,'开仓价格:',ask_price,'信号值:',self.sig[vt_symbol])
elif current_pos > 0 and self.sig[vt_symbol]>0:
if len(self.pdata[vt_symbol])>5:
long_profit = bar.close_price/self.buy_price[vt_symbol]-1
ask_price = math.ceil(bar.close_price - min(self.orderstep*self.get_pricetick(vt_symbol),np.mean(np.diff(self.pdata[vt_symbol]))))
if long_profit<self.start_stop:
if bar.close_price < 0.95*self.up_threshold[vt_symbol] and min(self.pdata[vt_symbol][-5:-1])>self.up_threshold[vt_symbol]:
self.targets[vt_symbol] = 0
print('平多1')
# self.sig[vt_symbol] = 0
else:
ma_new = (self.ma[vt_symbol]+bar.close_price)/self.period_2
if long_profit>1.5*self.start_stop:
self.targets[vt_symbol] = 0
print('平多2')
# self.sig[vt_symbol] = 0
elif bar.close_price < ma_new and min(self.pdata[vt_symbol][-5:-1])>ma_new and self.sell_signal[vt_symbol]==1:
self.targets[vt_symbol] = 0
print('平多3')
# self.sig[vt_symbol] = 0
elif current_pos < 0 and self.sig[vt_symbol] < 0:
print('当前仓位:',current_pos,'信号值:',self.sig[vt_symbol])
if len(self.pdata[vt_symbol])>5:
short_profit = self.sell_price[vt_symbol]/bar.close_price-1
bid_price = math.ceil(bar.close_price + min(self.orderstep*self.get_pricetick(vt_symbol),np.mean(np.diff(self.pdata[vt_symbol]))))
if short_profit<self.start_stop:
if bar.close_price > 1.05*self.dn_threshold[vt_symbol] and max(self.pdata[vt_symbol][-5:-1])<=self.dn_threshold[vt_symbol]:
self.targets[vt_symbol] = 0
print('平空1')
# self.sig[vt_symbol] = 0
else:
ma_new = (self.ma[vt_symbol]+bar.close_price)/self.period_2
if short_profit>1.5*self.start_stop:
self.targets[vt_symbol] = 0
print('平空2')
# self.sig[vt_symbol] = 0
elif bar.close_price > ma_new and max(self.pdata[vt_symbol][-5:-1])<=ma_new and self.buy_signal[vt_symbol]==1:
self.targets[vt_symbol] = 0
print('平空3')
# self.sig[vt_symbol] = 0
#判断是否平仓
for vt_symbol in self.vt_symbols:
target_pos = self.targets[vt_symbol]
current_pos = self.get_pos(vt_symbol)
pos_diff = target_pos - current_pos
volume = abs(pos_diff)
price = self.last_tick_price[vt_symbol]
if pos_diff > 0:#开多或平空
# price = bars[vt_symbol].close_price
if current_pos < 0:
self.cover(vt_symbol, price, volume)
self.sig[vt_symbol] = 0
else:
self.buy(vt_symbol, price, volume)
# self.sig[vt_symbol] = 1
elif pos_diff < 0:
# price = bars[vt_symbol].close_price
if current_pos > 0:
self.sell(vt_symbol, price, volume)
self.sig[vt_symbol] = 0
else:
self.short(vt_symbol,price, volume)
# self.sig[vt_symbol] = -1
self.put_event()
def on_order(self, order: OrderData):
"""
Callback of new order data update.
"""
pass
def on_trade(self, trade: TradeData):
"""
Callback of new trade data update.
"""
self.put_event()
```