Sumber dimuat naik... memuat...

Teori Dagangan Dinamik: Eksponensial Moving Average dan Kumulatif Volume Periode Crossover Strategy

Penulis:ChaoZhang, Tarikh: 2025-01-06 11:45:38
Tag:EMACVPAVWPTOD

img

Ringkasan

Strategi ini adalah sistem dagangan yang menggabungkan Exponential Moving Average (EMA) dan Cumulative Volume Period (CVP). Ia menangkap titik pembalikan trend pasaran dengan menganalisis persilangan antara harga EMA dan harga yang ditimbang jumlah kumulatif. Strategi ini termasuk penapis masa terbina dalam untuk mengehadkan sesi dagangan dan menyokong penutupan kedudukan automatik pada akhir tempoh dagangan. Ia menawarkan dua kaedah keluar yang berbeza: keluar persilangan terbalik dan keluar CVP tersuai, memberikan fleksibiliti dan kesesuaian yang kuat.

Prinsip Strategi

Logik teras strategi ini adalah berdasarkan pengiraan utama berikut:

  1. Mengira Harga Purata (AVWP): Kalikan purata aritmetik harga tinggi, rendah, dan dekat dengan jumlah.
  2. Mengira nilai tempoh jumlah kumulatif: Menjumlahkan harga beratkan jumlah sepanjang tempoh yang ditetapkan dan membahagikan dengan jumlah kumulatif.
  3. Mengira EMA harga penutupan dan EMA CVP secara berasingan.
  4. Menghasilkan isyarat panjang apabila harga EMA melintasi di atas EMA CVP; Menghasilkan isyarat pendek apabila harga EMA melintasi di bawah EMA CVP.
  5. Isyarat keluar boleh menjadi isyarat silang terbalik atau isyarat berdasarkan tempoh CVP tersuai.

Kelebihan Strategi

  1. Sistem Isyarat yang Kuat: Menggabungkan trend harga dan maklumat jumlah untuk penilaian arah pasaran yang lebih tepat.
  2. Kemudahan penyesuaian yang tinggi: Boleh menyesuaikan diri dengan persekitaran pasaran yang berbeza dengan menyesuaikan tempoh EMA dan CVP.
  3. Pengurusan Risiko Lengkap: Penapis masa terbina dalam menghalang perdagangan semasa tempoh yang tidak sesuai.
  4. Mekanisme Keluar Fleksibel: Menyediakan dua kaedah keluar yang berbeza untuk dipilih berdasarkan ciri pasaran.
  5. Visualisasi yang baik: Strategi menyediakan antara muka grafik yang jelas termasuk penanda isyarat dan pengisian kawasan trend.

Risiko Strategi

  1. Risiko Lag: EMA mempunyai lag yang melekat, yang boleh menyebabkan sedikit kelewatan dalam masa masuk dan keluar.
  2. Risiko goyangan: Boleh menghasilkan isyarat palsu di pasaran sampingan.
  3. Sensitiviti Parameter: Gabungan parameter yang berbeza boleh menyebabkan variasi prestasi yang ketara.
  4. Risiko Kecairan: Pengiraan CVP mungkin tidak tepat di pasaran kecairan rendah.
  5. Kebergantungan Zon Waktu: Strategi menggunakan masa New York untuk penapisan masa, yang memerlukan perhatian kepada waktu perdagangan pasaran yang berbeza.

Arahan Pengoptimuman Strategi

  1. Memperkenalkan Penapis Volatiliti: Sesuaikan parameter strategi berdasarkan turun naik pasaran untuk meningkatkan daya adaptasi.
  2. Mengoptimumkan Penapis Masa: Tambah beberapa tetingkap masa untuk kawalan sesi dagangan yang lebih tepat.
  3. Tambah Penilaian Kualiti Volume: Memperkenalkan penunjuk analisis jumlah untuk menapis isyarat kuantiti berkualiti rendah.
  4. Penyesuaian Parameter Dinamik: Membangunkan sistem parameter adaptif untuk menyesuaikan tempoh EMA dan CVP secara automatik berdasarkan keadaan pasaran.
  5. Tambah Penunjuk Sentimen Pasaran: Gabungkan dengan penunjuk teknikal lain untuk mengesahkan isyarat perdagangan.

