from datetime import datetime
import pytz
from vnpy_ctastrategy import CtaTemplate, StopOrder, BarGenerator, ArrayManager
from vnpy.trader.constant import (
Direction, Offset, Interval, Status, Exchange, OrderType
)
from vnpy.trader.object import TickData, BarData, OrderData, TradeData
from vnpy.trader.utility import round_to
class RBPro(CtaTemplate):
"""R-Breaker Pro策略"""
author = "QuantVision Pro"
# 策略参数
donchian_window = 30
atr_period = 14
risk_ratio = 0.02
trailing_mult = 2.0
max_loss_count = 3
price_impact = 0.0002
exit_time = "14:55"
timezone = "Asia/Shanghai"
parameters = [
"donchian_window",
"atr_period",
"risk_ratio",
"trailing_mult",
"max_loss_count",
"price_impact",
"exit_time",
"timezone"
]
variables = [
"day_high",
"day_low",
"atr_value",
"pos"
]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
# 时区处理
self.tz = pytz.timezone(self.timezone)
self.exit_hour, self.exit_minute = map(int, self.exit_time.split(":"))
# K线合成器
self.minute_bg = BarGenerator(
on_bar=self.on_bar,
window=15,
on_window_bar=self.on_15min_bar,
interval=Interval.MINUTE
)
self.daily_bg = BarGenerator(
on_bar=self.on_daily_bar,
interval=Interval.DAILY
)
# 数据管理器
self.am_15min = ArrayManager(size=200)
self.am_daily = ArrayManager(size=5)
def on_init(self):
"""策略初始化"""
self.write_log("策略初始化")
self.load_bar(10) # 加载10天数据
def on_start(self):
"""策略启动"""
self.write_log("策略启动")
def on_stop(self):
"""策略停止"""
self.write_log("策略停止")
def on_tick(self, tick: TickData):
"""Tick更新"""
# 转换时区
tick.datetime = tick.datetime.astimezone(self.tz)
self.minute_bg.update_tick(tick)
self.daily_bg.update_tick(tick)
def on_bar(self, bar: BarData):
"""1分钟K线回调"""
self.minute_bg.update_bar(bar)
self.daily_bg.update_bar(bar)
def on_15min_bar(self, bar: BarData):
"""15分钟K线回调"""
self.am_15min.update_bar(bar)
if not self.am_15min.inited:
return
# 计算ATR值
self.atr_value = self.am_15min.atr(self.atr_period)
# 获取当日的高点和低点
if self.am_daily.inited:
self.day_high = self.am_daily.high[-1]
self.day_low = self.am_daily.low[-1]
else:
return
# 交易逻辑
if self.pos == 0:
if bar.close_price > self.day_high:
self.buy(bar.close_price, 1)
elif self.pos > 0:
if bar.close_price < self.day_low:
self.sell(bar.close_price, 1)
def on_daily_bar(self, bar: BarData):
"""日线K线回调"""
self.am_daily.update_bar(bar)
if self.am_daily.inited:
self.day_high = self.am_daily.high[-1]
self.day_low = self.am_daily.low[-1]
def on_order(self, order: OrderData):
"""委托回调"""
pass
def on_trade(self, trade: TradeData):
"""成交回调"""
self.put_event()
Traceback (most recent call last):
File "H:\veighna_studio\lib\site-packages\vnpy_ctastrategy\ui\widget.py", line 177, in add_strategy
self.cta_engine.add_strategy(
File "H:\veighna_studio\lib\site-packages\vnpy_ctastrategy\engine.py", line 647, in add_strategy
strategy: CtaTemplate = strategy_class(self, strategy_name, vt_symbol, setting)
File "C:\Users\Administrator\strategies\rb_pro.py", line 56, in init
self.daily_bg = BarGenerator(
File "H:\veighnastudio\lib\site-packages\vnpy\trader\utility.py", line 209, in init
raise RuntimeError(("合成日K线必须传入每日收盘时间"))
RuntimeError: 合成日K线必须传入每日收盘时间