선체 필터 이동 평균 전략

저자:차오장, 날짜: 2024-01-04 15:16:34
태그:

img

전반적인 설명

이 전략은 거래 신호를 생성하고 필터링하기 위해 단기 및 장기적인 헐 이동 평균을 사용합니다. 단기 헐 이동 평균은 신호를 생성하는 데 사용되며, 장기적인 헐 이동 평균은 신호를 필터링하는 데 사용됩니다. 단기 헐 이동 평균이 방향을 변경하고 장기적인 헐 이동 평균이 동일한 전반적인 방향으로 움직일 때만 거래가 수행됩니다.

이 전략은 또한 ATR 지표를 사용하여 동적으로 스톱 로스를 설정하고 거래에 들어갈 때 수익 수준을 취합니다.

전략 논리

단기 Hull 이동 평균은 단기 가격 추세와 전환점을 포착합니다. 방향이 바뀌면 단기 가격 추세의 전환을 신호합니다.

장기적인 헐 이동 평균은 전체 가격 추세를 결정합니다. 예를 들어, 상승할 때 가격은 전체 상승 추세를 나타냅니다.

거래는 단기 Hull 이동 평균이 방향을 전환하고 새로운 방향이 장기 Hull 이동 평균의 방향과 일치 할 때만 수행됩니다. 이것은 전체 추세에 반대되는 신호를 필터링하고 단기 시장 소음일 수 있습니다.

포지션을 입력 한 후, 스톱 로스 및 트레이프 레벨은 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)


더 많은