Chiến lược giao dịch định lượng trung bình di chuyển ba lần

Tác giả:ChaoZhang, Ngày: 2024-01-23 14:20:50
Tags:

img

Chiến lược này tạo ra tín hiệu giao dịch bằng cách tính toán ba đường trung bình động của các giai đoạn khác nhau và kết hợp các bước đột phá giá. Nó thuộc về một chiến lược theo xu hướng điển hình. Chiến lược nhằm mục đích theo dõi xu hướng trung hạn trên thị trường và có thể được điều chỉnh cho các sản phẩm và môi trường giao dịch khác nhau bằng cách điều chỉnh các tham số một cách năng động.

Nguyên tắc

Chiến lược bao gồm ba đường trung bình động: MA1, MA2 và MA3. MA1 và MA2 tạo thành một kênh giao dịch, và giao thoa của chúng tạo ra các tín hiệu giao dịch; MA3 được sử dụng để lọc tín hiệu.

Khi đường MA1 vượt qua đường MA2 trung hạn, điều này cho thấy xu hướng ngắn hạn đang tăng mạnh. Tại thời điểm này, nếu giá trên đường MA3 dài hạn, một tín hiệu dài được tạo ra; ngược lại, nếu đường MA1 vượt qua đường MA2 và giá dưới đường MA3, một tín hiệu ngắn được tạo ra.

Vai trò của MA3 là lọc ra tiếng ồn thị trường ngắn hạn và chỉ tạo ra tín hiệu sau khi xác định xu hướng đã bước vào giai đoạn trung và dài hạn. Bằng cách điều chỉnh động các thông số của ba đường trung bình động, chiến lược có thể tìm ra sự kết hợp thông số tối ưu trên các thị trường khác nhau.

Ưu điểm

  • Khám phá xu hướng của các chu kỳ khác nhau thông qua nhiều đường trung bình động
  • MA3 lọc tín hiệu để tránh chém
  • Các loại và tham số trung bình động có thể tùy chỉnh, khả năng thích nghi cao
  • Hiển thị các chữ thập để xác định các điểm tín hiệu

Rủi ro

  • Các đường trung bình động có thể chậm lại khi xu hướng lớn đảo ngược
  • Tần suất giao dịch tiềm năng cao, tăng chi phí giao dịch và rủi ro trượt
  • Các thông số không chính xác có thể gây ra tín hiệu giao dịch quá mức hoặc chậm

Có thể tối ưu hóa thời gian MA cho các sản phẩm khác nhau; tối ưu hóa stop loss để kiểm soát lỗ đơn; kết hợp các chỉ số kỹ thuật khác để xác nhận tính hợp lệ của tín hiệu và giảm tín hiệu sai.

Hướng dẫn tối ưu hóa

  • Thêm các chỉ số khác để xác định xu hướng, ví dụ: MACD, Bollinger Bands, v.v.
  • Thêm các chiến lược dừng lỗ / lấy lợi nhuận
  • Điều chỉnh động các tham số để tìm kết hợp tối ưu
  • Tối ưu hóa tham số cho các sản phẩm khác nhau
  • Xem xét chi phí giao dịch, tối ưu hóa tần suất giao dịch

Tóm lại

Chiến lược này tạo ra các tín hiệu giao dịch bằng cách tính toán ba đường trung bình động và quan sát các đường chéo của chúng. Sử dụng ý tưởng kết hợp các đường nhanh, trung bình và chậm để xác định xu hướng, đây là một chiến lược theo xu hướng điển hình. Chiến lược có thể được điều chỉnh cho các sản phẩm khác nhau thông qua tối ưu hóa tham số, nhưng có nguy cơ chấn động và bỏ lỡ. Những cải tiến trong tương lai có thể giới thiệu các chỉ số kỹ thuật khác để đánh giá tính hợp lệ của tín hiệu, phát triển các cơ chế tối ưu hóa tham số năng động, v.v. để làm cho chiến lược linh hoạt hơn.


/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © Meesemoo

