Chiến lược dừng lỗ thông minh dựa trên đường trung bình động và mô hình trong ngày

SMA MA18 ATR
Ngày tạo: 2025-01-17 16:04:09 sửa đổi lần cuối: 2025-01-17 16:04:09
sao chép: 4 Số nhấp chuột: 361
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ thông minh dựa trên đường trung bình động và mô hình trong ngày

Tổng quan

Đây là chiến lược dựa trên đường trung bình động 18 ngày (SMA18), kết hợp với khả năng nhận dạng mô hình giao dịch trong ngày và cơ chế dừng lỗ thông minh. Chiến lược này chủ yếu quan sát mối quan hệ giữa giá và SMA18, kết hợp các điểm cao và thấp trong ngày và vào vị thế mua vào đúng thời điểm. Chiến lược này áp dụng kế hoạch dừng lỗ linh hoạt, có thể sử dụng điểm dừng lỗ cố định hoặc điểm thấp nhất trong hai ngày làm điểm chuẩn dừng lỗ theo sau.

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

Logic cốt lõi của chiến lược bao gồm các yếu tố chính sau:

  1. Điều kiện vào lệnh dựa trên vị trí tương đối của giá so với đường trung bình động 18 ngày. Bạn có thể chọn vào lệnh khi giá vượt qua đường trung bình động hoặc vào lệnh trên đường trung bình động.
  2. Bằng cách phân tích các mẫu hình K-line trong ngày, đặc biệt chú ý đến mẫu hình K-line nội bộ (Inside Bar), độ chính xác của mục nhập được cải thiện
  3. Dựa trên đặc điểm hiệu suất của các ngày giao dịch khác nhau trong tuần, bạn có thể giao dịch có chọn lọc vào những ngày cụ thể
  4. Giá vào được thiết lập theo lệnh giới hạn, với mức phí bảo hiểm nhỏ trên mức thấp để tăng khả năng giao dịch.
  5. Cơ chế dừng lỗ hỗ trợ hai chế độ: một là dừng lỗ cố định dựa trên giá vào lệnh và chế độ còn lại là dừng lỗ theo sau dựa trên mức thấp nhất của hai ngày giao dịch trước đó.

Lợi thế chiến lược

  1. Kết hợp các chỉ báo kỹ thuật và mô hình giá, tín hiệu vào lệnh đáng tin cậy hơn
  2. Cơ chế lựa chọn thời gian giao dịch linh hoạt, có thể được tối ưu hóa theo các đặc điểm khác nhau của thị trường
  3. Giải pháp dừng lỗ thông minh bảo vệ lợi nhuận trong khi vẫn cung cấp đủ không gian cho giá cả biến động
  4. Các thông số chiến lược có thể điều chỉnh cao và có thể thích ứng với các môi trường thị trường khác nhau
  5. Thông qua việc sàng lọc các mẫu K-line bên trong, các tín hiệu sai được giảm hiệu quả

Rủi ro chiến lược

  1. Trong thị trường biến động, các điểm dừng cố định có thể dẫn đến việc thoát lệnh sớm
  2. Để đảo ngược nhanh chóng, lệnh dừng lỗ theo sau có thể khóa ít lợi nhuận hơn
  3. Trong giai đoạn đi ngang, nến bên trong xuất hiện thường xuyên có thể dẫn đến giao dịch quá mức. Biện pháp đối phó:
  • Điều chỉnh khoảng cách dừng lỗ một cách linh hoạt theo sự biến động của thị trường
  • Thêm các chỉ báo xác nhận xu hướng
  • Đặt mục tiêu lợi nhuận tối thiểu để lọc ra các giao dịch chất lượng thấp

Hướng tối ưu hóa chiến lược

  1. Giới thiệu các chỉ báo biến động (như ATR) để điều chỉnh khoảng cách dừng lỗ một cách linh hoạt
  2. Tăng kích thước phân tích khối lượng và cải thiện độ tin cậy của tín hiệu
  3. Phát triển các thuật toán lựa chọn ngày thông minh hơn để tự động tối ưu hóa thời gian giao dịch dựa trên hiệu suất lịch sử
  4. Đã thêm bộ lọc cường độ xu hướng để tránh giao dịch theo xu hướng yếu
  5. Tối ưu hóa thuật toán nhận dạng dòng K bên trong để cải thiện độ chính xác của nhận dạng mẫu

Tóm tắt

Chiến lược này xây dựng một hệ thống giao dịch tương đối hoàn chỉnh bằng cách kết hợp các phương pháp phân tích từ nhiều khía cạnh. Ưu điểm cốt lõi của chiến lược này nằm ở các thiết lập tham số linh hoạt và cơ chế dừng lỗ thông minh, cho phép chiến lược này thích ứng với các môi trường thị trường khác nhau. Thông qua quá trình tối ưu hóa và cải tiến liên tục, chiến lược này dự kiến ​​sẽ duy trì hiệu suất ổn định trong nhiều điều kiện thị trường khác nhau.

Mã nguồn chiến lược
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent

strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')


insideBar() =>  //and high <= high[1] and low >= low[1] ? 1 : 0
    open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0

inside() =>
    high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]

inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
    enterIndex := bar_index
    enterIndex



//if strategy.position_size <= 0 

//    strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")


//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0 

//    strategy.exit("Long", stop=low[0]-belowlow,comment="exit")

//    enterIndex := na

T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])

W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])

//longStopPrice  = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)

//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)

showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')

isMon() =>
    dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
    dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
    dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
    dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
    dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
    dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
    dayofweek(time('D')) == dayofweek.sunday and showSun


clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or  isWed() 
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]

if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1])  //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
    if tradeabove == false
        strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
    if tradeabove == true and (xing == false or clprior < entryline)  // and high<high[1] 
        strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')


//if time>timestamp(2020,12,0,0,0) and isSat()  
//    strategy.entry("Long", strategy.long, limit=0, comment="long")


//strategy.exit("Long", stop=low-400*syminfo.mintick)

//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")

if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
    strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
    strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo
    strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')