Strategi Dagangan Berdasarkan Hull Moving Average dan WT Cross

Penulis:ChaoZhang, Tarikh: 2023-09-26 20:00:32
Tag:

Ringkasan

Strategi ini terutamanya menggabungkan Hull Moving Average dan WT cross signal untuk memanfaatkan kelebihan setiap penunjuk untuk penilaian trend yang lebih tepat dan masa kemasukan.

Logika Strategi

Strategi ini terdiri daripada Hull Moving Average dan WT cross signal.

Bahagian Hull Moving Average mengira Hull MAs jangka pendek dan jangka panjang dan mengisi warna untuk menentukan arah trend.

Short Hull MA = WMA ((2*WMA ((n/2) - WMA ((n), sqrt ((n))

Long Hull MA = WMA(WMA(n/3) *3 - WMA(n/2), n/2)

Di mana WMA adalah Purata Bergerak Bertimbang. Apabila MA pendek melintasi MA panjang, ia adalah isyarat kenaikan, sebaliknya isyarat penurunan.

Bahagian WT mengira garis WT dan memerhatikan persimpangan mereka untuk menentukan entri.

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

WT1 = EMA(TCI,n2)

WT2 = SMA(WT1,m)

Di mana TCI adalah Indeks Komposit Trend, yang mencerminkan penyimpangan harga dari EMA; WT1 adalah EMA TCI, WT2 adalah SMA WT1, m biasanya 4. Persalinan WT1 ke atas WT2 menunjukkan isyarat kenaikan, sementara penyambungan WT1 di bawah WT2 menunjukkan isyarat penurunan.

Dengan menggabungkan penilaian trend Hull MA dan isyarat persimpangan WT, kita boleh memasuki pasaran ke arah yang betul.

Analisis Kelebihan

Kelebihan strategi ini ialah:

  1. Hull MA menangkap perubahan harga lebih cepat dengan mengubah suai pengiraan, dan menapis bunyi pasaran dengan berkesan untuk penilaian trend yang boleh dipercayai.

  2. WT menggunakan turun naik harga dalam saluran untuk menangkap titik perubahan dengan cepat dan menghasilkan isyarat perdagangan yang agak tepat.

  3. Gabungan ini mempertimbangkan kedua-dua trend dan persimpangan untuk kawalan risiko yang lebih baik apabila trend sejajar.

  4. Parameter Hull MA dan WT boleh disesuaikan untuk penyesuaian dan pengoptimuman berdasarkan ciri simbol dan keutamaan perdagangan.

  5. Isyarat Hull MA dan WT boleh digunakan secara berasingan atau bersama-sama untuk kedua-dua trend mengikuti dan penyeberangan pengesahan.

  6. Stop loss dan mengambil keuntungan boleh ditetapkan untuk mengawal risiko perdagangan tunggal dengan berkesan.

Analisis Risiko

Risiko utama strategi ini ialah:

  1. Kedua-dua Hull MA dan WT menyelaraskan harga hingga tahap tertentu, yang mungkin menyebabkan isyarat masuk yang tertinggal.

  2. WT boleh menghasilkan isyarat divergensi bullish/bearish palsu tanpa trend yang jelas.

  3. Tetapan parameter yang tidak sesuai boleh memberi kesan kepada prestasi perdagangan dan memerlukan pengoptimuman berterusan.

  4. Stop loss boleh diaktifkan dengan kerap semasa penyatuan trend, menyebabkan beberapa kerugian.

Risiko boleh ditangani dan dioptimumkan seperti berikut:

  1. Sesuaikan parameter Hull MA dan WT untuk mencari keseimbangan yang optimum.

  2. Tambah mekanisme pengesahan trend untuk mengelakkan isyarat WT palsu tanpa trend yang disahkan.

  3. Mengoptimumkan parameter melalui backtesting dan perdagangan demo, dan menetapkan julat stop loss yang munasabah.

  4. Mengurangkan saiz kedudukan atau berhenti berdagang apabila trend tidak jelas.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dari aspek berikut:

  1. Uji purata bergerak yang berbeza digabungkan dengan WT, untuk mencari keseimbangan yang lebih baik, contohnya KAMA, TEMA dll.

  2. Tambah penunjuk lain seperti osilator, Bollinger Bands untuk meningkatkan ketepatan keputusan.

  3. Mengoptimumkan parameter melalui backtesting dan perdagangan demo. Membina program pengoptimuman parameter untuk penyesuaian pantas.

  4. Mengoptimumkan strategi stop loss e.g. trailing stop, volatility-based stop, bergerak dari dekat ke jauh dan lain-lain, untuk mengurangkan pencetus yang tidak diingini.

  5. Mengoptimumkan strategi saiz kedudukan, mengurangkan saiz dan kekerapan dalam trend yang tidak jelas untuk mengurangkan risiko.

  6. Memperkenalkan pembelajaran mesin dan teknik canggih lain untuk keputusan perdagangan yang lebih pintar dan parameter penyesuaian.

Ringkasan

Strategi ini menggabungkan kekuatan pelunturan MA Hull dan persimpangan WT untuk kedua-dua penghakiman trend dan pengesahan. Perdagangan dengan arah yang disahkan membantu mengawal risiko. Penambahbaikan lanjut boleh dibuat pada pengoptimuman parameter, strategi stop loss, ukuran kedudukan dll. Mengintegrasikan penunjuk lain dan teknik pintar juga merupakan arah pengoptimuman masa depan. Secara keseluruhan, ini adalah trend praktikal yang mengikuti strategi dengan kesederhanaan, kebolehpercayaan dan kemudahan pengoptimuman.


/*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 ///


Lebih lanjut