想请教一下,使用了跨周期用法。但是在H1(小时K)那段代码中,H1_MA1等于后面赋值公式,现在输出的时候使用公式的时候能够计算数值,但是当用H1_MA1的时候,值是0. 不知道什么原因。下面代码可以测试通过。
Params
// --- PUBU 基础参数 ---
Vars
Numeric Lots(1); // 交易手数
// 1. 日线级别变量 (Data[0]) - 6根PUBU均线
Series<Numeric> D1_MA1; // 最短周期
Series<Numeric> D1_MA2;
Series<Numeric> D1_MA3;
Series<Numeric> D1_MA4;
Series<Numeric> D1_MA5;
Series<Numeric> D1_MA6; // 最长周期
Series<Numeric> D1_TrendScore; // 趋势得分:用于判断排列顺序
// 2. H1级别变量 (Data[1]) - 6根PUBU均线
Series<Numeric> H1_MA1;
Series<Numeric> H1_MA2;
Series<Numeric> H1_MA3;
Series<Numeric> H1_MA4;
Series<Numeric> H1_MA5;
Series<Numeric> H1_MA6;
Series<Numeric> H1_TrendScore;
Events
// -----------------------------------------------------------------------
// 初始化事件:订阅跨周期数据
// -----------------------------------------------------------------------
OnInit()
{
// 假设主图是日线 (D1)
SubscribeBar(Data[0].Symbol(),"1H",20200101); // 订阅 1小时 K线
SubscribeBar(Data[0].Symbol(),"10M",20000101); // 订阅 10分钟 K线
}
// -----------------------------------------------------------------------
// Bar更新事件:核心逻辑处理
// -----------------------------------------------------------------------
OnBar(ArrayRef<Integer> indexs)
{
// ==========================================
// 第一层:日线 D1 逻辑 - 6线 PUBU 判断趋势
// ==========================================
D1_MA1 = (AverageFC(Data[0].Close, 4)+AverageFC(Data[0].Close, 4*2)+AverageFC(Data[0].Close, 4*3))/3;
D1_MA2 = (AverageFC(Data[0].Close, 6)+AverageFC(Data[0].Close, 6*2)+AverageFC(Data[0].Close, 6*3))/3;
D1_MA3 = (AverageFC(Data[0].Close, 9)+AverageFC(Data[0].Close, 9*2)+AverageFC(Data[0].Close, 9*3))/3;
D1_MA4 = (AverageFC(Data[0].Close, 13)+AverageFC(Data[0].Close, 13*2)+AverageFC(Data[0].Close, 13*3))/3;
D1_MA5 = (AverageFC(Data[0].Close, 18)+AverageFC(Data[0].Close, 18*2)+AverageFC(Data[0].Close, 18*3))/3;
D1_MA6 = (AverageFC(Data[0].Close, 24)+AverageFC(Data[0].Close, 24*2)+AverageFC(Data[0].Close, 24*3))/3;
Data[0].PlotNumeric("D1_MA1", D1_MA1);
Data[0].PlotNumeric("D1_MA2", D1_MA2);
Data[0].PlotNumeric("D1_MA3", D1_MA3);
Data[0].PlotNumeric("D1_MA4", D1_MA4);
Data[0].PlotNumeric("D1_MA5", D1_MA5);
Data[0].PlotNumeric("D1_MA6", D1_MA6);
Data[0].Commentary("D1_MA1:"+Text(D1_MA1));
// 判断 D1 排列状态
// 完美多头: MA1>MA2>MA3>MA4>MA5>MA6
If (D1_MA1 > D1_MA2 And D1_MA2 > D1_MA3 And D1_MA3 > D1_MA4 And D1_MA4 > D1_MA5 And D1_MA5 > D1_MA6)
{
D1_TrendScore = 1; // 强多头趋势
}
// 完美空头: MA1<MA2<MA3<MA4<MA5<MA6
Else
{
If (D1_MA1 < D1_MA2 And D1_MA2 < D1_MA3 And D1_MA3 < D1_MA4 And D1_MA4 < D1_MA5 And D1_MA5 < D1_MA6)
{
D1_TrendScore = -1; // 强空头趋势
}
Else
{
D1_TrendScore = 0; // 均线纠缠,震荡市
}
}
// ==========================================
// 第二层:H1 逻辑 - 6线 PUBU 寻找机会
// ==========================================
// 计算 H1 的 6 根均线
H1_MA1 = (AverageFC(Data[1].Close, 4)+AverageFC(Data[1].Close, 4*2)+AverageFC(Data[1].Close, 4*3))/3;
Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4)));
Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4*2)));
Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4*3)));
Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4)+AverageFC(Data[1].Close,4*2)+AverageFC(Data[1].Close,4*3)));
Data[1].Commentary("H1_MA1:"+Text(H1_MA1)); //问题在这里,H1_MA1等于后面的语句,上面我使用公式的时候能够计算数值,但是当用H1_MA1的时候,值是0.
H1_MA2 = (AverageFC(Data[1].Close, 6)+AverageFC(Data[1].Close, 6*2)+AverageFC(Data[1].Close, 6*3))/3;
H1_MA3 = (AverageFC(Data[1].Close, 9)+AverageFC(Data[1].Close, 9*2)+AverageFC(Data[1].Close, 9*3))/3;
H1_MA4 = (AverageFC(Data[1].Close, 13)+AverageFC(Data[1].Close, 13*2)+AverageFC(Data[1].Close, 13*3))/3;
H1_MA5 = (AverageFC(Data[1].Close, 18)+AverageFC(Data[1].Close, 18*2)+AverageFC(Data[1].Close, 18*3))/3;
H1_MA6 = (AverageFC(Data[1].Close, 24)+AverageFC(Data[1].Close, 24*2)+AverageFC(Data[1].Close, 24*3))/3;
// 判断 H1 排列状态
If (H1_MA1 > H1_MA2 And H1_MA2 > H1_MA3 And H1_MA3 > H1_MA4 And
H1_MA4 > H1_MA5 And H1_MA5 > H1_MA6)
{
H1_TrendScore = 1; // H1 处于多头结构
}
Else If (H1_MA1 < H1_MA2 And H1_MA2 < H1_MA3 And H1_MA3 < H1_MA4 And
H1_MA4 < H1_MA5 And H1_MA5 < H1_MA6)
{
H1_TrendScore = -1; // H1 处于空头结构
}
Else
{
// 保持上一根的状态,或者设为0表示当前混乱
// 这里选择保持状态,以过滤盘中波动,直到形态破坏
// 如果需要更敏感,可以在此处 Else { H1_TrendScore = 0; }
}
// ==========================================
// 第三层:M10 逻辑 - 触发入场
// ==========================================
// --- 做多逻辑 ---
// 条件1: D1 6线呈多头排列 (大方向向上)
// 条件2: H1 6线呈多头排列 (中周期确认向上,替代了KDJ金叉)
// 条件3: 当前无持仓
If (D1_TrendScore == 1 And H1_TrendScore == 1 And MarketPosition == 0)
{
// 激进入场:直接以当前 M10 收盘价或挂单入场
// 保守入场:等待 M10 突破前一根高点
Numeric BuyPrice = High[1];
Buy(Lots, BuyPrice);
PlotString("Action", "Buy");
}
// --- 做空逻辑 ---
// 条件1: D1 6线呈空头排列
// 条件2: H1 6线呈空头排列
// 条件3: 当前无持仓
If (D1_TrendScore == -1 And H1_TrendScore == -1 And MarketPosition == 0)
{
Numeric SellPrice = Low[1];
SellShort(Lots, SellPrice);
PlotString("Action", "SellShort");
}
// --- 离场逻辑 (示例) ---
// 当 H1 级别的 6线排列被破坏(例如短期均线下穿长期均线导致不再是完美排列)时离场
// 注意:这里的 H1_TrendScore 如果不是 1 或 -1,说明排列乱了
// 多单离场:H1 不再是完美多头排列
If (MarketPosition == 1 And H1_TrendScore != 1)
{
Sell(Lots, Close);
}
// 空单离场:H1 不再是完美空头排列
If (MarketPosition == -1 And H1_TrendScore != -1)
{
BuyToCover(Lots, Close);
}
}
// --- 绘图辅助 ---
// 绘制 D1 的 6 条线以便观察
//PlotNumeric("D1_MA1", D1_MA1);
//PlotNumeric("D1_MA6", D1_MA6); // 只画首尾两条作为通道参考,避免图表太乱
//PlotNumeric("TrendState", D1_TrendScore);
看不太明白,这是ai写的么
不是Ai写的。上面代码在途中展示的结果。 H1_MA1=AverageFC(Data[1].Close,4);Data[1].Commentary("H1_MA1:"+Text(AverageFC(Data[1].Close,4))); 则可以计算出数字。
Data[1].Commentary("H1_MA1:"+Text(H1_MA1)); 这个数字为0 。
按道理是等效的。
零基础课程里关于图层调用的说明看过么?变量是分图层的data0.ma1和data1.ma1是两个对象。并且函数内部参数图层对象依据于函数图层归属