Strategi trailing stop loss berdasarkan jurang harga


Tarikh penciptaan: 2023-11-28 13:53:16 Akhirnya diubah suai: 2023-11-28 13:53:16
Salin: 0 Bilangan klik: 655
1
fokus pada
1617
Pengikut

Strategi trailing stop loss berdasarkan jurang harga

Gambaran keseluruhan

Strategi ini menggunakan prinsip jurang harga, membeli apabila titik rendah telah dilanggar, dan menetapkan pesanan berhenti dan berhenti untuk mengesan harga terendah untuk berhenti dan membuat keuntungan.

Prinsip Strategi

Apabila harga jatuh di bawah paras terendah dalam masa N jam terakhir, masuklah ke dalam selang penempatan dan buat keuntungan mengikut peratusan yang ditetapkan, sambil menetapkan hentian dan hentian. Kemudian, garis hentian dan hentian akan bergerak mengikut keadaan pasaran. Logiknya adalah seperti berikut:

  1. Hitung titik terendah dalam N jam sebagai harga terikat
  2. Harga sebenar lebih rendah daripada harga terikat dengan peratusan setup pembelian
  3. Set Stop Order sebagai harga kemasukan kalikan dengan Set Peratusan Jual
  4. Tetapkan Stop Loss sebagai Harga Masuk Minus Harga Masuk Kalikan Peratusan Stop Loss
  5. Peratusan bilangan tunggal sebagai kepentingan strategi
  6. Mengikuti garis berhenti bergerak harga minimum
  7. Hentikan atau hentikan kedudukan kosong

Analisis kelebihan strategi

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan pemikiran jurang harga untuk masuk ke dalam permainan ketika anda berada di titik terendah dan meningkatkan peluang kemenangan
  2. Stop loss automatik yang dapat mengunci sebahagian besar keuntungan
  3. Persentase Stop Loss yang boleh dikonfigurasi untuk pasaran yang berbeza
  4. Sesuai untuk jenis yang mempunyai ciri-ciri berbalik
  5. Operasi mudah dan mudah dilaksanakan

Analisis risiko strategi

Strategi ini mempunyai beberapa risiko:

  1. Kesilapan ini tidak semestinya berjaya, mungkin akan cuba lagi.
  2. Penangguhan atau penangguhan yang tidak betul boleh menyebabkan penangguhan atau penangguhan yang lebih awal
  3. Parameter yang perlu dioptimumkan secara berkala untuk menyesuaikan diri dengan perubahan pasaran
  4. Variasi terhad, mungkin tidak berkesan untuk sesetengah varieti
  5. Terdapat keperluan untuk campur tangan manusia

Arah pengoptimuman strategi

Strategi ini juga boleh dioptimumkan dengan:

  1. Menambah algoritma pembelajaran mesin untuk mengoptimumkan parameter secara automatik
  2. Menambah lebih banyak cara untuk menghentikan kerugian, seperti menghentikan kerugian bergerak, menghentikan kerugian bergelantungan dan sebagainya
  3. Mengoptimumkan logik penghentian kerugian untuk penghentian kerugian yang lebih pintar dan lebih lancar
  4. Gabungan dengan lebih banyak petunjuk untuk menilai kebolehpercayaan isyarat, penapisan isyarat salah
  5. Memperluaskan penggunaan lebih banyak jenis dan meningkatkan keseragaman strategi

ringkaskan

Strategi ini secara keseluruhan merupakan strategi tracking stop loss yang mudah dan berkesan berdasarkan pemikiran jurang harga. Ia mengurangkan kemungkinan masuk silap, dapat mengunci keuntungan dengan berkesan, dan masih ada ruang untuk pengoptimuman yang besar dalam pengoptimuman dan penapisan parameter, yang patut diteliti dan diperbaiki.

Kod sumber strategi
/*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)