Strategi Pengesanan Peratusan Kotak Dinamik

Penulis:ChaoZhang, Tarikh: 2023-11-23 10:32:39
Tag:

img

Ringkasan

Strategi ini menggunakan perubahan harga peratusan untuk menetapkan garis kemasukan dan baris stop loss. Ia memasuki kedudukan apabila harga menembusi garis kemasukan dan keluar kedudukan apabila harga jatuh di bawah garis stop loss. Ciri utamanya adalah bahawa ia hanya mengambil satu unit risiko, yang bermaksud bahawa kedudukan baru hanya akan ditambah selepas kedudukan sebelumnya mencapai sasaran keuntungan yang telah ditetapkan.

Prinsip-prinsip

Strategi ini mula-mula menetapkan harga penanda aras dan menggunakan 10% daripada harga itu sebagai julat harga - batas atas adalah garisan kemasukan dan batas bawah adalah garisan stop loss. Apabila harga menembusi garisan kemasukan, kuantiti tetap akan dibeli. Apabila harga jatuh di bawah garisan stop loss, kedudukan akan ditutup. Selepas membuat keuntungan, garis kemasukan dan stop loss akan diselaraskan dengan peratusan untuk memperluaskan julat keuntungan. Ini membolehkan strategi untuk mengesan trend berjalan.

Satu lagi titik utama strategi adalah bahawa ia hanya mengambil satu unit risiko. iaitu, kedudukan baru hanya akan ditambahkan selepas kedudukan semasa mencapai sasaran keuntungan. Posisi baru juga akan mengikuti garis kemasukan dan stop loss baru. Ini mengehadkan risiko.

Analisis Kelebihan

Strategi ini menggabungkan kelebihan hentian dan saiz kedudukan, yang membolehkan kawalan risiko yang berkesan sambil menguntungkan.

  1. Menggunakan julat peratusan untuk garis kemasukan dan henti rugi membolehkan pengesanan trend automatik
  2. Risiko terhad kepada satu digit, mengelakkan kerugian besar
  3. Posisi baru hanya ditambah selepas keuntungan, mengelakkan mengejar trend
  4. Baris stop loss bergerak ke atas selepas keuntungan, mengunci keuntungan

Analisis Risiko

Terdapat juga beberapa risiko:

  1. Jika julat peratusan terlalu luas, risiko boleh berkembang
  2. Jika julat terlalu sempit, potensi keuntungan terhad
  3. Penempatan stop loss yang tidak betul boleh membawa kepada keluar awal
  4. Penambahan agresif boleh meningkatkan kerugian

Risiko ini boleh dielakkan dengan menyesuaikan parameter seperti saiz julat, penapis masuk dan lain-lain.

Pengoptimuman

Terdapat ruang untuk pengoptimuman lanjut:

  1. Menggabungkan dengan penunjuk trend untuk menentukan arah trend
  2. Menambah model pembelajaran mesin untuk garis yang lebih adaptif
  3. Ujian keadaan penambahan yang berbeza untuk mengurangkan risiko
  4. Mencari tempoh tahan yang optimum melalui ujian

Kesimpulan

Ini adalah sistem berasaskan julat peratusan yang mudah dan praktikal. Melalui penyesuaian parameter dan pengoptimuman model, strategi ini boleh menjadi alat penjejakan trend yang boleh dipercayai, menghasilkan prestasi yang lebih stabil untuk pelabur.


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

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HermanBrummer 4 April 2021

strategy ("The Box Percent Strat", shorttitle="The Box", overlay = true)

///     Designed for LONG only on Daily, 2D or 3D Charts
///     Uses fixed investment risk amount, meaning you're willing to lose that amount per trade
///     Limit buy to not overpay

RiskPerTrade            = input(10000, "Risk losing this much per trade", tooltip="This calculates how much you will lose based on difference between the entry price and stop loss price")
TradeAboveMAFilterPer   = input(50, "The System won't trade if price is below this MA")

UpBoxSize               = (input(10, "Box size in %") * 0.01)+1 // 1.1 == 10% up
DnBoxSize               = 1-(input(10, "Box size in %") * 0.01) // 0.9 == 10% dn


var FirstBar            = close > 0 ? close : na
var FirstTop            = FirstBar * UpBoxSize
var FirstBot            = FirstBar * DnBoxSize


var top                 = sma(FirstTop, 1)
var bot                 = sma(FirstBot, 1)

///     The Box Calcs
if  high[2] > top
    top                 := top * UpBoxSize
    bot                 := bot * UpBoxSize
if  low[1]  < bot
    top                 := top * DnBoxSize
    bot                 := bot * DnBoxSize

 
plot(bot,   "Bot",      #ff0000) // Green
plot(top,   "Top",      #00ff00) // Red

mid                     = ((top-bot)/2)+bot 
plot(mid,   "Mid", color.gray)

TradeAboveMAFilter      = sma(close, TradeAboveMAFilterPer)
plot(TradeAboveMAFilter, "Trade AboveMAF Filter", color.yellow, 3, style=plot.style_circles)

// col = high[1] < top and high >= top ? color.white : na
// bgcolor(col)


///     Shares
RiskRange                   = close * abs(DnBoxSize - 1) // 0.9 - 1 == 1.10 // 10% abs so you don't get a neg number NB NB
Shares                      = RiskPerTrade / RiskRange 
//plot(close-RiskRange, "RiskRange", color.fuchsia)

Enter   =   high >= top
             and close[1] > TradeAboveMAFilter
             and strategy.opentrades[0] == strategy.opentrades[1]
             and strategy.opentrades[1] == strategy.opentrades[2] 
             and strategy.opentrades[2] == strategy.opentrades[3]
             and strategy.opentrades[3] == strategy.opentrades[4] 
             and strategy.opentrades[4] == strategy.opentrades[5]
             and strategy.opentrades[5] == strategy.opentrades[6]
             // won't enter if new positon was taken in the last 6 bars
             // need better code for this.

///     Buy & Sell
//  (new highs)    and  (Close above moving average filter) and (No new trades were taken receently)
if  Enter //(high >= top)  and  (close[1] > TradeAboveMAFilter) and strategy.opentrades[0] == strategy.opentrades[1] 
    strategy.order("En", strategy.long, qty=Shares, limit=top)//, stop=top)
    
//barcolor(strategy.position_size != 0 ? #00ff00 : color.gray)


// ///     If ONE Position THEN this Stop Because: 
// if  strategy.position_size == 1
//     strategy.exit("Ex", "En", stop=bot)
///     If it has more than one trad OPEN
if  strategy.position_size > 0
    strategy.exit("Ex", "En", stop=bot[2] )   // puts stop on old bot

//plot(strategy.position_avg_price, "Avg Price", color.yellow)





Lebih lanjut