Strategi Harga Julat Relatif

Penulis:ChaoZhang, Tarikh: 2023-12-28 17:54:44
Tag:

img

Ringkasan

Strategi harga jumlah relatif adalah strategi perdagangan kuantitatif berdasarkan jumlah dagangan yang tidak normal dan turun naik harga. Strategi ini membandingkan jumlah dagangan semasa dengan purata sejarah untuk menentukan sama ada jumlah dagangan tidak normal. Ia juga menggabungkan selang jangkauan sebenar purata untuk menentukan sama ada harga agak stabil. Apabila jumlah dagangan meningkat secara tidak normal dan harga agak stabil, ia dianggap sebagai isyarat kemasukan.

Prinsip Strategi

Logik teras strategi harga jumlah relatif adalah berdasarkan dua petunjuk untuk penilaian: jumlah dagangan relatif dan julat turun naik harga.

Pertama, kita mengira purata bergerak sederhana jumlah dagangan selama 20 tempoh terakhir sebagai jumlah dagangan purata sejarah. Kemudian kita menetapkan parameter berganda (seperti 1.5 kali). Apabila jumlah dagangan semasa lebih besar daripada 1.5 kali jumlah dagangan purata, kita menganggap jumlah dagangan adalah tidak normal dan tergolong dalam keadaan volume relatif.

Kedua, kita mengira julat sebenar purata (ATR) selama 14 tempoh terakhir sebagai ukuran turun naik harga. Pada masa yang sama, kita mengira penyimpangan standard turun naik purata. Jika turun naik sebenar semasa adalah antara purata tambah atau tolak satu penyimpangan standard, kita menganggap turun naik harga berada dalam julat yang agak stabil.

Apabila kedua-dua syarat di atas dipenuhi pada masa yang sama, isyarat panjang dikeluarkan untuk membuka kedudukan panjang. Semasa tempoh pegangan, dua kali ATR digunakan sebagai tahap stop loss, dan harga tertinggi dikurangkan dua kali ATR digunakan sebagai tahap mengambil keuntungan.

Analisis Kelebihan

Kelebihan terbesar strategi harga jumlah relatif ialah ia menangkap trend harga yang disebabkan oleh jumlah dagangan yang tidak normal. Apabila jumlah dagangan meningkat, ia mewakili perubahan dalam sikap peserta pasaran, yang sering menandakan pecah harga dan pembentukan trend baru. Dengan membandingkan hubungan antara jumlah dagangan dan purata sejarah, strategi dapat menentukan tepat masa jumlah dagangan yang tidak normal.

Di sisi lain, strategi ini juga mempertimbangkan kadar turun naik, supaya isyarat berlaku semasa tempoh harga yang agak stabil. Ini mengelakkan risiko kerugian yang besar yang disebabkan oleh mengejar tinggi semasa turun naik yang ganas. Ia juga meningkatkan peluang keuntungan kerana trend biasanya mula pecah selepas kestabilan relatif.

Analisis Risiko

Risiko terbesar strategi ini adalah bahawa penunjuk jumlah dagangan tidak boleh 100% pasti dengan trend baru. Lonjakan dalam jumlah dagangan boleh menjadi pecah palsu dan harga berbalik dengan cepat. Dalam kes sedemikian, strategi mengalami kerugian yang lebih besar.

Untuk mengurangkan kerugian, sesuaikan parameter volume relatif dan tetapkan kriteria yang lebih ketat untuk menilai jumlah dagangan yang tidak normal.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Tambahkan penunjuk lain untuk penilaian, seperti nisbah perubahan, perolehan, dan lain-lain, untuk menjadikan isyarat jumlah dagangan yang tidak normal lebih boleh dipercayai.

  2. Parameter ATR boleh dioptimumkan untuk stok yang berbeza untuk menentukan julat harga yang stabil dengan lebih tepat.

  3. Tambah algoritma pembelajaran mesin untuk menilai secara aktif jumlah dagangan yang tidak normal, bukan hanya perbandingan sederhana dengan purata sejarah.

  4. Gunakan model pembelajaran mendalam untuk meramalkan turun naik harga, bukan hanya berdasarkan ATR sejarah.

Kesimpulan

Strategi harga jumlah relatif menangkap jumlah dagangan yang tidak normal sebagai isyarat ciri dan menggabungkan penilaian kestabilan harga untuk mengeluarkan isyarat dagangan. Strategi ini mudah dan praktikal, dan berfungsi dengan baik dalam mengesan jumlah dagangan saham yang tidak normal.


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


Lebih lanjut