
Strategi harga relatif adalah strategi perdagangan kuantitatif yang berdasarkan pada keabnormalan jumlah transaksi dan turun naik harga. Strategi ini menilai apakah jumlah transaksi adalah luar biasa dengan membandingkan hubungan jumlah transaksi semasa dengan jumlah transaksi rata-rata sejarah; dan, dalam kombinasi dengan julat gelombang sebenar rata-rata, menentukan apakah harga berada dalam julat yang agak stabil. Apabila jumlah transaksi meningkat secara luar biasa dan harga agak stabil, ia dianggap sebagai isyarat masuk.
Logik teras strategi harga relatif adalah berdasarkan dua petunjuk, satu adalah jumlah dagangan relatif dan satu adalah julat turun naik harga.
Pertama, kita mengira purata bergerak sederhana jumlah transaksi dalam 20 kitaran terakhir, sebagai purata sejarah. Kemudian, kita menetapkan parameter perkalian (seperti 1.5 kali ganda), yang mana apabila jumlah transaksi semasa lebih besar daripada 1.5 kali ganda daripada jumlah transaksi rata-rata, kita menganggap jumlah transaksi yang luar biasa, yang tergolong dalam keadaan yang lebih kecil daripada jumlah transaksi yang lebih kecil.
Kedua, kita mengira purata true amplitude ((ATR) untuk 14 kitaran terakhir sebagai ukuran pergerakan harga. Di samping itu, kita mengira perbezaan piawai bagi purata true amplitude. Jika purata true amplitude semasa berada di antara nilai purata positif dan negatif satu perbezaan piawai, kita menganggap pergerakan harga berada dalam julat yang agak rata.
Apabila kedua-dua syarat di atas dipenuhi pada masa yang sama, iaitu mengeluarkan banyak isyarat, membuka lebih banyak kedudukan. Semasa memegang kedudukan, tolak ATR sebanyak dua kali ganda sebagai titik berhenti, tolak ATR sebanyak dua kali ganda sebagai titik berhenti.
Kelebihan terbesar strategi harga relatif adalah menangkap trend harga yang disebabkan oleh jumlah transaksi yang luar biasa. Apabila jumlah transaksi meningkat, ia mewakili perubahan sikap peserta pasaran, yang sering menandakan penembusan harga dan pembentukan trend baru. Strategi ini dapat menilai dengan berkesan ketika jumlah transaksi yang tidak normal dengan membandingkan hubungan jumlah transaksi dengan nilai purata sejarah.
Di sisi lain, strategi ini juga mengambil kira kadar turun naik harga, supaya isyarat berlaku pada masa harga relatif stabil. Ini mengelakkan risiko kerugian yang besar yang disebabkan oleh mengejar tinggi ketika turun naik yang kuat.
Risiko terbesar strategi ini adalah bahawa indikator jumlah dagangan tidak dapat menentukan trend baru seratus peratus, lonjakan jumlah dagangan mungkin menjadi pemecahan palsu, dan harga akan berbalik dengan cepat. Dalam kes ini, strategi vrfs mengalami kerugian yang lebih besar.
Untuk mengurangkan kerugian, anda boleh menyesuaikan parameter yang berkaitan dengan kuantiti yang sesuai, menetapkan kriteria yang lebih ketat untuk menilai keabnormalan jumlah urus niaga. Atau menambah petunjuk penghakiman lain, seperti menambah analisis jumlah urus niaga, untuk menentukan sama ada pertumbuhan jumlah urus niaga sepadan dengan jumlah urus niaga.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Menambah penilaian indikator lain, seperti kenaikan dan turun, jumlah transaksi, dan lain-lain, menjadikan isyarat ketidaksuburan perdagangan lebih dipercayai.
Parameter ATR boleh dioptimumkan untuk saham yang berbeza, lebih tepat menentukan julat kestabilan harga.
Menambah algoritma pembelajaran mesin untuk membuat penilaian positif terhadap kecacatan dalam jumlah dagangan, dan bukan sekadar membandingkan dengan purata sejarah.
Menggunakan model pembelajaran mendalam untuk membuat ramalan pergerakan harga, bukan hanya berdasarkan ATR sejarah.
Strategi harga relatif menghantar isyarat perdagangan dengan menangkap kecacatan jumlah dagangan sebagai isyarat ciri, digabungkan dengan penghakiman kestabilan harga. Strategi ini mudah dan praktikal, lebih berkesan dalam mengesan jumlah dagangan saham yang tidak normal. Tetapi ada risiko isyarat palsu, perlu mengoptimumkan lagi indikator untuk meningkatkan kesesuaian.
/*backtest
start: 2022-12-21 00:00:00
end: 2023-12-27 00:00:00
period: 1d
basePeriod: 1h
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/
// © DojiEmoji (kevinhhl)
//@version=4
strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
len_volat = input(14,title="Length of ATR to determine volatility")
ATR_volat = atr(len_volat)
avg_ATR_volat = sma(ATR_volat, len_volat)
std_ATR_volat = stdev(ATR_volat, len_volat)
// }
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Signals for entry {
_avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)"))
_relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float)
__lowerOfOpenClose = min(open,close)
_wickRatio_lower = (__lowerOfOpenClose - low) / (high - low)
entry_signal1 = volume > _relative_vol
entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat
// }
alert_per_bar(msg)=>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")"
alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)
// MAIN:
if within_timeframe
if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
alert_per_bar("TSL raised to " + tostring(stop_loss_price))
// EXIT :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // placed before entry, will re-enter if stopped out
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
if strategy.position_size > 0 and TSL_source <= stop_loss_price
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if entry_signal1 and entry_signal2// and entry_signal3
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
// CLEAN UP:
if strategy.position_size == 0
stop_loss_price := float(0)