EMA Cross ADR Strategy - Satu Kaedah Dagangan Berbasis Indikator Teknikal Multidimensional dengan Pengurusan Risiko yang ketat

Penulis:ChaoZhang, Tarikh: 2024-03-28 16:46:29
Tag:

img

Ringkasan

EMA Cross ADR Strategy adalah strategi perdagangan kuantitatif berdasarkan platform TradingView. Ia menggabungkan beberapa penunjuk teknikal untuk menentukan trend, isyarat penapis, dan menetapkan tahap stop-loss dan mengambil keuntungan. Strategi ini menggunakan dua purata bergerak eksponen (EMA) dengan tempoh yang berbeza untuk mengenal pasti trend utama, menggunakan Julat Harian Purata (ADR) sebagai penapis turun naik, dan secara dinamik menetapkan tahap stop-loss dan mengambil keuntungan berdasarkan nisbah risiko-balasan. Di samping itu, strategi ini menggabungkan langkah pengurusan risiko seperti tetingkap masa perdagangan, berhenti impas, dan had kerugian maksimum, bertujuan untuk menangkap peluang trend sambil mengawal risiko penurunan secara ketat.

Prinsip Strategi

  1. Silang EMA Berganda: Strategi ini menggunakan dua Silang EMA dengan tempoh yang berbeza untuk menentukan trend. Apabila Silang EMA jangka pendek melintasi di atas Silang EMA jangka panjang, ia dianggap sebagai trend menaik, menghasilkan isyarat panjang; sebaliknya, apabila Silang EMA jangka pendek melintasi di bawah Silang EMA jangka panjang, ia dianggap sebagai downtrend, menghasilkan isyarat pendek.

  2. Penapis Volatiliti ADR: Untuk mengelakkan penjanaan isyarat dagangan dalam persekitaran turun naik yang rendah, strategi memperkenalkan penunjuk ADR sebagai penapis turun naik. Posisi hanya dibenarkan dibuka apabila nilai ADR melebihi ambang minimum yang ditetapkan terlebih dahulu.

  3. Jendela Masa Perdagangan: Strategi ini membolehkan pengguna menetapkan waktu permulaan dan akhir untuk perdagangan harian. Perdagangan hanya dilaksanakan dalam tetingkap masa yang ditentukan, yang membantu mengelakkan tempoh yang tidak cair atau sangat tidak menentu.

  4. Stop-Loss dan Take-Profit Dinamik: Strategi ini secara dinamik mengira harga stop-loss dan take-profit berdasarkan purata harga tertinggi dan terendah N candlesticks yang paling baru, digabungkan dengan nisbah risiko-balasan yang telah ditetapkan sebelumnya. Ini memastikan bahawa risiko-balasan setiap perdagangan boleh dikawal.

  5. Stop Break-Even: Apabila kedudukan mencapai tahap keuntungan tertentu (rasio risiko-balasan yang ditakrifkan oleh pengguna), strategi memindahkan stop-loss ke titik break-even (harga kemasukan). Ini membantu melindungi keuntungan yang telah diperoleh.

  6. Had Hilang Harian Maksimum: Untuk mengawal kerugian maksimum setiap hari, strategi menetapkan had kerugian harian. Sebaik sahaja kerugian harian mencapai had ini, strategi berhenti berdagang sehingga hari berikutnya dibuka.

  7. Tutup Semua Posisi di Akhir Hari: Tidak kira sama ada kedudukan telah mencapai tahap mengambil keuntungan atau stop-loss, strategi menutup semua kedudukan pada masa yang ditetapkan setiap hari dagangan (contohnya, 16:00) untuk mengelakkan risiko semalam.

Analisis Kelebihan

  1. Keupayaan Mengikuti Trend yang Kuat: Dengan menggunakan silang EMA berganda untuk menentukan trend, strategi dapat menangkap trend pasaran utama dengan berkesan, dengan itu meningkatkan kadar kemenangan dan potensi keuntungan.

  2. Kemudahan penyesuaian Volatiliti yang baik: Pengenalan penunjuk ADR sebagai penapis volatiliti dapat mengelakkan perdagangan yang kerap dalam persekitaran volatiliti rendah, mengurangkan kerugian yang disebabkan oleh isyarat yang tidak sah dan pecah palsu.

  3. Kawalan Risiko yang ketat: Strategi menetapkan langkah-langkah kawalan risiko dari pelbagai dimensi, termasuk stop-loss dan mengambil keuntungan yang dinamik, stop break-even, dan had kerugian harian maksimum, secara berkesan mengawal risiko penurunan dan meningkatkan pulangan yang disesuaikan dengan risiko.

  4. Tetapan Parameter Fleksibel: Pelbagai parameter strategi, seperti tempoh EMA, panjang ADR, nisbah risiko-balasan, tetingkap masa dagangan, dan lain-lain, boleh ditetapkan secara fleksibel mengikut pilihan pengguna dan ciri pasaran untuk mengoptimumkan prestasi strategi.

  5. Tahap Automasi Tinggi: Strategi ini berdasarkan platform TradingView, dan logik perdagangan dilaksanakan sepenuhnya oleh program, mengurangkan gangguan emosi manusia dan penilaian subjektif, yang mendorong operasi stabil jangka panjang strategi.

