Strategi Stop Loss Dua Tahap

Penulis:ChaoZhang, Tarikh: 2023-10-25 18:11:30
Tag:

img

Ringkasan

Idea utama strategi ini adalah untuk menetapkan dua sasaran keuntungan dan memindahkan stop loss ke harga masuk selepas sasaran pertama dicapai untuk mengelakkan memburu stop loss.

Logika Strategi

Strategi ini memasuki perdagangan berdasarkan Bollinger Bands dan penunjuk Stochastic. Ia pergi pendek apabila harga melebihi band atas Bollinger dan pergi panjang apabila Stochastic menunjukkan oversold.

Secara khusus, logik kemasukan adalah:

  1. Masuk panjang apabila penutupan berada di bawah Bollinger band bawah dan Stochastic K melintasi di bawah D.

  2. Masuk pendek apabila dekat berada di atas jalur atas Bollinger dan Stochastic K melintasi di atas D.

Strategi itu menetapkan dua sasaran keuntungan, TP1 ditetapkan pada 200 mata dan TP2 ditetapkan pada 500 mata.

Apabila harga bergerak dan TP1 dicetuskan, strategi akan memindahkan stop loss ke harga kemasukan. Ini mengunci keuntungan dari peringkat pertama dan menghalang pemburuan stop loss.

Strategi ini menutup semua kedudukan apabila TP2 atau stop loss dicetuskan.

Analisis Kelebihan

Kelebihan terbesar pendekatan stop loss dua peringkat ini adalah ia membolehkan mengunci keuntungan sambil menghalang pemburuan stop loss. Dengan memindahkan stop loss ke harga masuk, ia mengurangkan peluang pemburuan stop loss dan melindungi keuntungan.

Satu lagi kelebihan adalah gabungan Bollinger Bands untuk mengukur julat turun naik dan Stochastic untuk overbought / oversold menjadikan entri yang lebih tepat.

Analisis Risiko

Risiko utama berasal dari isyarat palsu yang berpotensi dari Bollinger Bands dan penunjuk Stochastic. Julat Bollinger yang tidak betul boleh menyebabkan entri yang hilang atau isyarat yang buruk.

Terdapat juga risiko kerugian berhenti diburu lagi selepas berpindah ke harga masuk. Pembalikan berbentuk V boleh mencetuskan kerugian berhenti untuk kali kedua.

Risiko ini boleh dikurangkan dengan mengoptimumkan parameter untuk kedua-dua penunjuk dan meningkatkan jarak antara kerugian berhenti.

Arahan pengoptimuman

Pengoptimuman lanjut untuk strategi ini:

  1. Uji kombinasi parameter yang berbeza untuk mencari parameter Bollinger dan Stochastic yang optimum.

  2. Uji sasaran keuntungan / kerugian yang berbeza untuk mencari konfigurasi yang ideal.

  3. Tambah penunjuk lain seperti purata bergerak untuk membuat sistem pelbagai penunjuk untuk ketepatan yang lebih tinggi.

  4. Penyelidikan alternatif logik kedudukan stop loss, seperti jarak tetap dari masuk dan bukannya harga masuk itu sendiri.

  5. Meningkatkan kejadian pergerakan stop loss kepada 3 atau lebih peringkat.

Kesimpulan

Strategi ini menggunakan Bollinger Bands dan Stochastic untuk entri, menetapkan dua sasaran mengambil keuntungan, dan bergerak stop loss ke entri selepas sasaran pertama dicapai untuk membentuk stop loss dua peringkat. Ini berkesan mengunci keuntungan dan menghalang pemburuan stop loss. Strategi ini mempunyai kelebihan yang jelas tetapi juga ruang untuk penambahbaikan melalui pengoptimuman parameter, sistem pelbagai penunjuk, dan penyesuaian logik 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)

Lebih lanjut