
Chiến lược ADR là một chiến lược giao dịch định lượng dựa trên nền tảng TradingView, kết hợp nhiều chỉ số kỹ thuật để đánh giá xu hướng, lọc tín hiệu và thiết lập điểm dừng. Chiến lược này sử dụng chỉ số di chuyển trung bình ((EMA) trong hai chu kỳ khác nhau để xác định xu hướng chính, sử dụng sóng thực trung bình ((ATR) làm bộ lọc tỷ lệ biến động và thiết lập điểm dừng dựa trên rủi ro so với lợi nhuận. Ngoài ra, chiến lược này cũng giới thiệu các biện pháp kiểm soát rủi ro như cửa sổ thời gian giao dịch, cân bằng lỗ hổng, lỗ hổng tối đa, trong nỗ lực nắm bắt cơ hội xu hướng, đồng thời kiểm soát chặt chẽ rủi ro đi xuống.
Giao chéo hai đường: chiến lược sử dụng hai đường EMA có chu kỳ khác nhau để đánh giá xu hướng. Khi EMA ngắn hạn đi qua EMA dài hạn, nó được coi là xu hướng lên và tạo ra tín hiệu đa; ngược lại, khi EMA ngắn hạn đi qua EMA dài hạn, nó được coi là xu hướng xuống và tạo ra tín hiệu đồng nghĩa.
Bộ lọc tỷ lệ biến động ADR: Để tránh tạo ra tín hiệu giao dịch trong môi trường có tỷ lệ biến động thấp, chiến lược đã giới thiệu chỉ số ADR làm bộ lọc tỷ lệ biến động. Chỉ khi giá trị ADR cao hơn ngưỡng tối thiểu được đặt trước, thì việc mở vị trí được cho phép.
Cửa sổ thời gian giao dịch: Chiến lược này cho phép người dùng thiết lập thời gian bắt đầu giao dịch hàng ngày. Các giao dịch sẽ chỉ được thực hiện trong cửa sổ thời gian được chỉ định. Điều này giúp tránh các khoảng thời gian ít lưu động hoặc biến động hơn.
Động thái dừng lỗ: Chiến lược dựa trên giá cao nhất và giá thấp nhất trung bình của đường N gốc K gần đây nhất, và kết hợp với tỷ lệ lợi nhuận rủi ro dự kiến, tính toán động giá dừng và giá dừng lỗ. Điều này đảm bảo lợi nhuận rủi ro cho mỗi giao dịch có thể kiểm soát được.
Cân bằng lỗ hổng: Khi nắm giữ vị trí đạt đến một mức lợi nhuận nhất định (người dùng có thể thiết lập tỷ lệ lợi nhuận rủi ro), chiến lược sẽ di chuyển mức dừng lỗ lên mức giá mở vị trí, tức là mức cân bằng lỗ hổng. Điều này giúp bảo vệ lợi nhuận đã đạt được.
Giới hạn tổn thất tối đa trong ngày: Để kiểm soát tổn thất tối đa trong một ngày, chiến lược đặt giới hạn tổn thất hàng ngày. Một khi tổn thất trong ngày đạt đến giới hạn đó, chiến lược sẽ ngừng giao dịch cho đến khi mở cửa vào ngày hôm sau.
Hoàn tất các vị trí: Bất kể vị trí nắm giữ có chạm vào đường dừng hoặc dừng lỗ hay không, chiến lược sẽ thanh toán tất cả các vị trí vào thời gian cố định của mỗi ngày giao dịch (ví dụ: 16:00) để tránh rủi ro qua đêm.
Khả năng theo dõi xu hướng mạnh mẽ: Xác định xu hướng bằng cách giao nhau bằng hai đường ngang, có thể nắm bắt hiệu quả các xu hướng chính của thị trường, do đó cải thiện tỷ lệ chiến thắng của chiến lược và tiềm năng lợi nhuận.
Tính thích ứng với tỷ lệ dao động: giới thiệu chỉ số ADR như một bộ lọc tỷ lệ dao động, có thể tránh giao dịch thường xuyên trong môi trường có tỷ lệ dao động thấp, giảm tổn thất do tín hiệu không hiệu quả và phá vỡ giả.
Kiểm soát rủi ro nghiêm ngặt: Chiến lược này thiết lập các biện pháp kiểm soát rủi ro từ nhiều chiều, bao gồm dừng động, dừng lỗ, cân bằng lỗ hổng, giới hạn lỗ hổng tối đa mỗi ngày, để kiểm soát hiệu quả rủi ro giảm của chiến lược và tăng thu nhập khi điều chỉnh rủi ro.
Tính linh hoạt của các tham số: Các tham số của chiến lược, chẳng hạn như chu kỳ đường trung bình, độ dài của ADR, tỷ lệ lợi nhuận rủi ro, cửa sổ thời gian giao dịch, v.v., có thể được thiết lập linh hoạt theo sở thích của người dùng và đặc điểm thị trường, để tối ưu hóa hiệu suất của chiến lược.
Mức độ tự động hóa cao: Chiến lược này dựa trên nền tảng TradingView, logic giao dịch được thực hiện hoàn toàn tự động bởi chương trình, giảm sự can thiệp của cảm xúc nhân tạo và phán đoán chủ quan, có lợi cho hoạt động ổn định lâu dài của chiến lược.
Rủi ro tối ưu hóa tham số: Mặc dù các tham số của chiến lược có thể được điều chỉnh một cách linh hoạt, nhưng nếu tối ưu hóa quá mức, có thể dẫn đến quá phù hợp, không hoạt động tốt ở ngoài mẫu. Do đó, khi đặt tham số, cần phải có đầy đủ phản hồi và phân tích để đảm bảo sự ổn định của chiến lược.
Rủi ro sự kiện bất ngờ: Chiến lược này chủ yếu dựa trên giao dịch chỉ số kỹ thuật, có thể phản ứng kém với một số sự kiện cơ bản lớn bất ngờ, chẳng hạn như thay đổi chính sách, biến động lớn trong dữ liệu kinh tế, dẫn đến sự rút lui lớn.
Rủi ro đảo chiều xu hướng: Trong thời gian quan trọng của sự đảo chiều xu hướng, tín hiệu giao chéo đường hai chiều có thể bị chậm trễ, dẫn đến việc chiến lược bỏ lỡ thời điểm đặt vị trí tốt nhất hoặc bị tổn thất trong giai đoạn đầu của sự đảo ngược xu hướng.
Rủi ro về thanh khoản: Mặc dù chiến lược đã thiết lập cửa sổ thời gian giao dịch, nhưng nếu giao dịch của giao dịch kém, bạn vẫn có thể phải đối mặt với rủi ro như trượt điểm, giao dịch chậm, ảnh hưởng đến hiệu suất của chiến lược.
Rủi ro thất bại của chỉ số kỹ thuật: Chiến lược này phụ thuộc nhiều vào chỉ số kỹ thuật và có thể giảm hiệu quả của chiến lược nếu môi trường thị trường thay đổi đáng kể khiến chỉ số mất ý nghĩa chỉ thị ban đầu.
Nhập các chỉ số có nhiều chiều hơn: Dựa trên đường hai chiều và ADR hiện có, có thể xem xét việc giới thiệu nhiều chỉ số kỹ thuật hiệu quả hơn, chẳng hạn như MACD, RSI, v.v., để cải thiện độ tin cậy và độ ổn định của tín hiệu.
Các tham số tối ưu hóa động: Có thể thiết lập một cơ chế tối ưu hóa các tham số, tùy thuộc vào các tình trạng thị trường khác nhau (như kiểu xu hướng, kiểu chấn động, v.v.), các tham số quan trọng của chiến lược điều chỉnh động để thích ứng với sự thay đổi của thị trường.
Thêm các yếu tố cơ bản: Cân nhắc một số chỉ số cơ bản quan trọng, như dữ liệu kinh tế, xu hướng chính sách, có thể giúp chiến lược nắm bắt được xu hướng thị trường tốt hơn và tránh rủi ro hệ thống kịp thời.
Cải thiện cơ chế dừng lỗ: Dựa trên cơ sở dừng lỗ động hiện có, có thể tối ưu hóa hơn nữa logic của dừng lỗ, chẳng hạn như giới thiệu các phương pháp theo dõi dừng lỗ, dừng một phần để bảo vệ lợi nhuận và kiểm soát rủi ro tốt hơn.
Nhiều mục tiêu, nhiều chu kỳ thời gian: mở rộng chiến lược sang nhiều mục tiêu giao dịch và nhiều chu kỳ thời gian, tăng khả năng thích ứng và ổn định của chiến lược bằng cách phân tán đầu tư và tối ưu hóa chu kỳ thời gian.
ADR là một chiến lược giao dịch định lượng dựa trên phân tích kỹ thuật để đánh giá xu hướng thông qua giao dịch hai đường ngang và lọc biến động bằng chỉ số ADR. Chiến lược này cũng có các biện pháp kiểm soát rủi ro nghiêm ngặt, bao gồm dừng động, cân bằng lỗ hổng, giới hạn lỗ hổng tối đa hàng ngày, để kiểm soát rủi ro xuống. Ưu điểm của chiến lược là khả năng theo dõi xu hướng mạnh mẽ, khả năng thích ứng với biến động, kiểm soát rủi ro nghiêm ngặt, khả năng điều chỉnh các tham số linh hoạt và tự động hóa cao.
/*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)