Strategi EMA Cross ADR adalah strategi perdagangan kuantitatif berdasarkan platform TradingView. Strategi ini menggabungkan beberapa indikator teknis untuk menentukan tren, sinyal filter, dan menetapkan stop-loss dan level take-profit. Strategi ini menggunakan dua Exponential Moving Averages (EMA) dengan periode yang berbeda untuk mengidentifikasi tren utama, menggunakan Average Daily Range (ADR) sebagai filter volatilitas, dan secara dinamis menetapkan stop-loss dan level take-profit berdasarkan rasio risiko-balas. Selain itu, strategi ini menggabungkan langkah-langkah manajemen risiko seperti jendela waktu perdagangan, stop break-even, dan batas kerugian harian maksimum, yang bertujuan untuk menangkap peluang tren sambil mengontrol risiko penurunan secara ketat.
Dual EMA Crossover: Strategi ini menggunakan dua EMA dengan periode yang berbeda untuk menentukan tren. Ketika EMA jangka pendek melintasi di atas EMA jangka panjang, itu dianggap sebagai tren naik, menghasilkan sinyal panjang; sebaliknya, ketika EMA jangka pendek melintasi di bawah EMA jangka panjang, itu dianggap sebagai tren menurun, menghasilkan sinyal pendek.
Filter Volatilitas ADR: Untuk menghindari menghasilkan sinyal perdagangan di lingkungan volatilitas rendah, strategi memperkenalkan indikator ADR sebagai filter volatilitas. Posisi hanya diizinkan dibuka ketika nilai ADR melebihi ambang minimum yang ditetapkan sebelumnya.
Trading Time Window: Strategi ini memungkinkan pengguna untuk mengatur waktu awal dan akhir untuk perdagangan harian. Perdagangan hanya dilaksanakan dalam jendela waktu yang ditentukan, yang membantu menghindari periode tidak likuid atau sangat volatile.
Dinamis Stop-Loss dan Take-Profit: Strategi secara dinamis menghitung harga stop-loss dan take-profit berdasarkan rata-rata harga tertinggi dan terendah dari N candlesticks terbaru, dikombinasikan dengan rasio risiko-balasan yang telah ditetapkan sebelumnya. Ini memastikan bahwa risiko-balasan dari setiap perdagangan dapat dikontrol.
Stop Break-Even: Ketika posisi mencapai tingkat keuntungan tertentu (rasio risiko-balasan yang ditentukan pengguna), strategi memindahkan stop-loss ke titik break-even (harga masuk). Ini membantu melindungi keuntungan yang telah diperoleh.
Batas kerugian harian maksimum: Untuk mengendalikan kerugian maksimum per hari, strategi menetapkan batas kerugian harian. Setelah kerugian harian mencapai batas ini, strategi berhenti berdagang sampai hari berikutnya dibuka.
Tutup Semua Posisi di Akhir Hari: Terlepas dari apakah posisi telah mencapai tingkat mengambil keuntungan atau stop loss, strategi menutup semua posisi pada waktu yang ditetapkan setiap hari perdagangan (misalnya, 16:00) untuk menghindari risiko overnight.
Kemampuan Mengikuti Tren yang Kuat: Dengan menggunakan silang EMA ganda untuk menentukan tren, strategi dapat secara efektif menangkap tren pasar utama, sehingga meningkatkan tingkat kemenangan dan potensi keuntungan.
Adaptifitas Volatilitas yang Baik: Pengenalan indikator ADR sebagai filter volatilitas dapat menghindari perdagangan yang sering dalam lingkungan volatilitas rendah, mengurangi kerugian yang disebabkan oleh sinyal yang tidak valid dan breakout palsu.
Pengendalian Risiko yang ketat: Strategi menetapkan langkah-langkah pengendalian risiko dari berbagai dimensi, termasuk stop-loss dan take-profit yang dinamis, stop break-even, dan batas kerugian harian maksimum, secara efektif mengendalikan risiko penurunan dan meningkatkan pengembalian yang disesuaikan dengan risiko.
Pengaturan Parameter Fleksibel: Berbagai parameter strategi, seperti periode EMA, panjang ADR, rasio risiko-manfaat, jendela waktu perdagangan, dll, dapat diatur secara fleksibel sesuai dengan preferensi pengguna dan karakteristik pasar untuk mengoptimalkan kinerja strategi.
Tingkat Otomatisasi Tinggi: Strategi didasarkan pada platform TradingView, dan logika perdagangan dijalankan sepenuhnya oleh program, mengurangi gangguan emosi manusia dan penilaian subjektif, yang kondusif untuk operasi stabil jangka panjang dari strategi.
Risiko Optimasi Parameter: Meskipun parameter strategi dapat disesuaikan secara fleksibel, terlalu banyak optimasi dapat menyebabkan overfit dan kinerja luar sampel yang buruk.
Risiko Kejadian Tiba-tiba: Strategi terutama diperdagangkan berdasarkan indikator teknis dan mungkin tidak merespons dengan cukup terhadap beberapa peristiwa mendadak fundamental utama, seperti perubahan kebijakan atau fluktuasi data ekonomi yang signifikan, yang mengarah pada penarikan besar.
Risiko Pembalikan Tren: Selama periode utama pembalikan tren, sinyal crossover EMA ganda dapat tertunda, menyebabkan strategi kehilangan waktu terbaik untuk menetapkan posisi atau mengalami kerugian pada awal pembalikan tren.
Risiko likuiditas: Meskipun strategi menetapkan jendela waktu perdagangan, jika likuiditas instrumen yang diperdagangkan buruk, ia masih dapat menghadapi risiko seperti slippage dan penundaan perdagangan, yang mempengaruhi kinerja strategi.
Risiko Gagal Indikator Teknis: Strategi sangat bergantung pada indikator teknis. Jika kondisi pasar berubah secara signifikan, menyebabkan indikator kehilangan makna aslinya, efektivitas strategi dapat menurun.
Memperkenalkan Indikator Lebih Dimensi: Berdasarkan EMA dual dan ADR yang ada, pertimbangkan untuk memperkenalkan indikator teknis yang lebih efektif, seperti MACD dan RSI, untuk meningkatkan keandalan dan ketahanan sinyal.
Optimasi Parameter Dinamis: Menetapkan mekanisme untuk optimasi parameter yang secara dinamis menyesuaikan parameter strategi utama berdasarkan keadaan pasar yang berbeda (seperti tren atau osilasi) untuk beradaptasi dengan perubahan pasar.
Menggabungkan Faktor Dasar: Pertimbangkan secara tepat beberapa indikator dasar penting, seperti data ekonomi dan arah kebijakan, yang dapat membantu strategi memahami tren pasar dengan lebih baik dan menghindari risiko sistemik secara tepat waktu.
Meningkatkan mekanisme Stop-Loss dan Take-Profit: Lebih mengoptimalkan logika stop-loss dan take-profit berdasarkan stop-loss dan take-profit dinamis yang ada, seperti memperkenalkan trailing stop dan partial take-profits, untuk lebih melindungi keuntungan dan mengendalikan risiko.
Multiple Instruments and Time Frames: Memperluas strategi ke beberapa instrumen perdagangan dan kerangka waktu, dan meningkatkan kemampuan beradaptasi dan stabilitas strategi melalui investasi yang beragam dan optimalisasi kerangka waktu.
Strategi EMA Cross ADR adalah strategi perdagangan kuantitatif yang didasarkan pada analisis teknis. Strategi ini menentukan tren melalui crossover EMA ganda dan menggunakan indikator ADR untuk penyaringan volatilitas. Strategi ini juga menetapkan langkah-langkah pengendalian risiko yang ketat, termasuk stop-loss dan take-profit dinamis, stop break-even, dan batas kerugian harian maksimum untuk mengendalikan risiko penurunan. Keuntungan dari strategi ini terletak pada kemampuan mengikuti tren yang kuat, kemampuan beradaptasi volatilitas yang baik, kontrol risiko yang ketat, pengaturan parameter yang fleksibel, dan tingkat otomatisasi yang tinggi. Namun, strategi ini juga memiliki beberapa risiko, seperti risiko optimasi parameter, risiko kejadian mendadak, risiko pembalikan 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)