//--- // 简称: EXPMA40 // 名称: EXPMA_MA40双向交易策略 // 类别: 公式应用 // 类型: 用户应用 // 输出: Void //--- /* 策略说明: 小周期 EXPMA 快慢线金叉/死叉产生交易信号,30 分钟周期 MA40 作为价格位置过滤,支持按 MA40 条件选择性反手 系统要素: 1、小周期(主图)EXPMA 快线、慢线(指数移动平均线,TB 用 XAverage 实现) 2、30 分钟周期 MA40 作为大周期价格过滤线 3、OnBar 运行,金叉/死叉及价格过滤均用前一根K线确认值,避免信号闪烁 入场条件: 开多:小周期 EXPMA 金叉,且收盘价在 30 分钟 MA40 上方 开空:小周期 EXPMA 死叉,且收盘价在 30 分钟 MA40 下方(需开启做空) 出场条件: 持多遇死叉:价格在 30 分钟 MA40 上方只平多;价格在 MA40 下方平多并反手开空 持空遇金叉:价格在 30 分钟 MA40 下方只平空;价格在 MA40 上方平空并反手开多 注意: 1、主图须加载小周期(如 5 分钟),OnReady 自动订阅 30 分钟计算 MA40 2、OnBar 每 tick 运行,条件判断使用 [1] 前值,委托价用 Open 3、金叉/死叉结果先写入 Series 再在条件中使用 */ Params Numeric EXPMA_Fast(12); // 小周期 EXPMA 快线周期 Numeric EXPMA_Slow(26); // 小周期 EXPMA 慢线周期 Numeric MA40_Length(40); // 30 分钟 MA40 周期 Numeric Lots(1); // 交易手数 Bool AllowShort(True); // 是否允许做空 Vars Global Integer id_30m; // 30 分钟图层 ID Global Bool sub_flag(False); // 订阅标志 Series ema_fast_line; // 小周期 EXPMA 快线 Series ema_slow_line; // 小周期 EXPMA 慢线 Series ma40; // 30 分钟 MA40(各图层独立,取 id_30m 图层值) Series golden_cross; // 小周期 EXPMA 金叉(前一根K线确认) Series death_cross; // 小周期 EXPMA 死叉(前一根K线确认) Events OnReady() { If(!sub_flag) { id_30m = SubscribeBar(Symbol(), "30m", BeginDateTime); sub_flag = True; } data[id_30m].Hide(); } OnBar(ArrayRef indexs) { Range[0:DataSourceSize() - 1] { // 小周期 EXPMA 快慢线 ema_fast_line = XAverage(Close, EXPMA_Fast); ema_slow_line = XAverage(Close, EXPMA_Slow); // 金叉/死叉用 [1] 前值计算,避免 OnBar 实时行情信号闪烁 golden_cross = CrossOver(ema_fast_line[1], ema_slow_line[1]); death_cross = CrossUnder(ema_fast_line[1], ema_slow_line[1]); // 30 分钟图层计算 MA40 ma40 = Average(Close, MA40_Length); } Range[0:0] { If(CurrentBar < 100) Return; If(EXPMA_Fast >= EXPMA_Slow) Return; // 价格过滤用前一根K线收盘价与30分钟MA40比较 Numeric ma40_30m = data[id_30m].ma40[1]; Bool price_above_ma40 = Close[1] > ma40_30m; Bool price_below_ma40 = Close[1] < ma40_30m; PlotNumeric("EXPMA_Fast", ema_fast_line, 0, Yellow); PlotNumeric("EXPMA_Slow", ema_slow_line, 0, Red); PlotNumeric("MA40_30m", data[id_30m].ma40, 0, White); // ---------- 持多:死叉出场 / 反手 ---------- If(MarketPosition == 1 && death_cross && BarsSinceEntry > 0) { If(price_above_ma40) { Sell(0, Open); Commentary("平多:死叉且价格在30分钟MA40上方,只平多不开空"); } Else If(AllowShort) { SellShort(Lots, Open); Commentary("反手:死叉且价格在30分钟MA40下方,平多开空"); } Else { Sell(0, Open); Commentary("平多:死叉且价格在30分钟MA40下方,未开启做空"); } Return; } // ---------- 持空:金叉出场 / 反手 ---------- If(MarketPosition == -1 && golden_cross && BarsSinceEntry > 0) { If(price_below_ma40) { BuyToCover(0, Open); Commentary("平空:金叉且价格在30分钟MA40下方,只平空不开多"); } Else { Buy(Lots, Open); Commentary("反手:金叉且价格在30分钟MA40上方,平空开多"); } Return; } // ---------- 空仓开仓 ---------- If(MarketPosition <> 1 && golden_cross && price_above_ma40) { Buy(Lots, Open); Commentary("开多:小周期EXPMA金叉且价格在30分钟MA40上方"); } Else If(MarketPosition <> -1 && AllowShort && death_cross && price_below_ma40) { SellShort(Lots, Open); Commentary("开空:小周期EXPMA死叉且价格在30分钟MA40下方"); } } } //--- // 编译版本 2026-07-14 // 版权所有 yiliu166(微信) // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer公式修改和重写的权利 //---