Strategi stop loss dan take profit komposit berdasarkan entri acak


Tanggal Pembuatan: 2024-01-24 15:38:49 Akhirnya memodifikasi: 2024-01-24 15:38:49
menyalin: 5 Jumlah klik: 688
1
fokus pada
1617
Pengikut

Strategi stop loss dan take profit komposit berdasarkan entri acak

Ringkasan

Gagasan utama dari strategi ini adalah dengan menentukan titik masuk melalui angka acak, dengan tiga titik berhenti dan satu titik berhenti untuk mengelola risiko, untuk mengendalikan kerugian setiap perdagangan.

Prinsip Strategi

Strategi ini menggunakan angka acakrd_number_entry untuk menentukan berapa banyak titik masuk antara 11 dan 13, dan menggunakan angka acakrd_number_exit antara 20 dan 22 untuk menentukan posisi kosong. Setelah melakukan lebih banyak, atur stop loss sebagai harga masuk dikurangiatr(14) * slx. Pada saat yang sama, atur tiga titik berhenti, titik berhenti pertama untuk harga masuk ditambahatr(14) * tpx, titik berhenti kedua untuk harga masuk ditambah 2 * tpx, dan titik berhenti ketiga untuk harga masuk ditambah 3 * tpx. Prinsip yang sama dengan pengosongan, berbeda dengan keputusan masuk mengambil nilai yang berbeda pada angka acakrd_number_entry, dan arah stop loss berlawanan.

Strategi ini dapat mengendalikan risiko dengan menyesuaikan tpx (stop loss coefficient) dan slx (stop loss coefficient).

Analisis Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Penggunaan random entry dapat mengurangi probabilitas kecocokan
  2. Mengatur Stop Loss Multiple untuk Mengontrol Risiko Perdagangan Tunggal
  3. Dengan menggunakan atr untuk mengatur stop loss, Anda dapat mengatur titik laba berdasarkan pergerakan pasar
  4. Anda dapat mengontrol risiko perdagangan dengan menyesuaikan faktor

Analisis risiko

Strategi ini juga memiliki risiko sebagai berikut:

  1. Masuk secara acak bisa melewatkan acara
  2. Stop loss yang terlalu kecil akan mudah rusak.
  3. Terlalu Banyak Ruang untuk Berhenti dan Mungkin Kurang Bermanfaat
  4. Parameter yang tidak tepat dapat menyebabkan peningkatan kerugian

Risiko dapat dikurangi dengan mengadaptasi stop-loss coefficient dan mengoptimalkan logika masuk acak.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Peningkatan Logika Masuk Random, Tergabung dengan Penghakiman Indikator Tren
  2. Optimalkan Stop Loss Factor untuk Membuat Keuntungan Lebih Rasional
  3. Peningkatan kontrol posisi, menggunakan ruang stop yang berbeda pada tahap yang berbeda
  4. Parameter pengoptimalan dengan algoritma pembelajaran mesin

Meringkaskan

Strategi ini didasarkan pada masuk acak, mengatur beberapa titik stop-stop untuk mengendalikan risiko perdagangan tunggal, karena keacakan yang kuat dapat mengurangi probabilitas penyesuaian kurva, risiko perdagangan dapat dikurangi melalui pengoptimalan parameter. Ada banyak ruang untuk pengoptimalan selanjutnya yang layak untuk diteliti lebih lanjut.

Kode Sumber Strategi
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Random Strategy with 3 TP levels and SL", overlay=true,max_bars_back = 50)

tpx = input(defval = 0.8, title = 'Atr multiplication for TPs?')
slx = input(defval = 1.2, title = 'Atr multiplication for SL?')
isLong = false
isLong := nz(isLong[1])

isShort = false
isShort := nz(isShort[1])

entryPrice = 0.0
entryPrice := nz(entryPrice[1])
tp1 = true
tp1 := nz(tp1[1])
tp2 = true
tp2 := nz(tp2[1])

sl_price = 3213.0
sl_price := nz(sl_price[1])

sl_atr = atr(14)*slx
tp_atr = atr(14)*tpx

rd_number_entry = 1.0
rd_number_entry := (16708 * nz(rd_number_entry[1], 1) % 2147483647)%17

rd_number_exit = 1.0
rd_number_exit := ((16708 * time % 2147483647) %17)


//plot(rd_number_entry)

shortCondition = (rd_number_entry == 13? true:false) and (year >= 2017) and not isLong and not isShort
longCondition = (rd_number_entry == 11 ? true:false) and (year >= 2017) and not isShort and not isShort
//Never exits a trade:
exitLong = (rd_number_exit == 22?true:false) and (year >= 2018) and not isShort
exitShort = (rd_number_exit ==  22?true:false) and (year >= 2018) and not isLong


//shortCondition = crossunder(sma(close, 14), sma(close, 28)) and year >= 2017
//longCondition = crossover(sma(close, 14), sma(close, 28)) and year >= 2017

//exitLong = crossunder(ema(close, 14), ema(close, 28)) and year >= 2017
//exitShort = crossover(ema(close, 14), ema(close, 28)) and year >= 2017

if (longCondition and not isLong)
    strategy.entry('Long1', strategy.long)
    strategy.entry('Long2', strategy.long)
    strategy.entry('Long3', strategy.long)
    isLong := true
    entryPrice := close
    isShort := false
    tp1 := false
    tp2 := false
    sl_price := close-sl_atr

if (shortCondition and not isShort)
    strategy.entry('Short1', strategy.short)
    strategy.entry('Short2', strategy.short)
    strategy.entry('Short3', strategy.short)
    isShort := true
    entryPrice := close
    isLong := false
    tp1 := false
    tp2 := false
    sl_price := close+sl_atr
    
if (exitShort and isShort)
    strategy.close('Short1')
    strategy.close('Short2')
    strategy.close('Short3')
    isShort :=  false

if (exitLong and isLong)
    strategy.close('Long1')
    strategy.close('Long2')
    strategy.close('Long3')
    isLong :=  false

if isLong
    if (close > entryPrice + tp_atr) and not tp1
        strategy.close('Long1')
        tp1 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 2*tp_atr) and not tp2
        strategy.close('Long2')
        tp2 := true
        sl_price := close - tp_atr
    if (close > entryPrice + 3*tp_atr)
        strategy.close('Long3')
        isLong := false
    if (close < sl_price)
        strategy.close('Long1')
        strategy.close('Long2')
        strategy.close('Long3')
        isLong := false

if isShort
    if (close < entryPrice - tp_atr) and not tp1
        strategy.close('Short1')
        sl_price := close + tp_atr
        tp1 := true
    if (close < entryPrice - 2*tp_atr) and not tp2
        strategy.close('Short2')
        sl_price := close + tp_atr
        tp2 := true
    if (close < entryPrice - 3*tp_atr)
        strategy.close('Short3')
        isShort := false
    if (close > sl_price)
        strategy.close('Short1')
        strategy.close('Short2')
        strategy.close('Short3')
        isShort := false
plot(atr(14)*slx)
plot(sl_price)