
Chiến lược này sử dụng các chỉ số hai làn sóng để xác định khu vực cân bằng, kết hợp với chiến lược phá vỡ để thực hiện chiến lược giao dịch mua bán thấp. Khi giá phá vỡ vùng trung lập, cho thấy giá bắt đầu khởi động xu hướng mới, khi đó nhập vào nhiều hơn; Khi giá rơi xuống vùng trung lập một lần nữa, cho thấy xu hướng giá kết thúc, khi đó bằng phẳng.
Chiến lược này sử dụng hai dải Brin. Dải Brin bên trong có đường ray trên và dưới là đường trung bình di chuyển đơn giản 20 ngày ± 1 lần chênh lệch chuẩn; và dải Brin bên ngoài có đường ray trên và dưới là đường trung bình di chuyển đơn giản 20 ngày ± 2 lần chênh lệch chuẩn.
Khi giá nằm trong khu vực trung lập của hai đường K liên tiếp, nó được coi là nằm trong khớp; khi giá khớp hai đường K liên tiếp, giá đóng cửa đường K thứ ba vượt quá băng Nabolin, tạo ra tín hiệu đa.
Sau khi thực hiện nhiều, thiết lập đường dừng lỗ là giá thấp nhất - 2 lần ATR để khóa lợi nhuận và kiểm soát rủi ro; Hạn chế khi giá giảm xuống dưới đường dây Neblin.
Chiến lược này kết hợp hai yếu tố chỉ số và xu hướng, có thể xác định khu vực cân bằng và phán đoán liệu giá có bắt đầu một vòng xu hướng mới hay không, để thực hiện mua thấp và bán cao, có nhiều không gian thu nhập. Chiến lược dừng lỗ có thể khóa lợi nhuận và kiểm soát rủi ro, làm cho chiến lược ổn định cao hơn.
Chiến lược này dựa trên nhiều tín hiệu được tạo ra khi giá phá vỡ đường dây Brin, và nếu có một sự phá vỡ giả, nó sẽ tạo ra một lệnh sai và mất mát. Ngoài ra, điểm dừng quá gần có thể bị dừng lại.
Có thể giảm khả năng phá vỡ giả bằng cách tối ưu hóa các tham số của bạch cầu, tăng điều kiện lọc và các phương pháp khác. Ngoài ra, điểm dừng có thể được nới lỏng thích hợp để đảm bảo có đủ không gian.
Chiến lược này tích hợp các chỉ số và chiến lược xu hướng hai làn sóng, để thực hiện mua thấp và bán cao, có nhiều cơ hội. Đồng thời, chiến lược dừng lỗ cũng làm cho chiến lược ổn định hơn. Bằng cách tối ưu hóa hơn nữa, có thể tăng hiệu quả chiến lược, đáng để kiểm tra thực tế.
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 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/
// © DojiEmoji
//@version=4
strategy("[KL] Double BB Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "LONG"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2020 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
// Bollinger bands
BOLL_length = 20, BOLL_src = close, SMA20 = sma(BOLL_src, BOLL_length)
BOLL_sDEV = stdev(BOLL_src, BOLL_length)
BOLL_upper1 = SMA20 + BOLL_sDEV, BOLL_lower1 = SMA20 - BOLL_sDEV
BOLL_upper2 = SMA20 + BOLL_sDEV*2, BOLL_lower2 = SMA20 - BOLL_sDEV*2
SMA_20_plot = plot(SMA20, "Basis", color=#872323, offset = 0)
BOLL_upper1_plot = plot(BOLL_upper1, "BOLL Upper1", color=color.navy, offset = 0, transp=50)
BOLL_lower1_plot = plot(BOLL_lower1, "BOLL Lower1", color=color.navy, offset = 0, transp=50)
BOLL_upper2_plot = plot(BOLL_upper2, "BOLL Upper2", color=color.navy, offset = 0, transp=50)
BOLL_lower2_plot = plot(BOLL_lower2, "BOLL Lower2", color=color.navy, offset = 0, transp=50)
fill(BOLL_upper2_plot, BOLL_upper1_plot, title = "Background", color=#198787, transp=85)
fill(BOLL_upper1_plot, SMA_20_plot, title = "Background", color=#198787, transp=75)
fill(SMA_20_plot, BOLL_lower1_plot, title = "Background", color=#198787, transp=75)
fill(BOLL_lower1_plot, BOLL_lower2_plot, title = "Background", color=#198787, transp=85)
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Signals for entry
is_neutral = close < BOLL_upper1 and close > BOLL_lower2
is_consol = is_neutral and is_neutral[2]
entry_signal = is_consol[1] and close > BOLL_upper1
// MAIN:
if within_timeframe
// EXIT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
end_of_rally = close < BOLL_upper1 and strategy.position_avg_price > stop_loss_price // also detects false breakouts
if strategy.position_size > 0 and (TSL_source <= stop_loss_price or end_of_rally)
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price)) and entry_signal
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
// CLEAN UP:
if strategy.position_size == 0
stop_loss_price := float(0)