ADR Moving Average Crossover Strategy - Kaedah dagangan yang menggabungkan penunjuk teknikal pelbagai dimensi dan henti untung dan henti rugi yang ketat


Tarikh penciptaan: 2024-03-28 16:46:29 Akhirnya diubah suai: 2024-03-28 16:46:29
Salin: 0 Bilangan klik: 352
1
fokus pada
1166
Pengikut

ADR Moving Average Crossover Strategy - Kaedah dagangan yang menggabungkan penunjuk teknikal pelbagai dimensi dan henti untung dan henti rugi yang ketat

Gambaran keseluruhan

Strategi ADR adalah strategi perdagangan kuantitatif berdasarkan platform TradingView yang menggabungkan beberapa indikator teknikal untuk menilai trend, memfilter isyarat dan menetapkan stop loss. Strategi ini menggunakan purata bergerak indeks dalam dua tempoh yang berbeza (EMA) untuk mengenal pasti trend utama, menggunakan purata gelombang sebenar (ATR) sebagai penapis kadar turun naik, dan menetapkan stop loss secara dinamik berdasarkan pulangan risiko.

Prinsip Strategi

  1. Dua garis sejajar: strategi menggunakan dua garis EMA dengan tempoh yang berbeza untuk menilai trend. Apabila EMA jangka pendek di atas EMA jangka panjang, dianggap sebagai trend ke atas, menghasilkan banyak isyarat; sebaliknya, apabila EMA jangka pendek di bawah EMA jangka panjang, dianggap sebagai trend ke bawah, menghasilkan isyarat.

  2. Penapisan kadar turun naik ADR: Untuk mengelakkan isyarat dagangan dalam persekitaran turun naik yang rendah, strategi memperkenalkan penunjuk ADR sebagai penapis kadar turun naik. Hanya apabila nilai ADR lebih tinggi daripada had minimum yang ditetapkan, kedudukan dibenarkan dibuka.

  3. Tetingkap masa dagangan: Strategi ini membolehkan pengguna menetapkan masa permulaan dan penghentian dagangan setiap hari. Perdagangan hanya akan dijalankan dalam tetingkap masa yang ditetapkan. Ini membantu mengelakkan tempoh kurang kecairan atau turun naik.

  4. Stop Loss Dinamik: Strategi ini berdasarkan purata harga tertinggi dan harga terendah pada garis N-root K terkini, dan digabungkan dengan nisbah pulangan risiko yang telah ditetapkan, secara dinamik mengira harga berhenti dan harga berhenti. Ini memastikan bahawa pulangan risiko setiap perdagangan dapat dikawal.

  5. Keseimbangan kerugian: Apabila memegang kedudukan mencapai margin keuntungan tertentu (pengguna boleh menetapkan nisbah risiko-keuntungan), strategi akan memindahkan kedudukan hentian ke harga kedudukan terbuka, iaitu kedudukan keseimbangan kerugian. Ini membantu melindungi keuntungan yang telah diperoleh.

  6. Had kerugian maksimum harian: Untuk mengawal kerugian maksimum dalam satu hari, strategi menetapkan had kerugian harian. Apabila kerugian hari itu mencapai had tersebut, strategi akan menghentikan perdagangan sehingga hari berikutnya dibuka.

  7. Penutupan kedudukan: Tidak kira sama ada memegang kedudukan menyentuh garis berhenti atau berhenti, strategi akan melonggarkan semua kedudukan pada waktu tetap setiap hari perdagangan (misalnya 16:00) untuk mengelakkan risiko semalaman.

Analisis kelebihan

  1. Keupayaan untuk mengesan trend yang kuat: Dengan menilai trend melalui persilangan dua garis rata, anda dapat menangkap trend utama pasaran dengan berkesan, sehingga meningkatkan kemenangan strategi dan potensi keuntungan.

  2. Adaptasi kadar turun naik yang baik: pengenalan penunjuk ADR sebagai penapis kadar turun naik dapat mengelakkan perdagangan yang kerap dalam persekitaran yang kurang turun naik, mengurangkan kerugian akibat isyarat tidak sah dan penembusan palsu.

  3. Kawalan risiko yang ketat: Strategi ini menetapkan langkah-langkah kawalan risiko dari pelbagai dimensi, termasuk berhenti berhenti dinamik, keseimbangan kerugian, dan had kerugian maksimum harian, yang berkesan mengawal risiko strategi yang menurun dan meningkatkan pendapatan selepas risiko disesuaikan.

  4. Fleksibiliti parameter: Pelbagai parameter strategi, seperti kitaran purata, panjang ADR, nisbah pulangan risiko, tingkap masa perdagangan, dan lain-lain, boleh disesuaikan secara fleksibel mengikut pilihan pengguna dan ciri-ciri pasaran, untuk mengoptimumkan prestasi strategi.

  5. Tingkat automasi yang tinggi: Strategi ini berdasarkan platform TradingView, logik perdagangan dilakukan sepenuhnya oleh program secara automatik, mengurangkan gangguan emosi manusia dan penilaian subjektif, yang membantu operasi strategi yang stabil dalam jangka panjang.

