Chiến lược lai ATR và Crossover trung bình động

Tác giả:ChaoZhang, Ngày: 2023-09-26 17:22:21
Tags:

Tổng quan

Chiến lược này kết hợp chỉ số Average True Range (ATR) và Moving Average crossover để xác định các tín hiệu xu hướng cho tỷ lệ thắng cao hơn.

Lý luận

  • Sử dụng ATR để xác định biến động giá trên khung thời gian dài hơn để xác nhận xu hướng tăng
  • Tính toán trung bình động nhanh và chậm trên khung thời gian thấp hơn, đi dài khi MA nhanh vượt qua MA chậm, đi ngắn khi MA nhanh vượt qua dưới MA chậm
  • ATR chỉ ra xu hướng tổng thể trong khung thời gian dài hơn; MA crossover xác định các điểm nhập khẩu cụ thể trong khung thời gian ngắn hơn
  • ATR được tính bằng cách làm mịn RMA, chiều dài và độ mịn có thể điều chỉnh
  • MA crossover bao gồm hai SMA, chiều dài có thể điều chỉnh

Ưu điểm

  • ATR có thể lọc hiệu quả các động thái bất ổn, tránh giao dịch không cần thiết
  • MA crossover xác định chính xác các điểm chuyển đổi xu hướng ngắn hạn
  • Làm mịn RMA trên ATR làm giảm sự nhọn nhọn, phán đoán ổn định hơn về xu hướng khung thời gian cao hơn
  • Việc sử dụng kết hợp tránh những khó khăn và nắm bắt các cơ hội
  • Các tham số có thể điều chỉnh để tối ưu hóa trên các sản phẩm và khung thời gian khác nhau
  • Tỷ lệ thắng lợi tổng thể cao hơn dự kiến cho lợi nhuận ổn định

Rủi ro

  • Đánh giá xu hướng ATR dễ bị chậm trễ, có thể bỏ lỡ sự khởi đầu xu hướng ban đầu
  • MA crossover dễ bị điều chỉnh nhiều lần, nhiều tín hiệu bán
  • Điều chỉnh tham số cực kỳ quan trọng, cài đặt không đúng dẫn đến giao dịch quá / dưới
  • Yêu cầu phân tích dữ liệu lịch sử để thiết lập tham số tối ưu cho mỗi sản phẩm
  • Xem xét kích thước vị trí dần dần, đảm bảo đủ tiền để hạn chế tổn thất

Cơ hội gia tăng

  • Khám phá các chỉ số bổ sung/thay thế cho ATR, ví dụ như Bollinger Band để xác định sức mạnh xu hướng
  • Mở rộng chéo MA với các kết hợp khác, ví dụ: EMA, chỉ số động lực
  • Tích hợp các cơ chế xác nhận đột phá để tránh đột phá sai
  • Trình tự tối ưu hóa tham số: chiều dài ATR/lượt> chiều dài MA > dừng lỗ/lấy lợi nhuận
  • Xem xét tích hợp các chiến lược quản lý vốn, ví dụ như định hình định hình, định hình vị trí động
  • Kiểm tra hậu quả rộng rãi để đánh giá sự ổn định của chiến lược và thu hút tối đa

Kết luận

Chiến lược này sử dụng đầy đủ điểm mạnh của ATR và MA để xác định hướng xu hướng và điểm nhập cảnh. Thông qua điều chỉnh tham số, nó có thể thích nghi với các môi trường thị trường khác nhau. Kiểm tra trực tiếp chứng minh lợi nhuận nhất quán và tỷ lệ thắng cao. Tuy nhiên, kiểm soát rủi ro là rất quan trọng cho các hoạt động thận trọng. Việc xác nhận dữ liệu thêm sẽ đảm bảo mở rộng và tinh chỉnh nó thành một hệ thống lượng mạnh mẽ.


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Phoenix085

