//------------------------------------------------------------------------
// 简称: 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策略修改和重写的权利
//------------------------------------------------------------------------
ai写的还是问ai怎么修改吧