
Strategi ADR adalah strategi perdagangan kuantitatif berbasis platform TradingView yang menggabungkan beberapa indikator teknis untuk menilai tren, memfilter sinyal, dan mengatur stop loss. Strategi ini menggunakan rata-rata pergerakan indeks (EMA) dari dua periode yang berbeda untuk mengidentifikasi tren utama, menggunakan rata-rata gelombang nyata (ATR) sebagai filter tingkat fluktuasi, dan mengatur stop loss secara dinamis berdasarkan pengembalian risiko. Selain itu, strategi ini juga memperkenalkan langkah-langkah pengendalian risiko seperti jendela waktu perdagangan, neraca kerugian, dan kerugian harian maksimum, berusaha untuk menangkap peluang tren sambil mengendalikan risiko penurunan secara ketat.
Dua garis sejajar: strategi menggunakan dua garis EMA dengan periode yang berbeda untuk menilai tren. Ketika EMA jangka pendek di atas EMA jangka panjang, dianggap sebagai tren ke atas, menghasilkan sinyal makeover; sebaliknya, ketika EMA jangka pendek di bawah EMA jangka panjang, dianggap sebagai tren ke bawah, menghasilkan sinyal makeover.
Filter tingkat fluktuasi ADR: Untuk menghindari sinyal perdagangan dalam lingkungan dengan fluktuasi rendah, strategi memperkenalkan indikator ADR sebagai filter tingkat fluktuasi. Hanya jika nilai ADR lebih tinggi dari nilai minimal default, maka posisi dibuka.
Jendela waktu perdagangan: Strategi ini memungkinkan pengguna untuk mengatur waktu mulai dan berhenti perdagangan setiap hari. Perdagangan hanya akan dilakukan dalam jendela waktu yang ditentukan. Ini membantu untuk menghindari periode yang kurang likuiditas atau volatilitas tinggi.
Stop Loss Dinamis: Strategi ini didasarkan pada harga tertinggi dan harga terendah rata-rata dari garis N-root K terbaru, dan digabungkan dengan rasio pengembalian risiko default, stop loss dan stop loss dihitung secara dinamis. Ini memastikan bahwa pengembalian risiko dari setiap perdagangan dapat dikendalikan.
Keseimbangan kerugian: Setelah posisi mencapai tingkat keuntungan tertentu (pengguna dapat mengatur rasio pengembalian risiko), strategi akan memindahkan stop loss ke harga pembukaan posisi, yaitu level keseimbangan kerugian. Ini membantu melindungi keuntungan yang telah diperoleh.
Batas kerugian maksimum harian: Untuk mengendalikan kerugian maksimum dalam satu hari, strategi menetapkan batas kerugian harian. Setelah kerugian hari mencapai batas tersebut, strategi akan berhenti berdagang sampai hari berikutnya dibuka.
Penutupan posisi: Tidak peduli apakah posisi yang dipegang telah mencapai batas stop loss atau stop loss, strategi ini akan menutup semua posisi pada waktu yang ditetapkan setiap hari perdagangan (misalnya 16:00), untuk menghindari risiko semalam.
Trend Tracking: Mengetahui tren dengan crossover dua garis rata, Anda dapat secara efektif menangkap tren utama pasar, sehingga meningkatkan kemenangan strategi dan potensi keuntungan.
Adaptifitas volatilitas yang baik: pengenalan indikator ADR sebagai filter volatilitas, dapat menghindari perdagangan yang sering terjadi di lingkungan dengan volatilitas rendah, mengurangi kerugian akibat sinyal tidak valid dan false breakout.
Kekuatan pengendalian risiko: Strategi ini mengatur langkah-langkah pengendalian risiko dari beberapa dimensi, termasuk stop loss, imbalan kerugian, dan batasan kerugian maksimum harian, yang secara efektif mengendalikan risiko penurunan strategi dan meningkatkan laba setelah penyesuaian risiko.
Fleksibilitas parameter: berbagai parameter strategi, seperti periode rata-rata, panjang ADR, rasio risiko-pengembalian, jendela waktu perdagangan, dan lain-lain, dapat diatur secara fleksibel sesuai dengan preferensi pengguna dan karakteristik pasar, sehingga dapat mengoptimalkan kinerja strategi.
Tingkat otomatisasi yang tinggi: Strategi ini didasarkan pada platform TradingView, logika perdagangan sepenuhnya dilakukan secara otomatis oleh program, mengurangi gangguan emosi manusia dan penilaian subjektif, yang mendukung operasi strategi yang stabil dalam jangka panjang.
Risiko optimasi parameter: Meskipun parameter dari strategi ini dapat disesuaikan secara fleksibel, jika terlalu banyak dioptimalkan, dapat menyebabkan overfitting, yang tidak berkinerja baik di luar sampel. Oleh karena itu, pengembalian dan analisis yang memadai diperlukan saat pengaturan parameter untuk memastikan kehandalan strategi.
Risiko Kejadian Luar Biasa: Strategi ini terutama didasarkan pada perdagangan indikator teknis, yang mungkin kurang bereaksi terhadap beberapa peristiwa mendasar besar yang tiba-tiba, seperti perubahan kebijakan, fluktuasi besar data ekonomi, dan sebagainya, yang menyebabkan penurunan yang lebih besar.
Risiko trend reversal: Pada saat-saat penting dari trend reversal, sinyal crossover bilateral mungkin mengalami keterlambatan, menyebabkan strategi kehilangan waktu terbaik untuk posisi, atau mengalami kerugian pada awal trend reversal.
Risiko likuiditas: Meskipun strategi mengatur jendela waktu perdagangan, jika indikator perdagangan memiliki likuiditas yang buruk, risiko slippage, keterlambatan perdagangan, dan lain-lain dapat mempengaruhi kinerja strategi.
Risiko kegagalan indikator teknis: Strategi ini sangat bergantung pada indikator teknis, dan efektivitas strategi dapat menurun jika ada perubahan besar dalam lingkungan pasar yang menyebabkan indikator kehilangan makna indikasi aslinya.
Pengenalan lebih banyak indikator dimensi: Berdasarkan garis rata-rata ganda dan ADR yang ada, dapat dipertimbangkan untuk memperkenalkan lebih banyak indikator teknis yang efektif, seperti MACD, RSI, dan lain-lain, untuk meningkatkan keandalan dan stabilitas sinyal.
Parameter pengoptimalan dinamis: Anda dapat membangun mekanisme pengoptimalan parameter, sesuai dengan kondisi pasar yang berbeda (seperti tren, getaran, dll.), Parameter kunci strategi penyesuaian dinamis untuk menyesuaikan dengan perubahan pasar.
Masukkan faktor-faktor mendasar: Mempertimbangkan beberapa indikator mendasar penting seperti data ekonomi, tren kebijakan, dan lain-lain dapat membantu strategi untuk lebih memahami tren pasar, dan menghindari risiko sistemik tepat waktu.
Peningkatan mekanisme stop loss: Berdasarkan stop loss dinamis yang ada, logika stop loss dapat dioptimalkan lebih lanjut, seperti memperkenalkan metode tracking stop loss, partial stop loss, dan lain-lain, untuk lebih melindungi keuntungan dan mengendalikan risiko.
Multi target, multi siklus waktu: memperluas strategi ke beberapa target perdagangan dan beberapa siklus waktu, meningkatkan fleksibilitas dan stabilitas strategi dengan diversifikasi investasi dan optimalisasi siklus waktu.
ADR adalah strategi perdagangan kuantitatif yang didasarkan pada analisis teknis untuk menilai tren melalui crossover dua rata-rata dan menggunakan indikator ADR untuk memfilter volatilitas. Strategi ini juga menyiapkan langkah-langkah pengendalian risiko yang ketat, termasuk stop loss yang dinamis, keseimbangan kerugian, batas kerugian maksimum harian, dan lain-lain untuk mengendalikan risiko downtrend. Keunggulan strategi ini adalah kemampuan untuk melacak tren yang kuat, fleksibilitas volatilitas yang baik, kontrol risiko yang ketat, parameter yang fleksibel dan otomatisasi yang tinggi. Namun, ada juga beberapa risiko, seperti risiko optimasi parameter, risiko insiden, risiko pergeseran tren, risiko likuiditas, dan risiko kegagalan indikator teknis.
/*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)