Strategi Dagangan Kuantitatif OBV dan MACD yang diubah

Penulis:ChaoZhang, Tarikh: 2023-11-15 17:58:42
Tag:

img

Ringkasan

Strategi ini menggunakan perubahan Volume On Balance (OBV) dan MACD untuk menjana isyarat dagangan. Ia menggabungkan indeks harga MACD dan OBV yang diubah sebagai penunjuk komprehensif untuk jumlah dan harga, bertujuan untuk menangkap peluang dagangan apabila harga dan kekuatan jumlah pecah.

Logika Strategi

  1. Mengira purata bergerak mudah (SMA) untuk menentukan trend pasaran.

  2. Mengira OBV yang diubah. Ia mengubahsuai pengiraan OBV berdasarkan harga dekat dan hubungan harga dekat sebelumnya untuk menjadikan OBV lebih sensitif.

  3. Mengira MACD pada OBV yang diubah. MACD terdiri daripada garisan pantas, garisan perlahan dan histogram untuk mengenal pasti perubahan momentum jumlah.

  4. Apabila MACD melintasi emas dan naik, isyarat beli dihasilkan.

  5. Apabila MACD mati dan turun, isyarat jual dicetuskan.

  6. Periksa SMA untuk mengelakkan perdagangan yang tidak perlu semasa pasaran tanpa trend.

Analisis Kelebihan

  1. OBV yang diubah lebih sensitif untuk menangkap perubahan jumlah awal.

  2. MACD dengan jelas menunjukkan perubahan momentum jumlah dan tahap utama.

  3. Jumlah dan harga gabungan isyarat meningkatkan ketepatan.

  4. SMA menapis isyarat palsu dengan menentukan trend pasaran.

  5. Logik strategi yang jelas dan ruang pengoptimuman yang besar.

Analisis Risiko

  1. OBV yang diubah boleh menghasilkan isyarat palsu, keperluan penapis dengan penunjuk lain.

  2. Tetapan parameter MACD yang tidak betul boleh terlepas perdagangan atau menyebabkan isyarat palsu.

  3. Perhatikan spesifikasi stok untuk mengelakkan kerugian.

  4. Memantau keadaan pasaran kerana strategi mungkin tidak berfungsi untuk senario khas.

  5. Risiko overfit backtest boleh membawa kepada prestasi yang lebih buruk dalam perdagangan langsung.

Arahan pengoptimuman

  1. Uji kombinasi tempoh SMA yang berbeza untuk mengoptimumkan penentuan trend pasaran.

  2. Uji parameter MACD untuk mengenal pasti perubahan momentum jumlah dengan lebih baik.

  3. Tambahkan penunjuk lain sebagai penapis, seperti KDJ, RSI dll.

  4. Tambah stop loss kepada had kerugian setiap perdagangan.

  5. Mengoptimumkan pengurusan wang untuk meningkatkan keuntungan keseluruhan.

  6. Perbezaan parameter ujian antara stok.

Kesimpulan

Strategi ini menggabungkan OBV dan MACD yang diubah untuk mencapai sintesis jumlah dan harga. Ia dapat menangkap perubahan momentum jumlah awal dan menghasilkan isyarat perdagangan. Berbanding dengan menggunakan OBV atau MACD sahaja, strategi ini memberikan peluang perdagangan yang lebih boleh dipercayai. Walau bagaimanapun, risiko isyarat palsu wujud dan pengoptimuman lebih lanjut pada penunjuk dan parameter, ditambah pengurusan wang diperlukan untuk mendapatkan keuntungan yang stabil dalam perdagangan langsung. Secara keseluruhan, strategi ini mempunyai logika yang jelas dan bernilai diuji dan dioptimumkan untuk meneroka potensinya.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-14 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/
// © stocktechbot

//@version=5
strategy("Altered OBV On MACD", overlay=true, margin_long=100, margin_short=100)

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © stocktechbot
//@version=5
//SMA Tredline
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
outthree = ta.sma(close, 9)
//sma plot
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
plot(out, color=color.blue, title="MA200", offset=offset)
plot(outf, color=color.maroon, title="MA50", offset=offset)
plot(outn, color=color.orange, title="MA90", offset=offset)
plot(outt, color=color.olive, title="MA21", offset=offset)
plot(outthree, color=color.fuchsia, title="MA9", offset=offset)

fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
chng = 0
obv = ta.cum(math.sign(ta.change(close)) * volume)
if close < close[1] and (open < close)
    chng := 1
else if close > close[1]
    chng := 1
else
    chng := -1
obvalt = ta.cum(math.sign(chng) * volume)
//src = input(title="Source", defval=close)
src = obvalt
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//hline(0, "Zero Line", color=color.new(#787B86, 50))
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
//BUY Signal
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
twohunraise = ta.rising(out, 2)
twentyrise = ta.rising(outt, 2)
macdrise = ta.rising(macd,2)
macdlong = ta.crossover(macd, signal)
longCondition=false
if macdlong and macdrise
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
shortmafall = ta.falling(outthree, 1)
macdfall = ta.falling(macd,1)
macdsell = macd < signal
shortCondition = false
if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2)
    shortCondition := true


if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


Lebih lanjut