//------------------------------------------------------------------------
// 简称: 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公式修改和重写的权利
//------------------------------------------------------------------------
学习了
但是没看懂
😟
这是昨天上课投稿的修改代码
你木有时间看直播
大概下下周就有回放视频啦
👌
无敌