//--- // 简称: ChandelierExec // 名称: ChandelierExec_启动即进场吊灯离场 // 类别: 公式应用 // 类型: 用户应用 // 输出: Void //--- /* 策略说明:纯执行工具 —— 方向与时机由你判断,程序只管出场纪律。 进场:启动前设 TradeDir(1做多 / -1做空);策略启动后【立即按方向进场】(不等任何交叉信号)。 出场:吊灯线(峰值∓K×ATR,棘轮只朝锁利方向移动)与固定止损(进场∓MaxLoss)取更紧者,触及即平。 一次性:平仓后不再进场;要下一单请手动重启策略实例。 EXPMA 快慢线仅作画图参考,不参与交易决策。 ★出场判断用已收线 [1] 前值,避免信号闪烁。 */ Params Numeric TradeDir(1); // 本次方向: 1做多 -1做空 Numeric EXPMA_Fast(21); // EXPMA 快线(仅画图参考) Numeric EXPMA_Slow(42); // EXPMA 慢线(仅画图参考) Numeric ATR_Length(20); // ATR 窗口 Numeric K(2.5); // 吊灯 ATR 倍数 Numeric MaxLoss(15); // 固定止损点数(0=关闭只用吊灯) Numeric Lots(1); // 开仓手数 Vars Series ema_fast; Series ema_slow; Series atr_val; Global Numeric extreme(0); // 多:进场后最高 / 空:进场后最低 Numeric chandLine; Numeric fixedLine; Numeric rawStop; Series stopLine; Global Numeric curStop(0); // 棘轮后的实际止损线 Global Bool tradeDone(False); // 一次性完成 Global Numeric prevPos(0); Events OnBar(ArrayRef indexs) { Range[0:DataSourceSize() - 1] { ema_fast = XAverage(Close, EXPMA_Fast); ema_slow = XAverage(Close, EXPMA_Slow); atr_val = AvgTrueRange(ATR_Length); } Range[0:0] { If(CurrentBar < ATR_Length + 2) Return; PlotNumeric("EXPMA_Fast", ema_fast, 0, Yellow); PlotNumeric("EXPMA_Slow", ema_slow, 0, Red); // 一次性完成检测:上一根有仓、本根空仓 => 已平仓 If(prevPos <> 0 && MarketPosition == 0) { tradeDone = True; } // ---------- 进场:启动即按方向进场(空仓且未完成) ---------- If(MarketPosition == 0 && !tradeDone) { If(TradeDir == 1) { Buy(Lots, Open); Commentary("启动开多"); } Else If(TradeDir == -1) { SellShort(Lots, Open); Commentary("启动开空"); } } // ---------- 持多:吊灯+固定止损(棘轮,只升不降) ---------- If(MarketPosition == 1 && BarsSinceEntry > 0) { If(BarsSinceEntry == 1) { extreme = AvgEntryPrice; } extreme = Max(extreme, High[1]); chandLine = extreme - K * atr_val[1]; If(MaxLoss > 0) { fixedLine = AvgEntryPrice - MaxLoss; } Else { fixedLine = -1000000; } rawStop = Max(chandLine, fixedLine); If(BarsSinceEntry == 1) { curStop = rawStop; } Else { curStop = Max(curStop, rawStop); } stopLine = curStop; PlotNumeric("StopLine", stopLine, 0, Green); If(Low[1] <= stopLine) { Sell(Lots, Open); Commentary("吊灯/固定止损平多"); } } // ---------- 持空:对称(棘轮,只降不升) ---------- If(MarketPosition == -1 && BarsSinceEntry > 0) { If(BarsSinceEntry == 1) { extreme = AvgEntryPrice; } extreme = Min(extreme, Low[1]); chandLine = extreme + K * atr_val[1]; If(MaxLoss > 0) { fixedLine = AvgEntryPrice + MaxLoss; } Else { fixedLine = 1000000; } rawStop = Min(chandLine, fixedLine); If(BarsSinceEntry == 1) { curStop = rawStop; } Else { curStop = Min(curStop, rawStop); } stopLine = curStop; PlotNumeric("StopLine", stopLine, 0, Green); If(High[1] >= stopLine) { BuyToCover(Lots, Open); Commentary("吊灯/固定止损平空"); } } prevPos = MarketPosition; } }