Strategi persimpangan ADR adalah strategi dagangan kuantitatif berdasarkan platform TradingView yang menggabungkan beberapa penunjuk teknikal untuk menentukan trend, isyarat penapis dan menetapkan stop loss. Strategi ini menggunakan dua purata bergerak indeks (EMA) dari dua kitaran yang berbeza untuk mengenal pasti trend utama, menggunakan rentang gelombang sebenar (ATR) sebagai penapis kadar turun naik, dan menetapkan stop loss secara dinamik berdasarkan nilai pulangan stop daripada risiko. Selain itu, strategi ini juga memperkenalkan langkah-langkah kawalan angin seperti tingkap masa dagangan, imbangan rugi, dan kerugian maksimum harian, untuk mengawal risiko penurunan yang ketat sambil menangkap peluang trend.
Perpindahan dua garis rata: Strategi menggunakan dua garis EMA yang berbeza untuk menentukan trend. Apabila EMA jangka pendek melintasi EMA jangka panjang, ia dianggap sebagai trend yang lebih tinggi dan menghasilkan isyarat yang lebih banyak; sebaliknya, apabila EMA jangka pendek melintasi EMA jangka panjang, ia dianggap sebagai trend yang lebih rendah dan menghasilkan isyarat kosong.
Penapisan kadar turun naik ADR: Untuk mengelakkan isyarat dagangan dihasilkan dalam persekitaran dengan kadar turun naik yang rendah, strategi memperkenalkan penunjuk ADR sebagai penapisan kadar turun naik. Hanya apabila nilai ADR melebihi ambang minimum yang ditetapkan, perdagangan dibenarkan dibuka.
Jendela masa dagangan: Dasar ini membolehkan pengguna menetapkan masa permulaan dan akhir dagangan setiap hari. Dagangan hanya akan dilaksanakan dalam tetingkap masa yang ditetapkan. Ini membantu mengelakkan masa yang lebih rendah atau lebih besar.
Stop loss dan stop loss dinamik: Strategi ini berdasarkan purata harga tertinggi dan terendah pada garis N root K terkini, dan digabungkan dengan nisbah pulangan risiko yang telah ditetapkan. Ini memastikan pulangan risiko setiap dagangan adalah terkawal.
Keseimbangan keuntungan dan kerugian: Apabila pegangan mencapai tahap keuntungan tertentu (pengguna boleh menetapkan nisbah pulangan risiko), strategi akan mengalihkan titik stop loss ke harga pembukaan, iaitu titik keseimbangan keuntungan dan kerugian. Ini membantu melindungi keuntungan yang telah diperoleh.
Had kerugian maksimum sehari: Untuk mengawal kerugian maksimum sehari, strategi menetapkan had kerugian harian. Apabila kerugian hari itu mencapai had itu, strategi akan menghentikan dagangan sehingga hari berikutnya dibuka.
Pelancongan penutupan: Strateginya adalah untuk menepis semua kedudukan pada waktu yang ditetapkan (seperti 16:00) setiap hari dagangan, mengelakkan risiko semalaman, sama ada pegangan menyentuh garis stop atau stop loss.
Keupayaan untuk mengikuti trend yang kuat: Dengan penyambungan dua garis rata untuk menentukan trend, anda dapat menangkap trend utama pasaran dengan berkesan, meningkatkan peluang kemenangan dan potensi keuntungan strategi.
Kemudahan penyesuaian kadar turun naik yang baik: pengenalan penunjuk ADR sebagai penapis kadar turun naik dapat mengelakkan perdagangan yang kerap dalam persekitaran dengan kadar turun naik yang rendah, mengurangkan kerugian yang disebabkan oleh isyarat yang tidak berkesan dan terobosan palsu.
Kawalan risiko yang ketat: Strategi ini menetapkan langkah-langkah kawalan angin dari pelbagai dimensi, termasuk penghentian pemadaman dinamik, keseimbangan keuntungan dan kerugian, batasan kerugian maksimum harian, dan lain-lain, secara berkesan mengawal risiko penurunan strategi dan meningkatkan keuntungan selepas penyesuaian risiko.
Parameter fleksibel: Parameter strategi, seperti kitaran rata-rata, panjang ADR, nisbah pulangan risiko, tingkap masa dagangan, dan lain-lain, boleh diatur secara fleksibel mengikut pilihan pengguna dan ciri-ciri pasaran untuk mengoptimumkan prestasi strategi.
Tingkat automasi yang tinggi: Strategi ini berdasarkan platform TradingView, logik dagangan dijalankan sepenuhnya secara automatik oleh program, mengurangkan gangguan emosi manusia dan pertimbangan subjektif, yang memberi manfaat kepada operasi strategi yang stabil dalam jangka panjang.
Risiko pengoptimuman parameter: Walaupun parameter strategi boleh disesuaikan secara fleksibel, jika terlalu dioptimumkan, ia boleh menyebabkan terlalu banyak kesesuaian dan menunjukkan prestasi yang buruk di luar sampel. Oleh itu, pemasangan parameter memerlukan pengulangan dan analisis yang mencukupi untuk memastikan kekuatan strategi.
Risiko kejadian mendadak: Strategi ini terutamanya berdasarkan perdagangan penunjuk teknikal, yang mungkin kurang bertindak balas terhadap beberapa peristiwa mendasar utama yang mendadak, seperti perubahan dasar, turun naik data ekonomi yang besar, dan lain-lain, yang menyebabkan kemunduran yang lebih besar.
Risiko pembalikan trend: Pada masa-masa penting pembalikan trend, isyarat persimpangan dua garis rata mungkin terlambat, menyebabkan strategi kehilangan masa terbaik untuk meletakkan atau mengalami kerugian pada awal pembalikan trend.
Risiko kecairan: Walaupun strategi menetapkan tetingkap masa dagangan, risiko titik licin, penundaan dagangan dan lain-lain mungkin berlaku jika tanda dagangan tidak lancar, yang mempengaruhi prestasi strategi.
Risiko kegagalan penunjuk teknikal: Strategi ini sangat bergantung kepada penunjuk teknikal, dan keberkesanan strategi mungkin merosot jika keadaan pasaran berubah secara besar-besaran yang menyebabkan penunjuk kehilangan makna petunjuk asalnya.
Memperkenalkan penunjuk yang lebih berdimensi: Berdasarkan garis rata dua dan ADR yang sedia ada, pertimbangan boleh dibuat untuk memperkenalkan penunjuk teknikal yang lebih berkesan, seperti MACD, RSI, dan lain-lain untuk meningkatkan kebolehpercayaan dan kestabilan isyarat.
Parameter pengoptimuman dinamik: Satu mekanisme pengoptimuman parameter boleh diwujudkan untuk menyesuaikan parameter utama strategi dinamik mengikut keadaan pasaran yang berbeza (seperti jenis trend, jenis pergolakan, dan lain-lain) untuk menyesuaikan perubahan pasaran.
Menggabungkan faktor asas: Mempertimbangkan dengan betul beberapa petunjuk asas penting, seperti data ekonomi, arah kebijakan, dan lain-lain, dapat membantu strategi memahami lebih baik trend pasaran dan mengelakkan risiko sistemik pada masa yang tepat.
Mempertingkatkan mekanisme penghentian rugi: Mengandung asas penghentian rugi dinamik yang sedia ada, logik penghentian rugi boleh dioptimumkan lebih lanjut, seperti memperkenalkan kaedah penghentian rugi, penghentian sebahagian, dan lain-lain untuk melindungi keuntungan dan mengawal risiko dengan lebih baik.
Multi-parameter, multi-siklus masa: memperluaskan strategi kepada pelbagai parameter dagangan dan pada pelbagai kitaran masa, meningkatkan kesesuaian dan kestabilan strategi dengan mengalihkan pelaburan dan mengoptimumkan kitaran masa.
Strategi persimpangan ADR adalah strategi dagangan kuantitatif berdasarkan analisis teknikal untuk menentukan trend melalui persimpangan dua arah dan menapis kadar turun naik menggunakan indikator ADR. Strategi ini juga menetapkan langkah-langkah kawalan risiko yang ketat, termasuk penghentian kehilangan, penyimpangan keuntungan, batasan kerugian maksimum harian, dan lain-lain untuk mengawal risiko turun. Keunggulan strategi ini adalah kemampuan mengikuti trend yang kuat, fleksibiliti kadar turun naik yang baik, kawalan risiko yang ketat, kebolehan parameter yang boleh disesuaikan, tahap automatik yang tinggi. Tetapi terdapat juga beberapa risiko, seperti risiko pengoptimuman parameter, risiko kejadian mendadak, risiko penurunan trend, risiko kebolehan kebolehan kebolehan kebolehan kebolehan untuk melakukan perdagangan yang lebih baik.
/*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)