请问一下,5日线合成也没有激活 from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)
from vnpy.trader.constant import Interval
from datetime import time
class FourDayMacdStrategy(CtaTemplate):
"""4天合成K线的MACD金叉死叉策略"""
author = "Your Name"
# 策略参数
fast_window = 12 # MACD快线参数
slow_window = 26 # MACD慢线参数
signal_window = 9 # MACD信号线参数
fixed_size = 1 # 每次交易数量
# 策略变量
macd = 0 # MACD值
signal = 0 # 信号线值
hist = 0 # 柱状图值
parameters = ["fast_window", "slow_window", "signal_window", "fixed_size"]
variables = ["macd", "signal", "hist"]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
"""初始化策略"""
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
# 创建4天的合成K线生成器,使用daily_end参数指定每日收盘时间
self.bg_4day = BarGenerator(
on_bar=self.on_bar,
window=4,
on_window_bar=self.on_4day_bar,
interval=Interval.DAILY,
daily_end=time(15, 0) # 正确的参数名是daily_end
)
# 创建4天K线的数组管理器
self.am_4day = ArrayManager(size=100) # 增加size参数确保足够容量
def on_init(self):
"""策略初始化回调"""
self.write_log("策略初始化")
# 加载足够的历史数据(建议至少是窗口大小的10倍)
self.load_bar(40) # 40天数据可生成10根4日K线
def on_start(self):
"""策略启动回调"""
self.write_log("策略启动")
def on_stop(self):
"""策略停止回调"""
self.write_log("策略停止")
def on_tick(self, tick: TickData):
"""Tick更新回调"""
self.bg_4day.update_tick(tick)
def on_bar(self, bar: BarData):
"""1天K线更新回调"""
self.bg_4day.update_bar(bar)
def on_4day_bar(self, bar: BarData):
"""4天合成K线更新回调"""
# 更新数组管理器
self.am_4day.update_bar(bar)
if not self.am_4day.inited:
return
# 计算MACD指标
macd, signal, hist = self.am_4day.macd(
self.fast_window,
self.slow_window,
self.signal_window,
array=True
)
self.macd = macd[-1]
self.signal = signal[-1]
self.hist = hist[-1]
# 获取当前持仓
pos = self.pos
# 交易逻辑
if pos == 0: # 无持仓
# 金叉做多信号
if macd[-1] > signal[-1] and macd[-2] <= signal[-2] and hist[-1] > 0:
self.buy(bar.close_price, self.fixed_size)
# 死叉做空信号
elif macd[-1] < signal[-1] and macd[-2] >= signal[-2] and hist[-1] < 0:
self.short(bar.close_price, self.fixed_size)
elif pos > 0: # 持有多头
# 死叉平多信号
if macd[-1] < signal[-1] and macd[-2] >= signal[-2] and hist[-1] < 0:
self.sell(bar.close_price, abs(pos))
elif pos < 0: # 持有空头
# 金叉平空信号
if macd[-1] > signal[-1] and macd[-2] <= signal[-2] and hist[-1] > 0:
self.cover(bar.close_price, abs(pos))
self.put_event()
def on_order(self, order: OrderData):
"""委托更新回调"""
pass
def on_trade(self, trade: TradeData):
"""成交更新回调"""
self.put_event()
def on_stop_order(self, stop_order: StopOrder):
"""停止单更新回调"""
pass