Chiến lược chéo trung bình di chuyển

Tác giả:ChaoZhang, Ngày: 2023-10-10 10:44:25
Tags:

Tổng quan

Chiến lược chuyển động trung bình là một chiến lược giao dịch được sử dụng phổ biến dựa trên trung bình chuyển động. Nó sử dụng sự chéo chéo của một trung bình chuyển động nhanh hơn và một trung bình chuyển động chậm hơn như các tín hiệu giao dịch. Khi trung bình chuyển động nhanh hơn vượt qua trên trung bình chuyển động chậm hơn từ dưới, đó là một tín hiệu mua. Khi trung bình chuyển động nhanh hơn vượt qua dưới trung bình chuyển động chậm hơn từ trên, đó là một tín hiệu bán. Chiến lược này sử dụng MA 50 ngày là MA nhanh hơn và MA 200 ngày là MA chậm hơn.

Chiến lược logic

Định nghĩa cơ bản của chiến lược này dựa trên lý thuyết về đường trung bình động. Định nghĩa trung bình động có thể làm mịn mượt biến động giá và chỉ ra xu hướng giá. MA nhanh hơn nhạy cảm hơn với sự thay đổi giá và có thể nắm bắt các điểm đảo ngược xu hướng. MA chậm hơn ít nhạy cảm hơn với sự thay đổi giá và có thể lọc ra các biến động ngắn hạn. Khi MA nhanh hơn vượt qua đường MA chậm hơn, nó cho thấy xu hướng tăng giá. Khi MA nhanh hơn vượt qua đường MA chậm hơn, nó cho thấy xu hướng giảm giá.

Cụ thể, chiến lược này đầu tiên xác định MA 50 ngày và MA 200 ngày. Điều kiện đầu vào dài được thiết lập khi MA nhanh hơn vượt qua trên MA chậm hơn. Điều kiện đầu vào ngắn được thiết lập khi MA nhanh hơn vượt qua dưới MA chậm hơn. Để tránh giao dịch chồng chéo, chiến lược sử dụng cờ isEntry và isExit để kiểm soát. Khi điều kiện đầu vào được đáp ứng, isEntry được thiết lập là true. Khi điều kiện ra được đáp ứng, isExit được thiết lập là true. Một vị trí dài sẽ chỉ được mở khi isEntry là false và tín hiệu mua xuất hiện. Một vị trí ngắn sẽ chỉ được mở khi isExit là false và tín hiệu bán xuất hiện.

Ngoài ra, chiến lược cũng thiết lập mức lợi nhuận và dừng lỗ. Người dùng có thể xác định khoảng cách TP / SL theo tỷ lệ phần trăm thông qua đầu vào. Giá TP và SL sẽ được tính dựa trên tỷ lệ phần trăm giá nhập cảnh. Khi kích thước vị trí lớn hơn 0, TP và SL sẽ được thực hiện dựa trên tỷ lệ phần trăm TP / SL dài. Khi kích thước vị trí nhỏ hơn 0, TP và SL sẽ dựa trên tỷ lệ phần trăm TP / SL ngắn.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Đơn giản để thực hiện. Nó giao dịch hoàn toàn dựa trên MA chéo, phù hợp cho người mới bắt đầu mà không có kinh nghiệm giao dịch.

  2. Điều khiển rút tiền với quản lý rủi ro.

  3. Các tham số có thể tùy chỉnh để thích nghi. Người dùng có thể tối ưu hóa các tham số như thời gian MA và mức TP / SL.

  4. Hình dung rõ ràng. Chiến lược vẽ các MAs chính, mục nhập và mức TP / SL trên biểu đồ.

  5. Khung mở rộng. Cấu trúc chiến lược đã hoàn thành. Các tín hiệu và chỉ số mới có thể được thêm để tăng cường nó.

Phân tích rủi ro

Những rủi ro của chiến lược này bao gồm:

  1. Không thể ngăn chặn lỗ trong các sự kiện thị trường cực đoan, dẫn đến giảm lớn. MA nhanh hơn nhạy cảm với sự thay đổi giá và có thể thất bại trong điều kiện cực đoan.

  2. Có xu hướng giảm giá trên các thị trường khác nhau, gây ra những tổn thất liên tục.

  3. Chi phí giao dịch không được xem xét. Phí và trượt trong giao dịch thực tế sẽ ảnh hưởng đáng kể đến lợi nhuận.

  4. Backtest quá phù hợp: Điều kiện thị trường thực tế rất phức tạp và kết quả backtest có thể không đại diện cho hiệu suất thực tế.

Các giải pháp bao gồm:

  1. Sử dụng stop loss rộng hơn, hoặc thêm stop loss breakout thêm.

  2. Mở rộng khoảng cách MA, giảm tần suất giao dịch hoặc thêm các bộ lọc khác.

  3. Xem xét chi phí giao dịch thực tế, đặt mục tiêu lợi nhuận rộng hơn.

  4. Tối ưu hóa các thông số dần dần và giảm quá tải bằng cách xem xét các điều kiện thị trường thay đổi.

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

Chiến lược này có thể được tối ưu hóa trong các khía cạnh sau:

  1. Kiểm tra các kết hợp tham số khác nhau để tìm các tham số tối ưu, chẳng hạn như thời gian MA.

  2. Thêm các chỉ số khác làm bộ lọc để tránh các whipsaws, chẳng hạn như MACD, KD v.v.

  3. Tối ưu hóa chiến lược dừng lỗ để quản lý rủi ro tốt hơn, chẳng hạn như dừng lỗ.

  4. Tăng kích thước vị trí với đòn bẩy để tăng lợi nhuận trong khi kiểm soát rủi ro.

  5. Xem xét chi phí giao dịch, tối ưu hóa các thông số cho giao dịch trực tiếp.

  6. Đánh giá sự ổn định của các thông số bằng cách sử dụng các phương pháp thống kê để giảm quá tải.

Kết luận

Tóm lại, chiến lược giao thoa MA này có logic rõ ràng và đơn giản để thực hiện, phù hợp như một chiến lược giới thiệu cho giao dịch algo. Nhưng nó cũng có rủi ro và hạn chế. Parameter cẩn thận và tối ưu hóa bộ lọc, và kiểm soát rủi ro là cần thiết để đạt được lợi nhuận ổn định. Chiến lược này có khả năng mở rộng lớn cho người dùng đổi mới và tối ưu hóa dựa trên nó để phù hợp với phong cách giao dịch của riêng họ.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
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/
// © gjfsdrtytru

//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)


// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)

plot(fastMA, "Fast MA",  color.blue)
plot(slowMA, "Slow MA",  color.red)

// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)

// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)


// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"

//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////

// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options

// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL

// Determine TP/SL price based on percentage given
longProfitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice  = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice  = strategy.position_avg_price * (1 + shortStopPerc)

// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and  shortCondition
exitShort = not isExit_Short and closeShort

if (entryLong)
    isEntry_Long := true
    isExit_Long := false
if (exitLong)
    isEntry_Long := false
    isExit_Long := true
if (entryShort)
    isEntry_Short := true
    isExit_Short := false
if (exitShort)
    isEntry_Short := false
    isExit_Short := true

// Order Execution
if testPeriod() 
    if entryLong
        strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
    if entryShort
        strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}


// TP/SL Execution
if (strategy.position_size > 0)
    strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
    strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}

if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
    strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
    
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")

Thêm nữa