
Strategi ini menggunakan sudut cerun rata-rata untuk menentukan arah trend, digabungkan dengan penunjuk kadar perubahan harga, untuk melakukan perdagangan dua hala yang panjang dan pendek. Inti dari strategi ini adalah untuk menentukan trend harga menggunakan sudut cerun rata-rata, dan strategi pemantauan trend yang disesuaikan dengan penunjuk kadar perubahan harga.
Strategi ini berdasarkan kepada indikator-indikator berikut:
Sudut garis purata: untuk menentukan arah trend harga dengan mengira sudut kemiringan garis purata Jurik dan purata bergerak indeks. Sudut yang lebih besar daripada 0 adalah tren naik, dan lebih kecil daripada 0 adalah tren turun.
Kadar perubahan harga: Mengira kadar perubahan harga penutupan 12 baris K terkini, menapis isyarat tidak berkesan melalui turun naik.
Apabila sudut garisan rata ke atas (<=0) dan kadar perubahan harga memenuhi syarat, buat lebih banyak; apabila sudut garisan rata ke bawah (<=0) dan kadar perubahan harga memenuhi syarat, buat kosong.
Khususnya, strategi pertama mengira sudut kemerosotan garis rata-rata Jurik dan EMA. Kemudian, ia mengira petunjuk kadar perubahan harga untuk digunakan dalam tempoh penyaringan. Ia menghasilkan isyarat perdagangan apabila sudut rata-rata menunjukkan trend dan kadar perubahan harga memenuhi syarat.
Strategi ini mempunyai kelebihan berikut:
Kaedah ini sangat dipercayai untuk menilai trend dengan menggunakan garis rata-rata dan mempunyai kadar kemenangan yang tinggi.
Penunjuk kadar perubahan harga boleh menapis turun naik dengan berkesan untuk mengelakkan perdagangan yang tidak berkesan.
Jurik bertindak balas dengan cepat terhadap penembusan, dan EMA memberikan penilaian trend yang stabil, yang saling melengkapi.
Menggunakan kaedah perdagangan dua hala yang panjang dan pendek, anda boleh menangkap lebih banyak mata wang dalam keadaan trend.
Strategi ini mempunyai beberapa risiko:
Pada masa harga bergoyang-goyang, garis purata mempunyai kemungkinan besar untuk menghasilkan isyarat yang salah. Risiko ini dapat dikurangkan dengan parameter pengoptimuman.
Sinyal linear yang sama mungkin sering bertukar ketika memasuki persediaan, menghasilkan terlalu banyak perdagangan yang tidak perlu. Syarat penapisan tambahan boleh dimasukkan untuk mengurangkan perdagangan yang tidak sah.
Apabila berlaku peristiwa yang tidak dijangka yang menyebabkan harga melambung tinggi, stop loss boleh ditembusi dan titik stop loss boleh dikurangkan dengan sewajarnya.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Mengoptimumkan parameter rata-rata, mencari kombinasi parameter terbaik, meningkatkan kestabilan strategi.
Meningkatkan syarat penapisan seperti kadar turun naik, jumlah transaksi, dan seterusnya mengurangkan perdagangan yang tidak sah.
Ia juga boleh digunakan untuk menentukan titik henti, dan ia juga boleh digunakan untuk menentukan titik henti, dan ia juga boleh digunakan untuk menentukan titik henti.
“Kami akan terus berusaha untuk meningkatkan kualiti dan kualiti pelaburan kami”, kata beliau.
Strategi ini secara keseluruhan adalah strategi trend pengesanan yang sangat praktikal. Ia menggunakan kecenderungan rata-rata yang sangat dipercayai untuk menentukan trend, dan indikator kadar perubahan harga dapat menapis isyarat yang tidak berkesan.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Based on ma angles code by Duyck which also uses Everget Jurik MA calulation and angle calculation by KyJ
strategy("Trend Angle BF", overlay=false)
/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
src=input(ohlc4,title="source")
// definition of "Jurik Moving Average", by Everget
jma(_src,_length,_phase,_power) =>
phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
alpha = pow(beta, _power)
jma = 0.0
e0 = 0.0
e0 := (1 - alpha) * _src + alpha * nz(e0[1])
e1 = 0.0
e1 := (_src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
jma := e2 + nz(jma[1])
//// //// Determine Angle by KyJ //// ////
angle(_src) =>
rad2degree=180/3.14159265359 //pi
ang=rad2degree*atan((_src[0] - _src[1])/atr(14))
jma_line=jma(src,10,50,1)
ma=ema(src,input(56))
jma_slope=angle(jma_line)
ma_slope=angle(ma)
///////////// Rate Of Change /////////////
source = close
roclength = input(12, minval=1)
pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// Strategy ///////////////
long = ma_slope>=0 and isMoving()
short = ma_slope<=0 and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("Long", strategy.long, when=long)
strategy.entry("Short", strategy.short, when=short)
strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
///////////// Plotting /////////////
hline(0, title='Zero line', color=color.purple, linewidth=1)
plot(ma_slope,title="ma slope", linewidth=2,color=ma_slope>=0?color.lime:color.red)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)