帮修改一下代码以通过
//------------------------------------------------------------------------// 简称: BX_MultiTimeframe_Sys// 名称: 小牛短线高手多周期交易系统(无数组遍历版)// 类别: 公式应用// 类型: 内建应用// 输出:// 策略说明: 基于BX指标的多周期交易系统,使用时间判断替代数组遍历// 系统要素:// 1. BX指标:VAR1=(C*2+H+L)/4, SK1=EMA(VAR1,13)-EMA(VAR1,21), SD=EMA(SK1,2)// 多方能量=2*(SK1-SD)*3.8, 空方能量=-2*(SK1-SD)*3.8// 2. 多周期:4小时(趋势判断)和60分钟(入场/出场)// 3. BBI多空线:(MA(C,3)+MA(C,6)+MA(C,12)+MA(C,24))/4// 入场条件:// 多头:4小时多方能量金叉空方能量,或(60分钟多方能量金叉空方能量且收盘价>BBI)// 空头:4小时空方能量金叉多方能量,或(60分钟空方能量金叉多方能量且收盘价<BBI)// 出场条件:// 止损:多单以开仓后最低价下浮2点,空单以开仓后最高价上浮2点// 止盈:多单收盘价低于BBI,空单收盘价高于BBI//------------------------------------------------------------------------Params Numeric FastLen(13); // VAR1的快线EMA周期 Numeric SlowLen(21); // VAR1的慢线EMA周期 Numeric SmoothLen(2); // SK1的平滑周期 Numeric Factor(3.8); // 能量放大因子 Numeric BBIPeriod1(3); // BBI第1条均线周期 Numeric BBIPeriod2(6); // BBI第2条均线周期 Numeric BBIPeriod3(12); // BBI第3条均线周期 Numeric BBIPeriod4(24); // BBI第4条均线周期 Numeric StopPoints(2); // 止损浮动点数 Numeric TradeVol(1); // 交易手数Vars // Data0 (60分钟) 变量 Series<Numeric> VAR1_0; // 加权平均价 Series<Numeric> SK1_0; // 短期差值 Series<Numeric> SD_0; // SK1的平滑 Series<Numeric> BullPower_0; // 多方能量 Series<Numeric> BearPower_0; // 空方能量 Series<Bool> BullCross_0; // 多方金叉空方 (60分钟) Series<Bool> BearCross_0; // 空方金叉多方 (60分钟) Series<Numeric> BBI_0; // BBI多空线 // Data1 (4小时) 信号存储(全局变量) Global Numeric PrevBullPower_1; // 上一根4小时多方能量 Global Numeric PrevBearPower_1; // 上一根4小时空方能量 Global Numeric CurrBullPower_1; // 当前4小时多方能量 Global Numeric CurrBearPower_1; // 当前4小时空方能量 Global Bool BullCross_1; // 当前4小时多方金叉信号 Global Bool BearCross_1; // 当前4小时空方金叉信号 Global Bool PrevBullCross_1; // 上一根4小时多方金叉信号 Global Bool PrevBearCross_1; // 上一根4小时空方金叉信号 Global Bool Data1_Ready; // 4小时数据是否已初始化 Global Numeric LastData1Time; // 上次处理的4小时Bar时间 Numeric MinPoint; // 最小变动价位 Numeric StopTicks; // 止损点数对应的价格 Numeric MaxPeriod0; // Data0所需最大周期 Numeric MaxPeriod1; // Data1所需最大周期 Numeric MaxPeriod1_2; // Data1所需最大周期+1 Numeric i; // 循环变量(仅用于兼容,未使用)Events OnBar(ArrayRef<Integer> indexs) { // 初始化价格精度 MinPoint = MinMove * PriceScale; StopTicks = StopPoints * MinPoint; // 预计算所需最大周期(嵌套Max解决参数过多问题) MaxPeriod1 = Max(Max(FastLen, SlowLen), SmoothLen); MaxPeriod1_2 = MaxPeriod1 + 1; MaxPeriod0 = Max( Max( Max(Max(FastLen, SlowLen), SmoothLen), Max( Max(BBIPeriod1, BBIPeriod2), Max(BBIPeriod3, BBIPeriod4) ); // 始终以Data0(60分钟)为交易执行周期 // 但在执行前,先检查Data1是否有新K线,若有则更新其信号 If(Data1.CurrentBar >= MaxPeriod1) { If(LastData1Time != Data1.DateTime) // Data1有新K线 { // 保存上一根信号 PrevBullCross_1 = BullCross_1; PrevBearCross_1 = BearCross_1; // 保存前值(用于交叉判断) PrevBullPower_1 = CurrBullPower_1; PrevBearPower_1 = CurrBearPower_1; // 计算当前4小时的BX指标 Numeric VAR1_1 = (Data1.Close*2 + Data1.High + Data1.Low) / 4; Numeric SK1_1 = XAverage(VAR1_1, FastLen) - XAverage(VAR1_1, SlowLen); Numeric SD_1 = XAverage(SK1_1, SmoothLen); CurrBullPower_1 = 2 * (SK1_1 - SD_1) * Factor; CurrBearPower_1 = -2 * (SK1_1 - SD_1) * Factor; // 判断交叉信号(需要至少两根K线) If(Data1.CurrentBar >= MaxPeriod1_2) { BullCross_1 = (CurrBullPower_1 > CurrBearPower_1) And (PrevBullPower_1 <= PrevBearPower_1); BearCross_1 = (CurrBearPower_1 > CurrBullPower_1) And (PrevBearPower_1 <= PrevBullPower_1); } Else { BullCross_1 = False; BearCross_1 = False; } Data1_Ready = True; // 标记4小时数据可用 LastData1Time = Data1.DateTime; // 记录本次处理时间 } } // 处理Data0 (60分钟周期) 更新(交易执行) // 注意:这里没有判断Data0是否真的更新,而是直接计算。由于OnBar每次调用都会执行, // 但指标计算依赖于Data0的当前Bar,因此每次计算的都是最新值,不会重复执行。 // 实际交易信号需使用上一根Bar确认,因此即使多次调用,只要Data0没有新K线,信号不会变。 If(CurrentBar >= MaxPeriod0) { // 计算BX指标(使用Data0价格) VAR1_0 = (Close*2 + High + Low) / 4; SK1_0 = XAverage(VAR1_0, FastLen) - XAverage(VAR1_0, SlowLen); SD_0 = XAverage(SK1_0, SmoothLen); BullPower_0 = 2 * (SK1_0 - SD_0) * Factor; BearPower_0 = -2 * (SK1_0 - SD_0) * Factor; // 计算BBI BBI_0 = (Average(Close, BBIPeriod1) + Average(Close, BBIPeriod2) + Average(Close, BBIPeriod3) + Average(Close, BBIPeriod4)) / 4; // 60分钟交叉信号(使用CrossOver函数,返回Series<Bool>) BullCross_0 = CrossOver(BullPower_0, BearPower_0); BearCross_0 = CrossOver(BearPower_0, BullPower_0); // 开仓条件(使用上一根Bar的信号,避免未来数据) If(MarketPosition == 0 And Data1_Ready) { // 多头开仓条件:4小时上一根金叉 或 (60分钟上一根金叉且上一根收盘价>BBI) If( PrevBullCross_1 Or (BullCross_0[1] And Close[1] > BBI_0[1]) ) { Buy(TradeVol, Open); } // 空头开仓条件:4小时上一根死叉 或 (60分钟上一根死叉且上一根收盘价<BBI) If( PrevBearCross_1 Or (BearCross_0[1] And Close[1] < BBI_0[1]) ) { SellShort(TradeVol, Open); } } // 止损与止盈(适用于持仓) If(MarketPosition == 1) // 持有多仓 { // 移动止盈:上一根收盘价低于BBI,平多 If(Close[1] < BBI_0[1]) { Sell(0, Open); } // 止损:基于开仓后最低价下浮2点 If(BarsSinceEntry > 0) { Numeric LowestSinceEntry = Lowest(Low[1], BarsSinceEntry); // 开仓后到前一根的最低价 Numeric StopPrice = LowestSinceEntry - StopTicks; If(Low <= StopPrice) // 当前Bar触及止损 { Sell(0, Min(Open, StopPrice)); } } } Else If(MarketPosition == -1) // 持有空仓 { // 移动止盈:上一根收盘价高于BBI,平空 If(Close[1] > BBI_0[1]) { BuyToCover(0, Open); } // 止损:基于开仓后最高价上浮2点 If(BarsSinceEntry > 0) { Numeric HighestSinceEntry = Highest(High[1], BarsSinceEntry); // 开仓后到前一根的最高价 Numeric StopPrice = HighestSinceEntry + StopTicks; If(High >= StopPrice) // 当前Bar触及止损 { BuyToCover(0, Max(Open, StopPrice)); } } } } }//------------------------------------------------------------------------// 编译版本 TB 2025// 版权所有 YourName// 注意:代码中部分位置调用XAverage、Lowest等序列函数位于IF语句内,但因已确保数据量充足,运行时不会出错,TB编译警告可忽略。//------------------------------------------------------------------------