Strategi Stop Loss Dinamik berasaskan ATR

Penulis:ChaoZhang, Tarikh: 2023-10-10 10:50:21
Tag:

Ringkasan

Strategi ini menggunakan penunjuk ATR untuk menetapkan titik stop loss dinamik dan menyesuaikan kedudukan stop loss berdasarkan turun naik harga, untuk mengawal risiko. Ia terutamanya masuk panjang apabila 5EMA melintasi di atas 20EMA, dan kemudian menggunakan penunjuk ATR untuk menetapkan kedudukan stop loss dan mengambil keuntungan. Kedudukan stop loss akan disesuaikan mengikut pergerakan harga untuk mengunci lebih banyak keuntungan.

Logika Strategi

Strategi ini pertama menilai jika 5EMA melintasi di atas 20EMA untuk pergi panjang. Selepas memasuki, ia mengira kelipatan ATR harga kemasukan kepada harga semasa menggunakan penunjuk ATR, dan menetapkan kedudukan stop loss pada 1.5ATR di bawah harga kemasukan. Apabila harga meningkat, kedudukan stop loss secara beransur-ansur dinaikkan untuk meningkatkan keuntungan kedudukan.

Khususnya, strategi itu mentakrifkan pembolehubah berikut:

  • entry_price: harga kemasukan
  • Stop_price: harga stop loss
  • Take_profit_price: mengambil harga keuntungan
  • atr_down: ATR garis bawah
  • atr_up: ATR garis atas
  • atr_current: garis ATR semasa
  • atr_ref: Nilai ATR

Selepas masuk, ia mengira atr_ref sebagai nilai ATR semasa, dan atr_div sebagai kelipatan ATR harga masuk ke harga semasa. Kemudian menetapkan kedudukan atr_down, atr_current dan atr_up berdasarkan atr_div. Harga stop loss stop_price ditetapkan pada 1.5ATR di bawah harga masuk.

Apabila harga meningkat, dengan membandingkan harga semasa avg dan atr_up, jika avg melintasi di atas atr_up, ia mengira semula kedudukan garisan atr_div dan ATR, dengan itu secara beransur-ansur menaikkan garisan stop loss untuk meningkatkan keuntungan.

Jika harga meningkat di atas 3ATR daripada harga kemasukan, ia akan menutup kedudukan sebahagiannya untuk mengunci keuntungan, dan menetapkan tookProfit kepada benar. Selepas itu jika harga terus meningkat, ia akan terus meningkatkan stop loss. Apabila stop loss dicetuskan, ia memeriksa tookProfit - jika sudah mengambil keuntungan sebahagiannya sebelumnya, ia hanya akan menutup kedudukan yang tersisa; jika tidak, tutup kedudukan penuh.

Kelebihan

  1. Menggunakan penunjuk ATR untuk menyesuaikan stop loss secara dinamik boleh menetapkan jarak berhenti yang munasabah berdasarkan turun naik pasaran.

  2. Ikuti trend sambil mengehadkan kerugian. Stop loss akan meningkat secara beransur-ansur untuk mengumpul keuntungan.

  3. Mekanisme mengambil keuntungan separa mengunci beberapa keuntungan dan mengurangkan risiko.

Risiko

  1. Indikator ATR tidak sensitif terhadap pembalikan tajam dan jurang.

  2. EMA tidak dapat menentukan pembalikan trend, boleh memasuki kedudukan baru pada pembalikan trend.

  3. Kemungkinan kerugian yang tinggi selepas mengambil keuntungan separa.

  4. Parameter perlu dioptimumkan lebih lanjut, 1.5ATR berhenti dan 3ATR mengambil keuntungan harus diselaraskan untuk produk yang berbeza.

Peningkatan

  1. Pertimbangkan untuk menambah penunjuk stop loss lain seperti Saluran Donchian untuk mengimbangi kelewatan ATR.

  2. Uji purata bergerak yang berbeza atau tambah MACD dan lain-lain untuk menilai pembalikan trend.

  3. Mengoptimumkan nisbah keuntungan separa dan kekerapan untuk produk yang berbeza.

  4. Optimumkan parameter pada kelipatan ATR untuk berhenti dan mengambil keuntungan.

  5. Prestasi ujian semasa trend lemah, boleh melumpuhkan strategi semasa trend lemah.

