Strategi tren berdasarkan rasio volume


Tanggal Pembuatan: 2023-09-14 19:53:55 Akhirnya memodifikasi: 2023-09-14 19:53:55
menyalin: 3 Jumlah klik: 713
1
fokus pada
1617
Pengikut

Dalam artikel ini, kita akan membahas strategi kuantitatif untuk menentukan arah tren berdasarkan rasio volume transaksi. Strategi ini menghasilkan sinyal beli dan jual dengan menghitung rata-rata volume transaksi kosong.

  1. Prinsip Strategi

Indikator utama dari strategi ini adalah volume transaksi. Langkah-langkah perhitungan spesifiknya adalah sebagai berikut:

  1. Menghitung volume transaksi pada hari tersebut.

  2. Jika K dianggap sebagai multihead, maka volume transaksi ditulis sebagai volume transaksi multi-head (Bull Volume).

  3. Jika garis K dianggap kosong, volume transaksi dicatat sebagai volume transaksi di sisi kosong (Bear Volume).

  4. Perhitungan rata-rata bergerak dari jumlah transaksi multi dan kosong.

  5. Ketika banyak pihak bergerak di atas rata-rata rata-rata bergerak yang melintasi, menghasilkan sinyal beli; sebaliknya menghasilkan sinyal jual.

  6. Selain itu, ada juga penyaringan melalui indikator tingkat perubahan harga, yang hanya diperdagangkan ketika ada tren harga yang jelas.

  7. Stop Loss Stop Point diatur berdasarkan sinyal untuk mengunci keuntungan.

Dengan cara ini, arah tren dapat ditentukan melalui proporsi kosong dari volume transaksi, ditambah dengan penyaringan dengan indikator tingkat perubahan harga, yang dapat meningkatkan kualitas sinyal. Pengaturan Stop Loss Stop Stop juga membuat kerugian yang dapat dikontrol dari setiap transaksi.

Kedua, keunggulan strategi

Keuntungan terbesar dari strategi ini adalah penggunaan volume transaksi untuk menentukan arah tren, yang merupakan salah satu metode dasar untuk menentukan tren. Volume transaksi dapat mencerminkan perilaku peserta pasar.

Selain itu, indikator volume transaksi juga dapat mencerminkan sinyal terobosan lebih awal, lebih sensitif. Dibandingkan dengan hanya menggunakan indikator harga, indikator volume transaksi dapat menangkap perubahan tren lebih awal.

Terakhir, penyaringan dengan indikator perubahan harga juga meningkatkan kualitas sinyal.

Ketiga, potensi risiko

Meskipun ada beberapa keuntungan dari strategi ini, risiko yang harus diperhatikan dalam real-time trading adalah:

Pertama, berhati-hatilah dalam mengatur parameter indikator lalu lintas untuk menghindari sinyal palsu.

Kedua, mengandalkan satu indikator saja mudah untuk menembus harga yang tidak valid. Kombinasi berbagai indikator harus diverifikasi.

Akhirnya, setting stop loss terlalu dekat dapat menyebabkan risiko terobosan stop loss.

Empat isi, ringkasan

Artikel ini menjelaskan strategi kuantitatif yang memanfaatkan rasio volume transaksi untuk menilai tren. Strategi ini dapat menghasilkan sinyal perdagangan dengan menghitung rata-rata volume transaksi kosong. Strategi ini memiliki keunggulan tertentu, tetapi juga perlu diverifikasi dengan indikator lain. Selain itu, pengaturan parameter yang tepat dan manajemen dana yang ketat adalah kunci kelayakan. Secara keseluruhan, strategi ini memberikan cara berpikir yang unik untuk menilai tren volume transaksi, tetapi perlu disempurnakan lebih lanjut.

Kode Sumber Strategi
/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Based on Volume Flow v3 indicator by oh92
strategy("Volume Flow BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// 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
    
maType =    input(title="Moving Average Type", options=["Simple", "Exponential", "Double Exponential"], defval="Simple")
length =    input(6, title="MA Length")
x      =    input(3.1, title="Factor For Breakout Candle")

// Basic Volume Calcs //
vol  =  volume
bull =  close>open?vol:0 
bear =  open>close?vol:0

// Double EMA Function //
dema(src, len) => (2 * ema(src, len) - ema(ema(src, len), len))

// BULL Moving Average Calculation
bullma = maType == "Exponential" ?        ema(bull, length) :
         maType == "Double Exponential" ? dema(bull, length) :
         sma(bull, length)

// BEAR Moving Average Calculation //
bearma = maType == "Exponential" ?        ema(bear, length) :
         maType == "Double Exponential" ? dema(bear, length) :
         sma(bear, length)

///////////// 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 = bullma > bearma and isMoving()
short = bullma < bearma 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 /////////////
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) 
plot(bullma, color=color.lime, linewidth=1, transp=0, title="Bull MA", transp=10)
plot(bearma, color=color.red, linewidth=1, transp=0, title="Bear MA", transp=10)