Ý tưởng chính của chiến lược này là thiết lập hai mục tiêu lấy lợi nhuận và di chuyển giá dừng lỗ sang giá nhập cảnh sau khi đạt được mục tiêu đầu tiên để tránh săn stop loss.
Chiến lược này tham gia giao dịch dựa trên Bollinger Bands và chỉ số Stochastic. Nó đi ngắn khi giá vượt quá Bollinger upper band và đi dài khi Stochastic hiển thị oversold.
Cụ thể, logic nhập là:
Nhập dài khi đóng là dưới dải dưới Bollinger và Stochastic K vượt dưới D.
Nhập ngắn khi đóng là trên dải Bollinger trên và Stochastic K vượt trên D.
Chiến lược đặt ra hai mục tiêu lợi nhuận, TP1 cố định ở mức 200 điểm và TP2 cố định ở mức 500 điểm.
Khi giá di chuyển và TP1 được kích hoạt, chiến lược sẽ di chuyển dừng lỗ sang giá nhập cảnh. Điều này khóa lợi nhuận từ giai đoạn đầu và ngăn chặn việc săn stop loss.
Chiến lược đóng tất cả các vị trí khi TP2 hoặc dừng lỗ được kích hoạt.
Ưu điểm lớn nhất của phương pháp dừng lỗ hai giai đoạn này là nó cho phép khóa lợi nhuận trong khi ngăn chặn việc săn stop loss.
Một lợi thế khác là sự kết hợp của Bollinger Bands để đo phạm vi biến động và Stochastic cho quá mua / quá bán làm cho các mục chính xác hơn.
Rủi ro chính xuất phát từ các tín hiệu sai tiềm năng từ Bollinger Bands và các chỉ số Stochastic. Phạm vi Bollinger không chính xác có thể dẫn đến việc thiếu các mục nhập hoặc tín hiệu xấu.
Ngoài ra còn có nguy cơ dừng lỗ bị săn lùng một lần nữa sau khi chuyển sang giá nhập cảnh.
Những rủi ro này có thể được giảm bằng cách tối ưu hóa các tham số cho cả hai chỉ số và tăng khoảng cách giữa các lỗ dừng.
Các tối ưu hóa khác cho chiến lược này:
Kiểm tra các kết hợp tham số khác nhau để tìm các tham số Bollinger và Stochastic tối ưu.
Kiểm tra các mục tiêu lợi nhuận / lỗ khác nhau để tìm các cấu hình lý tưởng.
Thêm các chỉ số khác như đường trung bình động để tạo ra các hệ thống đa chỉ số cho độ chính xác cao hơn.
Nghiên cứu các biện pháp định vị stop loss thay thế, như khoảng cách cố định từ giá vào thay vì chính giá vào.
Tăng sự xuất hiện của chuyển động dừng lỗ đến 3 giai đoạn hoặc nhiều hơn.
Chiến lược này sử dụng Bollinger Bands và Stochastic cho các mục nhập, thiết lập hai mục tiêu lấy lợi nhuận và di chuyển dừng lỗ vào mục tiêu sau khi mục tiêu đầu tiên đạt được để tạo thành một lỗ dừng hai giai đoạn. Điều này có hiệu quả khóa lợi nhuận và ngăn chặn việc săn stop loss. Chiến lược có những lợi thế rõ ràng nhưng cũng có chỗ cho cải tiến thông qua tối ưu hóa tham số, hệ thống đa chỉ số và điều chỉnh logic stop loss.
/*backtest start: 2022-10-18 00:00:00 end: 2023-10-24 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/ // © fpsd4ve //@version=5 // Add Bollinger Bands indicator (close, 20, 2) manually to visualise trading conditions strategy("2xTP, SL to entry", overlay=false, pyramiding=0, calc_on_every_tick=false, default_qty_type=strategy.percent_of_equity, default_qty_value=25, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0.01 ) // PARAMETERS // Assumes quote currency is FIAT as with BTC/USDT pair tp1=input.float(200, title="Take Profit 1") tp2=input.float(500, title="Take Profit 2") sl=input.float(200, title="Stop Loss") stOBOS = input.bool(true, title="Use Stochastic overbought/oversold threshold") // Colors colorRed = #FF2052 colorGreen = #66FF00 // FUNCTIONS // Stochastic f_stochastic() => stoch = ta.stoch(close, high, low, 14) stoch_K = ta.sma(stoch, 3) stoch_D = ta.sma(stoch_K, 3) stRD = ta.crossunder(stoch_K, stoch_D) stGD = ta.crossover(stoch_K, stoch_D) [stoch_K, stoch_D, stRD, stGD] // VARIABLES [bbMiddle, bbUpper, bbLower] = ta.bb(close, 20, 2) [stoch_K, stoch_D, stRD, stGD] = f_stochastic() // ORDERS // Active Orders // Check if strategy has open positions inLong = strategy.position_size > 0 inShort = strategy.position_size < 0 // Check if strategy reduced position size in last bar longClose = strategy.position_size < strategy.position_size[1] shortClose = strategy.position_size > strategy.position_size[1] // Entry Conditions // Enter long when during last candle these conditions are true: // Candle high is greater than upper Bollinger Band // Stochastic K line crosses under D line and is oversold longCondition = stOBOS ? low[1] < bbLower[1] and stGD[1] and stoch_K[1] < 25 : low[1] < bbLower[1] and stGD[1] // Enter short when during last candle these conditions are true: // Candle low is lower than lower Bollinger Band // Stochastic K line crosses over D line and is overbought shortCondition = stOBOS ? high[1] > bbUpper[1] and stRD[1] and stoch_K[1] > 75 : high[1] > bbUpper[1] and stRD[1] // Exit Conditions // Calculate Take Profit longTP1 = strategy.position_avg_price + tp1 longTP2 = strategy.position_avg_price + tp2 shortTP1 = strategy.position_avg_price - tp1 shortTP2 = strategy.position_avg_price - tp2 // Calculate Stop Loss // Initialise variables var float longSL = 0.0 var float shortSL = 0.0 // When not in position, set stop loss using close price which is the price used during backtesting // When in a position, check to see if the position was reduced on the last bar // If it was, set stop loss to position entry price. Otherwise, maintain last stop loss value longSL := if inLong and ta.barssince(longClose) < ta.barssince(longCondition) strategy.position_avg_price else if inLong longSL[1] else close - sl shortSL := if inShort and ta.barssince(shortClose) < ta.barssince(shortCondition) strategy.position_avg_price else if inShort shortSL[1] else close + sl // Manage positions strategy.entry("Long", strategy.long, when=longCondition) strategy.exit("TP1/SL", from_entry="Long", qty_percent=50, limit=longTP1, stop=longSL) strategy.exit("TP2/SL", from_entry="Long", limit=longTP2, stop=longSL) strategy.entry("Short", strategy.short, when=shortCondition) strategy.exit("TP1/SL", from_entry="Short", qty_percent=50, limit=shortTP1, stop=shortSL) strategy.exit("TP2/SL", from_entry="Short", limit=shortTP2, stop=shortSL) // DRAW // Stochastic Chart plot(stoch_K, color=color.blue) plot(stoch_D, color=color.orange) // Circles plot(stOBOS ? stRD and stoch_K >= 75 ? stoch_D : na : stRD ? stoch_D : na, color=colorRed, style=plot.style_circles, linewidth=3) plot(stOBOS ? stGD and stoch_K <= 25 ? stoch_D : na : stGD ? stoch_K : na, color=colorGreen, style=plot.style_circles, linewidth=3) // Levels hline(75, linestyle=hline.style_dotted) hline(25, linestyle=hline.style_dotted)