모멘텀 추적 전략은 가격 트렌드 방향을 결정하는 주요 지표로 홀 이동 평균을 사용합니다. 동시에 전략은 가격 트렌드를 확인하고 잘못된 신호를 필터하기 위해 기본 라인, 확인 지표 등 다른 지표를 통합합니다. 시장에 진출한 후 전략은 동적 스톱 손실을 계산하기 위해 평균 진정한 범위를 사용하여 수익을 위해 트렌드를 추적합니다.
모멘텀 트래킹 전략의 핵심은 헐 이동 평균이다. 헐 이동 평균은 가격 변화에 더 민감하고 트렌드 방향을 효과적으로 결정할 수 있다. 가격이 헐 라인을 상향으로 돌파하면 상승 추세가 확인되며, 길게 갈 때; 가격이 헐 라인을 상하로 돌파하면 하락 추세가 확인되며, 짧게 갈 때.
또한 전략은 단기 및 장기 트렌드를 판단하는 기본 지표도 도입합니다. 확인 지표는 잘못된 브레이크오프를 필터링하는 데 사용됩니다. 거래 신호는 기본 지표와 확인 지표가 트렌드 방향을 확인 한 후에만 작동됩니다.
시장에 진입 한 후 전략은 평균 진정한 범위와 허ల్ EMA를 사용하여 스톱 러스 위치를 설정합니다. 트렌드가 계속되면 스톱 러스 라인은 트렌드 수익을 잠금하기 위해 계속 상승 / 하락 할 것입니다.
모멘텀 트래킹 전략은 트렌드 판단과 위험 통제의 장점을 결합하여 트렌딩 시장에서 좋은 수익을 얻을 수 있습니다. 고정 스톱 손실 전략과 비교하면 스톱 손실을 이동하여 트렌드 러닝을 추적하고 정상적인 시장 변동에 의해 중단되는 것을 피할 수 있습니다.
여러 지표의 조합은 또한 전략이 잘못된 신호를 효과적으로 필터하는 동시에 시장 변화에 더 민감하게 작용합니다. 또한 전략은 사용자가 자신의 시장 판단에 따라 최적화 할 수있는 여러 가지 조정 가능한 매개 변수를 제공합니다.
이 전략은 주로 트렌드 지표에 의존하며 통합 과정에서 잘못된 신호를 생성하고 손실을 멈추는 경향이 있습니다. 또한 여러 지표의 조합은 또한 지표 간의 충돌로 이어질 수 있습니다. 잘못된 매개 변수 설정은 또한 전략 성능이 좋지 않을 수 있습니다.
지표가 오차를 나타낼 때 거래를 일시 중단하기 위해 전략에 추가 판단 모듈을 추가하는 것을 고려하거나 여러 지표의 판단 결과를 합성하기 위해 투표 메커니즘을 채택하십시오. 매개 변수 설정을 위해 최적의 매개 변수를 백테스트 최적화 방법을 통해 찾을 수 있습니다.
모멘텀 추적 전략은 다음과 같은 방향으로 최적화 될 수 있습니다:
요약하자면, 모멘텀 추적 전략은 우수한 트렌드 추적 전략이다. 트렌드 판단과 동적 스톱 로스를 성공적으로 결합하여 트렌드를 효과적으로 추적하고 수익을 얻을 수 있다. 추가 최적화로 더 나은 전략 성능을 달성할 것으로 예상된다. 전략은 양적 거래 전략의 구축에 좋은 참조를 제공합니다.
/*backtest start: 2023-11-28 00:00:00 end: 2023-12-28 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © Milleman //@version=4 strategy("MilleMachine", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.06) // Additional settings Mode = input(title="Mode", defval="LongShort", options=["LongShort", "OnlyLong", "OnlyShort","Indicator Mode"]) UseTP = false //input(false, title="Use Take Profit?") QuickSwitch = true //input(true, title="Quickswitch") UseTC = true //input(true, title="Use Trendchange?") // Risk management settings //Spacer2 = input(false, title="======= Risk management settings =======") Risk = input(1.0, title="% Risk",minval=0)/100 RRR = 2 //input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20) SL_Mode = false // input(true, title="ON = Fixed SL / OFF = Dynamic SL (ATR)") SL_Fix = 3 //input(3,title="StopLoss %",step=0.25, minval=0)/100 ATR = atr(14) //input(14,title="Periode ATR")) Mul = input(2,title="ATR Multiplier",step=0.1) xATR = ATR * Mul SL = SL_Mode ? SL_Fix : (1 - close/(close+xATR)) // INDICATORS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Ind(type, src, len) => float result = 0 if type=="McGinley" result := na(result[1]) ? ema(src, len) : result[1] + (src - result[1]) / (len * pow(src/result[1], 4)) if type=="HMA" result := wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len))) if type=="EHMA" result := ema(2*ema(src, len/2)-ema(src, len), round(sqrt(len))) if type=="THMA" lend = len/2 result := wma(wma(src, lend/3)*3-wma(src, lend/2)-wma(src,lend), lend) if type=="SMA" // Simple result := sma(src, len) if type=="EMA" // Exponential result := ema(src, len) if type=="DEMA" // Double Exponential e = ema(src, len) result := 2 * e - ema(e, len) if type=="TEMA" // Triple Exponential e = ema(src, len) result := 3 * (e - ema(e, len)) + ema(ema(e, len), len) if type=="WMA" // Weighted result := wma(src, len) if type=="VWMA" // Volume Weighted result := vwma(src, len) if type=="SMMA" // Smoothed w = wma(src, len) result := (w[1] * (len - 1) + src) / len if type == "RMA" result := rma(src, len) if type=="LSMA" // Least Squares result := linreg(src, len, 0) if type=="ALMA" // Arnaud Legoux result := alma(src, len, 0.85, 6) if type=="Kijun" //Kijun-sen kijun = avg(lowest(len), highest(len)) result :=kijun if type=="WWSA" // Welles Wilder Smoothed Moving Average result := nz(result[1]) + (close -nz(result[1]))/len result // Baseline : Switch from Long to Short and vice versa BL_Act = input(true, title="====== Activate Baseline - Switch L/S ======") BL_type = input(title="Baseline Type", defval="McGinley", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) BL_src = input(close, title="BL source") BL_len = input(50, title="BL length", minval=1) BL = Ind(BL_type,BL_src, BL_len) // Confirmation indicator C1_Act = input(false, title="===== Activate Confirmation indicator =====") C1_type = input(title="C1 Entry indicator", defval="SMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) C1_src = input(close, title="Source") C1_len = input(5,title="Length", minval=1) C1 = Ind(C1_type,C1_src,C1_len) // Entry indicator : Hull Moving Average Spacer5 = input(true, title="====== ENTRY indicator =======") EI_type = input(title="EI Entry indicator", defval="HMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) EI_src = input(close, title="Source") EI_Len = input(46,title="Length", minval=1) EI = Ind(EI_type,EI_src,EI_Len) // Trail stop settings TrailActivation = input(true, title="===== Activate Trailing Stop =====") TS_type = input(title="TS Traling Stop Type", defval="EMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) TrailSLScaling = 1 //input(100, title="SL Scaling", minval=0, step=5)/100 TrailingSourceLong = Ind(TS_type,low,input(5,"Smoothing Trail Long EMA", minval=1)) TrailingSourceShort = Ind(TS_type,high,input(2,"Smoothing Trail Short EMA", minval=1)) //VARIABLES MANAGEMENT TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1] TriggerSL = 0.0, TriggerSL := TriggerSL[1] SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1] isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1] //LOGIC GoLong = crossover(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] > 1) and (not C1_Act or C1>C1[1]) and (Mode == "LongShort" or Mode == "OnlyLong") GoShort = crossunder(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] < 1) and (not C1_Act or C1<C1[1]) and (Mode == "LongShort" or Mode == "OnlyShort") ExitLong = isLong and crossunder(EI,EI[1]) and UseTC ExitShort = isShort and crossover(EI,EI[1]) and UseTC //FRAMEWORK //Reset Long-Short memory if isLong and strategy.position_size == 0.0 isLong := false if isShort and strategy.position_size == 0.0 isShort := false //Long if GoLong isLong := true, TriggerPrice := close, TriggerSL := SL TPPrice := UseTP? TriggerPrice * (1 + (TriggerSL * RRR)) : na SLPrice := TriggerPrice * (1-TriggerSL) Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice strategy.entry("Long", strategy.long, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice) if isLong NewValSL = TrailingSourceLong * (1 - (SL*TrailSLScaling)) if TrailActivation and NewValSL > SLPrice SLPrice := NewValSL strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice) if ExitLong strategy.close_all(comment="TrendChange") isLong := false //Short if GoShort isShort := true, TriggerPrice := close, TriggerSL := SL TPPrice := UseTP? TriggerPrice * (1 - (TriggerSL * RRR)) : na SLPrice := TriggerPrice * (1 + TriggerSL) Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice strategy.entry("Short", strategy.short, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice) if isShort NewValSL = TrailingSourceShort * (1 + (SL*TrailSLScaling)) if TrailActivation and NewValSL < SLPrice SLPrice := NewValSL strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice) if ExitShort strategy.close_all(comment="TrendChange") isShort := false //VISUALISATION plot(BL_Act?BL:na, color=color.blue,title="Baseline") plot(C1_Act?C1:na, color=color.yellow,title="confirmation Indicator") EIColor = EI>EI[1] ? color.green : color.red Fill_EI = plot(EI, color=EIColor, linewidth=1, transp=40, title="Entry Indicator EI") Fill_EID = plot(EI[1], color=EIColor, linewidth=1, transp=40, title="Entry Indicator EID") fill(Fill_EI,Fill_EID, title="EI_Fill", color=EIColor,transp=50) plot(strategy.position_size != 0.0 and (isLong or isShort) ? TriggerPrice : na, title="TriggerPrice", color=color.yellow, style=plot.style_linebr) plot(strategy.position_size != 0.0 and (isLong or isShort) ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr) plot(strategy.position_size != 0.0 and (isLong or isShort) ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr) bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice and TriggerPrice>SLPrice ? color.yellow : na, transp=75, title="SL Long") bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice and TriggerPrice<SLPrice ? color.yellow : na, transp=75, title="SL Short")