Xu hướng trung bình di chuyển ba lần theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-02-01 11:02:17
Tags:

img

Tổng quan

Chiến lược này kết hợp khái niệm giao dịch rùa với phân tích giai đoạn Niko Bakker, sử dụng ba đường trung bình động của các chu kỳ khác nhau để xác định hướng xu hướng theo xu hướng. Nó đi dài khi đường trung bình động nhanh vượt qua đường trung bình động trung bình và cả ba đường trung bình động đều có cùng xu hướng tăng hoặc giảm; Nó đi ngắn khi đường trung bình động nhanh vượt dưới đường trung bình động và cả ba đường trung bình động đều có cùng xu hướng tăng hoặc giảm.

Chiến lược logic

  1. Tính toán ba trung bình động của các chu kỳ khác nhau: thời gian trung bình động nhanh là 8 ngày, thời gian trung bình động trung bình là 21 ngày và thời gian trung bình động chậm là 55 ngày.

  2. Xác định điều kiện nhập cảnh: khi trung bình động nhanh vượt trên trung bình động trung bình và cả ba trung bình động đều có xu hướng tăng, đi dài; khi trung bình động nhanh vượt dưới trung bình động trung bình và cả ba trung bình động đều có xu hướng giảm, đi ngắn.

  3. Xác định các điều kiện thoát: đóng các vị trí khi trung bình động nhanh vượt qua trung bình động trung bình theo hướng ngược lại.

  4. Định kích thước vị trí: sử dụng định kích thước vị trí cố định, mở 1 hợp đồng mỗi lần. ATR cũng có thể được sử dụng để điều chỉnh động định kích thước vị trí.

Phân tích lợi thế

  1. Sử dụng ba đường trung bình di chuyển giúp xác định hướng xu hướng và tránh các sự phá vỡ sai.

  2. Xu hướng tiếp theo cho tiềm năng lợi nhuận.

  3. Sử dụng các đường trung bình động dẫn đến lợi nhuận ổn định và thu hồi tương đối nhỏ.

  4. Chiến lược dừng lỗ có thể kiểm soát được làm giảm khả năng mất mát lớn.

Phân tích rủi ro

  1. Có nhiều lỗ nhỏ, làm giảm hiệu quả lợi nhuận.

  2. Mức trung bình động chậm lại và có thể bỏ lỡ các điểm đảo ngược xu hướng.

  3. Định kích thước vị trí cố định không thể kiểm soát rủi ro hiệu quả, có thể gây ra sự gọi ký quỹ trong thời gian biến động thị trường đáng kể.

  4. Tối ưu hóa tham số không đúng dẫn đến giao dịch quá mức, tăng chi phí giao dịch và trượt.

Tối ưu hóa

  1. Tối ưu hóa các giai đoạn trung bình động để phù hợp với các đặc điểm của công cụ giao dịch.

  2. Sử dụng ATR để điều chỉnh động kích thước vị trí.

  3. Thêm chiến lược dừng lỗ.

  4. Bao gồm các chỉ số khối lượng giao dịch để xác định độ tin cậy của xu hướng.

Tóm lại

Chiến lược này tích hợp các chỉ số kỹ thuật truyền thống và triết lý giao dịch rùa, sử dụng ba đường trung bình động để theo dõi xu hướng. Với tối ưu hóa tham số thích hợp, nó có thể đạt được lợi nhuận tốt. Nhưng nó cũng có một số rủi ro. Dừng lỗ, kích thước vị trí và các biện pháp khác cần được sử dụng để kiểm soát rủi ro và có được lợi nhuận ổn định dài hạn từ chiến lược giao dịch định lượng này.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JoshuaMcGowan

//@version=4

// 1. Define strategy settings
strategy(title="Triple Moving Average", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=4, slippage=2)
     
fastMALen = input(title="Fast MA Length", type=input.integer, defval=8)
medMALen  = input(title="Medium MA Length", type=input.integer, defval=21)
slowMALen = input(title="Slow MA Length", type=input.integer, defval=55)

//endMonth = input(title="End Month Backtest", type=input.integer, defval=11)
//endYear  = input(title="End Year Backtest", type=input.integer, defval=2019)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// 2. Calculate strategy values
fastMA = sma(close, fastMALen)
medMA  = sma(close, medMALen)
slowMA = sma(close, slowMALen)

//Position Sizing
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Backtest Window
//tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0))

// 3. Determine long trading conditions
enterLong = crossover(fastMA, medMA) and
     (fastMA > slowMA) and (medMA > slowMA) and
     window() 

exitLong = crossunder(fastMA, medMA)

// 4. Code short trading conditions
enterShort = crossunder(fastMA, medMA) and
     (fastMA < slowMA) and (medMA < slowMA) and
     window() 

exitShort = crossover(fastMA, medMA)

// 5. Output strategy data
plot(series=fastMA, color=color.green, title="Fast MA")
plot(series=medMA, color=color.purple, title="Medium MA")
plot(series=slowMA, color=color.red, title="Slow MA",
     linewidth=2)
     
bgColour =
     enterLong and (strategy.position_size < 1) ? color.green :
     enterShort and (strategy.position_size > -1) ? color.red :
     exitLong and (strategy.position_size > 0) ? color.lime :
     exitShort and (strategy.position_size < 0) ? color.orange :
     na

bgcolor(color=bgColour, transp=85)

// 6. Submit entry orders
if (enterLong)
    strategy.entry(id="EL", long=true, qty=1)

if (enterShort)
    strategy.entry(id="ES", long=false, qty=1)

// 7. Submit exit orders
strategy.close_all(when=exitLong and
     (strategy.position_size > 0))
strategy.close_all(when=exitShort and
     (strategy.position_size < 0))

strategy.close_all(when=not window())

//END

Thêm nữa