Tài nguyên đang được tải lên... tải...

Chiến lược dừng theo dõi thông minh dựa trên SMA với nhận dạng mô hình trong ngày

Tác giả:ChaoZhang, Ngày: 2025-01-17 16:04:09
Tags:SMAMA18ATR

 SMA-Based Intelligent Trailing Stop Strategy with Intraday Pattern Recognition

Tổng quan

Đây là một chiến lược dựa trên trung bình di chuyển đơn giản 18 ngày (SMA18), kết hợp nhận dạng mô hình trong ngày và cơ chế dừng lại theo dõi thông minh. Chiến lược chủ yếu quan sát mối quan hệ giá với SMA18, cùng với các vị trí cao và thấp trong ngày, để thực hiện các mục nhập dài vào thời điểm tối ưu. Nó sử dụng cách tiếp cận dừng lỗ linh hoạt, cung cấp cả hai điểm dừng lỗ cố định và tùy chọn dừng lỗ thấp hai ngày.

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

Logic cốt lõi bao gồm một số yếu tố chính: Các điều kiện đầu vào dựa trên vị trí giá so với đường trung bình di chuyển 18 ngày, với các tùy chọn cho việc phá vỡ hoặc đầu vào trên đường 2. Phân tích các mẫu nến trong ngày, đặc biệt tập trung vào các mẫu Inside Bar để cải thiện độ chính xác nhập 3. Giao dịch chọn lọc dựa trên đặc điểm ngày trong tuần 4. Đặt giá vào sử dụng lệnh giới hạn với sự thay đổi nhỏ từ mức thấp để cải thiện xác suất lấp đầy 5. Cơ chế dừng lỗ kép: dừng cố định dựa trên giá nhập cảnh hoặc dừng theo dõi dựa trên mức thấp hai ngày

Ưu điểm chiến lược

  1. Kết hợp các chỉ số kỹ thuật và mô hình giá cho các tín hiệu nhập cảnh đáng tin cậy hơn
  2. Cơ chế lựa chọn thời gian giao dịch linh hoạt để tối ưu hóa cụ thể thị trường
  3. Hệ thống dừng lỗ thông minh bảo vệ lợi nhuận và cho phép chuyển động giá phù hợp
  4. Các tham số có thể điều chỉnh cao cho các môi trường thị trường khác nhau
  5. Giảm hiệu quả tín hiệu giả thông qua lọc mẫu Inside Bar

Rủi ro chiến lược

  1. Các điểm dừng cố định có thể kích hoạt việc thoát sớm trong các thị trường biến động
  2. Chế độ dừng lại có thể khóa lợi nhuận tối thiểu trong thời gian đảo ngược nhanh chóng
  3. Các Inside Bar thường xuyên trong quá trình hợp nhất có thể dẫn đến giao dịch quá mức Các biện pháp giảm thiểu:
  • Điều chỉnh stop-loss động dựa trên biến động thị trường
  • Thêm các chỉ số xác nhận xu hướng
  • Thực hiện các mục tiêu lợi nhuận tối thiểu để lọc các giao dịch chất lượng thấp

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

  1. Bao gồm các chỉ số biến động (như ATR) để điều chỉnh dừng lỗ động
  2. Thêm kích thước phân tích âm lượng để cải thiện độ tin cậy 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 dựa trên hiệu suất lịch sử
  4. Thực hiện các bộ lọc sức mạnh xu hướng để tránh giao dịch trong xu hướng yếu
  5. Cải thiện thuật toán nhận dạng Inside Bar để xác định mẫu cải thiện

Tóm lại

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


/*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')




Có liên quan

Thêm nữa