Bollinger Band Trend Chaser

Tác giả:ChaoZhang, Ngày: 2023-11-22 16:51:27
Tags:

img

Tổng quan

Ý tưởng của chiến lược này là một chiến lược rủi ro thấp đối với cổ phiếu xu hướng (hoặc bất kỳ thị trường xu hướng nào khác), nhằm mục đích đạt được sự rút vốn tối thiểu (ví dụ, tại thời điểm viết bài này AAPL chỉ có ~ 1,36% rút vốn, FB ~ 1,93% rút vốn và SPY là 0,80% rút vốn và tất cả vẫn có lợi nhuận).

Nguyên tắc

Chiến lược này sử dụng Trung bình Di chuyển 200 ngày, Dải Bollinger tùy chỉnh, TSI với 52 thời gian cân nhắc trung bình di chuyển và sức mạnh ADX.

Tín hiệu mua được đưa ra khi giao dịch trên mức trung bình động 200 + 5 nến đã đóng trên mức Bollinger tùy chỉnh trên + TSI dương tính + ADX trên 20.

Ưu điểm

Ưu điểm của chiến lược này là rút vốn thấp và rủi ro tối thiểu. Nó phù hợp với hầu hết các cổ phiếu xu hướng với hoạt động rủi ro thấp. Theo dữ liệu thử nghiệm, lợi nhuận cao và AAPL chỉ có mức rút vốn tối đa là 1,36% và FB có mức rút vốn tối đa là 1,93% trong thời gian thử nghiệm.

Bằng cách kết hợp nhiều chỉ số kỹ thuật như Bollinger Bands, đường MA, chỉ số TSI, và sử dụng ADX để xác định sức mạnh của xu hướng, nó mua khi xu hướng tăng, cố gắng nắm bắt tiềm năng tăng trung hạn đến dài hạn của các cổ phiếu xu hướng. so với việc đánh giá bằng một chỉ số duy nhất, chiến lược này sử dụng nhiều chỉ số kỹ thuật để đánh giá chính xác và đáng tin cậy hơn và giảm rủi ro.

Nó cũng chứa một chiến lược dừng lỗ để khóa lợi nhuận bằng cách dừng lỗ kịp thời khi chỉ số TSI thay đổi hướng, kiểm soát hiệu quả rủi ro.

Phân tích rủi ro

Những rủi ro chính đối với chiến lược này là hai:

  1. Một số sự kiện thiên nga đen có thể khiến cổ phiếu giảm mạnh và không thể ngăn chặn tổn thất.

  2. Khi cổ phiếu chuyển từ xu hướng sang củng cố, có thể có sự rút vốn lớn hơn.

Đối với rủi ro 1, các cơ chế dừng lỗ nghiêm ngặt hơn có thể được thiết lập hoặc dừng can thiệp thủ công có thể được sử dụng. Đối với rủi ro 2, nhiều yếu tố đánh giá có thể được kết hợp để phát hiện kết thúc xu hướng, chẳng hạn như tăng chỉ số khối lượng giao dịch.

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

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

  1. Thêm một chiến lược dừng lỗ để thiết lập các điểm dừng lỗ chính xác hơn để kiểm soát tốt hơn rủi ro.

  2. Tối ưu hóa các thông số trung bình động để kiểm tra sự ổn định của các kết hợp thông số khác nhau.

  3. Tăng các chỉ số động lực để xác định chính xác hơn sự khởi đầu và kết thúc của xu hướng.

  4. Kiểm tra các thông số chu kỳ thời gian dài hơn để phù hợp với các hoạt động dài hạn.

Kết luận

