跨周期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; // —— 动态绘图处理 —— 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公式修改和重写的权利 //------------------------------------------------------------------------