请修改代码,谢谢。

//------------------------------------------------------------------------

// 简称: ATR_5Min_Strategy

// 名称: ATR通道5分钟分时图策略

// 类别: 策略应用

// 类型: 用户应用

// 输出: Void

//------------------------------------------------------------------------


Params

   // ========== ATR通道参数 ==========

   Numeric ATRLength(60);          // ATR计算周期(60周期)

   Numeric ATRMultiplier(1);       // ATR通道倍数(1倍)


   // ========== 均线参数 ==========

   Numeric Dx(20);                 // 短线均线周期(对应原始代码中的Dx)

   Numeric MiddleMALength(60);     // 中轨均线周期(60周期)


   // ========== 操盘线参数 ==========

   Numeric N(15);                  // 高低点计算周期(15周期)


   // ========== 交易参数 ==========

   Numeric Lots(1);                // 交易手数

   Numeric StopLossOffset(0);      // 止损偏移点数(可根据品种调整)


   // ========== 交易时间参数 ==========

   Numeric MorningStartTime(900);   // 上午开始时间 9:00

   Numeric MorningEndTime(1455);    // 上午结束时间 14:55

   Numeric NightStartTime(2100);    // 晚上开始时间 21:00

   Numeric NightEndTime(2255);      // 晚上结束时间 22:55


Vars

   // ========== ATR通道变量 ==========

   Numeric TR;                     // 真实波幅

   Numeric ATR;                    // 平均真实波幅

   Numeric MiddleBand;             // 中轨

   Numeric UpperBand;              // 上轨

   Numeric LowerBand;              // 下轨


   // ========== 均线变量 ==========

   Numeric ShortMA;                // 短线均线

   Numeric ShortMAUp;              // 短线均线上涨(紫色)

   Numeric ShortMADown;            // 短线均线下跌(青色)


   // ========== 操盘线变量 ==========

   Numeric HH;                     // N周期最高价

   Numeric LL;                     // N周期最低价

   Numeric TT;                     // HH创新高周期数

   Numeric NN;                     // LL创新低周期数

   Numeric YY;                     // 多空方向

   Numeric TradingLine;            // 操盘线

   Numeric LongLine;               // 做多线(红色)

   Numeric ShortLine;              // 做空线(绿色)


   // ========== 信号变量 ==========

   Bool CrossUpSignal;             // NN上穿TT信号(做多信号)

   Bool CrossDownSignal;           // TT上穿NN信号(做空信号)


   // ========== 交易变量 ==========

   Numeric LongEntryPrice;         // 做多入场价

   Numeric ShortEntryPrice;        // 做空入场价

   Numeric LongStopLoss;           // 做多止损价

   Numeric ShortStopLoss;          // 做空止损价

   Integer LongEntryBar;           // 做多入场Bar索引

   Integer ShortEntryBar;          // 做空入场Bar索引


   // ========== 状态变量 ==========

   Bool InLongPosition;            // 持有多头仓位

   Bool InShortPosition;           // 持有空头仓位


   // ========== 时间控制变量 ==========

   Numeric CurrentTime;            // 当前时间(分钟数)

   Bool IsTradingTime;             // 是否在交易时间内

   Bool IsForceCloseTime;          // 是否强制平仓时间


   // ========== 绘图变量 ==========

   NumericRef PlotATR;

   NumericRef PlotMiddleBand;

   NumericRef PlotUpperBand;

   NumericRef PlotLowerBand;

   NumericRef PlotShortMA;

   NumericRef PlotShortMAUp;

   NumericRef PlotShortMADown;

   NumericRef PlotTradingLine;

   NumericRef PlotLongLine;

   NumericRef PlotShortLine;


Defs

   // 计算真实波幅(精确实现原始公式)

   // TR := MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));

   Numeric CalculateTR()

   {

       Numeric tr1 = High - Low;                           // 当日最高价-当日最低价

       Numeric tr2 = Abs(Close[1] - High);                 // 昨日收盘价-当日最高价的绝对值

       Numeric tr3 = Abs(Close[1] - Low);                  // 昨日收盘价-当日最低价的绝对值

       return Max(Max(tr1, tr2), tr3);                     // 取三个值中的最大值

   }


