请修改代码,谢谢。
//------------------------------------------------------------------------// 简称: 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:55Vars // ========== 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策略修改和重写的权利//------------------------------------------------------------------------