Chiến lược dừng lỗ hai giai đoạn

Tác giả:ChaoZhang, Ngày: 2023-10-25 18:11:30
Tags:

img

Tổng quan

Ý 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 logic

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à:

  1. Nhập dài khi đóng là dưới dải dưới Bollinger và Stochastic K vượt dưới D.

  2. 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.

Phân tích lợi thế

Ư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.

Phân tích rủi ro

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.

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

Các tối ưu hóa khác cho chiến lược này:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Kết luậ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)

Thêm nữa