Hull 이동 평균 및 WT 크로스 기반의 거래 전략

저자:차오장, 날짜: 2023-09-26 20:00:32
태그:

전반적인 설명

이 전략은 주로 Hull Moving Average와 WT 크로스 신호를 결합하여 각 지표의 장점을 활용하여 더 정확한 트렌드 판단과 입시 시기를 제공합니다.

전략 논리

전략은 Hull 이동 평균과 WT 십자 신호로 구성됩니다.

헐 이동 평균 부분은 단기 및 장기적인 헐 MAs를 계산하고 트렌드 방향을 결정하기 위해 색을 채웁니다. 공식은 다음과 같습니다.

짧은 배체 MA = WMA ((2*WMA ((n/2) - WMA ((n), sqrt ((n))

장함 MA = WMA ((WMA)) n/3) *3 - WMA ((n/2), n/2)

여기서 WMA는 가중화 이동 평균입니다. 짧은 MA가 긴 MA를 넘으면 상승 신호이고 그렇지 않으면 하락 신호입니다.

WT 부분은 WT 직선을 계산하고 항목을 결정하기 위해 교차점을 관찰합니다. 공식은 다음과 같습니다.

TCI = (Close - EMA(Close,n1)) / (k * STD(Close - EMA(Close,n1),n1))

WT1 = EMA (TCI,n2)

WT2 = SMA ((WT1,m)

여기서 TCI는 트렌드 복합 지수이며, EMA에서 가격의 오차를 반영합니다. WT1는 TCI의 EMA, WT2는 WT1의 SMA, m는 일반적으로 4입니다. WT1이 WT2보다 넘어가면 상승 신호를 나타냅니다. WT2 아래의 WT1의 넘어가면 하락 신호를 나타냅니다.

헐 MA 트렌드 판단과 WT 교차 신호를 결합하면 올바른 방향으로 시장에 진입 할 수 있습니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 헐 MA는 계산을 수정함으로써 가격 변화를 더 빨리 파악하고 신뢰할 수있는 트렌드 판단을 위해 시장 소음을 효과적으로 필터합니다.

  2. WT는 채널 내의 가격 변동을 사용하여 전환점을 빠르게 파악하고 비교적 정확한 거래 신호를 생성합니다.

  3. 이 조합은 트렌드가 일치할 때 더 나은 위험 통제를 위해 트렌드와 교차를 모두 고려합니다.

  4. Hull MA와 WT 매개 변수는 기호 특성 및 거래 선호도에 따라 조정 및 최적화를 위해 사용자 정의 할 수 있습니다.

  5. Hull MA와 WT 신호는 트렌드 추적 및 교차 검증 모두에 개별적으로 또는 함께 사용할 수 있습니다.

  6. 스톱 러스 및 영업이익은 단일 무역 리스크를 효과적으로 제어하도록 설정할 수 있습니다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 헐 MA와 WT 모두 어느 정도 가격을 완화시켜서 후진 입시 신호를 일으킬 수 있습니다.

  2. WT는 명확한 트렌드가 없는 거짓 상승/하락 이각 신호를 생성할 수 있습니다.

  3. 부적절한 매개 변수 설정은 거래 성과에 영향을 미치고 지속적인 최적화를 요구할 수 있습니다.

  4. 트렌드 연대화 도중 손해를 막는 작업이 자주 발생하여 약간의 손실이 발생할 수 있습니다.

위험은 다음과 같이 해결되고 최적화 될 수 있습니다.

  1. 최적의 균형을 찾기 위해 Hull MA와 WT 매개 변수를 조정합니다. 다른 지표도 Hull MA로 테스트 할 수 있습니다.

  2. 트렌드 검증 메커니즘을 추가하여 확인된 트렌드가 없는 잘못된 WT 신호를 피합니다.

  3. 백테스팅과 데모 트레이딩을 통해 매개 변수를 최적화하고 합리적인 스톱 로스 범위를 설정합니다.

  4. 트렌드가 명확하지 않을 때 포지션 크기를 줄이거나 거래를 중단하십시오.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. 더 나은 균형을 찾기 위해 WT와 결합한 다른 이동 평균을 테스트하십시오. 예를 들어 KAMA, TEMA 등.

  2. 결정의 정확성을 높이기 위해 오시레이터, 볼링거 밴드 같은 다른 지표를 추가합니다.

  3. 백테스팅과 데모 트레이딩을 통해 매개 변수를 최적화합니다. 빠른 조정을 위해 매개 변수 최적화 프로그램을 구축합니다.

  4. 트레일링 스톱, 변동성 기반 스톱, 가까운 곳에서 먼 곳으로 이동 등 원치 않는 트리거를 줄이기 위해 스톱 손실 전략을 최적화하십시오.

  5. 포지션 사이즈 전략을 최적화하고, 위험을 줄이기 위해 불확실한 트렌드의 크기와 빈도를 줄이십시오.

  6. 더 똑똑한 거래 결정과 적응 매개 변수를 위해 기계 학습 및 다른 고급 기술을 도입하십시오.

요약

이 전략은 트렌드 판단과 검증을 위해 Hull MA 평평화 및 WT 교차 강점을 결합합니다. 확인 된 방향과 거래는 위험을 제어하는 데 도움이됩니다. 매개 변수 최적화, 스톱 로스 전략, 포지션 사이징 등에 대한 추가 개선이 가능합니다. 다른 지표와 지능형 기술을 통합하는 것도 미래 최적화 방향입니다. 전반적으로 이것은 단순성, 신뢰성 및 최적화 용이성을 가진 전략을 따르는 실용적인 추세입니다.


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// WT CROSS @author [© LazyBear]
// © pigsq
// @version=5

strategy("Kahlman HullMA / WT Cross Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100)

_1 = input(false, '───────── SP/TP SETTINGS ─────────')

stoploss1 = input(title='Stop Loss On/Off?', defval=true)
stoploss = input.float(5, "Stop Loss", minval = 1, step = 1)/100
takeprofit1 = input(title='Take Profit On/Off?', defval=true)
takeprofit = input.float(10, "Take Profit", minval = 1, step = 1)/100

_2 = input(false, '──────── WT CROSS SETTINGS ────────')

wtcross = input(title='WT Cross On/Off?', defval=true)
wtcross2 = input(title='Change WT Cross Method ( If WT Cross ON )', defval=false)

/// WT CROSS ///

n1 = input(10, 'Channel Length')
n2 = input(21, 'Average Length')

ap = hlc3
esa = ta.ema(ap, n1)
r = ta.ema(math.abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * r)
tci = ta.ema(ci, n2)

wt1 = tci
wt2 = ta.sma(wt1, 4)

/// WT CROSS ///

/// HULL TREND WITH KAHLMAN ///

_3 = input(false, '──────── HULLMA SETTINGS ────────')

srchull = input(hl2, 'Source')
lengthhull = input(24, 'Lookback')
gain = input(10000, 'Gain')
kh = input(true, 'Use Kahlman')

hma(_srchull, _lengthhull) =>
    ta.wma((2 * ta.wma(_srchull, _lengthhull / 2)) - ta.wma(_srchull, _lengthhull), math.round(math.sqrt(_lengthhull)))

hma3(_srchull, _lengthhull) =>
    p = lengthhull / 2
    ta.wma(ta.wma(close, p / 3) * 3 - ta.wma(close, p / 2) - ta.wma(close, p), p)

kahlman(x, g) =>
    kf = 0.0
    dk = x - nz(kf[1], x)
    smooth = nz(kf[1], x) + dk * math.sqrt(g / 10000 * 2)
    velo = 0.0
    velo := nz(velo[1], 0) + g / 10000 * dk
    kf := smooth + velo
    kf

a = kh ? kahlman(hma(srchull, lengthhull), gain) : hma(srchull, lengthhull)
b = kh ? kahlman(hma3(srchull, lengthhull), gain) : hma3(srchull, lengthhull)
c = b > a ? color.lime : color.red
crossdn = a > b and a[1] < b[1]
crossup = b > a and b[1] < a[1]

p1hma = plot(a, color=c, linewidth=1, title='Long Plot', transp=75)
p2hma = plot(b, color=c, linewidth=1, title='Short Plot', transp=75)
fill(p1hma, p2hma, color=c, title='Fill', transp=55)

/// HULL TREND WITH KAHLMAN ///

/// DATE ///

_4 = input(false, '───────── DATE SETTINGS ─────────')

FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=999, title='From Year', minval=999)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=999)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() =>
    time >= start and time <= finish ? true : false

/// DATE ///

/// LONG/SHORT CONDITION ///

longCondition = crossup and ta.crossover(wt1,wt2)
longCondition1 = crossup
longCondition2 = crossup and wt1 > wt2

if (wtcross == true ? longCondition : wtcross == false ? longCondition1:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long")
else if (wtcross2 == true ? longCondition2 : wtcross2 == false ? longCondition:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long")
    
shortCondition = crossdn and ta.crossunder(wt1,wt2)
shortCondition1 = crossdn
shortCondition2 = crossdn and wt1 < wt2

if (wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na)
    strategy.entry("SHORT", strategy.short, when=window(), comment="Enter Short")
else if (wtcross2 == true ? shortCondition2 : wtcross2 == false ? shortCondition:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Short")

/// LONG/SHORT CONDITION ///

/// CLOSE STRATEGY ///

strategy.close("LONG", when=wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na, comment = "Close Long")
strategy.close("SHORT", when=wtcross == true ? longCondition : wtcross == false ? longCondition1:na, comment = "Close Short")

/// EXIT STRATEGY ///

strategy.exit("LONG", when=strategy.position_size > 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 - stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 + takeprofit):na, comment="Exit Long")
strategy.exit("SHORT", when=strategy.position_size < 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 + stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 - takeprofit):na, comment ="Exit Short")

/// LONG SL/TP LINE ///

plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 - stoploss) : na, title='Long Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr)
plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + takeprofit) : na, title='Long Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr)

/// LONG SL/TP LINE ///

/// SHORT SL/TP LINE ///

plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 + stoploss) : na, title='Short Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - takeprofit) : na, title='Short Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr)

/// SHORT SL/TP LINE ///


더 많은