Sumber daya yang dimuat... Pemuatan...

Strategi Pelacakan Osilasi Pita Isolasi

Penulis:ChaoZhang, Tanggal: 2024-02-04 10:28:24
Tag:

img

Gambaran umum

Ide utama dari strategi ini adalah untuk menghitung garis stop-loss panjang dan pendek berdasarkan indikator ATR. Ini menghasilkan sinyal perdagangan ketika harga menembus garis stop-loss ini.

Prinsip Strategi

Strategi ini menggunakan ATR periode N dikalikan dengan koefisien untuk menghitung garis stop-loss panjang dan pendek.

Long Stop = Highest Price - ATR * Coefficient 
Short Stop = Lowest Price + ATR * Coefficient

Ini pergi panjang ketika harga naik dan melanggar garis stop-loss panjang, dan pergi pendek ketika harga turun dan melanggar garis stop-loss pendek. Setelah pergi panjang atau pendek, akan melacak fluktuasi harga secara real time untuk memindahkan garis stop-loss.

Dengan menggunakan band ATR sebagai level stop-loss, metode ini dapat sepenuhnya menangkap tren harga sambil memastikan risiko stop-loss.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa ia dapat secara otomatis menyesuaikan tingkat stop-loss untuk menangkap tren harga sambil mengendalikan risiko.

  1. Stop-loss yang mengambang berdasarkan indikator ATR dapat menyesuaikan rentang stop-loss sesuai dengan volatilitas pasar untuk secara efektif mengendalikan kerugian tunggal.

  2. Mengadopsi metode terobosan untuk menghasilkan sinyal dapat menyaring beberapa kebisingan dan menghindari mengejar puncak dan dasar.

  3. Penyesuaian garis stop-loss secara real time untuk melacak fluktuasi harga mencegah stop-loss terlalu longgar dan mengunci lebih banyak keuntungan.

Analisis Risiko

Strategi ini juga memiliki beberapa risiko, terutama terkonsentrasi dalam pengaturan tingkat stop-loss dan generasi sinyal.

  1. Siklus dan koefisien ATR yang tidak tepat dapat menyebabkan stop loss yang terlalu luas atau sempit.

  2. Metode sinyal terobosan mungkin melewatkan peluang tren awal.

  3. Mungkin ada beberapa keterlambatan dalam pelacakan stop-loss selama akhir tren, tidak dapat keluar dengan sempurna.

Langkah-langkah penanggulangan terutama untuk menyesuaikan parameter untuk membuat stop-loss lebih wajar, atau membantu dengan indikator lain untuk menentukan tren dan sinyal.

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:

  1. Atur stop-loss lapisan kedua untuk mengendalikan risiko lebih lanjut.

  2. Menggabungkan indikator lain untuk menentukan tren dan meningkatkan kualitas sinyal.

  3. Tambahkan strategi stop-profit bergerak untuk meningkatkan keuntungan ketika tren terus berlanjut.

  4. Mengoptimalkan siklus ATR dan koefisien parameter untuk membuat stop-loss lebih dekat dengan fluktuasi harga yang sebenarnya.

Ringkasan

Secara keseluruhan, strategi ini sangat praktis. Ini dapat secara efektif mengendalikan risiko dengan secara otomatis menyesuaikan tingkat stop-loss, sambil mendapatkan keuntungan yang baik melalui pelacakan tren. Kita dapat lebih mengoptimalkan dan meningkatkan strategi dengan menggabungkan metode analisis lainnya pada dasar yang ada untuk membuatnya lebih stabil dan cerdas.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
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/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)

length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)

atr = mult * atr(length)

longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop) 
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red

longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)


long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")

start     = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish    = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")   
window()  => true

slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")

lastBuyPrice = strategy.position_avg_price

diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0

s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0

strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")

if long_short
    strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
    strategy.close("SHORT", when = window() and buySignal)
    strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
    strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
    strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")

Lebih banyak