Strategi Crossover Rata-rata Pergerakan Eksponensial dan Siklus Volume Kumulatif dari Teori Perdagangan Dinamis

EMA CVP AVWP TOD
Tanggal Pembuatan: 2025-01-06 11:45:38 Akhirnya memodifikasi: 2025-01-06 11:45:38
menyalin: 1 Jumlah klik: 346
1
fokus pada
1617
Pengikut

Strategi Crossover Rata-rata Pergerakan Eksponensial dan Siklus Volume Kumulatif dari Teori Perdagangan Dinamis

Ringkasan

Strategi ini adalah sistem perdagangan yang menggabungkan Exponential Moving Average (EMA) dan Cumulative Volume Period (CVP). Ia menangkap titik balik tren pasar dengan menganalisis persilangan rata-rata pergerakan harga eksponensial dan harga kumulatif tertimbang volume. Strategi ini memiliki filter waktu bawaan yang dapat membatasi jam perdagangan dan mendukung penutupan posisi otomatis di akhir periode perdagangan. Strategi ini menyediakan dua metode keluar yang berbeda: keluar silang terbalik dan keluar CVP khusus, menjadikannya lebih fleksibel dan mudah beradaptasi.

Prinsip Strategi

Logika inti dari strategi ini didasarkan pada perhitungan utama berikut:

  1. Hitung harga rata-rata (AVWP): kalikan rata-rata aritmatika dari harga tertinggi, terendah, dan penutupan dengan volume.
  2. Hitung nilai periode volume kumulatif: tambahkan harga tertimbang volume selama periode yang ditetapkan dan bagi dengan volume kumulatif.
  3. Hitung EMA harga penutupan dan EMA CVP secara terpisah.
  4. Sinyal panjang dihasilkan saat EMA harga melintasi EMA CVP ke atas; sinyal pendek dihasilkan saat EMA harga melintasi EMA CVP ke bawah.
  5. Sinyal keluar dapat berupa sinyal persilangan terbalik atau sinyal persilangan berdasarkan siklus CVP khusus.

Keunggulan Strategis

  1. Sistem sinyalnya kuat: menggabungkan tren harga dan informasi volume perdagangan untuk menentukan tren pasar secara lebih akurat.
  2. Kemampuan beradaptasi yang kuat: Periode EMA dan periode CVP dapat disesuaikan untuk beradaptasi dengan lingkungan pasar yang berbeda.
  3. Manajemen risiko yang sempurna: Filter waktu bawaan dapat menghindari operasi selama periode yang tidak cocok untuk perdagangan.
  4. Mekanisme keluar yang fleksibel: Dua metode keluar yang berbeda disediakan, dan Anda dapat memilih metode keluar yang sesuai menurut karakteristik pasar.
  5. Visualisasi yang baik: Strategi menyediakan antarmuka grafis yang jelas, termasuk penanda sinyal dan pengisian area tren.

Risiko Strategis

  1. Risiko histeresis: EMA sendiri memiliki histeresis tertentu, yang dapat menyebabkan sedikit keterlambatan dalam waktu masuk dan keluar.
  2. Risiko pasar yang fluktuatif: Sinyal palsu dapat dihasilkan di pasar yang menyamping dan fluktuatif.
  3. Sensitivitas parameter: Kombinasi parameter yang berbeda dapat menyebabkan perbedaan besar dalam kinerja strategi.
  4. Risiko likuiditas: Di pasar likuiditas rendah, perhitungan CVP mungkin tidak cukup akurat.
  5. Ketergantungan zona waktu: Strategi ini menggunakan waktu New York sebagai filter waktu, dan perlu memperhatikan perbedaan jam perdagangan di berbagai pasar.

Arah optimasi strategi

  1. Memperkenalkan filter volatilitas: Parameter strategi dapat disesuaikan menurut volatilitas pasar untuk meningkatkan kemampuan beradaptasi strategi.
  2. Filter waktu yang dioptimalkan: Beberapa jendela waktu dapat ditambahkan untuk mengontrol sesi perdagangan dengan lebih cermat.
  3. Tingkatkan penilaian kualitas volume: perkenalkan indikator analisis volume untuk menyaring sinyal volume berkualitas rendah.
  4. Penyesuaian parameter dinamis: Mengembangkan sistem parameter adaptif untuk menyesuaikan periode EMA dan CVP secara otomatis sesuai dengan kondisi pasar.
  5. Tambahkan indikator sentimen pasar: Gabungkan dengan indikator teknis lainnya untuk mengonfirmasi sinyal perdagangan.

Meringkaskan

Ini adalah strategi perdagangan kuantitatif dengan struktur lengkap dan logika yang jelas. Dengan menggabungkan keunggulan EMA dan CVP, terciptalah sistem perdagangan yang dapat menangkap tren sambil berfokus pada pengendalian risiko. Strategi ini sangat dapat disesuaikan dan cocok digunakan di berbagai lingkungan pasar. Melalui penerapan saran pengoptimalan, ada ruang untuk peningkatan lebih lanjut dalam kinerja strategi.

Kode 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)