//@version=4
strategy("Custom MA Strategy Tester", overlay = true)
MA1Period = input(13, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA1Source = input(title="MA1 Source", type=input.source, defval=close)
MA1Visible = input(title="MA1 Visible", type=input.bool, defval=true)
MA2Period = input(50, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA2Source = input(title="MA2 Source", type=input.source, defval=close)
MA2Visible = input(title="MA2 Visible", type=input.bool, defval=true) 
MA3Period = input(200, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA3Source = input(title="MA3 Source", type=input.source, defval=close)
MA3Visible = input(title="MA3 Visible", type=input.bool, defval=true)
ShowCrosses = input(title="Show Crosses", type=input.bool, defval=true)

MA1 = if MA1Type == "SMA"
    sma(MA1Source, MA1Period)
else
    if MA1Type == "EMA"
        ema(MA1Source, MA1Period)
    else
        if MA1Type == "WMA"
            wma(MA1Source, MA1Period)
        else
            if MA1Type == "RMA"
                rma(MA1Source, MA1Period)
            else
                if MA1Type == "HMA"
                    wma(2*wma(MA1Source, MA1Period/2)-wma(MA1Source, MA1Period), round(sqrt(MA1Period)))
                else
                    if MA1Type == "DEMA"
                        e = ema(MA1Source, MA1Period)
                        2 * e - ema(e, MA1Period)
                    else
                        if MA1Type == "TEMA"
                            e = ema(MA1Source, MA1Period)
                            3 * (e - ema(e, MA1Period)) + ema(ema(e, MA1Period), MA1Period)

                    
MA2 = if MA2Type == "SMA"
    sma(MA2Source, MA2Period)
else
    if MA2Type == "EMA"
        ema(MA2Source, MA2Period)
    else
        if MA2Type == "WMA"
            wma(MA2Source, MA2Period)
        else
            if MA2Type == "RMA"
                rma(MA2Source, MA2Period)
            else
                if MA2Type == "HMA"
                    wma(2*wma(MA2Source, MA2Period/2)-wma(MA2Source, MA2Period), round(sqrt(MA2Period)))
                else
                    if MA2Type == "DEMA"
                        e = ema(MA2Source, MA2Period)
                        2 * e - ema(e, MA2Period)
                    else
                        if MA2Type == "TEMA"
                            e = ema(MA2Source, MA2Period)
                            3 * (e - ema(e, MA2Period)) + ema(ema(e, MA2Period), MA2Period)
                    
MA3 = if MA3Type == "SMA"
    sma(MA3Source, MA3Period)
else
    if MA3Type == "EMA"
        ema(MA3Source, MA3Period)
    else
        if MA3Type == "WMA"
            wma(MA3Source, MA3Period)
        else
            if MA3Type == "RMA"
                rma(MA3Source, MA3Period)
            else
                if MA3Type == "HMA"
                    wma(2*wma(MA3Source, MA3Period/2)-wma(MA3Source, MA3Period), round(sqrt(MA3Period)))
                else
                    if MA3Type == "DEMA"
                        e = ema(MA3Source, MA3Period)
                        2 * e - ema(e, MA3Period)
                    else
                        if MA3Type == "TEMA"
                            e = ema(MA3Source, MA3Period)
                            3 * (e - ema(e, MA3Period)) + ema(ema(e, MA3Period), MA3Period)
                    


p1 = plot(MA1Visible ? MA1 : na, color=color.green, linewidth=1)
p2 = plot(MA2Visible ? MA2 : na, color=color.yellow, linewidth=1)
p3 = plot(MA3Visible ? MA3 : na, color=color.red, linewidth=2)

fill(p1, p2, color.silver, transp=80, title="Fill")


start = timestamp(2019, 1, 1, 1, 0)
end = timestamp(2025, 1, 1, 1, 0)

if time >= start and time <= end
    longCondition = crossover(MA1, MA2) and close > MA3
    if (longCondition)
        strategy.entry("Long", strategy.long)
        
    shortCondition = crossunder(MA1, MA2) and close < MA3
    if (shortCondition)
        strategy.entry("Short", strategy.short)

Thêm nữa