Chiến lược này xác định các cơ hội mua bằng cách sử dụng ADX để xác định sức mạnh xu hướng, chỉ số TSI để xác định hướng xu hướng, Bollinger Bands để xác định sự đột phá và trung bình động để xác định xu hướng dài hạn. Việc xác minh nhiều chỉ số có thể kiểm soát rủi ro hiệu quả. Chiến lược này phù hợp với việc theo dõi dài hạn các cổ phiếu xu hướng với mức rút thấp và lợi nhuận cao. Nhưng nó vẫn cần được tối ưu hóa cho rủi ro để làm cho chiến lược mạnh mẽ hơn.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
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/
// © gary_trades
//This script has been designed to be used on trending stocks as a low risk trade with minimal drawdown, utilising 200 Moving Average, Custom Bollinger Band, TSI with weighted moving average and ADX strength. 
//Backtest dates are set to 2010 - 2020 and all other filters (moving average, ADX, TSI , Bollinger Band) are not locked so they can be user amended if desired. 
//Buy signal is given when trading above the 200 moving average + 5 candles have closed above the upper custom Bollinger + the TSI is positive + ADX is above 20.
//As back testing proved that this traded better only in tends then some Sell/Short conditions have been removed and this focueses on  Long orders.
//Only requires 2 additional lines of code to add shorting orders.
//Close for either long or short trades is signaled once the TSI crosses in the opposite direction indicating change in trend strength or if stop loss is trggered.
//Further optimization could be achieved by adding a stop loss.
//NOTE: This only shows the lower indicators however for visualization you can use my script "CUSTOM BOLLINGER WITH SMA", which is the upper indicators in this stratergy.
//------------
//@version=4
strategy(shorttitle="Trend Chaser", title="ADX_TSI_Bol Band Trend Chaser", overlay=false, pyramiding=0,
 currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=10,
 initial_capital=10000, commission_value=0.1)
//------------
//Custom Bollinger Band
length = input(20, minval=1)
src = input(close, title="Source")
mult = input(0.382, minval=0.001, maxval=50, title="StdDev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "Basis", color=color.gray, offset = offset, display=display.none)
p1 = plot(upper, "Upper", color=color.gray, offset = offset, display=display.none)
p2 = plot(lower, "Lower", color=color.gray, offset = offset, display=display.none)
fill(p1, p2, title = "Background", color=#787B86, transp=85)
//------------
//Moving Average
MAlen = input(200, minval=1, title="Length")
MAout = sma(src, MAlen)
plot(MAout, color=color.black, title="MA", offset=offset, linewidth=2, display=display.none)
//------------
//True Strength WMA
TSlong = input(title="Long Length", type=input.integer, defval=25)
TSshort = input(title="Short Length", type=input.integer, defval=13)
TSsignal = input(title="Signal Length", type=input.integer, defval=52)
double_smooth(src, TSlong, TSshort) =>
    fist_smooth = wma(src, TSlong)
    wma(fist_smooth, TSshort)
price = close     
pc = change(price)
double_smoothed_pc = double_smooth(pc, TSlong, TSshort)
double_smoothed_abs_pc = double_smooth(abs(pc), TSlong, TSshort)
tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
tsi2 = wma(tsi_value, TSsignal)
plot(tsi_value, color=color.blue)
plot(wma(tsi_value, TSsignal), color=color.red)
hline(0, title="Zero")
//------------
//ADX
adxlen = input(13, title="ADX Smoothing")
dilen = input(13, title="DI Length")
keyLevel = input(20, title="Keylevel for ADX")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

sig = adx(dilen, adxlen)

plot(sig, color=color.black, title="ADX", style=plot.style_histogram, transp=40)
plot(20, color=color.green, title="ADX Keyline", linewidth=1)
//------------
//Identify Triggers

//Back Test Range
start = timestamp("America/New_York", 2010, 1, 1, 9,30)
end = timestamp("America/New_York", 2030, 7, 1, 0, 0)

//Custom Bollinger Band
Long1 = close > upper[5] and close[5] > upper [6]
Short1 = close < lower[5] and close[5] < lower [6]

//Moving Average
Long2 = close >= MAout[1]
Short2 = close <= MAout[1]

//True Strength WMA
Long3 = tsi_value > tsi2  
Short3 = tsi_value < tsi2

//ADX
ADXkey = adx(dilen, adxlen) > 20 and adx(dilen, adxlen) < 100

//Buy
Buy = Long1 and Long2 and Long3 and ADXkey
CloseLong = crossunder(tsi_value,tsi2)

//Short
Sell = Short1 and Short2 and Short3 and ADXkey
CloseShort = crossover(tsi_value,tsi2)
//------------
//Entry and Exit
if time >= start and time <= end
    strategy.entry("Long", true, when = Buy)

strategy.close("Long", when = CloseLong)


Thêm nữa