Bollinger Bands xu hướng theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-01-15 14:31:21
Tags:

img

Tổng quan

Chiến lược này được gọi là Bollinger Bands Trend Following Strategy. Nó sử dụng chỉ số Bollinger Bands để xác định xu hướng giá và đi dài hoặc ngắn khi giá vượt ra khỏi kênh Bollinger Bands. Nó kết hợp bộ lọc trung bình động để đánh giá hướng xu hướng khi vượt qua, do đó quyết định giữa các mục dài và ngắn.

Nguyên tắc

Chiến lược dựa chủ yếu trên chỉ số Bollinger Bands để xác định xu hướng giá và điểm nhập cảnh.

  1. Đường giữa: trung bình động trong n ngày
  2. Dòng trên: độ lệch chuẩn n ngày tăng lên
  3. Đường dưới: lệch chuẩn n ngày xuống

Khi giá phá vỡ từ đường dưới qua đường trên, một xu hướng tăng được xác định. Khi giá phá vỡ từ đường trên qua đường dưới, một xu hướng giảm đã bắt đầu. Chiến lược đi dài hoặc ngắn khi xảy ra hai loại đột phá này.

Cụ thể, chiến lược logic là:

  1. Nhập dài khi gần phá vỡ lên từ đường dưới băng.
  2. Nhập ngắn khi gần phá vỡ xuống từ đường trên của Bands.

Để tránh các đột phá sai, một bộ lọc trung bình động được thêm vào.

Ở đây, Mức trung bình di chuyển biểu thức được sử dụng làm chỉ số.

Tóm lại, các tiêu chí để xác định sự phá vỡ xu hướng là:

  1. Tín hiệu dài: Khép phá vỡ Dải đường trên && Khép phá vỡ trung bình động
  2. Tín hiệu ngắn: Khép phá vỡ Dải đường dưới && Khép phá vỡ trung bình động

Sau khi vào, stop loss theo dõi đường giữa. ra khi giá chạm vào đường trung lại.

Phân tích sức mạnh

Các điểm mạnh chính của chiến lược này bao gồm:

  1. Bắt được xu hướng mới được hình thành bởi các đường đột phá giữa.
  2. Tránh các đột phá giả thông qua bộ lọc trung bình động, đảm bảo chỉ nhập vào sự đảo ngược xu hướng thực tế.
  3. Cơ chế dừng lỗ tích hợp bằng cách theo dõi đường giữa, kiểm soát hiệu quả rủi ro.
  4. Logic đơn giản và rõ ràng, dễ hiểu và thực hiện, phù hợp với các chiến lược giao dịch algo.
  5. Sử dụng kênh băng và các chỉ số trung bình động, không cần dự đoán giá cả, xác định xu hướng dựa trên bằng chứng sau khi thực tế.

Phân tích rủi ro

Mặc dù có những lợi thế, chiến lược cũng mang những rủi ro sau:

  1. Các thông số Bands không phù hợp có thể làm tăng tần suất giao dịch và rủi ro.
  2. Chọn tham số trung bình động không đầy đủ có thể gây ra xu hướng thực tế bị thiếu hoặc tạo ra tín hiệu sai.
  3. Dừng lỗ dựa trên đường trung gian, có thể thoát sớm hoặc cho phép quá nhiều không gian khôi phục. Điều này có thể dẫn đến việc bỏ lỡ hầu hết lợi nhuận hoặc tăng rủi ro mất mát.

Để kiểm soát các rủi ro trên, tối ưu hóa sau đây có thể được thực hiện:

  1. Điều chỉnh các thông số băng tần đúng cách, tăng chiều rộng kênh để giảm khả năng phá vỡ sai.
  2. Kiểm tra các loại và chiều dài trung bình động khác nhau để tìm kết hợp tối ưu.
  3. Hãy thử các phương pháp dừng lỗ khác, ví dụ như dừng lỗ sau hoặc mức dừng lỗ tiến bộ.

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

Dựa trên phân tích rủi ro, các tối ưu hóa khác có thể được thực hiện trong các lĩnh vực sau:

  1. Tối ưu hóa tham số: Sử dụng các phương pháp có hệ thống hơn như thuật toán di truyền để tìm kết hợp tham số tối ưu cho các dải và đường trung bình động, để làm cho chiến lược ổn định và có lợi hơn.

  2. Dừng Loss Optimization: Kiểm tra các kỹ thuật dừng lỗ khác nhau như dừng ATR, dừng theo dõi vv, để xác định cơ chế dừng tốt nhất.

  3. Tối ưu hóa bộ lọc: Hãy thử thêm các chỉ số khác như RSI, KD vv như bộ lọc bổ sung, để giảm xác suất tín hiệu sai và tăng tỷ lệ lợi nhuận.

  4. Điều kiện nhập học tối ưu hóa: Thêm các cân nhắc khác như điều kiện xu hướng, khối lượng bất thường vv để chọn đúng thời gian nhập cảnh, tránh các mục nhập không cần thiết.

  5. Học máy: Thu thập nhiều dữ liệu lịch sử hơn để xây dựng LSTM, RNN và các mô hình học sâu khác, để cho phép thời gian vào và ra tốt nhất dựa trên AI.

  6. Quản lý rủi ro-lợi nhuận năng động: Kết hợp các điểm dừng tỷ lệ cố định, tăng mục tiêu lợi nhuận sau khi đạt đến mức lợi nhuận nhất định vv để kiểm soát năng động rủi ro-trả tiền.

Thông qua tối ưu hóa trong các lĩnh vực trên, các chỉ số chính như sự ổn định, lợi nhuận, khả năng điều chỉnh rủi ro có thể được cải thiện toàn diện, biến chiến lược thành một thuật toán cấp sản xuất phù hợp với giao dịch trực tiếp.

Kết luận

Kết luận, Chiến lược theo dõi xu hướng Bollinger Bands xác định xu hướng giá bằng cách sử dụng chỉ số Bands và đường trung bình động, nhập vào các điểm đột phá chính. Nó có những ưu điểm về logic rõ ràng, đơn giản, dễ thực hiện trong khi cũng có các lĩnh vực cải tiến như điều chỉnh tham số, cơ chế dừng lỗ.


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

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


Thêm nữa