Analisis risiko

  1. Risiko pengoptimuman parameter: Walaupun parameter strategi ini boleh disesuaikan secara fleksibel, jika pengoptimuman berlebihan, ia boleh menyebabkan overfitting, yang tidak berfungsi dengan baik di luar sampel. Oleh itu, pengembalian dan analisis yang mencukupi diperlukan semasa parameter ditetapkan untuk memastikan kehandalan strategi.

  2. Risiko Kejadian Luar Biasa: Strategi ini adalah sebahagian besarnya berdasarkan perdagangan petunjuk teknikal, dan mungkin kurang responsif terhadap beberapa peristiwa asas yang mendadak, seperti perubahan dasar, turun naik besar dalam data ekonomi, dan sebagainya, yang menyebabkan penarikan balik yang lebih besar.

  3. Risiko pembalikan trend: Pada masa-masa kritikal pembalikan trend, isyarat persilangan binari mungkin mengalami kelewatan, menyebabkan strategi kehilangan masa terbaik untuk meletakkan kedudukan, atau mengalami kerugian pada awal pembalikan trend.

  4. Risiko kecairan: Walaupun strategi menetapkan tetingkap masa perdagangan, risiko seperti slippage, kelewatan perdagangan, dan lain-lain mungkin mempengaruhi prestasi strategi jika nilai dagangan kurang cair.

  5. Risiko kegagalan petunjuk teknikal: Strategi ini sangat bergantung kepada petunjuk teknikal, dan keberkesanan strategi mungkin menurun jika keadaan pasaran berubah secara signifikan yang menyebabkan petunjuk kehilangan makna petunjuk asalnya.

Arah pengoptimuman

  1. Pengenalan penunjuk dimensi yang lebih banyak: Di atas asas garis rata-rata dua dan ADR yang sedia ada, penubuhan lebih banyak penunjuk teknikal yang berkesan seperti MACD, RSI dan lain-lain boleh dipertimbangkan untuk meningkatkan kebolehpercayaan dan ketahanan isyarat.

  2. Parameter pengoptimuman dinamik: mekanisme untuk mengoptimumkan set parameter boleh ditubuhkan, mengikut keadaan pasaran yang berbeza (seperti jenis trend, jenis gegaran, dan lain-lain), parameter utama strategi penyesuaian dinamik untuk menyesuaikan diri dengan perubahan pasaran.

  3. Menambah faktor asas: Mempertimbangkan beberapa petunjuk asas penting seperti data ekonomi, trend dasar, dan lain-lain dapat membantu strategi untuk lebih memahami trend pasaran dan mengelakkan risiko sistemik pada masa yang tepat.

  4. Peningkatan mekanisme hentian hentian: Berdasarkan hentian hentian yang dinamik yang sedia ada, logik hentian hentian boleh dioptimumkan lebih lanjut, seperti memperkenalkan kaedah hentian hentian, hentian sebahagian, dan lain-lain untuk melindungi keuntungan dan mengawal risiko dengan lebih baik.

  5. Multi-target, pelbagai kitaran masa: memperluaskan strategi ini ke pelbagai sasaran dagangan dan pelbagai kitaran masa, meningkatkan daya serap dan kestabilan strategi melalui penyebaran pelaburan dan pengoptimuman kitaran masa.

ringkaskan

Strategi ADR merentasi adalah strategi perdagangan kuantitatif berdasarkan analisis teknikal yang menilai trend dengan merentasi dua rantaian dan menggunakan penapis kadar turun naik ADR. Strategi ini juga menetapkan langkah-langkah kawalan risiko yang ketat, termasuk stop loss yang dinamik, imbangan kerugian, dan had kerugian harian maksimum untuk mengawal risiko yang menurun. Kelebihan strategi ini adalah keupayaan untuk mengesan trend yang kuat, adaptasi kadar turun naik yang baik, kawalan risiko yang ketat, parameter yang fleksibel dan automasi yang tinggi. Tetapi terdapat juga beberapa risiko, seperti risiko pengoptimuman parameter, risiko kejadian yang tiba-tiba, risiko pertukaran trend, risiko kecairan dan risiko kegagalan indikator teknikal.

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