请老师帮我看看这个策略,编译没有错误,但是没有交易信号,跨周期调用数据没用,能帮我修改下吗,谢谢!
这是一个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公式修改和重写的权利
//------------------------------------------------------------------------
这个发付费代写区去