Events

   // ========== 初始化事件函数 ==========

   OnInit()

   {

       // 设置数据源相关(5分钟分时图)

       Range[0:DataCount-1]

       {

           // 5分钟分时图设置

           SetBarInterval(Enum_DataInterval_Min, 5);      // 设置5分钟K线


           // 可以根据需要添加其他数据源设置

           // AddDataFlag(Enum_Data_OnlyDay());            // 设置仅日盘

           // AddDataFlag(Enum_Data_OnlyNight());          // 设置仅夜盘

       }


       // 设置交易相关

       SetMarginRate(0.1);                // 设置保证金率为10%

       SetSlippage(Enum_Rate_PointPerHand, 2);  // 设置滑点为2跳/手

       SetOrderPriceOffset(2);            // 设置委托价为叫买/卖价偏移2跳


       // 初始化状态变量

       InLongPosition = False;

       InShortPosition = False;

       LongEntryPrice = 0;

       ShortEntryPrice = 0;

       LongStopLoss = 0;

       ShortStopLoss = 0;

       LongEntryBar = -1;

       ShortEntryBar = -1;


       // ========== 创建绘图对象 ==========


       // ATR指标(黄色点状)

       PlotATR = CreatePlotNumeric("ATR");

       PlotATR.SetPlotColor(ColorYellow);

       PlotATR.SetPlotStyle(Enum_PlotStyle_Dot);

       PlotATR.SetVisible(False);  // 默认不显示,需要时可开启


       // ATR通道

       PlotMiddleBand = CreatePlotNumeric("中轨");

       PlotMiddleBand.SetPlotColor(ColorYellow);

       PlotMiddleBand.SetPlotStyle(Enum_PlotStyle_Line);

       PlotMiddleBand.SetLineThick(1);


       PlotUpperBand = CreatePlotNumeric("上轨");

       PlotUpperBand.SetPlotColor(ColorRed);

       PlotUpperBand.SetPlotStyle(Enum_PlotStyle_Line);

       PlotUpperBand.SetLineThick(1);


       PlotLowerBand = CreatePlotNumeric("下轨");

       PlotLowerBand.SetPlotColor(ColorGreen);

       PlotLowerBand.SetPlotStyle(Enum_PlotStyle_Line);

       PlotLowerBand.SetLineThick(1);


       // 变色均线

       PlotShortMA = CreatePlotNumeric("短线均线");

       PlotShortMA.SetPlotColor(ColorWhite);

       PlotShortMA.SetPlotStyle(Enum_PlotStyle_Line);

       PlotShortMA.SetLineThick(1);


       PlotShortMAUp = CreatePlotNumeric("短线多");

       PlotShortMAUp.SetPlotColor(ColorMagenta);

       PlotShortMAUp.SetPlotStyle(Enum_PlotStyle_Line);

       PlotShortMAUp.SetLineThick(1);


       PlotShortMADown = CreatePlotNumeric("短线空");

       PlotShortMADown.SetPlotColor(ColorCyan);

       PlotShortMADown.SetPlotStyle(Enum_PlotStyle_Line);

       PlotShortMADown.SetLineThick(1);


       // 操盘线系统

       PlotTradingLine = CreatePlotNumeric("操盘线");

       PlotTradingLine.SetPlotColor(ColorMagenta);

       PlotTradingLine.SetPlotStyle(Enum_PlotStyle_Line);

       PlotTradingLine.SetLineThick(1);


       PlotLongLine = CreatePlotNumeric("做多线");

       PlotLongLine.SetPlotColor(ColorFF0000);

       PlotLongLine.SetPlotStyle(Enum_PlotStyle_Line);

       PlotLongLine.SetLineThick(1);


       PlotShortLine = CreatePlotNumeric("做空线");

       PlotShortLine.SetPlotColor(Color00FF00);

       PlotShortLine.SetPlotStyle(Enum_PlotStyle_Line);

       PlotShortLine.SetLineThick(1);


       // 输出初始化信息

       Comment("ATR通道5分钟分时图策略已初始化");

       Comment("交易时间框架:5分钟K线");

       Comment("信号系统:操盘线交叉信号");

       Comment("止损机制:入场柱高低点止损");

   }


   // ========== Bar更新事件函数 ==========

   OnBar(ArrayRef<Integer> indexs)

   {

       // 计算当前时间和交易状态

       CalculateTimeStatus();


       // 计算技术指标

       CalculateIndicators();


       // 判断交易信号

       CheckSignals();


       // 执行交易逻辑

       ExecuteTrading();


       // 更新绘图

       UpdatePlots();

   }


   // ========== 计算时间状态 ==========

   Void CalculateTimeStatus()

   {

       // 将时间转换为分钟数(HHMM格式)

       CurrentTime = TimeToMinutes(Time);


       // 判断是否在交易时间内

       IsTradingTime = (CurrentTime >= MorningStartTime && CurrentTime < MorningEndTime) ||

                      (CurrentTime >= NightStartTime && CurrentTime < NightEndTime);


       // 判断是否强制平仓时间(14:55或22:55)

       IsForceCloseTime = (CurrentTime >= MorningEndTime && CurrentTime < NightStartTime) ||

                         CurrentTime >= NightEndTime;

   }


   // ========== 计算技术指标 ==========

   Void CalculateIndicators()

   {

       // 1. 计算ATR通道(精确实现原始公式)

       TR = CalculateTR();

       ATR = XAverage(TR, ATRLength);                     // ATR := EMA(TR,60)

       MiddleBand = XAverage(Close, MiddleMALength);      // 中轨: EMA(C,60)

       UpperBand = MiddleBand + ATRMultiplier * ATR;      // 上轨: 中轨+1*ATR

       LowerBand = MiddleBand - ATRMultiplier * ATR;      // 下轨: 中轨-1*ATR


       // 2. 计算变色均线(精确实现)

       ShortMA = XAverage(Close, Dx);                     // 短线 := EMA(CLOSE, Dx)


       // 短线多: IF(短线>=REF(短线,1),短线,DRAWNULL),NOTEXT,COLORMAGENTA

       if (ShortMA >= ShortMA[1])

       {

           ShortMAUp = ShortMA;

       }

       else

       {

           ShortMAUp = InvalidNumeric;

       }


       // 短线空: IF(短线<REF(短线,1),短线,DRAWNULL),NOTEXT,COLORCYAN

       if (ShortMA < ShortMA[1])

       {

           ShortMADown = ShortMA;

       }

       else

       {

           ShortMADown = InvalidNumeric;

       }


       // 3. 计算操盘线系统(精确实现)

       HH = Highest(High, N);                            // HH:=HHV(H,N);

       LL = Lowest(Low, N);                              // LL:=LLV(L,N);


       // 计算TT: BARSLAST((HH>REF(HH,1)))

       if (CurrentBar > N)

       {

           if (HH > HH[1])

           {

               TT = 0;  // HH创新高,重置为0

           }

           else

           {

               TT = TT[1] + 1;  // 距离上次创新高的周期数+1

           }

       }


       // 计算NN: BARSLAST((LL<REF(LL,1)))

       if (CurrentBar > N)

       {

           if (LL < LL[1])

           {

               NN = 0;  // LL创新低,重置为0

           }

           else

           {

               NN = NN[1] + 1;  // 距离上次创新低的周期数+1

           }

       }


       // 计算YY: IFELSE((TT <NN),1,IFELSE((TT > NN),-1,0))

       if (CurrentBar > N)

       {

           if (TT < NN)  // 最近创新高比创新低更近

           {

               YY = 1;   // 多头方向

           }

           else if (TT > NN)  // 最近创新低比创新高更近

           {

               YY = -1;  // 空头方向

           }

           else

           {

               YY = 0;   // 平衡状态

           }

       }


       // 计算操盘线: IFELSE(YY >= 0 , LL , HH)

       if (YY >= 0)  // 多头或平衡状态

       {

           TradingLine = LL;  // 使用N周期最低价作为操盘线

       }

       else  // 空头状态

       {

           TradingLine = HH;  // 使用N周期最高价作为操盘线

       }


       // 计算做多线: IF(YY>=0, 操盘线, DRAWNULL)

       if (YY >= 0)

       {

           LongLine = TradingLine;

       }

       else

       {

           LongLine = InvalidNumeric;

       }


       // 计算做空线: IF(YY<0, 操盘线, DRAWNULL)

       if (YY < 0)

       {

           ShortLine = TradingLine;

       }

       else

       {

           ShortLine = InvalidNumeric;

       }

   }


   // ========== 判断交易信号 ==========

   Void CheckSignals()

   {

       if (CurrentBar <= N + 1) return;  // 确保有足够的数据计算信号


       // 判断NN上穿TT(做多信号):CROSS(NN,TT)

       // 当NN从大于TT变为小于等于TT时,产生做多信号

       CrossUpSignal = CrossOver(NN, TT);


       // 判断TT上穿NN(做空信号):CROSS(TT,NN)

       // 当TT从大于NN变为小于等于NN时,产生做空信号

       CrossDownSignal = CrossOver(TT, NN);

   }


   // ========== 执行交易逻辑 ==========

   Void ExecuteTrading()

   {

       // ===== 规则0:强制平仓逻辑 =====

       // 在强制平仓时间(14:55或22:55)无条件平仓

       if (IsForceCloseTime)

       {

           // 强制平多仓

           if (InLongPosition)

           {

               Sell(Lots, Open);

               InLongPosition = False;


               // 计算本次交易盈亏

               Numeric profit = (Open - LongEntryPrice) * Lots * BigPointValue;


               LongEntryPrice = 0;

               LongStopLoss = 0;

               LongEntryBar = -1;


               Comment("【强制平多仓】");

               Comment("平仓时间:" + Text(Date) + " " + Text(Time));

               Comment("平仓价格:" + Text(Open));

               Comment("持仓盈亏:" + Text(profit));

               Comment("平仓原因:交易时间结束(强制平仓)");

           }


           // 强制平空仓

           if (InShortPosition)

           {

               BuyToCover(Lots, Open);

               InShortPosition = False;


               // 计算本次交易盈亏

               Numeric profit = (ShortEntryPrice - Open) * Lots * BigPointValue;


               ShortEntryPrice = 0;

               ShortStopLoss = 0;

               ShortEntryBar = -1;


               Comment("【强制平空仓】");

               Comment("平仓时间:" + Text(Date) + " " + Text(Time));

               Comment("平仓价格:" + Text(Open));

               Comment("持仓盈亏:" + Text(profit));

               Comment("平仓原因:交易时间结束(强制平仓)");

           }


           // 强制平仓后直接返回,不再执行其他交易逻辑

           return;

       }


       // ===== 规则1:做多交易逻辑 =====

       // 出现 DRAWTEXT(CROSS(NN,TT),LL,'多') 做多

       // 只有在交易时间内才允许开仓

       if (IsTradingTime && CrossUpSignal && !InLongPosition && !InShortPosition)

       {

           // 开多仓

           Buy(Lots, Open);

           InLongPosition = True;

           LongEntryPrice = Open;

           LongEntryBar = CurrentBar;


           // 设置止损:5分钟分时图做多柱的最低点

           // 使用当前5分钟K线的最低点作为止损价

           LongStopLoss = Low - StopLossOffset * MinMove * PriceScale;


           Comment("【做多信号触发】");

           Comment("信号类型:NN上穿TT");

           Comment("入场时间:" + Text(Date) + " " + Text(Time));

           Comment("入场价格:" + Text(LongEntryPrice));

           Comment("止损价格:" + Text(LongStopLoss));

           Comment("止损依据:做多柱最低点");

       }


       // ===== 规则2:做空交易逻辑 =====

       // 出现 DRAWTEXT(CROSS(TT,NN),HH,'空') 做空

       // 只有在交易时间内才允许开仓

       if (IsTradingTime && CrossDownSignal && !InShortPosition && !InLongPosition)

       {

           // 开空仓

           SellShort(Lots, Open);

           InShortPosition = True;

           ShortEntryPrice = Open;

           ShortEntryBar = CurrentBar;


           // 设置止损:5分钟分时图做空柱的最高点

           // 使用当前5分钟K线的最高点作为止损价

           ShortStopLoss = High + StopLossOffset * MinMove * PriceScale;


           Comment("【做空信号触发】");

           Comment("信号类型:TT上穿NN");

           Comment("入场时间:" + Text(Date) + " " + Text(Time));

           Comment("入场价格:" + Text(ShortEntryPrice));

           Comment("止损价格:" + Text(ShortStopLoss));

           Comment("止损依据:做空柱最高点");

       }


       // ===== 规则3:平多仓逻辑 =====

       // 出现 DRAWTEXT(CROSS(TT,NN),HH,'空') 平多

       if (InLongPosition && CrossDownSignal)

       {

           Sell(Lots, Open);

           InLongPosition = False;


           // 计算本次交易盈亏

           Numeric profit = (Open - LongEntryPrice) * Lots * BigPointValue;


           LongEntryPrice = 0;

           LongStopLoss = 0;

           LongEntryBar = -1;


           Comment("【平多信号触发】");

           Comment("信号类型:TT上穿NN(反向信号)");

           Comment("平仓时间:" + Text(Date) + " " + Text(Time));

           Comment("平仓价格:" + Text(Open));

           Comment("持仓盈亏:" + Text(profit));

       }


       // ===== 规则4:平空仓逻辑 =====

       // 出现 DRAWTEXT(CROSS(NN,TT),LL,'多') 平空

       if (InShortPosition && CrossUpSignal)

       {

           BuyToCover(Lots, Open);

           InShortPosition = False;


           // 计算本次交易盈亏

           Numeric profit = (ShortEntryPrice - Open) * Lots * BigPointValue;


           ShortEntryPrice = 0;

           ShortStopLoss = 0;

           ShortEntryBar = -1;


           Comment("【平空信号触发】");

           Comment("信号类型:NN上穿TT(反向信号)");

           Comment("平仓时间:" + Text(Date) + " " + Text(Time));

           Comment("平仓价格:" + Text(Open));

           Comment("持仓盈亏:" + Text(profit));

       }


       // ===== 规则5:止损逻辑 =====

       // 做多止损:价格跌破做多柱最低点

       if (InLongPosition && Low <= LongStopLoss)

       {

           Sell(Lots, Min(Open, LongStopLoss));

           InLongPosition = False;


           // 计算止损盈亏

           Numeric profit = (Min(Open, LongStopLoss) - LongEntryPrice) * Lots * BigPointValue;


           LongEntryPrice = 0;

           LongStopLoss = 0;

           LongEntryBar = -1;


           Comment("【做多止损触发】");

           Comment("止损时间:" + Text(Date) + " " + Text(Time));

           Comment("止损价格:" + Text(LongStopLoss));

           Comment("止损盈亏:" + Text(profit));

       }


       // 做空止损:价格涨破做空柱最高点

       if (InShortPosition && High >= ShortStopLoss)

       {

           BuyToCover(Lots, Max(Open, ShortStopLoss));

           InShortPosition = False;


           // 计算止损盈亏

           Numeric profit = (ShortEntryPrice - Max(Open, ShortStopLoss)) * Lots * BigPointValue;


           ShortEntryPrice = 0;

           ShortStopLoss = 0;

           ShortEntryBar = -1;


           Comment("【做空止损触发】");

           Comment("止损时间:" + Text(Date) + " " + Text(Time));

           Comment("止损价格:" + Text(ShortStopLoss));

           Comment("止损盈亏:" + Text(profit));

       }

   }


   // ========== 更新绘图 ==========

   Void UpdatePlots()

   {

       // 更新指标线

       PlotATR.SetValue(ATR);

       PlotMiddleBand.SetValue(MiddleBand);

       PlotUpperBand.SetValue(UpperBand);

       PlotLowerBand.SetValue(LowerBand);

       PlotShortMA.SetValue(ShortMA);

       PlotShortMAUp.SetValue(ShortMAUp);

       PlotShortMADown.SetValue(ShortMADown);

       PlotTradingLine.SetValue(TradingLine);

       PlotLongLine.SetValue(LongLine);

       PlotShortLine.SetValue(ShortLine);


       // 绘制信号标记(精确对应原始代码)

       if (CrossUpSignal)

       {

           // DRAWTEXT(CROSS(NN,TT),LL,'多'),VALIGN0,ColorFF0000;

           PlotText("多", LL, ColorFF0000, Enum_Align_Bottom);


           // 在图表上标记做多信号

           PlotShape(Enum_Shape_UpArrow, Low, ColorFF0000);

       }


       if (CrossDownSignal)

       {

           // DRAWTEXT(CROSS(TT,NN),HH,'空'),VALIGN2,Color00FF00;

           PlotText("空", HH, Color00FF00, Enum_Align_Top);


           // 在图表上标记做空信号

           PlotShape(Enum_Shape_DownArrow, High, Color00FF00);

       }


       // 绘制K线颜色(根据原始代码的变色规则)

       // 红色K线:CLOSE>=操盘线&&CLOSE>=短线&&ISUP

       if (Close >= TradingLine && Close >= ShortMA && Close > Open)

       {

           SetBarColor(ColorFF0000);  // 红色上涨K线

       }

       // 绿色K线:CLOSE<操盘线&&CLOSE<短线&&ISUP

       else if (Close < TradingLine && Close < ShortMA && Close > Open)

       {

           SetBarColor(Color00FF00);  // 绿色上涨K线

       }

       // 蓝色K线:CLOSE>=操盘线&&CLOSE<=短线 或 CLOSE<操盘线&&CLOSE>短线

       else if ((Close >= TradingLine && Close <= ShortMA) ||

                (Close < TradingLine && Close > ShortMA))

       {

           SetBarColor(ColorBlue);    // 蓝色K线

       }

       // 下跌K线保持默认颜色


       // 标记当前持仓状态

       if (InLongPosition)

       {

           PlotText("持多", High, ColorFF0000, Enum_Align_Top);

       }

       else if (InShortPosition)

       {

           PlotText("持空", Low, Color00FF00, Enum_Align_Bottom);

       }

   }


   // ========== 策略退出时触发 ==========

   OnExit()

   {

       // 平掉所有仓位

       if (InLongPosition)

       {

           Sell(Lots, Close);

           Comment("策略退出,平多仓,价格:" + Text(Close));

       }


       if (InShortPosition)

       {

           BuyToCover(Lots, Close);

           Comment("策略退出,平空仓,价格:" + Text(Close));

       }


       Comment("ATR通道5分钟分时图策略已退出");

   }


//------------------------------------------------------------------------

// 编译版本    2026/4/15 201540

// 版权所有    ATR通道5分钟分时图策略

// 更改声明    TradeBlazer Software保留对TradeBlazer平台

//            每一版本的TradeBlazer策略修改和重写的权利

//------------------------------------------------------------------------

请修改代码,谢谢。
请帮助我修改一下公式代码
请协助修改密码
请tblaocai老师帮修改用户函数
指标代码修改
请帮忙修改,提示错误
请帮助修改量化交易策略
代码修改
求EMA函数代码,谢谢
老师,帮忙修改下代码

ai写的还是问ai怎么修改吧