
이 전략은 단기 및 장기 두 개의 홀 이동 평균을 사용하여 거래 신호를 생성하고 필터링한다. 단기 홀 이동 평균은 신호를 생성하는 데 사용되며, 장기 홀 이동 평균은 필터링 신호를 사용하며, 단기 홀 평균과 장기 홀 평균이 동방향적으로 변할 때만 거래 신호를 생성한다.
이 전략은 ATR 지표를 사용하여 동시에 중지 손실과 중지 지점을 설정합니다. 매번 포지션을 열면 ATR의 값에 따라 현재 위치의 중지 손실과 중지 지점을 동적으로 설정합니다.
단기 홀 이동 평균은 가격의 단기 경향과 전환점을 포착하기 위해 사용됩니다. 단기 홀 이동 평균의 방향이 변하면 가격의 단기 경향이 바뀌었다는 것을 나타냅니다.
장기 홀 이동 평균은 가격의 전반적인 움직임을 판단하는 데 사용됩니다. 예를 들어, 장기 홀 이동 평균의 방향이 상승하면 가격이 전반적인 상승 추세에 있음을 나타냅니다.
단기 홀 이동 평균이 변동할 때만 거래 신호가 발생하며, 변동 방향이 장기 홀 이동 평균의 전반적인 움직임 방향과 일치하면 거래 신호가 발생한다. 즉, 단기 가격 추세가 변하면서 전반적인 움직임도 같은 방향으로 변할 때만 이 단기 신호에 거래한다. 이것은 단기 시장 소음으로 인한 잘못된 신호를 효과적으로 필터링 할 수 있다.
포지션을 개시한 후, ATR 지표의 크기에 따라 중지 손실과 중지 손실이 설정됩니다. ATR 지표는 시장의 변동 정도와 위험 수준을 반영 할 수 있습니다.
이 전략은 단기 신호와 장기 필터링을 결합하여 중기 가격의 추세를 효과적으로 식별하고 전환점을 적시에 잡을 수 있습니다. 단일 이동 평균과 같은 지표에 비해 시장 소음으로 속일 가능성을 줄일 수 있습니다.
동적으로 조정하는 스톱 스톱 위치, 시장의 변동 정도에 따라 합리적인 스톱 스톱을 설정할 수 있으며, 수익을 보장하면서 너무 급진적인 것을 피하고 손실 위험을 줄일 수 있습니다.
홀 이동 평균의 장점을 활용하여 가격 움직임을 보다 유연하고 정확하게 판단할 수 있으며, 일반 이동 평균에 비해 더 강력한 추적 성능을 가지고 있다.
이 전략은 단기 및 장기간에 걸쳐 두 개의 홀 이동 평균의 교차를 신호로 의존하고 있으며, 두 개의 이동 평균 사이에 가짜 교차가 발생하면 잘못된 입구를 초래할 수 있습니다. 이 경우 장기 및 단기 시장 구조에 따라 신호를 필터링할지 여부를 결정해야합니다.
흔들리는 상황에서는 가격이 더 작은 거래 범위 내에서 흔들릴 수 있으며, 이는 신호 오류율을 증가시키고 무의미한 거래의 가능성을 증가시킵니다. 이 경우 거래 신호 필터 조건을 확장하여 무의미한 거래를 피할 수 있습니다.
스톱 스 설정은 ATR 지표에 의존하며, ATR 지표가 반영한 시장 변동이 정확하지 않으면 스톱 스 위치도 무효가 된다. 이 경우 다른 변동률 지표와 함께 ATR 값을 수정하는 것을 고려할 수 있다.
RSI와 같은 과매매 과매매 지표와 같은 다른 단기 지표와 결합하여 신호 판단을 보조하는 것을 고려하여 필터링 효과를 높일 수 있습니다.
장기 단기 홀 이동 평균 사이의 필터링 논리 관계를 추가하거나 최적화하여 필터링 규칙을 더 엄격하게 만들고 잘못된 신호를 피하십시오.
전략의 안정성과 수익성에 대한 다양한 파라미터 설치의 영향을 연구할 수 있다. 예를 들어 이동 평균 파라미터, ATR 파라미터 등의 다양한 조합은 다른 거래 성과를 초래할 수 있다.
이 전략은 종합적으로 단기 홀 이동 평균 신호 캡처, 장기 홀 이동 평균 신호 필터링 및 ATR 지표가 중지 중지 설정 방법을 사용하여, 중간 트렌드 추적 전략 시스템을 형성합니다. 이 전략은 중기 가격 전환점을 효과적으로 발견하고, 단기 시장 소음 방해를 피하고, 트렌드 거래 시스템을 구축하는 중요한 주식 선택 도구입니다. 매개 변수 최적화 및 보조 조건을 추가하면 이 전략은 신호 판단 정확성을 더욱 강화하여 더 나은 성능을 얻을 수 있습니다.
/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)
// Parameters for Hull Moving Averages
src = input(close, title="Source")
signal_period = input(50, title="Period of signal HMA")
filter_period = input(200, title="Period of filter HMA")
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
// Set allowed trading directions
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
// stop loss and take profit
sl_factor = input(2,title="Stop Loss Factor")
tp_factor = input(3,title="Take Profit Factor")
atr_period = input(14, title="ATR Period (SL/TP)")
// Testing Start dates
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// -----------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------
var float tp = na
var float sl = na
var float position = na
// -----------------------------------------------------------------------------
// Functions
// -----------------------------------------------------------------------------
testWindow() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// -----------------------------------------------------------------------------
// The engine
// -----------------------------------------------------------------------------
hma_signal = hma(src, signal_period)
hma_filter = hma(src, filter_period)
// Used to determine exits and stop losses
atr_e = atr(atr_period)
// if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0
trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0
signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0
// -----------------------------------------------------------------------------
// signals
// -----------------------------------------------------------------------------
if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow()
sl := close - sl_factor*atr_e
tp := close + tp_factor*atr_e
strategy.entry("HMA_LNG", strategy.long)
strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow()
sl := close + sl_factor*atr_e
tp := close - tp_factor*atr_e
strategy.entry("HMA_SHRT", strategy.short)
strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
if strategy.position_size != 0
sl := sl[1]
tp := tp[1]
// -----------------------------------------------------------------------------
// PLOT
// -----------------------------------------------------------------------------
hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red)
hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red)
plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1)
plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)