Purata Pergerakan Eksponen dan Strategi Persilangan Kitaran Isipadu Kumulatif Teori Dagangan Dinamik

EMA CVP AVWP TOD
Tarikh penciptaan: 2025-01-06 11:45:38 Akhirnya diubah suai: 2025-01-06 11:45:38
Salin: 1 Bilangan klik: 346
1
fokus pada
1617
Pengikut

Purata Pergerakan Eksponen dan Strategi Persilangan Kitaran Isipadu Kumulatif Teori Dagangan Dinamik

Gambaran keseluruhan

Strategi ini ialah sistem perdagangan yang menggabungkan Purata Pergerakan Eksponen (EMA) dan Tempoh Volum Kumulatif (CVP). Ia menangkap titik perubahan dalam arah aliran pasaran dengan menganalisis persilangan purata bergerak eksponen harga dan harga terkumpul berwajaran volum. Strategi ini mempunyai penapis masa terbina dalam yang boleh mengehadkan waktu dagangan dan menyokong penutupan automatik kedudukan pada akhir tempoh dagangan. Strategi ini menyediakan dua kaedah keluar berbeza: jalan keluar silang terbalik dan keluar CVP tersuai, menjadikannya lebih fleksibel dan boleh disesuaikan.

Prinsip Strategi

Logik teras strategi adalah berdasarkan pengiraan utama berikut:

  1. Kira harga purata (AVWP): darab min aritmetik harga tertinggi, terendah dan penutup dengan volum.
  2. Kira nilai tempoh volum terkumpul: tambah harga wajaran volum sepanjang tempoh yang ditetapkan dan bahagikan dengan volum terkumpul.
  3. Kira EMA harga penutupan dan EMA CVP secara berasingan.
  4. Isyarat panjang dijana apabila harga EMA melintasi CVP EMA ke atas; isyarat pendek dijana apabila harga EMA melintasi CVP EMA ke bawah.
  5. Isyarat keluar boleh menjadi isyarat silang terbalik atau isyarat silang berdasarkan kitaran CVP tersuai.

Kelebihan Strategik

  1. Sistem isyarat adalah teguh: ia menggabungkan arah aliran harga dan maklumat volum dagangan untuk menentukan arah aliran pasaran dengan lebih tepat.
  2. Kebolehsuaian yang kukuh: Tempoh EMA dan tempoh CVP boleh dilaraskan untuk menyesuaikan diri dengan persekitaran pasaran yang berbeza.
  3. Pengurusan risiko yang sempurna: Penapis masa terbina dalam boleh mengelakkan operasi semasa tempoh yang tidak sesuai untuk perdagangan.
  4. Mekanisme keluar yang fleksibel: Dua kaedah keluar yang berbeza disediakan, dan anda boleh memilih kaedah keluar yang sesuai mengikut ciri pasaran.
  5. Visualisasi yang baik: Strategi ini menyediakan antara muka grafik yang jelas, termasuk penanda isyarat dan pengisian kawasan arah aliran.

Risiko Strategik

  1. Risiko histerisis: EMA sendiri mempunyai histerisis tertentu, yang boleh menyebabkan sedikit kelewatan dalam masa masuk dan keluar.
  2. Risiko pasaran tidak menentu: Isyarat palsu mungkin dijana dalam pasaran mendatar dan tidak menentu.
  3. Kepekaan parameter: Kombinasi parameter yang berbeza boleh membawa kepada perbezaan besar dalam prestasi strategi.
  4. Risiko kecairan: Dalam pasaran kecairan yang rendah, pengiraan CVP mungkin tidak cukup tepat.
  5. Pergantungan zon masa: Strategi menggunakan masa New York sebagai penapis masa, dan perlu memberi perhatian kepada perbezaan dalam waktu dagangan dalam pasaran yang berbeza.

Arah pengoptimuman strategi

  1. Memperkenalkan penapis turun naik: Parameter strategi boleh dilaraskan mengikut turun naik pasaran untuk meningkatkan kebolehsuaian strategi.
  2. Penapis masa yang dioptimumkan: Tetingkap masa berbilang boleh ditambah untuk mengawal sesi dagangan dengan lebih halus.
  3. Tingkatkan penilaian kualiti volum: perkenalkan penunjuk analisis volum untuk menapis isyarat volum berkualiti rendah.
  4. Pelarasan parameter dinamik: Bangunkan sistem parameter penyesuaian untuk melaraskan tempoh EMA dan CVP secara automatik mengikut keadaan pasaran.
  5. Tambah penunjuk sentimen pasaran: Gabungkan dengan penunjuk teknikal lain untuk mengesahkan isyarat dagangan.

ringkaskan

Ini adalah strategi perdagangan kuantitatif dengan struktur lengkap dan logik yang jelas. Dengan menggabungkan kelebihan EMA dan CVP, sistem perdagangan dicipta yang boleh menangkap arah aliran sambil memfokuskan pada kawalan risiko. Strategi ini sangat disesuaikan dan sesuai untuk digunakan dalam persekitaran pasaran yang berbeza. Melalui pelaksanaan cadangan pengoptimuman, terdapat ruang untuk penambahbaikan selanjutnya dalam prestasi strategi.

Kod sumber strategi
/*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)