Ringkasan

Ini adalah strategi perdagangan kuantitatif dengan struktur lengkap dan logik yang jelas. Dengan menggabungkan kelebihan EMA dan CVP, ia mewujudkan sistem perdagangan yang dapat menangkap trend dan memberi tumpuan kepada kawalan risiko. Strategi ini sangat disesuaikan dan sesuai untuk digunakan dalam persekitaran pasaran yang berbeza. Melalui pelaksanaan cadangan pengoptimuman, terdapat ruang untuk peningkatan prestasi yang lebih lanjut.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ EMA/CVP", title="[Sapphire] EMA/CVP Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupEMACVP = "EMA / Cumulative Volume Period"
tradeDirection = input.string(title='Trade Direction', defval='LONG', options=['LONG', 'SHORT'], group=groupEMACVP)
emaLength = input.int(25, title='EMA Length', minval=1, maxval=200, group=groupEMACVP)
cumulativePeriod = input.int(100, title='Cumulative Volume Period', minval=1, maxval=200, step=5, group=groupEMACVP)
exitType = input.string(title="Exit Type", defval="Crossover", options=["Crossover", "Custom CVP" ], group=groupEMACVP)
cumulativePeriodForClose = input.int(50, title='Cumulative Period for Close Signal', minval=1, maxval=200, step=5, group=groupEMACVP)
showSignals = input.bool(true, title="Show Signals", group=groupEMACVP)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupEMACVP)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = math.sum(avgPriceVolume, cumulativePeriod)
cumulVolume = math.sum(volume, cumulativePeriod)
cumValue = cumulPriceVolume / cumulVolume

cumulPriceVolumeClose = math.sum(avgPriceVolume, cumulativePeriodForClose)
cumulVolumeClose = math.sum(volume, cumulativePeriodForClose)
cumValueClose = cumulPriceVolumeClose / cumulVolumeClose

emaVal = ta.ema(close, emaLength)
emaCumValue = ta.ema(cumValue, emaLength)

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// Strategy Entry Conditions
longEntryCondition = ta.crossover(emaVal, emaCumValue) and tradeDirection == 'LONG'
shortEntryCondition = ta.crossunder(emaVal, emaCumValue) and tradeDirection == 'SHORT'

// User-Defined Exit Conditions
longExitCondition = false
shortExitCondition = false

if exitType == "Crossover"
    longExitCondition := ta.crossunder(emaVal, emaCumValue)
    shortExitCondition := ta.crossover(emaVal, emaCumValue)

if exitType == "Custom CVP"
    emaCumValueClose = ta.ema(cumValueClose, emaLength)
    longExitCondition := ta.crossunder(emaVal, emaCumValueClose)
    shortExitCondition := ta.crossover(emaVal, emaCumValueClose)

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// Strategy Execution
if longEntryCondition and timeCondition
    strategy.entry('Long', strategy.long)
    label.new(bar_index, high - signalOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

if shortEntryCondition and timeCondition
    strategy.entry('Short', strategy.short)
    label.new(bar_index, low + signalOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)

if strategy.position_size > 0 and longExitCondition
    strategy.close('Long')

if strategy.position_size < 0 and shortExitCondition
    strategy.close('Short')

// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(emaVal, title='EMA', color=color.new(color.green, 25))
plot(emaCumValue, title='Cumulative EMA', color=color.new(color.purple, 35))
fill(plot(emaVal), plot(emaCumValue), color=emaVal > emaCumValue ? #008ee6 : #d436a285, title='EMA and Cumulative Area', transp=70)


Berkaitan

Lebih lanjut