跨周期SuperTrend编写问题
//------------------------------------------------------------------------
// 简称: SuperTrend_5M_120M_1
// 名称: 在5分钟小周期上调用120分钟SuperTrend1
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
	Numeric ATRPeriod(10);
	Numeric Multiplier(1.7);  // 根据日线参数优化建议

Vars
	// 120分钟周期状态跟踪
    Series<Bool> IsNewPeriod(False);
    Series<Numeric> CurrentHigh(0);
    Series<Numeric> CurrentLow(0);
    Series<Numeric> CurrentTR(0);
    Array<Numeric> TRHistory(ATRPeriod);
    Series<Numeric> UpperBand(0);
    Series<Numeric> LowerBand(0);
    Numeric i;
    Numeric SumTR;
    Numeric ValidCount;
    Numeric PrevPeriodStart;
    
    Series<Numeric> HLA;
    
    Series<Numeric> High_120M(0);
    Series<Numeric> Low_120M(0);
    Series<Numeric> TR_120M(0);

Defs
	//此处添加公式函数
	
Events
	//此处实现事件函数
	
	//初始化事件函数,策略运行期间,首先运行且只有一次
	OnInit()
	{
		// 初始化数组和变量
		If (BarStatus == 0)
		{
			For i = 0 To ATRPeriod - 1
				TRHistory[i] = -1;  // 用-1标记无效数据
			PrevPeriodStart = 0;
		}
	}


	//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
	OnBar(ArrayRef<Integer> indexs)
	{
        
            
		// —— 原子级周期检测 ——
		// —— 时间处理修正 ——
		Numeric hours = Hour();
		Numeric minutes = Minute();
		Numeric totalMinutes = hours * 60 + minutes;  // 替代TimeToMinutes
		
		// —— 周期检测修正 ——
		Numeric periodStart = Date + Floor(totalMinutes / 120, 1) * 120;  // 添加精度参数
		IsNewPeriod = (periodStart != PrevPeriodStart);
		PrevPeriodStart = periodStart;
		
		// 周期闭合检测(无未来函数)
		//IsNewPeriod = BarsSinceNewPeriod("120") == 0;
		
		// 获取120分钟原生数据
		//High_120M = DataConvert(High, "TimeFrame", "120M", "High","Previous");
		//Low_120M = DataConvert(Low, "TimeFrame", "120M", "Low","Previous");
		//IsNewPeriod = High_120M != High_120M[1];

		// —— 实时数据累积 ——
		If (Not IsNewPeriod)
		{
			// 累积当前周期极值
			CurrentHigh = Max(CurrentHigh, High);
			CurrentLow = Min(CurrentLow, Low);
			Numeric tmpTR = Max(High - Low, Max(Abs(High - Close[1]), Abs(Low - Close[1])));
			CurrentTR = Max(CurrentTR, tmpTR);
		}
		Else
		{
			// —— 周期闭合时计算 ——
			// HLA计算(带溢出保护)
			HLA = (CurrentHigh + CurrentLow) / 2;
			If (HLA > 100000000 Or HLA < -100000000)  // 替换1e8
				HLA = HLA[1];

			// 环形缓冲区更新(For循环实现)
			For i = ATRPeriod - 1 DownTo 1  // 从后向前移动元素
				TRHistory[i] = TRHistory[i - 1];
			TRHistory[0] = CurrentTR;      // 插入新值到数组头部

			// 计算有效ATR(排除初始化无效值)
			SumTR = 0; ValidCount = 0;
			For i = 0 To ATRPeriod - 1
			{
				If (TRHistory[i] != -1)
				{
					SumTR = SumTR + TRHistory[i];
					ValidCount = ValidCount + 1;
				}
			}
			Numeric ATRValue = IIF(ValidCount > 0, SumTR / ValidCount, 0);

			// 动态乘数调整(高波动时收缩通道)
			Numeric DynamicMultiplier = Multiplier;
			If (ATRValue > 100)
				DynamicMultiplier = Multiplier * 0.9;

			// 更新通道值
			UpperBand = HLA + DynamicMultiplier * ATRValue;
			LowerBand = HLA - DynamicMultiplier * ATRValue;

			// —— 重置周期数据 ——
			CurrentHigh = High;
			CurrentLow = Low;
			CurrentTR = Max(High - Low, Max(Abs(High - Close[1]), Abs(Low - Close[1])));
		}
        If(CurrentBar<ATRPeriod) return;a
		// —— 动态绘图处理 ——
        If(BarStatus==0)//这里如果不做初始化处理,那么图上图形就会失真
        {
            upperband = high;
            LowerBand = low;
        }
		If (IsNewPeriod)
		{
			// 绘制完整周期通道线
			PlotNumeric("Upper", UpperBand, RGB(0,255,0));
			PlotNumeric("Lower", LowerBand, RGB(255,0,0));
		}
		Else If (BarStatus == 2)  // 实时K线更新
		{
			// 延长通道线(不创建新对象)
			PlotNumeric("Upper", UpperBand, RGB(0,255,0), 0); 
			PlotNumeric("Lower", LowerBand, RGB(255,0,0), 0);
		}
	}


//------------------------------------------------------------------------
// 编译版本	2025-03-31 011634
// 版权所有	menglh918
// 更改声明	TradeBlazer Software保留对TradeBlazer平台
//			每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------


跨周期模型编写
跨周期代码编写
跨周期模型编写
关于跨周期的问题
关于跨周期的问题
跨周期问题
跨周期模型回测问题
跨周期Commentary 注释问题
关于跨周期报错的问题
请教TB跨周期问题

学习了

但是没看懂

😟

这是昨天上课投稿的修改代码

你木有时间看直播

大概下下周就有回放视频啦

👌

无敌