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


Ngày tạo: 2024-01-05 15:36:00 sửa đổi lần cuối: 2024-01-05 15:36:00
sao chép: 1 Số nhấp chuột: 683
1
tập trung vào
1617
Người theo dõi

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

Tổng quan

Bài viết này đề cập đến một chiến lược giao dịch dựa trên đường trung bình di chuyển đơn giản. Chiến lược này sử dụng đường trung bình di chuyển có chiều dài 17 để so sánh với giá đóng cửa.

Nguyên tắc chiến lược

Tính toán trung bình di chuyển

Chiến lược này sử dụng các tham số sau để tính toán trung bình di chuyển:

  • MA nguồn: mặc định là trung bình của OHLC ((OHCL4))
  • Loại MA: Định nghĩa mặc định là trung bình di chuyển đơn giản (SMA)
  • MA: 17 mặc định

Dựa trên các tham số này, hàm getMAType (() sẽ tính toán giá đóng cửa SMA 17 chu kỳ.

Tạo tín hiệu giao dịch

Sau đó so sánh giá đóng cửa với đường trung bình di chuyển:

  • Giá đóng cửa > Đường trung bình di chuyển: tín hiệu dài
  • Giá đóng cửa < Đường trung bình di chuyển: tín hiệu trống

Khi giá đóng cửa đi qua đường trung bình di chuyển từ dưới, nó tạo ra tín hiệu nhiều; khi đi qua từ trên xuống, nó tạo ra tín hiệu ngắn.

Thực hiện giao dịch

Trong chu kỳ đo lường lại, nếu có nhiều tín hiệu thì mở nhiều và nếu có tín hiệu trống thì mở trống.

Phân tích lợi thế

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

Ngoài ra, các đường trung bình di chuyển thuộc loại chỉ số theo xu hướng, có thể theo dõi hiệu quả xu hướng thay đổi, tránh bị nhiễu bởi tiếng ồn ngắn hạn trên thị trường.

Có thể điều chỉnh thông qua các tham số để thích ứng với các chu kỳ khác nhau và các giống 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ố, một tiêu chuẩn đánh giá đơn giản, có thể tạo ra nhiều tín hiệu sai.

Ngoài ra, chiến lược này là một hệ thống theo dõi xu hướng và không thể hoạt động trong một thị trường ổn định và bất ổn.

Ngoài ra, không có thiết lập dừng lỗ, có nguy cơ tăng lỗ.

Giải pháp là kết hợp các chỉ số khác, tối ưu hóa các tham số, giảm tín hiệu sai. Thiết lập dừng lỗ, kiểm soát rủi ro và tối ưu hóa rút lui.

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

Sau đây là một số khía cạnh mà bạn có thể nghĩ đến để tối ưu hóa chiến lược:

  1. Điều chỉnh tham số trung bình di chuyển, tối ưu hóa số chu kỳ. Ví dụ: thay đổi thành 30 chu kỳ hoặc 50 chu kỳ.

  2. Thử các loại moving average khác nhau như EMA, VIDA, v.v. Chúng có độ nhạy khác nhau đối với sự thay đổi giá.

  3. Thêm kết hợp các chỉ số khác. Ví dụ, kết hợp với MACD, có thể đánh giá được điểm mạnh. hoặc kết hợp với RSI, giảm tín hiệu sai.

  4. Tăng cơ chế dừng lỗ. Thiết lập dừng động với tỷ lệ phần trăm cố định hoặc giá trị ATR. Kiểm soát lỗ đơn.

  5. Tăng cơ chế ngăn chặn. Thiết lập tỷ lệ lợi nhuận mục tiêu. Tối đa hóa lợi nhuận.

Những cải tiến này giúp cho chiến lược hoạt động ổn định hơn và tránh bị rút lại quá nhiều.

Tóm tắt

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 đường trung bình di chuyển 17 chu kỳ. Nguồn tín hiệu chiến lược đơn giản, dễ hiểu và thực hiện, thuộc hệ thống theo dõi xu hướng điển hình. Bằng cách giải thích sâu về chiến lược, phân tích lợi thế và rủi ro của nó và đưa ra tư duy tối ưu hóa đa chiều.

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