Chiến lược chéo ngang


Ngày tạo: 2023-10-10 10:44:25 sửa đổi lần cuối: 2023-10-10 10:44:25
sao chép: 0 Số nhấp chuột: 751
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược giao dịch chéo đường trung bình là một chiến lược giao dịch phổ biến dựa trên đường trung bình di chuyển. Chiến lược này sử dụng đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm làm tín hiệu mua và bán.

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

Lý luận cốt lõi của chiến lược này dựa trên lý thuyết đường trung bình. Đường trung bình di chuyển có thể làm phẳng hiệu quả sự biến động giá, phản ánh xu hướng giá. Đường trung bình nhanh nhạy cảm hơn với sự thay đổi giá và có thể nắm bắt các điểm biến động của xu hướng; đường trung bình chậm ít nhạy cảm với sự thay đổi giá và có thể lọc các biến động ngắn hạn.

Cụ thể, chiến lược này đã xác định đường trung bình 50 ngày và đường trung bình 200 ngày. Sau đó, đặt điều kiện nhập nhiều đầu vào đường trung bình nhanh trên đường trung bình chậm và điều kiện nhập đầu rỗng dưới đường trung bình nhanh. Để tránh giao dịch chồng chéo, chiến lược sử dụng isEntry và isExit để kiểm soát. Khi điều kiện nhập được đáp ứng, isEntry được đặt thành True và khi điều kiện thoát được đáp ứng, isExit được đặt thành True.

Ngoài ra, chiến lược cũng đặt điểm dừng lỗ. Người dùng có thể thiết lập khoảng cách dừng lỗ bằng cách nhập phần trăm. Giá dừng và dừng lỗ sẽ được tính dựa trên sự thay đổi phần trăm của giá nhập.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Điều hành đơn giản, dễ thực hiện. Các giao dịch chỉ dựa vào sự giao thoa đều, rất phù hợp cho người mới bắt đầu không có kinh nghiệm giao dịch.

  2. Việc rút lại có thể kiểm soát được, có một cơ chế quản lý rủi ro. Đường trung bình di động có thể lọc hiệu quả các biến động giá ngắn hạn, tránh bị đánh giá.

  3. Các tham số có thể tùy chỉnh, có khả năng thích ứng. Người dùng có thể tự thiết lập tham số đường trung bình và tiêu chuẩn dừng lỗ, tham số để tối ưu hóa chiến lược.

  4. Hình ảnh hiển thị rõ ràng. Chiến lược vẽ trực tiếp trên biểu đồ các điểm trung bình quan trọng, điểm vào, điểm dừng lỗ, ngay lập tức.

  5. Khả năng mở rộng: Khung chiến lược được xây dựng hoàn chỉnh, chỉ cần thay đổi các tín hiệu giao dịch quan trọng, thêm các chỉ số, v.v. để cải thiện chiến lược.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Các sự kiện bất ngờ trên thị trường gây ra tình trạng kinh doanh lớn, không thể ngăn chặn. Đường trung bình nhanh nhạy cảm với sự thay đổi giá và không thể đối phó hiệu quả với sự bất ngờ.

  2. Nếu thị trường bị chấn động lâu dài, nó sẽ gây ra tổn thất lặp lại.

  3. Không tính chi phí giao dịch. Phí và mất điểm trong giao dịch thực tế ảnh hưởng nghiêm trọng đến lợi nhuận.

  4. Nguy cơ phù hợp với dữ liệu phản hồi. Tình huống thực tế rất phức tạp và thay đổi, kết quả phản hồi không đại diện cho hiệu suất chiến đấu thực tế.

Giải pháp tương ứng:

  1. Các tiêu chuẩn dừng lỗ lỏng lẻo hơn có thể được thiết lập, hoặc có thể thêm vào lệnh dừng lỗ đột phá bổ sung.

  2. Có thể mở rộng khoảng cách đường trung bình, giảm tần số giao dịch, hoặc thay đổi các chỉ số khác để lọc tín hiệu.

  3. Cần tính đến chi phí giao dịch thực tế và thiết lập một khoảng trống hạn chế hơn.

  4. Cần xem xét đầy đủ các thay đổi trong môi trường thị trường, tối ưu hóa các tham số và giảm dần sự phù hợp.

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

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

  1. Kiểm tra các tổ hợp tham số khác nhau để tìm tham số tốt nhất. Bạn có thể kiểm tra số ngày trung bình chậm và nhanh, tổ hợp tham số, v.v.

  2. Thêm các chỉ số khác để lọc để tránh giao dịch sai trong tình huống chấn động. Ví dụ: MACD, KD và các chỉ số khác.

  3. Tối ưu hóa chiến lược dừng lỗ và quản lý rủi ro hiệu quả hơn. Ví dụ: theo dõi dừng lỗ, đặt lệnh dừng lỗ.

  4. Tăng cường quy mô, sử dụng đòn bẩy để mở rộng, tăng lợi nhuận.

  5. Cân nhắc chi phí giao dịch trên đĩa cứng, điều chỉnh và tối ưu hóa các tham số phản hồi để các tham số chiến lược phù hợp hơn với chiến đấu thực tế.

  6. Kết hợp các phương pháp thống kê để đánh giá tính ổn định của các tham số, giảm nguy cơ phù hợp của dữ liệu và tăng tính ổn định.

Tóm tắt

Tuy nhiên, chiến lược này cũng có một số rủi ro và thiếu sót, cần phải tối ưu hóa chi tiết các tham số và bộ lọc, và chú ý kiểm soát rủi ro giao dịch trực tiếp để có được lợi nhuận ổn định. Khung chiến lược có khả năng mở rộng mạnh mẽ, người dùng có thể đổi mới và tối ưu hóa trên cơ sở này để phát triển chiến lược giao dịch phù hợp hơn với phong cách của riêng mình.

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