Chiến lược lai ghép đường trung bình động và đường trung bình thực


Ngày tạo: 2023-09-26 17:22:21 sửa đổi lần cuối: 2023-09-26 17:22:21
sao chép: 7 Số nhấp chuột: 976
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược tổng hợp sử dụng hai chỉ số kỹ thuật là đường trung bình và đường trung bình thực tế để nhận ra tín hiệu đường trung bình trong xu hướng để có được tỷ lệ thắng cao hơn.

Nguyên tắc

  • Sử dụng chỉ số ATR để đánh giá biến động giá chu kỳ lớn, xác nhận xu hướng tăng
  • Trong chu kỳ nhỏ, tính trung bình nhanh và trung bình chậm, làm nhiều khi đi qua đường chậm trên đường nhanh và trống khi đi qua đường chậm dưới đường nhanh
  • Chỉ số ATR tính toán sóng thực trung bình trong chu kỳ lớn, xác định xu hướng tổng thể; đường chéo trung bình xác định điểm ra thị trường cụ thể trong chu kỳ nhỏ
  • Chỉ số ATR được tính bằng trung bình di chuyển trơn RMA, có thể điều chỉnh độ dài và độ trơn
  • Giao chéo đường trung bình được tạo thành từ hai đường trung bình SMA, có thể điều chỉnh chiều dài

Ưu điểm

  • Chỉ số ATR có thể lọc hiệu quả xu hướng dao động, tránh giao dịch vô nghĩa
  • Đường trung bình giao nhau để xác định chính xác xu hướng chu kỳ nhỏ
  • RMA tính toán ATR để giảm độ lệch và xác định chính xác hơn về xu hướng chu kỳ lớn
  • Sự kết hợp của hai điều này giúp tránh khỏi những cú sốc và nắm bắt những cơ hội cụ thể.
  • Các tham số có thể điều chỉnh, có thể được tối ưu hóa cho các giống và chu kỳ thời gian khác nhau
  • Nhìn chung, chiến lược này có tỷ lệ thắng cao và có thể mang lại lợi nhuận ổn định.

Rủi ro

  • Chỉ số ATR cho thấy xu hướng chính bị chậm lại, có thể bỏ lỡ sự khởi đầu của xu hướng
  • Tỷ lệ đa lần điều chỉnh đường trung bình, tín hiệu Sell nhiều hơn
  • Parameter Tuning rất quan trọng, thiết lập không đúng cách có thể dẫn đến giao dịch quá thường xuyên hoặc bảo thủ
  • Cần phân tích dữ liệu lịch sử cho các giống cụ thể để tìm các tham số kết hợp tốt nhất
  • Đề xuất mở đầu tư theo từng giai đoạn, đảm bảo nguồn vốn đầy đủ và kiểm soát tổn thất đơn lẻ

Hướng tối ưu hóa

  • Cố gắng bổ sung hoặc thay thế ATR bằng các chỉ số khác, chẳng hạn như BRI để đánh giá cường độ của xu hướng
  • Loại giao tuyến trung bình có thể mở rộng cho các kết hợp khác như EMA, chỉ số động lượng, v.v.
  • Có thể tham gia vào cơ chế xác nhận đột phá để tránh đột phá giả
  • Lệnh thiết lập tham số tối ưu hóa: Độ dài và độ mịn ATR > Độ dài đường trung bình > Cài đặt Stop Loss
  • Xem xét các chiến lược quản lý tài sản, chẳng hạn như cổ phần cố định, vị trí động
  • Đánh giá về sự ổn định của chiến lược và rút lui tối đa

Tóm tắt

Chiến lược này tận dụng tối đa các ưu điểm của ATR và đường trung bình để cùng đánh giá hướng xu hướng và thời điểm nhập cảnh cụ thể. Nó có thể được điều chỉnh theo các tham số và thích ứng với các môi trường thị trường khác nhau.

Mã nguồn chiến lược
/*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")