策略
CK动量反转止损策略CK-Momentum-Reversal-Stop-Loss-Strategy
ChaoZhang · PineScript · 突破 · 2023-11-27 18:13:58
概述
该策略运用CK通道判定价格趋势,并设定动态止损线,在发生价格反转时进行反向操作,属于短线交易策略。
策略原理
策略运用CK通道判断价格趋势和支撑阻力。计算上通道线和下通道线,当价格突破通道线时产生交易信号。此外,策略还会跟踪通道线的移动情况,在通道线反转时采取反向头寸,属于反转交易策略。 具体来说,策略基于最高价、最低价计算出上下通道线。如果上通道线开始下降,下通道线开始上升,则判定为价格反转,做空头寸。反之,如果下通道线开始下降,上通道线开始上升,则判定为价格反转,做多头寸。
优势
- 运用双通道判断价格反转点,精准做反向操作
- 采用动态止损方式来控制风险,可以及时止损
- 策略逻辑简单清晰,容易理解实现
风险
- 市场价格剧烈波动时,止损线可能被突破,导致亏损加大
- 交易次数可能较多,交易成本增加
- 需要选择合适的参数来控制止损线,避免过于宽松或过于紧绷
总结
该策略整体思路清晰易懂,运用双通道判断价格反转,采取反向操作;并设定动态止损来控制风险,属于典型的短线交易策略。策略效果还可进一步优化,主要是调整止损参数,并辅助其他技术指标判断操作时机。
其他
- 优化止损线参数,使其更加合理且有效
- 结合趋势指标判断反转信号的可靠性,避免在趋势中反向操作
- 增加自动交易和自动止损模块,降低交易成本
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| v_input_1 | 9 | hiP |
| v_input_2 | true | hix |
| v_input_3 | 7 | hiQ |
| v_input_4 | 9 | loP |
| v_input_5 | true | lox |
| v_input_6 | 5 | loQ |
| v_input_7 | false | 反向操作:買/賣 |
| v_input_8 | true | Sig |
| v_input_9 | true | Bgtrend |
| v_input_10 | 2021 | 年 |
| v_input_11 | 9 | 月 |
| v_input_12 | true | 日 |
| v_input_13 | 2032 | 年 |
| v_input_14 | true | 月 |
| v_input_15 | true | 日 |
| v_input_16 | My Long Msg | Long Alert Msg |
| v_input_17 | My Short Msg | Short Alert Msg |
源码(65 行)
/*backtest
start: 2023-10-27 00:00:00
end: 2023-11-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//
//study(title="Chande Kroll Stop", shorttitle="CK Stop", overlay=true)
strategy(title="Chande Kroll Stop", shorttitle="Chande Kroll Stop回測", overlay=true, initial_capital=100000, calc_on_every_tick=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)
br_red = #e91e63,Red = #f41818,n_green = #91dc16,dk_green = #004d40,lt_green = #16dc78,lt_blue = #0dbdd8,dk_blue = #0a3577,Blue = #034fed,br_orange = #f57c00,dk_orange = #e65100,dk_gray = #434651,dk_pink = #7c1df0,lt_pink = #e743f5,Purple = #5b32f3,lt_purple = #6b5797
hiP = input(9, "",inline="h")
hix = input(1,"" ,inline="h", step=0.1)
hiQ = input(7,"" ,inline="h")
loP = input(9,"" ,inline="h1")
lox = input(1,"" ,inline="h1", step=0.1)
loQ = input(5,"" ,inline="h1")
Xr=input(false,"反向操作:買/賣",inline="T"),
first_high_stop = highest(high, hiP) - hix * atr(hiP)
first_low_stop = lowest(high, loP) + lox * atr(loP)
stop_short = highest(first_high_stop, hiQ)
stop_long = lowest(first_low_stop, loQ)
cklow = stop_short
ckhigh = stop_long
Xdn = cklow < cklow[1] and ckhigh < ckhigh[1]
Xup = cklow > cklow[1] and ckhigh > ckhigh[1]
longcol = Xup ? lt_green : Xdn ? br_red : #2a2e39
shortcol = Xup? lt_green : Xdn ? br_red : #2a2e39
plot(stop_long, color=longcol)
plot(stop_short, color=shortcol)
plotshape(Xup and not Xup[1] , title="CK Stop Buy", text='CK', style=shape.triangleup, size=size.tiny, location=location.belowbar, color=lt_green, textcolor=lt_green,display=display.none)
plotshape(Xdn and not Xdn[1], title="CK Stop Sell", text='CK', style=shape.triangledown, size=size.tiny, location=location.abovebar, color=br_red, textcolor=br_red,display=display.none)
// , default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=true)
tl=input(true,"Sig",inline="T"), sbg=input(true,"Bgtrend",inline="T"), vbuild="FIREHORSE XRPUSDT"
Xp = 0.0, Xp:=Xdn? -1 : Xup? 1 : Xp[1], Xdf = Xr? Xup and Xp[1] == -1 : Xdn and Xp[1] == 1 ,Xuf = Xr? Xdn and Xp[1] == 1: Xup and Xp[1] == -1
FY=input(2021,"年",inline="btf"),FM=input(9,"月",inline="btf"),FD=input(01,"日",inline="btf"),
TY = input(2032,"年",inline="to"),TM=input(01,"月",inline="to"),TDy=input(01,"日",inline="to"),
testTF = time>=timestamp(FY,FM,FD,00,00) and time <= timestamp(TY,TM,TDy,23,59)? true:false
plotchar(tl? Xuf:na,vbuild+" 生門","△",location.bottom, #14e540,10,0," " ,#14e540,1,size.tiny)// ︽ ︾
plotchar(tl? Xdf:na,vbuild+" 傷門","▽",location.top, #9b0842,10,0," ", #9b0842,1,size.tiny)
bgcolor(sbg ? Xp==1 ? #0d47a1 :na: na, transp=90),
alertcondition(Xuf,vbuild+ "Buy", "Long ? \n"+vbuild), alertcondition(Xdf, vbuild+ " Sell","Short ?\n"+vbuild)
if Xuf
alert("Long " + tostring(close)+"\nLong "+input("My Long Msg","Long Alert Msg")+vbuild, alert.freq_once_per_bar)
if Xdf
alert("Short " + tostring(close)+"\nShort"+input("My Short Msg","Short Alert Msg")+vbuild, alert.freq_once_per_bar)
if testTF
strategy.entry("Long ", strategy.long, comment=" Long ",when=Xuf), strategy.entry("Short", strategy.short, comment=" Short",when=Xdf )