求大神根据我的思路代编策略

趋势过滤:收盘价>EMA20 只做多;收盘价<EMA20 只做空进场确认:连续 2 根 K 线突破通道(EMA20±2ATR),单根刺破无效出场双层规则固定止损:进场价 ±1.5ATR止盈分仓:触及 3ATR 止盈减 70%,剩余 30% 以成本 + 0.5ATR 移动止损;价格回踩 EMA20 全部平仓震荡过滤:EMA 斜率接近 0(走平)禁止开仓

// ===== 参数设置 =====Params Numeric EMA_LEN(20); // EMA周期 Numeric ATR_LEN(14); // ATR周期 Numeric ATR_Multi_Breakout(2); // 突破倍数 Numeric ATR_Multi_SL(1.5); // 止损倍数 Numeric ATR_Multi_TP(3.0); // 止盈倍数 Numeric Slope_Len(20); // 斜率计算周期 Numeric Slope_Thresh(0.001); // EMA走平阈值 Numeric InitialLots(1); // 初始开仓手数 Numeric TP_Ratio(0.7); // 止盈时平仓比例(70%) Numeric Trail_ATR(0.5); // 剩余仓位移动止损偏移(0.5ATR)End// ===== 变量声明 =====Vars Numeric emaVal; Numeric atrVal; Numeric emaSlope; Bool longCond; Bool shortCond; Bool flatCond; Bool trendOK; Numeric trailPrice; // 移动止损跟踪价格 Bool trailInit; // 是否已初始化移动止损EndBegin // ===== 基础判断 ===== If(BarStatus == 0) Return; // ===== 指标计算 ===== emaVal := XAverage(Close, EMA_LEN); atrVal := XAverage(TrueRange, ATR_LEN); emaSlope := Abs(emaVal - emaVal[Slope_Len]) / Max(emaVal[Slope_Len], 0.0001); // ===== 趋势过滤 ===== trendOK := emaSlope > Slope_Thresh; // ===== 进场条件 ===== longCond := Close > emaVal + ATR_Multi_Breakout * atrVal And Close[1] <= emaVal[1] + ATR_Multi_Breakout * atrVal[1] And Close > emaVal And trendOK And MarketPosition <> -1; shortCond := Close < emaVal - ATR_Multi_Breakout * atrVal And Close[1] >= emaVal[1] - ATR_Multi_Breakout * atrVal[1] And Close < emaVal And trendOK And MarketPosition <> 1; // ===== 出场条件(回EMA20全平)===== flatCond := (MarketPosition == 1 And Close <= emaVal) Or (MarketPosition == -1 And Close >= emaVal); // ===== 开仓逻辑 ===== If (longCond) Then Begin Buy(InitialLots, Open); trailInit = False; // 重置移动止损标记 End; If (shortCond) Then Begin SellShort(InitialLots, Open); trailInit = False; End; // ===== 加仓逻辑 ===== If (MarketPosition == 1 And CurrentContracts > 0 And BarsSinceEntry > 0) Begin Numeric profitPerContract = Close - AvgEntryPrice; If (profitPerContract >= 1.5 * atrVal And High > High[1]) Begin Buy(IntPart(CurrentContracts * 0.5), Max(Open, High[1] + 1)); End; End; If (MarketPosition == -1 And CurrentContracts > 0 And BarsSinceEntry > 0) Begin Numeric profitPerContract = AvgEntryPrice - Close; If (profitPerContract >= 1.5 * atrVal And Low < Low[1]) Begin SellShort(IntPart(CurrentContracts * 0.5), Min(Open, Low[1] - 1)); End; End; // ===== 止损、止盈、移动止损统一处理 ===== If (MarketPosition == 1) Begin // 固定止损:亏损达到1.5ATR If (Low <= AvgEntryPrice - ATR_Multi_SL * atrVal) Begin Sell(0, Open); trailInit = False; End // 止盈:先平70%,剩余仓位启用移动止损 Else If (High >= AvgEntryPrice + ATR_Multi_TP * atrVal) Begin Sell(CurrentContracts * TP_Ratio, Max(Open, AvgEntryPrice + ATR_Multi_TP * atrVal)); // 初始化移动止损价为成本+0.5ATR trailPrice = AvgEntryPrice + Trail_ATR * atrVal; trailInit = True; End // 移动止损(在已启用且未平完的情况下) Else If (trailInit And CurrentContracts > 0) Begin // 更新移动止损线(跟随最高价上移) Numeric newTrail = AvgEntryPrice + Trail_ATR * atrVal; If (Close > trailPrice) trailPrice = newTrail; // 若价格跌破移动止损线,则全平剩余仓位 If (Low <= trailPrice) Begin Sell(0, Open); trailInit = False; End End; End Else If (MarketPosition == -1) Begin // 空头固定止损:亏损达到1.5ATR If (High >= AvgEntryPrice + ATR_Multi_SL * atrVal) Begin BuyToCover(0, Open); trailInit = False; End // 空头止盈:先平70%,剩余仓位启用移动止损 Else If (Low <= AvgEntryPrice - ATR_Multi_TP * atrVal) Begin BuyToCover(CurrentContracts * TP_Ratio, Min(Open, AvgEntryPrice - ATR_Multi_TP * atrVal)); trailPrice = AvgEntryPrice - Trail_ATR * atrVal; trailInit = True; End // 空头移动止损 Else If (trailInit And CurrentContracts > 0) Begin Numeric newTrail = AvgEntryPrice - Trail_ATR * atrVal; If (Close < trailPrice) trailPrice = newTrail; If (High >= trailPrice) Begin BuyToCover(0, Open); trailInit = False; End End; End; // ===== EMA回撤强制平仓(高于止盈止损优先级)===== If (flatCond And CurrentContracts > 0) Begin If (MarketPosition == 1) Sell(0, Open); If (MarketPosition == -1) BuyToCover(0, Open); trailInit = False; End;End;

TB策略收费代编服务试运行,请按照模版提交 https://bbs.tbquant.net/thread?id=20241205162315158864