Strategi Stop Loss Terakhir Berdasarkan Jurang Harga

Penulis:ChaoZhang, Tarikh: 2023-11-28 13:53:16
Tag:

img

Ringkasan

Strategi ini menggunakan prinsip selisih harga untuk pergi lama apabila harga memecahkan paras terendah baru-baru ini, dengan perintah stop loss dan mengambil keuntungan untuk mengikuti harga terendah untuk mengambil keuntungan.

Logika Strategi

Ia mengenal pasti jurang apabila harga pecah di bawah harga terendah dalam N jam terakhir, pergi lama berdasarkan peratusan yang dikonfigurasikan, dengan perintah stop loss dan mengambil keuntungan.

  1. Mengira harga terendah dalam N jam terakhir sebagai harga terikat
  2. Pergi panjang apabila harga masa nyata di bawah harga ikatan * membeli peratus
  3. Set mengambil keuntungan berdasarkan harga kemasukan * jualan peratus
  4. Set stop loss berdasarkan harga kemasukan - harga kemasukan * peratus stop loss
  5. Saiz kedudukan adalah peratusan ekuiti strategi
  6. Jalur stop kehilangan dengan harga terendah
  7. Posisi ditutup apabila mengambil keuntungan atau menghentikan kerugian dipicu

Analisis Kelebihan

Kelebihan strategi ini:

  1. Menggunakan konsep jurang harga, meningkatkan kadar kemenangan
  2. Hentikan kerugian automatik untuk mengunci kebanyakan keuntungan
  3. Peratusan stop loss dan mengambil keuntungan yang boleh disesuaikan untuk pasaran yang berbeza
  4. Bekerja dengan baik untuk instrumen dengan rebounds jelas
  5. Logik yang mudah dan mudah dilaksanakan

Analisis Risiko

Terdapat juga beberapa risiko:

  1. Penembusan jurang mungkin gagal dengan paras terendah yang lebih rendah
  2. Tetapan stop loss atau mengambil keuntungan yang tidak betul boleh menyebabkan keluar awal
  3. Memerlukan penyesuaian parameter berkala untuk perubahan pasaran
  4. Instrumen terhad yang boleh digunakan, mungkin tidak berfungsi untuk beberapa
  5. Penyertaan manual diperlukan dari semasa ke semasa

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dalam aspek berikut:

  1. Tambah model pembelajaran mesin untuk penyesuaian parameter automatik
  2. Tambah lebih banyak jenis perintah stop loss/take profit, contohnya, perintah stop loss, pesanan braket
  3. Mengoptimumkan logik stop loss / mengambil keuntungan untuk keluar yang lebih pintar
  4. Masukkan lebih banyak penunjuk untuk menapis isyarat palsu
  5. Memperluas kepada lebih banyak instrumen untuk meningkatkan keseluruhan

Kesimpulan

Kesimpulannya, ini adalah strategi stop loss yang mudah dan berkesan berdasarkan jurang harga. Ia mengurangkan entri palsu dan kunci keuntungan dengan berkesan. Masih ada banyak ruang untuk penambahbaikan dalam penyesuaian parameter dan penapisan isyarat. Ia bernilai penyelidikan dan penyempurnaan lanjut.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)



Lebih lanjut