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.
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:
Masuk panjang apabila penutupan berada di bawah Bollinger band bawah dan Stochastic K melintasi di bawah D.
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.
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.
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.
Pengoptimuman lanjut untuk strategi ini:
Uji kombinasi parameter yang berbeza untuk mencari parameter Bollinger dan Stochastic yang optimum.
Uji sasaran keuntungan / kerugian yang berbeza untuk mencari konfigurasi yang ideal.
Tambah penunjuk lain seperti purata bergerak untuk membuat sistem pelbagai penunjuk untuk ketepatan yang lebih tinggi.
Penyelidikan alternatif logik kedudukan stop loss, seperti jarak tetap dari masuk dan bukannya harga masuk itu sendiri.
Meningkatkan kejadian pergerakan stop loss kepada 3 atau lebih peringkat.
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)