Chiến lược phá vỡ kép

Tác giả:ChaoZhang, Ngày: 2023-11-03 17:16:02
Tags:

img

Tổng quan

Chiến lược này sử dụng Bollinger Bands để xác định các điểm đột phá cho các giao dịch dài và ngắn, kết hợp với chỉ số ADX để lọc các điều kiện thị trường không thuận lợi biến động thấp, để theo dõi xu hướng.

Chiến lược logic

Chiến lược này chủ yếu dựa trên chỉ số Bollinger Bands để xác định hướng dài hoặc ngắn. Dải giữa của Bollinger Bands là trung bình động N ngày của giá đóng cửa, và chiều rộng dải được tính bằng cách sử dụng độ lệch chuẩn. Một sự đột phá bên dưới dải dưới báo hiệu giao dịch dài, trong khi một sự đột phá bên trên dải trên báo hiệu giao dịch ngắn.

Để tránh việc phá vỡ không hợp lệ và giao dịch sai lầm trong các thị trường không có xu hướng, chiến lược kết hợp chỉ số ADX để lọc các điều kiện thị trường biến động thấp. Các tín hiệu giao dịch chỉ được tạo ra khi giá trị ADX dưới ngưỡng. Khi ADX vượt quá ngưỡng, tất cả các vị trí được đóng để chờ điều kiện xu hướng.

Chiến lược này cũng thiết lập stop loss và take profit cho các giao dịch mở. Cụ thể, sau khi mở một vị trí, giá thấp nhất và giá cao nhất của N ngày trước được ghi lại như mức stop loss và take profit cho hướng đó. Điều này cho phép khóa lợi nhuận trong khi giảm lỗ từ đảo ngược.

Từ logic mã, chiến lược đầu tiên tính toán Bollinger Bands và tham số ADX. Sau đó nó kiểm tra xem giá có phá vỡ Bands trên hoặc dưới băng và nếu ADX dưới ngưỡng, để tạo ra tín hiệu giao dịch. Sau đó mức dừng lỗ và lấy lợi nhuận được cập nhật và theo dõi dựa trên hướng vị trí hiện tại.

Phân tích lợi thế

  • Bollinger Bands cung cấp các tín hiệu đột phá rõ ràng để nắm bắt các cơ hội xu hướng
  • Bộ lọc ADX tránh giao dịch Các thị trường rối loạn mà không có xu hướng rõ ràng
  • Stop loss kiểm soát hiệu quả lỗ giao dịch duy nhất
  • Theo dõi lấy lợi nhuận khóa trong hầu hết các lợi nhuận

Phân tích rủi ro

  • Breakouts có thể sai mà không cần xem xét khối lượng
  • Bộ lọc ADX cũng có thể bỏ lỡ cơ hội xu hướng
  • Dừng lỗ và lấy lợi nhuận quá gần có thể bị dừng ra
  • Điều chỉnh tham số kém ảnh hưởng đến hiệu suất chiến lược

Xem xét kết hợp với các chỉ số khác để xác nhận đột phá với khối lượng; tối ưu hóa bộ lọc ADX bằng cách sử dụng độ dốc để xác định những thay đổi xu hướng; mở rộng phạm vi dừng lỗ và lấy lợi nhuận để tránh thoát sớm.

Hướng dẫn cải thiện

  • Tối ưu hóa chiều dài Bollinger Bands cho kết quả đột phá tốt nhất
  • Bộ lọc ADX tinh chỉnh để cân bằng độ chính xác xu hướng và tín hiệu sai
  • Thêm các chỉ số khác để xác nhận tính hợp lệ của sự đột phá
  • Tối ưu hóa phạm vi dừng lỗ để tránh độ nhạy quá mức
  • Mở rộng phạm vi lợi nhuận để khóa trong lợi nhuận nhiều hơn

Kết luận

Chiến lược này có một logic rõ ràng và đơn giản, sử dụng Bollinger Bands cho các tín hiệu đột phá rõ ràng, được lọc bởi ADX cho các điều kiện xu hướng, để nắm bắt các cơ hội xu hướng. Dừng lỗ và lấy lợi nhuận được sử dụng để kiểm soát rủi ro và khóa lợi nhuận. Dễ hiểu và thực hiện, chiến lược đáng để thử nghiệm và tối ưu hóa thêm như một hệ thống theo xu hướng cơ bản.


/*backtest
start: 2023-10-26 00:00:00
end: 2023-11-02 00:00:00
period: 1m
basePeriod: 1m
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/
// © tweakerID

// This strategy uses Bollinger Bands to buy when the price 
// crosses over the lower band and sell when it crosses down
// the upper band. It only takes trades when the ADX is 
// below a certain level, and exits all trades when it's above it.

//@version=4
strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100)

//Inputs
i_reverse=input(false, title="Reverse Trades")
i_ADXClose=input(true, title="ADX Close")
i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(20, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=.5, title="SL Expander")
i_TPExpander=input(defval=0, step=.5, title="TP Expander")

//ADX Calculations
adxlen = input(14, title="ADX Smoothing")
dilen = input(20, title="DI Length")
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)
adxlevel=input(30, step=5)

//BB Calculations
BBCALC=input(false, title="-----------BB Inputs-----------")

length = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)
MAlen=input(defval=9)
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Entry Logic
BUY = crossover(source, lower) and sig < adxlevel
SELL = crossunder(source, upper) and sig < adxlevel

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander)
lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander))
sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na
TP= islong ? lTP : isshort ? sTP : na

//Entries
strategy.entry("long", long=i_reverse?false:true, when=BUY)
strategy.entry("short", long=i_reverse?true:false, when=SELL)

//EXITS
if i_ADXClose
    strategy.close_all(when=sig > adxlevel)
if i_SL
    strategy.exit("longexit", "long", stop=SL, limit=TP)
    strategy.exit("shortexit", "short", stop=SL, limit=TP)

//Plots	
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP")
plot(upper)
plot(lower)




Thêm nữa