//@version=4
strategy("Phoenix085-Strategy_ATR+MovAvg", shorttitle="Strategy_ATR+MovAvg", overlay=true)

// // ######################>>>>>>>>>>>>Inputs<<<<<<<<<<<#########################
// // ######################>>>>>>>>>>>>Strategy Inputs<<<<<<<<<<<#########################

TakeProfitPercent = input(50, title="Take Profit %", type=input.float, step=.25)
StopLossPercent = input(5, title="Stop Loss %", type=input.float, step=.25)

ProfitTarget = (close * (TakeProfitPercent / 100)) / syminfo.mintick
LossTarget = (close * (StopLossPercent / 100)) / syminfo.mintick

len_S = input(title="Shorter MA Length", defval=8, minval=1)
len_L = input(title="Longer MA Length", defval=38, minval=1)

TF = input(defval="", title="Session TF for calc only", type=input.session,options=[""])
TF_ = "1"

if TF == "3"
    TF_ == "1"
else 
    if TF == "5" 
        TF_ == "3"
    else 
        if TF == "15"
            TF_ == "5"
        else 
            if TF == "30"
                TF_ == "15"
            else 
                if TF == "1H"
                    TF_ == "30"
                else 
                    if TF == "2H"
                        TF_ == "1H"
                    else 
                        if TF == "4H"
                            TF_ == "3H"
                        else 
                            if TF == "1D"
                                TF_ == "4H"
                            else
                                if TF == "1W"
                                    TF_ == "1H"
                                else 
                                    if TF == "1M"
                                        TF_ == "1W"
                                    else
                                        if TF =="3H"
                                            TF_ == "2H"

Src = security(syminfo.tickerid, TF, close[1], barmerge.lookahead_on)

Src_ = security(syminfo.tickerid, TF_, close, barmerge.lookahead_off)

// ######################>>>>>>>>>>>>ATR Inputs<<<<<<<<<<<#########################
length = input(title="ATR Length", defval=4, minval=1)
smoothing = input(title="ATR Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])


// //######################>>>>>>>>>>>>Custom Functions Declarations<<<<<<<<<<<#########################



// ######################>>>>>>>>>>>>ATR<<<<<<<<<<<#########################

ma_function(source, length) =>
	if smoothing == "RMA"
		rma(Src, length)
	else
		if smoothing == "SMA"
			sma(Src, length)
		else
			if smoothing == "EMA"
				ema(Src, length)
			else
				wma(Src, length)

ATR=ma_function(tr(true), length)


// //######################>>>>>>>>>>>>Conditions<<<<<<<<<<<#########################
ATR_Rise = ATR>ATR[1] and ATR[1]<ATR[2] and ATR[2]<ATR[3]

longCondition = crossover(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) < sma(Src_, len_S) and (sma(Src_, len_S) < Src_[1])
shortCondition = crossunder(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) > sma(Src_, len_S) 

plot(sma(Src_, len_S), color=color.lime, transp=90)
col = longCondition ? color.lime : shortCondition ? color.red : color.gray
plot(sma(Src_, len_L),color=col,linewidth=2)


bool IsABuy = longCondition 
bool IsASell = shortCondition

// // ######################>>>>>>>>>>>>Strategy<<<<<<<<<<<#########################

testStartYear = input(2015, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
inDateRange = true

bgcolor(inDateRange ? color.green : na, 90)
// //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

// // ######################>>>>>>LongEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsABuy 
    strategy.entry("longCondition",true,when = longCondition)
    strategy.close("shortCondition")
    strategy.exit("Take Profit or Stop Loss", "longCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
// strategy.risk.max_drawdown(10, strategy.percent_of_equity)
    
// // ######################>>>>>>ShortEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsASell  
    strategy.entry("shortCondition",false,when = shortCondition)
    strategy.exit("Take Profit or Stop Loss", "shortCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
    strategy.close("longCondition")

Thêm nữa