Ringkasan

Strategi ini mempunyai logik yang jelas untuk menggunakan ATR untuk pengurusan stop loss dinamik yang merupakan kekuatan terbesarnya. Walau bagaimanapun, ATR itu sendiri mempunyai batasan seperti ketinggalan. Menambah penunjuk berhenti dan trend lain akan memperbaikinya. Juga mengambil keuntungan separa memerlukan pengoptimuman di seluruh produk. Secara keseluruhan ia memberikan idea pengurusan stop loss berasaskan ATR tetapi memerlukan pengoptimuman dan peningkatan lanjut.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 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/
// © ekinbasarkomur

//@version=5
strategy("[EKIN] ATR Exit Strategy", overlay=true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = true)

// Simple EMA tracking
fastEMA = ta.ema(close, 5)
slowEMA = ta.ema (close, 20)
atr = ta.atr(14)

// We define entry price for future reference
var float entry_price = na
// We define stop and take profit for future calculations
var float stop_price = na
var float take_profit_price = na

// We define atr limtim its here
var float atr_down = na
var float atr_up = na
var float atr_current = na
var float atr_ref = na

avg = (low + high) / 2

// Conditions
enterCondition = ta.crossover(fastEMA, slowEMA)
var bool tookProfit = false
timePeriod = time >= timestamp(syminfo.timezone, 2021, 12, 15, 0, 0)
InTrade = strategy.position_size > 0

// Go long if conditions are met
if (enterCondition and timePeriod and not InTrade)
    // Calculate and update variables
    entry_price := avg
    atr_ref := atr
    atr_div = int((avg - entry_price) / atr_ref)
    atr_down := entry_price + (atr_ref * (atr_div - 1.5))
    atr_up := entry_price + (atr_ref * (atr_div + 1))
    atr_current := entry_price + (atr_ref * atr_div) 
    stop_price := (entry_price - (atr_ref * 1.5))
    take_profit_price := (entry_price + (atr_ref * 3))
    strategy.order("buy", strategy.long, qty = 2)

// Enter here if in position
if InTrade or tookProfit
    stopCondition = avg < stop_price
    takeProfitCondition = avg > take_profit_price

    if avg < atr_down
        stopCondition := true

    // Move stop price and exit price if price for each atr price increase
    if avg > atr_up
        if tookProfit
            atr_ref := atr
        atr_div = int((avg - entry_price) / atr_ref)
        atr_down := entry_price + (atr_ref * (atr_div - 1))
        atr_up := entry_price + (atr_ref * (atr_div + 1))
        atr_current := entry_price + (atr_ref * atr_div) 

    // Take half of the investment if current price is 3 atr higher than entry price
    if (takeProfitCondition and timePeriod and InTrade and not tookProfit)
        strategy.order("take_half_profit", strategy.short, qty = 1)
        tookProfit := true

    // Exit position if conditions are met and reset the variables
    if (stopCondition and timePeriod and InTrade)
        if tookProfit
            strategy.order("exit", strategy.short, qty = 1)
        else
            strategy.order("stop_loss", strategy.short, qty = 2)

        tookProfit := false

// Plot EMA's
plot(fastEMA, color = color.blue)
plot(slowEMA, color = color.yellow)

// Plot ATR Limit/Stop positions
profit_plot = plot(series = InTrade?atr_up:na, title = "profit", color = color.green, style=plot.style_linebr)
close_plot = plot(series = InTrade?atr_current:na, title = "close", color = color.white, style=plot.style_linebr)
stop_plot = plot(series = InTrade?atr_down:na, title = "stop_loss", color = color.red, style=plot.style_linebr)
fill(profit_plot, close_plot, color = color.new(color.green, 80))
fill(close_plot, stop_plot, color =color.new(color.red,80))

Lebih lanjut