在bar level回测正常。 tick level 回测的时候 engine.set_parameters已经设置了 mode=BacktestingMode.TICK, 策略里面也改成了self.load_tick(),下了订单但是马上就被取消
策略如下(简化成了macd >0 马上做多,macd<0马上做空)
from vnpy.app.cta_strategy import (
CtaTemplate,
BarGenerator,
ArrayManager,
TickData,
BarData,
OrderData,
TradeData,
StopOrder
)
from datetime import datetime
class Vegas_5m_tick9(CtaTemplate):
""""""
author = ""
rsi_window = 13
k12 = 12
k144 = 144
k169 = 169
k288 = 288
k338 = 338
k576 = 576
macd_fast_period = 24
macd_slow_period = 36
macd_signal_period = 9
rsi_allow_long = 50
rsi_allow_short = 50
short_stop_per = 1.5
short_take_per = 3.0
long_stop_per = 1.5
long_take_per = 3.0
fixed_size = 1
ema12_dist = 0.008
bar_range_left = 0.009
bar_range_right = 0.01
parameters = [
"rsi_window", "rsi_allow_short", "rsi_allow_long",
'k12', 'k144', 'k169', 'k288', 'k338', 'k576',
"macd_fast_period", "macd_slow_period", "macd_signal_period",
'short_stop_per', 'short_take_per', 'long_stop_per', 'long_take_per',
"fixed_size", 'bar_range_left', 'bar_range_right', 'ema12_dist'
]
variables = [
]
bars_5m = []
def __init__(
self,
cta_engine,
strategy_name: str,
vt_symbol: str,
setting: dict,
):
""""""
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager()
self.bg5m = BarGenerator(self.on_bar, 5, self.on_5m_bar)
self.am5m = ArrayManager(600) # 保存的bar数量
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
#回测时加载n个交易日数据用于初始化
# self.load_bar(3) # 数字是天数
self.load_tick(3) # 数字是天数
def on_start(self):
"""
Callback when strategy is started.
"""
self.write_log("策略启动")
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
self.bg.update_tick(tick)
def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
if self.pos > 0 and bar.close_price > self.long_take :
self.sell(self.long_take - 0.1, abs(self.pos))
if self.pos < 0 and bar.close_price < self.short_take :
self.cover(self.short_take + 0.1, abs(self.pos))
self.bg5m.update_bar(bar)
def on_5m_bar(self, bar: BarData):
#cancel all order
self.cancel_all()
self.am5m.update_bar(bar)
if not self.am5m.inited:
return
self.rsi_value = self.am5m.rsi(self.rsi_window)
self.macd_macd, self.macd_signal, self.macd_hist = self.am5m.macd(
self.macd_fast_period, self.macd_slow_period, self.macd_signal_period)
# No position
if self.pos == 0:
if self.macd_macd > 0 :
print('macd', self.macd_macd , file=open( 'D:\Downloads\print.txt', 'a'))
self.buy(bar.close_price + 0.2, self.fixed_size)
# 止盈止损
self.long_stop = bar.close_price * (1 - self.long_stop_per / 100)
self.long_take = bar.close_price * (1 + self.long_take_per / 100)
if self.macd_macd < 0 :
# return
self.short(bar.close_price - 0.2, self.fixed_size)
# 止盈止损
self.short_stop = bar.close_price * (1 + self.short_stop_per / 100)
self.short_take = bar.close_price * (1 - self.short_take_per / 100)
self.put_event()
def on_trade(self, trade: TradeData):
"""
Callback of new trade data update.
"""
if self.pos > 0:
self.sell(self.long_stop, abs(self.pos), stop=True)
# self.sell(self.long_take, abs(self.pos), stop=True)
elif self.pos < 0:
self.cover(self.short_stop, abs(self.pos), stop=True)
# self.cover(self.short_take, abs(self.pos), stop=True)
self.put_event()
def on_order(self, order: OrderData):
"""
Callback of new order data update.
"""
print('order', order.status, file=open( 'D:\Downloads\print.txt', 'a'))
pass
def on_stop_order(self, stop_order: StopOrder):
"""
Callback of stop order update.
"""
pass
打印出来的结果类似于
macd 0.13436859257532774
order Status.NOTTRADED
order Status.CANCELLED
macd 0.1224525081596255
order Status.NOTTRADED
order Status.CANCELLED
macd 0.11129331033552603
order Status.NOTTRADED
所有订单不成交,马上就被取消。
2021-12-24 00:48:44.131052 开始加载历史数据
2021-12-24 00:48:44.203047 加载进度:# [0%]
2021-12-24 00:48:44.209051 加载进度:# [7%]
2021-12-24 00:48:44.216102 加载进度:## [14%]
2021-12-24 00:48:44.222151 加载进度:### [21%]
2021-12-24 00:48:44.232069 加载进度:### [28%]
2021-12-24 00:48:44.239969 加载进度:#### [34%]
2021-12-24 00:48:44.248656 加载进度:##### [41%]
2021-12-24 00:48:44.251652 加载进度:##### [48%]
2021-12-24 00:48:44.260670 加载进度:###### [55%]
2021-12-24 00:48:44.264656 加载进度:####### [62%]
2021-12-24 00:48:44.274669 加载进度:####### [69%]
2021-12-24 00:48:44.289635 加载进度:######## [76%]
2021-12-24 00:48:44.292663 加载进度:######### [83%]
2021-12-24 00:48:44.306645 加载进度:######### [90%]
2021-12-24 00:48:44.309669 加载进度:########## [97%]
2021-12-24 00:48:44.312653 历史数据加载完成,数据量:5721043
2021-12-24 00:48:45.169673 策略初始化完成
2021-12-24 00:48:45.169673 开始回放历史数据
2021-12-24 00:48:48.682612 回放进度:= [0%]
2021-12-24 00:48:51.775750 回放进度:== [10%]
2021-12-24 00:48:55.186807 回放进度:=== [20%]
2021-12-24 00:48:58.752515 回放进度:==== [30%]
2021-12-24 00:49:02.110492 回放进度:===== [40%]
2021-12-24 00:49:05.654370 回放进度:====== [50%]
2021-12-24 00:49:09.225055 回放进度:======= [60%]
2021-12-24 00:49:12.393397 回放进度:======== [70%]
2021-12-24 00:49:15.723135 回放进度:========= [80%]
2021-12-24 00:49:19.111351 回放进度:========== [90%]
2021-12-24 00:49:19.117359 回放进度:=========== [100%]
2021-12-24 00:49:19.117359 历史数据回放结束
2021-12-24 00:49:19.171435 开始计算逐日盯市盈亏
2021-12-24 00:49:19.171435 成交记录为空,无法计算
2021-12-24 00:49:19.172404 开始计算策略统计指标
2021-12-24 00:49:19.172404 ------------------------------
2021-12-24 00:49:19.172404 首个交易日:
2021-12-24 00:49:19.172404 最后交易日:
2021-12-24 00:49:19.172404 总交易日: 0