Analisis Risiko

  1. Risiko Pengoptimuman Parameter: Walaupun parameter strategi boleh diselaraskan dengan fleksibel, pengoptimuman berlebihan boleh membawa kepada pemasangan berlebihan dan prestasi luar sampel yang buruk. Oleh itu, ketika menetapkan parameter, pengujian dan analisis yang mencukupi diperlukan untuk memastikan ketahanan strategi.

  2. Risiko Kejadian Tiba-tiba: Strategi ini terutamanya berdagang berdasarkan penunjuk teknikal dan mungkin tidak bertindak balas dengan mencukupi kepada beberapa peristiwa asas besar tiba-tiba, seperti perubahan dasar atau turun naik data ekonomi yang ketara, yang membawa kepada penarikan besar.

  3. Risiko Pembalikan Trend: Semasa tempoh utama pembalikan trend, isyarat silang EMA dua boleh ditangguhkan, menyebabkan strategi terlepas masa terbaik untuk menubuhkan kedudukan atau mengalami kerugian pada permulaan pembalikan trend.

  4. Risiko Kecairan: Walaupun strategi menetapkan tetingkap masa dagangan, jika kecairan instrumen yang didagangkan adalah lemah, ia masih boleh menghadapi risiko seperti slippage dan kelewatan dagangan, yang mempengaruhi prestasi strategi.

  5. Risiko Gagal Indikator Teknikal: Strategi sangat bergantung kepada penunjuk teknikal. Jika keadaan pasaran berubah dengan ketara, menyebabkan penunjuk kehilangan makna asalnya, keberkesanan strategi mungkin menurun.

Arahan pengoptimuman

  1. Memperkenalkan penunjuk yang lebih berdimensi: Berdasarkan EMA dan ADR ganda yang sedia ada, pertimbangkan untuk memperkenalkan penunjuk teknikal yang lebih berkesan, seperti MACD dan RSI, untuk meningkatkan kebolehpercayaan dan ketahanan isyarat.

  2. Pengoptimuman Parameter Dinamik: Menubuhkan mekanisme untuk pengoptimuman parameter yang secara dinamik menyesuaikan parameter strategi utama berdasarkan keadaan pasaran yang berbeza (seperti trend atau berayun) untuk menyesuaikan diri dengan perubahan pasaran.

  3. Memasukkan Faktor-faktor Dasar: Pertimbangkan dengan sewajarnya kepada beberapa penunjuk asas penting, seperti data ekonomi dan arah dasar, yang dapat membantu strategi memahami lebih baik trend pasaran dan mengelakkan risiko sistem pada masa yang tepat.

  4. Mempertingkatkan mekanisme Stop-Loss dan Take-Profit: Mengoptimumkan lagi logik Stop-Loss dan Take-Profit berdasarkan Stop-Loss dan Take-Profit dinamik yang sedia ada, seperti memperkenalkan Trailing Stops dan Take-Profit separa, untuk melindungi keuntungan dan mengawal risiko dengan lebih baik.

  5. Pelbagai Instrumen dan Kerangka Masa: Memperluaskan strategi kepada pelbagai instrumen perdagangan dan kerangka masa, dan meningkatkan kesesuaian dan kestabilan strategi melalui pelaburan yang pelbagai dan pengoptimuman kerangka masa.

Ringkasan

Strategi EMA Cross ADR adalah strategi dagangan kuantitatif berdasarkan analisis teknikal. Ia menentukan trend melalui silang EMA berganda dan menggunakan penunjuk ADR untuk penapisan turun naik. Strategi ini juga menetapkan langkah kawalan risiko yang ketat, termasuk stop-loss dinamik dan mengambil keuntungan, stop break-even, dan had kerugian harian maksimum untuk mengawal risiko penurunan. Kelebihan strategi ini terletak pada keupayaan mengikuti trend yang kuat, kemampuan penyesuaian turun naik yang baik, kawalan risiko yang ketat, tetapan parameter yang fleksibel, dan tahap automasi yang tinggi. Walau bagaimanapun, ia juga mempunyai beberapa risiko, seperti risiko pengoptimuman parameter, risiko kejadian mendadak, risiko pembalikan trend, risiko kecairan, dan risiko kegagalan indikator teknikal. Pada masa akan datang, strategi ini boleh mempertimbangkan dan mengoptimumkan dari pelbagai aspek seperti memperkenalkan penunjuk yang lebih praktikal, pengoptimuman parameter dinamik, meningkatkan faktor-faktor asas, meningkatkan mekanisme pengoptimuman risiko dan keuntungan, memperluaskan jangka masa dan mempertingkatkan mekanisme rujukan, dan mempertingkatkan strategi perdagangan secara keseluruhan, tetapi ia menyediakan instrumen yang lebih baik untuk digunakan secara kuantitatif, meningkatkan jangka masa dan meningkatkan keuntungan, dan mempertingkatkan


