Chiến lược theo dõi xu hướng dựa trên dải Bollinger


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

Chiến lược theo dõi xu hướng dựa trên dải Bollinger

Tổng quan

Chiến lược này được gọi là BollingerBands theo dõi xu hướng chiến lược, nó sử dụng chỉ số BollingerBands để xác định xu hướng giá và mở rộng khi giá phá vỡ kênh BollingerBands. Nó kết hợp với bộ lọc đồng nhất để xác định hướng xu hướng khi sự phá vỡ xảy ra, do đó quyết định mở rộng.

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

Chiến lược này chủ yếu dựa trên các chỉ số BollingerBands để xác định xu hướng giá và vị trí điểm vào. BollingerBands bao gồm ba đường:

  1. Đường giữa: trung bình di chuyển n ngày
  2. Dòng trên: Di chuyển lên theo khoảng cách n ngày
  3. Bottom line: Di chuyển xuống n ngày cách biệt tiêu chuẩn

Khi giá từ đường dưới phá vỡ đường lên, nó được coi là đang hình thành xu hướng giảm giá; khi giá từ đường trên phá vỡ đường xuống, nó được coi là đang hình thành xu hướng giảm giá. Chiến lược này được thực hiện khi cả hai loại phá vỡ xảy ra.

Theo đó, chiến lược này có thể được giải thích như sau:

  1. Khi giá đóng cửa vượt qua Bands downline và lên đường, hãy thực hiện thêm nhập cảnh
  2. Khi giá đóng cửa từ Bands Up Break Down Line, Shorting vào

Để lọc các đột phá giả mạo, chiến lược này được thêm vào phán quyết đường trung bình. Chỉ khi giá đóng cửa phá vỡ các Bands và phá vỡ đường trung bình, thì sẽ kích hoạt nhập cảnh.

Ở đây sử dụng Exponential Moving Average làm chỉ số đường trung bình.

Nói tóm lại, chiến lược này đánh giá sự phá vỡ xu hướng như sau:

  1. Tạo nhiều tín hiệu: giá đóng cửa vượt qua Bands trên đường && giá đóng cửa vượt qua đường trung bình
  2. Tín hiệu tháo lỗ: giá đóng cửa vượt qua Bands downline && giá đóng cửa vượt qua đường trung bình

Sau khi vào, phương thức dừng là theo dõi đường trung tâm. Khi giá chạm lại đường trung tâm, thoát khỏi dừng.

Phân tích lợi thế

Chiến lược này có những lợi thế chính như sau:

  1. Các đường băng có không gian cho sự biến động giá, các đường băng phá vỡ đại diện cho việc giá bắt đầu hình thành một hướng mới.
  2. Kết hợp với bộ lọc đồng nhất, tránh các vấn đề phá vỡ giả, đảm bảo rằng bạn sẽ tham gia khi có một sự thay đổi xu hướng thực sự.
  3. Có cơ chế dừng tích hợp, chủ động dừng khi giá quay trở lại đường trung tâm của Bands, điều khiển rủi ro hiệu quả.
  4. Chiến lược logic đơn giản và rõ ràng, dễ hiểu và thực hiện, phù hợp với chiến lược thuật toán để định lượng giao dịch.
  5. Sử dụng kênh Bands và chỉ số đường trung bình, không cần phải dự đoán giá, dựa trên bằng chứng sau sự kiện để đánh giá xu hướng, hiệu quả đo lường lại tốt hơn.

Phân tích rủi ro

Mặc dù chiến lược này có một số lợi thế, nhưng nó cũng có những rủi ro:

  1. Thiết lập tham số Bands không đúng có thể làm tăng tần suất giao dịch và rủi ro giao dịch. Nếu tham số quá nhạy cảm, sẽ tạo ra một số lượng lớn đột phá giả tạo gây ra hệ thống mở cửa thường xuyên.
  2. Lựa chọn tham số đường trung bình không đúng cũng có thể dẫn đến việc bỏ lỡ xu hướng thực hoặc tạo ra tín hiệu giả. Thiết lập tham số cần được thử nghiệm và tối ưu hóa nhiều lần.
  3. Hạn chế phụ thuộc vào đường trung tâm, có thể ra đi sớm hoặc cho giá quá nhiều chỗ để điều chỉnh. Điều này có thể dẫn đến việc bỏ lỡ phần lớn lợi nhuận hoặc tăng nguy cơ thua lỗ.

Để kiểm soát các rủi ro trên, có thể tối ưu hóa từ:

  1. Điều chỉnh Bands để tăng chiều rộng và giảm khả năng phá vỡ giả
  2. Kiểm tra các loại và độ dài đường trung bình để tìm ra sự kết hợp tốt nhất
  3. Thử các cách dừng khác, chẳng hạn như theo xu hướng hoặc di chuyển dừng dần dần

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

Dựa trên phân tích rủi ro ở trên, chiến lược này có thể được tối ưu hóa hơn nữa từ các khía cạnh sau:

  1. Tối ưu hóa tham số: Tìm kiếm sự kết hợp tốt nhất giữa các Bands và các tham số trung bình bằng các phương pháp có hệ thống hơn, chẳng hạn như thuật toán di truyền, để làm cho chiến lược ổn định và có lợi nhuận hơn.

  2. Tối ưu hóa Stop Loss: Thử nghiệm các phương pháp dừng khác nhau, chẳng hạn như dừng ATR, dừng theo dõi, v.v., để xác định cơ chế dừng tối ưu.

  3. Điều chỉnh bộ lọcThử thêm các chỉ số khác như RSI, KD và các chỉ số khác như điều kiện lọc bổ sung, giảm khả năng tín hiệu giả và tăng tỷ lệ lợi nhuận.

  4. Điều kiện nhập học tối ưu hóaThêm các yếu tố khác, chẳng hạn như đánh giá xu hướng, VOLUME khác biệt, chọn lọc chặt chẽ thời điểm nhập cảnh, giảm bớt các vị trí không cần thiết.

  5. Học máy: Thu thập nhiều dữ liệu lịch sử hơn, mô hình hóa các mô hình học sâu như LSTM, RNN, và sử dụng AI để xác định điểm xuất phát tốt nhất.

  6. Quản lý động lực rủi ro và lợi nhuậnPhương pháp: thêm tỷ lệ cố định để dừng lỗ, tăng mức dừng lỗ sau khi đạt mục tiêu lợi nhuận, quản lý rủi ro và lợi nhuận động.

Bằng cách tối ưu hóa một số khía cạnh trên, bạn có thể làm cho các chỉ số của chiến lược như ổn định, lợi nhuận, khả năng điều chỉnh rủi ro được nâng cao toàn diện, trở thành chiến lược thuật toán có thể giao dịch trên sàn giao dịch thực.

Tóm tắt

Nhìn chung, chiến lược theo dõi xu hướng BollingerBands sử dụng chỉ số Bands và xu hướng phán đoán giá bằng đường trung bình, tham gia vào khi điểm quan trọng phá vỡ, thuộc loại chiến lược theo dõi xu hướng. Nó có lợi thế như phán đoán rõ ràng, logic ngắn gọn, dễ thực hiện, cũng có một số phương thức tối ưu hóa tham số, dừng lỗ.

Mã nguồn chiến lược
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================