老师:
晚上好,听了最近您一个答疑的视频,然后有点思路用AI做了下面代码,但有个问题:就是满足MA_Bull是真的 但是实际跑过程中显示是不满足,导致没有交易信号 麻烦老师看一下

Params
Numeric MA_Period(21); // 均线周期
Numeric ATR_Period(14); // ATR周期
Numeric StopLossPct(1.5); // 止损百分比
Numeric TrailMultiplier(2.0); // ATR移动止盈倍数
Numeric ATR_Filter(1.5); // ATR过滤阈值
Numeric lots(1); // 开仓手数
Vars
// 多周期图层编号(全局变量)
Global Numeric i1; // 日线图层
Global Numeric i2; // 1小时图层
Global Numeric i3; // 15分钟图层(主显示图层)
// 多周期均线(通过Range绑定图层)
Series<Numeric> MA_Daily; // 日线均线(i1图层)
Series<Numeric> MA_H1; // 1小时均线(i2图层)
Series<Numeric> MA_M15; // 15分钟均线(i3图层)
Series<Numeric> ATR_Val; // ATR(i3图层)
// 其他变量
Numeric TrailStop;
Series<Numeric> HighSinceEntry;
Series<bool> MA_Bull;
Series<Numeric> myStopPrice;
Series<Numeric> myentryprice;
Series<Numeric> myexitprice;
Numeric profit;
Numeric pricediff;
Series<bool> cond1(False);
Series<bool> cond2(False);
Series<bool> cond3(False);
Events
OnInit()
{
// 订阅三周期数据
i1 = SubscribeBar(symbol, "D", BeginDateTime);
i2 = SubscribeBar(symbol, "1h", BeginDateTime);
i3 = SubscribeBar(symbol, "15m", BeginDateTime);
// 检查图层订阅是否成功
If(i1 == InvalidNumeric || i2 == InvalidNumeric || i3 == InvalidNumeric)
{
Print("图层订阅失败!周期设置错误");
}
}
OnBar(ArrayRef<Integer> indexs)
{
// 数据加载检查(保留你的原始设置)
If(Data[i1].CurrentBar < MA_Period || Data[i2].CurrentBar < 8*MA_Period || Data[i3].CurrentBar < 32*MA_Period)
{
Data[i3].Commentary("数据加载中:日线Bar=" + Text(Data[i1].CurrentBar) + ", 1小时Bar=" + Text(Data[i2].CurrentBar) + ", 15分钟Bar=" + Text(Data[i3].CurrentBar));
return;
}
// Range隔离图层计算(核心:确保指标绑定对应图层)
Range[i1:i1]
{
MA_Daily = AverageFC(Close, MA_Period); // 日线图层计算
}
Range[i2:i2]
{
MA_H1 = AverageFC(Close, MA_Period); // 1小时图层计算
}
Range[i3:i3]
{
MA_M15 = AverageFC(Close, MA_Period);
ATR_Val = AvgTrueRange(ATR_Period); // 15分钟图层计算
}
// 1. 绘图:日线/1小时MA显式绑定对应图层
Data[i1].PlotNumeric("MA_Daily-日线MA值:", Data[i1].MA_Daily[1]); // 绑定i1图层
Data[i1].Commentary("MA_Daily[1]: " + Text(Data[i1].MA_Daily[1]));
Data[i2].PlotNumeric("MA_H1-1小时MA值:", Data[i2].MA_H1[1]); // 绑定i2图层
Data[i2].Commentary("MA_H1[1]: " + Text(Data[i2].MA_H1[1]));
Data[i3].PlotNumeric("MA_Daily-日线MA值:", Data[i1].MA_Daily[1]); // 绑定i1图层
Data[i3].PlotNumeric("MA_H1-1小时MA值:", Data[i2].MA_H1[1]); // 绑定i2图层
Data[i3].PlotNumeric("MA_M15-15分钟MA值", MA_M15[1]);
// 2. 打印:日线/1小时MA显式绑定对应图层
Data[i3].Commentary("ATR值[1]: " + Text(ATR_Val[1]));
// 3. 布尔信号:日线/1小时MA显式绑定对应图层
MA_Bull = (Data[i1].MA_Daily[1] > Data[i1].MA_Daily[2]) && // i1图层前值比较
(Data[i2].MA_H1[1] > Data[i2].MA_H1[2]) && // i2图层前值比较
(MA_M15[1] > MA_M15[2]); // 15分钟无需额外绑定
// 计算MA_Bull的三个条件,并单独存储
cond1 = (Data[i1].MA_Daily[1] > Data[i1].MA_Daily[2]); // 日线MA:前一根 > 前两根
cond2 = (Data[i2].MA_H1[1] > Data[i2].MA_H1[2]); // 1小时MA:前一根 > 前两根
cond3 = (MA_M15[1] > MA_M15[2]); // 15分钟MA:前一根 > 前两根
MA_Bull = cond1 && cond2 && cond3;
// 打印MA_Bull的判断过程(使用IfString函数处理布尔值的文字描述)
Data[i3].Commentary("MA_Bull判断过程:");
// 条件1:用IIFString函数,true返回"满足",false返回"不满足"
Data[i3].Commentary("条件1(日线MA[1] > MA[2]): " + IIFString(cond1, "满足", "不满足") + " 【值:" + Text(Data[i1].MA_Daily[1]) + " > " + Text(Data[i1].MA_Daily[2]) + "】");
// 条件2:同理处理1小时周期条件
Data[i3].Commentary("条件2(1小时MA[1] > MA[2]): " + IIFString(cond2, "满足", "不满足") + " 【值:" + Text(Data[i2].MA_H1[1]) + " > " + Text(Data[i2].MA_H1[2]) + "】");
// 条件3:同理处理15分钟周期条件
Data[i3].Commentary("条件3(15分钟MA[1] > MA[2]): " + IIFString(cond3, "满足", "不满足") + " 【值:" + Text(MA_M15[1]) + " > " + Text(MA_M15[2]) + "】");
// 最终结果:用IfString函数描述MA_Bull的真假
Data[i3].Commentary("最终MA_Bull: " + IIFString(MA_Bull, "真(所有条件满足)", "假(至少一个条件不满足)"));
/* If(MA_Bull)
Data[i3].Commentary("MA_Bull为真");
Else
Data[i3].Commentary("MA_Bull为假");*/
// 开仓逻辑(保持不变)
If(Data[i3].MarketPosition != 1 And MA_Bull And ATR_Val[1] > ATR_Filter)
{
Data[i3].Buy(lots, Data[i3].Open);
myentryprice = Data[i3].Open;
myStopPrice = myentryprice * (1 - StopLossPct * 0.01);
HighSinceEntry = Data[i3].High;
Data[i3].Commentary("开仓:myentryprice=" + Text(myentryprice));
}
// 平仓逻辑(保持不变)
If(Data[i3].MarketPosition == 1 And Data[i3].BarsSinceEntry >= 1)
{
If(Data[i3].High > HighSinceEntry)
HighSinceEntry = Data[i3].High;
TrailStop = Max(myStopPrice, HighSinceEntry - TrailMultiplier * ATR_Val);
If(Data[i3].Low <= TrailStop)
{
myexitprice = Min(Data[i3].Open, TrailStop);
pricediff = myexitprice - myentryprice;
profit = pricediff * abs(Data[i3].CurrentContracts()) * ContractUnit() * BigPointValue();
Data[i3].Sell(lots, myexitprice);
Data[i3].Commentary("平仓:profit=" + Text(profit));
}
}
}
看得比较混乱,建议每个变量前加上对应图层