/*backtest
start: 2024-02-26 00:00:00
end: 2024-03-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Scriptâ„¢ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Sameh_Hussein

//@version=5
strategy('EMA Cross ADR Strategy with Stats', overlay=true)

// Adjustable Parameters
shortEmaLength = input(10, title='Short EMA Length')
longEmaLength = input(50, title='Long EMA Length')
adrLength = input(14, title='ADR Length')
riskRewardRatio = input(2.0, title='Risk/Reward Ratio')
lookbackCandles = input(10, title='Lookback Candles for Stop Loss')
startTime = input(0900, title='Start Time')
endTime = input(1600, title='End Time')
minAdrValue = input(10, title='Minimum ADR Value for Entry')
breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0)
breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0)
dailyLossLimit = input(-2000.0, title='Daily Loss Limit')

// Exponential Moving Averages
shortEma = ta.ema(close, shortEmaLength)
longEma = ta.ema(close, longEmaLength)

// Average Daily Range
adr = ta.sma(ta.tr, adrLength)

// Time Filter Function
timeFilter() => true

// Entry Conditions with ADR filter
longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue
shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue

// Calculate the average low and average high of the previous 'lookbackCandles' candles
averageLow = ta.sma(low, lookbackCandles)
averageHigh = ta.sma(high, lookbackCandles)

// Risk and Reward Calculation
stopLossLong = averageLow
takeProfitLong = close + (close - averageLow) * riskRewardRatio
stopLossShort = averageHigh
takeProfitShort = close - (averageHigh - close) * riskRewardRatio

// Entry Control Variables
var longEntryAllowed = true
var shortEntryAllowed = true

// Update entry price on trade execution
var float entryPriceLong = na
var float entryPriceShort = na

if (strategy.position_size > 0)
    if (strategy.position_size[1] <= 0)
        entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1)
    else
        entryPriceLong := entryPriceLong
else
    entryPriceLong := na

if (strategy.position_size < 0)
    if (strategy.position_size[1] >= 0)
        entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1)
    else
        entryPriceShort := entryPriceShort
else
    entryPriceShort := na

// Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached
breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR
breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR

if (longEntryAllowed and close >= breakEvenTriggerLong)
    stopLossLong := entryPriceLong + breakEvenProfit

if (shortEntryAllowed and close <= breakEvenTriggerShort)
    stopLossShort := entryPriceShort - breakEvenProfit

// Close all trades at 1600
if (hour == 15 and minute == 59)
    strategy.close_all(comment='Close at 1600')

// Define the daily loss variable and last trade day
var float[] dailyLossArray = array.new_float(1, 0.0)
var int[] lastTradeDayArray = array.new_int(1, na)

// Function to update the daily loss
updateDailyLoss() =>
    _dailyLoss = array.get(dailyLossArray, 0)
    _lastTradeDay = array.get(lastTradeDayArray, 0)
    if na(_lastTradeDay) or dayofmonth != _lastTradeDay
        _dailyLoss := 0.0
        array.set(lastTradeDayArray, 0, dayofmonth)
    if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1))
        _dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1)
    array.set(dailyLossArray, 0, _dailyLoss)

// Call the function to update the daily loss
updateDailyLoss()

// Execute Strategy
if longCondition and longEntryAllowed
    strategy.entry('Long', strategy.long)
    strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong)
    longEntryAllowed := false

if shortCondition and shortEntryAllowed
    strategy.entry('Short', strategy.short)
    strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort)
    shortEntryAllowed := false

// Reset entry control variables on position close
if strategy.position_size == 0
    longEntryAllowed := true
    shortEntryAllowed := true

// // Statistics
// winRate = strategy.wintrades / strategy.closedtrades * 100
// totalTrades = strategy.closedtrades
// averageProfit = strategy.grossprofit / strategy.wintrades
// averageLoss = strategy.grossloss / strategy.losstrades

// // Plotting
// plot(shortEma, color=color.new(color.red, 0), title='Short EMA')
// plot(longEma, color=color.new(color.blue, 0), title='Long EMA')

// // Display Table
// table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1)
// table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)


Lebih lanjut