
Strategi ini menggunakan indikator WaveTrend untuk menilai tren harga dan overbought oversold, digabungkan dengan indikator RSI untuk memfilter sinyal, menggunakan metode pelacakan tren, dan melakukan operasi terbalik pada posisi overbought oversold.
Strategi ini menggunakan indikator WaveTrend untuk menentukan arah tren harga. Indikator WaveTrend didasarkan pada peningkatan indikator Rainbow untuk menentukan arah tren harga dengan menghitung perbedaan antara garis rata-rata Heikin-Ashi dan nilai mutlak harga.
Secara khusus, formula WaveTrend dalam strategi adalah:
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)
Di antaranya, esa adalah rata-rata Heikin-Ashi yang dihitung, d adalah rata-rata perbedaan antara rata-rata Heikin-Ashi dan nilai mutlak harga.
Indikator RSI digunakan untuk menilai overbought dan oversold. RSI dalam kode memiliki rumus:
rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))
Nilai standarnya adalah 0-100, di atas 70 adalah zona over-buy, di bawah 30 adalah zona over-sell.
Kombinasi kedua indikator ini, ketika RSI di bawah 25, WaveTrend di bawah -60 adalah zona oversold, sinyal plus; ketika RSI di atas 75, WaveTrend di atas 60 adalah zona oversold, sinyal short.
Strategi ini memiliki keuntungan sebagai berikut:
Strategi ini juga memiliki beberapa risiko:
Tanggapan:
Strategi ini dapat dioptimalkan dari beberapa arah:
Mengganti atau menambahkan indikator penilaian untuk mengoptimalkan akurasi sinyal. Misalnya, menambahkan indikator penilaian seperti MACD, KD.
Pengaturan parameter yang dioptimalkan untuk varietas perdagangan yang berbeda. Misalnya, menyesuaikan siklus smoothing untuk menemukan kombinasi parameter yang optimal.
Bergabunglah dengan strategi tracking stop loss untuk mengontrol kerugian tunggal secara efektif. Misalnya, stop loss persentase saldo, stop loss bergerak, dll.
Pertimbangkan strategi penambahan lainnya. Misalnya, gunakan penambahan Martingale sebagai pengganti jumlah tetap yang telah ditetapkan.
Mengoptimalkan parameter rentang adaptasi, mencari parameter optimal untuk meningkatkan akurasi penilaian.
Strategi ini memiliki pemikiran yang jelas, menggunakan indikator volatilitas untuk menilai tren harga, dan memfilter sinyal perdagangan noise secara efektif. Strategi memiliki ruang untuk dioptimalkan, dapat diperbaiki dari berbagai sudut, sehingga strategi lebih stabil dan dapat diandalkan. Optimalisasi dapat disesuaikan dengan berbagai jenis perdagangan melalui penyesuaian parameter, layak untuk diuji lebih lanjut untuk verifikasi di lapangan.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//2018
//@version=2
strategy(title = "Noro's WaveTrender Strategy v1.0", shorttitle = "WaveTrender str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
showarr = input(true, defval = true, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
//RSI
rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))
//WaveTrend
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)
//Body
body = abs(close - open)
abody = sma(body, 10)
//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overs = rsi < 25 and wt < -60
overb = rsi > 75 and wt > 60
up1 = (strategy.position_size == 0 or close < strategy.position_avg_price) and overs and bar == -1
dn1 = (strategy.position_size == 0 or close > strategy.position_avg_price) and overb and bar == 1
exit = (strategy.position_size > 0 and overs == false) or (strategy.position_size < 0 and overb == false)
//Arrows
col = exit ? black : up1 or dn1 ? blue : na
needup = up1
needdn = dn1
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)
//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]
if up1
if strategy.position_size < 0
strategy.close_all()
strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)
if dn1
if strategy.position_size > 0
strategy.close_all()
strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)
if exit
strategy.close_all()