跨周期失败,老师帮我看看,谢谢
请老师帮我看看这个策略,编译没有错误,但是没有交易信号,跨周期调用数据没用,能帮我修改下吗,谢谢!这是一个30分钟主周期和日线,5分钟周期的3周期策略做多进场条件:1,日线周期MACD处于零线上方。2,30分钟周期金叉的当跟K线立即进场。做多平仓条件:5分钟周期MACD死叉立即平仓做空进场条件:1,日线周期MACD处于零线下方。2,30分钟周期死叉的当跟K线立即进场。做空平仓条件:5分钟周期MACD金叉立即平仓仓位控制:每次进场买2手//------------------------------------------------------------------------// 简称: MACD_DualCycle// 名称: 30分钟日线双周期MACD策略// 类别: 策略应用// 类型: 内建应用// 说明: 本策略在30分钟周期上运行,调用5分钟和日线周期数据// - 主周期:30分钟(在策略单元界面添加)// - 次周期:5分钟(在策略单元界面添加)// - 大周期:日线(在策略单元界面添加)//------------------------------------------------------------------------Params Numeric FastLength(12); // MACD快线周期 Numeric SlowLength(26); // MACD慢线周期 Numeric SignalLength(9); // MACD信号线周期 Numeric PositionSize(2); // 每次进场手数Vars // 30分钟周期MACD变量(主周期) Series<Numeric> Min30MACD; // 30分钟MACD Series<Numeric> Min30MACDAvg; // 30分钟MACD信号线 Series<Numeric> Min30MACDDiff; // 30分钟MACD差值 // 5分钟周期MACD变量 Series<Numeric> Min5MACD; // 5分钟MACD Series<Numeric> Min5MACDAvg; // 5分钟MACD信号线 Series<Numeric> Min5MACDDiff; // 5分钟MACD差值 // 日线周期MACD变量 Series<Numeric> DayMACD; // 日线MACD Series<Numeric> DayMACDAvg; // 日线MACD信号线 Series<Numeric> DayMACDDiff; // 日线MACD差值 // 交易变量 Numeric EntryPrice; // 入场价格Events OnInit() { Commentary("OnInit: 策略初始化完成"); } OnBar(ArrayRef<Integer> indexs) { // 计算30分钟MACD (主周期) Min30MACD = AverageFC(Close, FastLength) - AverageFC(Close, SlowLength); Min30MACDAvg = AverageFC(Min30MACD, SignalLength); Min30MACDDiff = Min30MACD - Min30MACDAvg; // 临时解决方案:先检查数据源是否可用 If(Data1.Close > 0) { // 计算5分钟MACD (使用Data1) Min5MACD = Data1.AverageFC(Data1.Close, FastLength) - Data1.AverageFC(Data1.Close, SlowLength); Min5MACDAvg = Data1.AverageFC(Min5MACD, SignalLength); Min5MACDDiff = Min5MACD - Min5MACDAvg; } Else { // 如果5分钟数据源不可用,使用30分钟数据作为替代 Min5MACD = Min30MACD; Min5MACDAvg = Min30MACDAvg; Min5MACDDiff = Min30MACDDiff; Commentary("警告:5分钟数据源不可用,使用30分钟数据作为替代"); } If(Data2.Close > 0) { // 计算日线MACD (使用Data2) DayMACD = Data2.AverageFC(Data2.Close, FastLength) - Data2.AverageFC(Data2.Close, SlowLength); DayMACDAvg = Data2.AverageFC(DayMACD, SignalLength); DayMACDDiff = DayMACD - DayMACDAvg; } Else { // 如果日线数据源不可用,使用30分钟数据作为替代 DayMACD = Min30MACD; DayMACDAvg = Min30MACDAvg; DayMACDDiff = Min30MACDDiff; Commentary("警告:日线数据源不可用,使用30分钟数据作为替代"); } // 绘制30分钟周期MACD指标线(在独立指标区域) PlotNumeric("MACD", Min30MACD); PlotNumeric("MACD_Signal", Min30MACDAvg); PlotNumeric("MACD_Zero", 0); // 调试输出 Commentary("日线MACD:" + Text(DayMACDDiff) + ", 30分钟MACD:" + Text(Min30MACDDiff) + ", 5分钟MACD:" + Text(Min5MACDDiff)); Commentary("持仓状态:" + Text(MarketPosition) + ", 日线价格:" + Text(Data2.Close) + ", 30分钟价格:" + Text(Close) + ", 5分钟价格:" + Text(Data1.Close)); Commentary("日线MACD>0:" + IIFString(DayMACDDiff > 0, "True", "False") + ", 日线MACD<0:" + IIFString(DayMACDDiff < 0, "True", "False")); // 数据源检查 If(CurrentBar == 1) { Commentary("策略启动 - 数据源检查"); Commentary("日线数据源正常:" + IIFString(Data2.Close > 0, "True", "False")); Commentary("30分钟数据源正常:" + IIFString(Close > 0, "True", "False")); Commentary("5分钟数据源正常:" + IIFString(Data1.Close > 0, "True", "False")); } // 检查金叉死叉信号(当根K线判断) Bool Min30GoldCross = Min30MACDDiff > 0 And Min30MACDDiff[1] <= 0; Bool Min30DeadCross = Min30MACDDiff < 0 And Min30MACDDiff[1] >= 0; Bool Min5GoldCross = Min5MACDDiff > 0 And Min5MACDDiff[1] <= 0; Bool Min5DeadCross = Min5MACDDiff < 0 And Min5MACDDiff[1] >= 0; Commentary("30分钟金叉:" + IIFString(Min30GoldCross, "True", "False") + ", 30分钟死叉:" + IIFString(Min30DeadCross, "True", "False")); Commentary("5分钟金叉:" + IIFString(Min5GoldCross, "True", "False") + ", 5分钟死叉:" + IIFString(Min5DeadCross, "True", "False")); // 交易逻辑 - 先检查平仓,再检查开仓 // 持仓状态 - 优先检查5分钟平仓信号 If(MarketPosition > 0) // 多仓状态 { // 多仓平仓条件:5分钟周期MACD死叉立即平仓 If(Min5DeadCross) { Sell(0, Close); // 平掉所有多仓 Commentary("多仓平仓(5分钟死叉),手数:" + Text(MarketPosition) + ", 价格:" + Text(Close)); } } Else If(MarketPosition < 0) // 空仓状态 { // 空仓平仓条件:5分钟周期MACD金叉立即平仓 If(Min5GoldCross) { BuyToCover(0, Close); // 平掉所有空仓 Commentary("空仓平仓(5分钟金叉),手数:" + Text(-MarketPosition) + ", 价格:" + Text(Close)); } } Else // 空仓状态 - 检查开仓信号 { // 做多进场条件 // 1. 日线周期MACD处于零线上方 // 2. 30分钟周期金叉的当根K线立即进场 If(DayMACDDiff > 0 And Min30GoldCross) { EntryPrice = Close; Buy(PositionSize, Open); Commentary("做多进场,价格:" + Text(EntryPrice)); } // 做空进场条件 // 1. 日线周期MACD处于零线下方 // 2. 30分钟周期死叉的当根K线立即进场 Else If(DayMACDDiff < 0 And Min30DeadCross) { EntryPrice = Close; SellShort(PositionSize, Open); Commentary("做空进场,价格:" + Text(EntryPrice)); } // 调试:检查每个条件 Commentary("开仓条件检查 - 日线MACD>0:" + IIFString(DayMACDDiff > 0, "True", "False") + ", 30分钟金叉:" + IIFString(Min30GoldCross, "True", "False") + ", 30分钟死叉:" + IIFString(Min30DeadCross, "True", "False")); } }//------------------------------------------------------------------------// 编译版本 GS2010.12.08// 版权所有 TradeBlazer Software 2003-2025// 更改声明 TradeBlazer Software保留对TradeBlazer平// 台每一版本的TradeBlazer公式修改和重写的权利//------------------------------------------------------------------------