이 전략은 주로 헐 이동 평균과 WT 지표의 교차 신호를 결합하여 각 지표의 장점을 활용하여 트렌드 판단과 진입 시기를 선택하는 데 더 정확한 결정을 내립니다.
이 전략은 주로 헐 이동 평균과 WT 지표의 교차 신호로 구성된다.
헐 이동 평균 부분, 단기 및 장기 헐 MA를 계산하고 색을 채우며 트렌드 방향을 판단한다. 계산 공식은 다음과 같다:
단기 hull MA = WMA*WMA(n/2) - WMA(n), sqrt(n))
장기적인 Hull MA = WMA(WMA(n/3)*3 - WMA(n/2), n/2)
WMA는 중화 이동 평균이다. 단기선에서 장기선을 통과할 때 포지션 신호, 그렇지 않으면 낙하 신호이다.
WT 지표 부분, WT 지표의 다공간 평균선을 계산하고 평균선의 교차 상황을 관찰하여 진출을 판단한다. 계산 공식은 다음과 같다.
TCI = (Close - EMA(Close,n1)) / (k * STD(Close - EMA(Close,n1),n1))
WT1 = EMA(TCI,n2)
WT2 = SMA(WT1,m)
여기서 TCI는 트렌드 컴포지트 인덱스 (Trend Composite Index) 로, 가격과 통로 중선 EMA의 편차 정도를 반영한다. WT1은 TCI의 EMA 평준화 값이다. WT2는 WT1의 SMA 값이다. m는 일반적으로 4을 다. WT1 위에 WT2를 뚫을 때 다단 신호이며, WT1 아래에 WT2를 뚫을 때 공백 신호이다.
합성 Hull MA의 트렌드 판단과 WT 지표의 교차 신호는, 트렌드 방향이 맞다는 전제 조건으로 진입할 수 있다.
이 전략은 Hull MA와 WT 지표의 장점을 통합하여 다음과 같은 장점을 가지고 있다:
Hull MA는 이동 평균을 계산하는 방법을 수정하여 가격 변화의 흐름을 더 빨리 포착하고, 시장 소음을 효과적으로 제거하여 흐름을 정확하게 판단할 수 있다.
WT 지표는 채널 내의 가격 변동 특성을 활용하여 전환점을 빠르게 포착하여 보다 정확한 거래 신호를 발산한다.
이 둘을 결합하여 트렌드 판단과 교차 신호를 고려하여 트렌드 면의 힘과 동시에 위험을 제어 할 수 있습니다.
헐 MA 평준화 파라미터와 WT 지표 파라미터 모두 사용자 정의 가능하며, 다양한 품종 특성과 거래 선호도에 따라 조정 및 최적화 할 수 있다.
Hull MA 또는 WT 지표의 교차 신호를 개별적으로 사용할 수 있으며, 트렌드 추적 및 교차 검증을 고려하여 사용할 수 있습니다.
스톱로스 스톱 전략을 설정하여 단일 거래의 위험을 효과적으로 제어할 수 있다.
이 전략에는 다음과 같은 몇 가지 위험이 있습니다.
헐 MA와 WT 지표는 가격에 대해 어느 정도 흐릿하게 처리하고 있으며, 약간의 지연이 있을 수 있으며, 입시 시기는 정확하지 않습니다.
WT 지표는 여러 개의 뒷면과 허공의 뒷면과 같은 가짜 신호를 쉽게 생성할 수 있으며, 트렌드 판단과 결합되지 않으면 거래 위험을 증가시킬 수 있습니다.
변수 설정이 잘못되면 거래 결과에 영향을 미치며, 품종 특성에 따라 지속적인 테스트 및 최적화가 필요합니다.
동향이 흔들릴 때, 정지 손실은 종종 발생하여 거래에 손실이 발생할 수 있습니다.
위험 대응은 다음과 같은 방법으로 최적화되고 개선될 수 있습니다.
헐 MA와 WT 파라미터를 조정하여 최적의 균형점을 찾습니다. 다른 지표가 헐 MA와 결합되어 사용되기도 합니다.
트렌드를 판단하는 메커니즘을 추가하여 WT 지표가 명확한 트렌드가 없을 때 잘못된 신호를 피하십시오.
피드백과 시뮬레이션 거래를 사용하여 최적의 변수를 찾아내고, 합리적인 스톱 손실 범위를 설정한다.
트렌드가 불투명할 때, 포지션 규모를 줄이거나 일시적으로 거래하지 마십시오.
이 전략은 다음과 같은 방향으로 더 개선될 수 있습니다.
다른 이동 평균과 WT 지표 조합을 테스트하여 더 나은 균형점을 찾습니다. KAMA, TEMA 등.
다른 지표 판단을 추가하여 의사 결정의 정확성을 향상시킵니다.
최적화 매개 변수 설정, 피드백 및 시뮬레이션을 통해 최적의 매개 변수 조합을 찾는다. 매개 변수 최적화 프로그램을 구축하여 최적의 매개 변수를 빠르게 찾는다.
이동식 스톱, 진동식 스톱, 근접식 스톱, 원격식 스톱 등의 스톱 전략을 최적화하여 스톱이 유발될 확률을 낮출 수 있다.
포지션 관리 전략을 최적화하고, 트렌드가 불확실할 때 거래 빈도와 포지션 크기를 적극적으로 줄여서 위험을 줄이십시오.
기계 학습과 같은 첨단 기술을 추가하여 더 지능적인 거래 의사결정과 변수 적응을 가능하게 합니다.
이 전략은 총체적인 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 ///