Strategi pelacakan pembalikan rata-rata bergerak ganda

Penulis:ChaoZhang, Tanggal: 2024-02-20 17:08:43
Tag:

img

Gambaran umum

Dual Moving Average Reversal Tracking adalah strategi perdagangan kuantitatif yang memanfaatkan crossover rata-rata bergerak sebagai sinyal perdagangan. Strategi ini menggabungkan indikator MACD dengan perbedaan rata-rata bergerak cepat dan lambat dan garis sinyalnya, serta rasio panjang / pendek volume perdagangan, untuk membentuk sinyal perdagangan dan menangkap peluang pembalikan pasar.

Logika Strategi

Strategi ini terutama menilai hubungan antara garis cepat dan garis lambat. Ini menghasilkan sinyal beli ketika garis cepat melintasi di atas garis lambat, dan sinyal jual ketika garis cepat melintasi di bawah garis lambat. Selain itu, strategi ini juga secara komprehensif menilai status panjang/pendek pasar berdasarkan status panjang/pendek dari nilai selisih MACD, hubungan antara selisih dan garis sinyal, situasi panjang/pendek dari volume perdagangan, dll.

Secara khusus, strategi menilai ukuran dan arah nilai selisih MACD, persilangan antara selisih dan garis sinyal, arah konsisten atau berlawanan antara selisih dan garis sinyal, dll. Situasi ini mencerminkan karakteristik rebound subpasar setelah terjun. Selain itu, distribusi panjang / pendek volume perdagangan juga digunakan sebagai indikator penilaian tambahan.

Ketika perbedaan dan garis sinyal menunjukkan sinyal pembalikan pasar, dan volume perdagangan sesuai untuk mengkonfirmasi pembalikan pasar, sinyal perdagangan akan dihasilkan.

Keuntungan

  • Menggunakan dua crossover rata-rata bergerak untuk menentukan titik pembalikan pasar, dasar teoritis yang kuat
  • Masukkan penilaian volume perdagangan untuk menghindari kegagalan palsu
  • Indikator MACD menilai sentimen subbagian, mengidentifikasi fitur rebound
  • Fleksibilitas parameter yang tinggi

Risiko dan Solusi

  • Masalah Whipsaw yang disebabkan oleh crossover rata-rata bergerak
    • Mengatur parameter rata-rata bergerak, meningkatkan ambang
  • Volume perdagangan tidak dapat sepenuhnya menyaring false breakout
    • Menggabungkan indikator sekunder seperti OBV untuk menilai tren volume perdagangan riil
  • Tidak dapat menilai kedalaman dan kekuatan penyesuaian subbagian
    • Meningkatkan stop loss, mengevaluasi area pendukung penting

Arahan Optimasi

  • Menggunakan model pembelajaran mesin alih-alih penilaian berbasis aturan
    • Meningkatkan ketahanan strategi, mengurangi overfit
  • Tingkatkan teknik stop loss dan take profit
    • Mengunci sebagian keuntungan, mengurangi risiko
  • Sertakan indikator sentimen, analisis berita
    • Meningkatkan akurasi penilaian model
  • Pelabuhan ke produk lain, pasar
    • Keluasan strategi pengujian

Ringkasan

Strategi pelacakan pembalikan rata-rata bergerak ganda secara komprehensif mempertimbangkan indikator seperti rata-rata bergerak, MACD, dan volume perdagangan. Dengan menangkap sinyal pembalikan mereka, titik pembalikan yang sesuai dipilih untuk membangun posisi. Masih ada ruang besar untuk mengoptimalkan strategi ini, ketahanan dan profitabilitas dapat ditingkatkan lebih lanjut dengan teknik seperti pembelajaran mesin dan manajemen risiko.


/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 10 Oscillator Profile Flagging", shorttitle="3 10 Oscillator Profile Flagging", overlay=true)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
//plot(macdSlope, color=color.red, title="Total Volume")
//plot(signalSlope, color=color.green, title="Total Volume")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0
    float s = 0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

bool isPositiveSignalReversal = signalSlope > 0 and signalSlope[1] < 0
bool isPositiveMacdReversal = macdSlope > 0 and macdSlope[1] < 0

bool hasBearInversion = signalSlope > 0 and macdSlope < 0
bool hasBullInversion = signalSlope < 0 and macdSlope > 0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0
bool hasSignalSellerBias = hasSignalBias and signal < 0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - 0.75, stop=strategy.position_avg_price + 0.5)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + 0.75, stop=strategy.position_avg_price - 0.5)

Lebih banyak