Chiến lược giao dịch hệ thống trung bình động

Tác giả:ChaoZhang, Ngày: 2024-01-05 15:36:00
Tags:

img

Tổng quan

Bài viết này thảo luận về một chiến lược giao dịch dựa trên một đường trung bình động đơn giản. Chiến lược so sánh giá đóng với đường trung bình động 17 giai đoạn, đi dài khi giá đóng vượt trên đường trung bình động và đi ngắn khi nó vượt dưới.

Chiến lược logic

Tính toán trung bình động

Chiến lược sử dụng các thông số sau đây để tính trung bình động:

  • MA Source: Default to average of OHLC (OHLC4) (Máy nguồn: mặc định đến trung bình của OHLC)
  • Loại MA: mặc định đến trung bình di chuyển đơn giản (SMA)
  • MA Length: mặc định là 17

Dựa trên các thông số này, hàm getMAType (() được gọi để tính SMA 17 giai đoạn của giá đóng.

Sản xuất tín hiệu giao dịch

Sau đó so sánh mối quan hệ giữa giá đóng cửa và trung bình động:

  • Close > Moving Average: tín hiệu dài
  • Khóa < Trung bình động: tín hiệu ngắn

Khi giá đóng vượt qua trên đường trung bình động từ dưới, một tín hiệu dài được tạo ra. Khi nó vượt qua dưới từ trên, một tín hiệu ngắn được tạo ra.

Thực hiện giao dịch

Trong thời gian backtest, mở các vị trí dài khi tín hiệu dài xuất hiện và mở các vị trí ngắn khi tín hiệu ngắn xuất hiện.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là logic rất đơn giản và rõ ràng. Chỉ với một chỉ số, nó đánh giá sự đảo ngược xu hướng dựa trên sự thay đổi hướng của chỉ số. Chiến lược dễ hiểu và thực hiện, phù hợp cho người mới bắt đầu học.

Ngoài ra, các đường trung bình động thuộc về các chỉ số theo xu hướng, có thể theo dõi hiệu quả những thay đổi xu hướng và tránh sự can thiệp của tiếng ồn thị trường ngắn hạn.

Bằng cách điều chỉnh các tham số, nó có thể thích nghi với các chu kỳ khác nhau và các sản phẩm khác nhau.

Phân tích rủi ro

Thứ nhất, chiến lược này chỉ dựa trên một chỉ số, do đó các tiêu chí đánh giá tương đối đơn giản, có thể tạo ra nhiều tín hiệu sai hơn.

Ngoài ra, như một hệ thống theo xu hướng, nó không hoạt động tốt trên các thị trường giới hạn và bên cạnh.

Bên cạnh đó, nếu không dừng lỗ hoặc lấy lợi nhuận, có nguy cơ mở rộng tổn thất.

Các giải pháp là kết hợp các chỉ số khác, tối ưu hóa các kết hợp tham số để giảm tín hiệu sai. Thêm dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro và tối ưu hóa rút tiền.

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

Dưới đây là một số ý tưởng để tối ưu hóa chiến lược:

  1. Điều chỉnh các thông số trung bình động, tối ưu hóa số thời gian, ví dụ như thay đổi thành thời gian 30 hoặc 50.

  2. Hãy thử các loại trung bình động khác nhau, như EMA, VIDYA vv. Chúng có độ nhạy khác nhau đối với sự thay đổi giá.

  3. Thêm các chỉ số khác kết hợp, ví dụ: MACD để đánh giá sức mạnh; RSI để giảm tín hiệu sai.

  4. Thêm cơ chế dừng lỗ. Đặt tỷ lệ phần trăm cố định hoặc ATR dựa trên dừng lỗ để kiểm soát số tiền lỗ giao dịch duy nhất.

  5. Thêm các cơ chế lấy lợi nhuận. Đặt mục tiêu tỷ lệ lợi nhuận để tối đa hóa lợi nhuận.

Những tối ưu hóa này có thể làm cho hiệu suất chiến lược ổn định hơn và tránh giảm quá mức.

Tóm lại

Bài viết này phân tích một chiến lược giao dịch đơn giản dựa trên một đường trung bình động 17 giai đoạn. Chiến lược có nguồn tín hiệu đơn giản, dễ hiểu và thực hiện, thuộc về một hệ thống theo xu hướng điển hình. Thông qua việc giải thích sâu về chiến lược, ưu và nhược điểm của nó được phân tích và nhiều chiều của ý tưởng tối ưu hóa được đề xuất.


/*backtest
start: 2023-12-05 00:00:00
end: 2024-01-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Moving Average /////////////
source = input(title="MA Source", defval=ohlc4)
maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"])
length = input(title="MA Length", defval=17)

///////////// Get MA Function /////////////
getMAType(maType, sourceType, maLen) => 
    res = sma(close, 1)
    
    if maType == "ema"
        res := ema(sourceType, maLen)
    if maType == "sma"
        res := sma(sourceType, maLen)
    if maType == "swma"
        res := swma(sourceType)
    if maType == "wma"
        res := wma(sourceType, maLen)
    if maType == "vwma"
        res := vwma(sourceType, maLen)
    if maType == "rma"
        res := rma(sourceType, maLen)
    res
    
MA = getMAType(maType, source, length)

/////////////// Strategy ///////////////
long = close > MA
short = close < MA

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)

/////////////// Plotting /////////////// 
p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2)
p2 = plot(close, linewidth=2)
fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)

Thêm nữa