Strategi PB SAR Backtest dengan Elastic Stop Loss

Penulis:ChaoZhang, Tanggal: 2023-10-11 15:22:26
Tag:

Pengamatan

Strategi ini didasarkan pada indikator stop loss yang elastis, mengatur sinyal beli dan jual, melakukan operasi posisi panjang dan pendek.

Prinsip

Strategi ini terutama menggunakan indikator stop elastic untuk mengidentifikasi titik balik tren dan melakukan operasi pembalikan. Indikator ini menggunakan indikator rentang yang benar untuk mengidentifikasi harga batas, dan ketika harga melebihi batas, dianggap sebagai terobosan yang tidak biasa, menentukan kemungkinan pembalikan tren. Secara khusus, indikator ini mempertahankan dua variabel di dalam indikator: harga batas (EP) dan harga pemicu (TP).

Dalam tren uptrend, ketika harga lebih tinggi dari EP, ditentukan sebagai penembusan yang tidak biasa, di mana EP diperbarui menjadi harga tertinggi, TP adalah harga terendah. Ketika harga lebih rendah dari TP, ditentukan reversasi tren, menghasilkan sinyal jual. Dalam tren penurunan, prinsipnya sama.

Strategi ini dikombinasikan dengan mekanisme pelacakan stop loss, yang ketika posisi dibuka, akan melacak harga stop loss optimal secara real time, untuk mengendalikan risiko sambil menjamin keuntungan. Secara khusus, setelah melakukan banyak, stop loss line akan mengikuti titik penutupan low; setelah melakukan kosong, stop loss line akan mengikuti titik penutupan high.

Keunggulan

Strategi ini memiliki keuntungan berikut:

  1. Dengan menggunakan indikator untuk mengidentifikasi titik pembalikan tren, mereka tidak mudah ditangkap.

  2. Mengikuti mekanisme stop loss, dapat mengunci keuntungan dan menghindari kerugian yang meluas.

  3. Parameter indikator sederhana dan mudah diterapkan.

  4. Anda dapat mengkonfigurasi sinyal tanda jual beli, mudah dioperasikan.

  5. Fleksibel untuk mengkonfigurasi siklus uji ulang, untuk mengevaluasi secara komprehensif efek strategi.

Risiko

Namun, strategi ini juga memiliki beberapa risiko:

  1. Indikator yang tertinggal dan mungkin kehilangan titik terbaik untuk membalikkan tren.

  2. Jika stop loss terlalu radikal, hal ini dapat dipengaruhi oleh harga yang bergesekan dalam waktu singkat.

  3. Pemilihan siklus retest tidak tepat dan tidak dapat menilai secara komprehensif efek strategi.

  4. Perhatikan dampak biaya transaksi pada keuntungan.

Untuk mengatasi risiko, optimalisasi dapat dilakukan dengan:

  1. Peraturan-peraturan yang dibuat oleh para pemimpin negara-negara Eropa, termasuk negara-negara Asia Tenggara, telah mengubah parameter indikator, mengurangi keterlambatan.

  2. Mengoptimalkan algoritma stop loss untuk menghindari kasus yang sama.

  3. Pilih siklus uji ulang yang tepat untuk memastikan keandalan.

  4. Mengoptimalkan manajemen posisi dan mengurangi biaya transaksi.

Optimasi arah

Strategi ini dapat dioptimalkan lebih lanjut untuk:

  1. Menggabungkan indikator tren untuk menghindari reversing trading yang terikat. Anda dapat bergabung dengan indikator seperti MA untuk menentukan tren besar.

  2. Mengoptimalkan algoritma manajemen posisi, seperti posisi proporsi tetap, posisi dinamis, dll.

  3. Untuk menghindari kesalahan transaksi yang disebabkan oleh kesenjangan, tambahkan filter volume transaksi.

  4. Optimasi parameter untuk menemukan kombinasi parameter terbaik.

  5. Jika Anda tidak memiliki strategi yang tepat, maka Anda tidak akan mendapatkan keuntungan.

  6. Optimalkan strategi stop loss untuk membuat stop loss lebih halus. Anda dapat mencoba algoritma stop loss seperti Chandelier Exit.

  7. Optimisasi jenis transaksi, periode waktu, dan lain-lain untuk meningkatkan fleksibilitas strategi.

  8. Dengan menambahkan algoritma pembelajaran mesin, strategi menjadi lebih adaptif.

Pengamatan

Strategi ini secara keseluruhan lebih sederhana dan dapat diandalkan, menggunakan indikator stop loss yang elastis untuk mengidentifikasi titik pembalikan, dan dilengkapi dengan mekanisme stop loss yang dapat dilacak untuk mengendalikan risiko, dan dapat digunakan sebagai strategi reversal jangka pendek. Namun, masih perlu diperhatikan masalah seperti keterlambatan indikator, stop loss yang terlalu radikal, dan sebagainya. Dengan optimasi lebih lanjut, diharapkan hasil strategi yang lebih baik.

Gambaran umum

Strategi ini didasarkan pada indikator Parabolic SAR untuk menghasilkan sinyal beli dan jual untuk posisi panjang dan pendek.

Prinsip

Inti dari strategi ini adalah untuk mengidentifikasi titik pembalikan tren menggunakan indikator Parabolic SAR untuk perdagangan kontra-tren. Indikator ini menggunakan rentang yang sebenarnya untuk mendeteksi harga ekstrim. Ketika harga melebihi ekstrim, itu dianggap sebagai breakout dan tanda potensi pembalikan tren. Secara khusus, indikator ini mempertahankan dua variabel: Harga Ekstrim (EP) dan Harga Pemicu (TP).

Dalam tren naik, ketika harga lebih tinggi dari EP, itu dianggap sebagai break-out. EP kemudian diperbarui ke harga tertinggi dan TP ke harga terendah. Ketika harga turun di bawah TP, pembalikan tren diidentifikasi dan sinyal jual dihasilkan. Prinsip yang sama berlaku untuk tren penurunan.

Strategi ini juga menggabungkan mekanisme stop loss trailing. Setelah membuka posisi, ia akan melacak harga stop loss optimal secara real-time, mengunci keuntungan sambil mengendalikan risiko. Secara khusus, setelah masuk panjang, stop loss melacak titik rendah penutupan; setelah masuk pendek, ia melacak titik tinggi penutupan.

Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Identifikasi titik pembalikan tren dengan indikator, menghindari terjebak dalam tren.

  2. Mengikuti stop loss mengunci keuntungan dan mencegah kerugian yang lebih besar.

  3. Parameter indikator sederhana, mudah diterapkan.

  4. Pemberitahuan sinyal beli/jual yang dapat dikonfigurasi untuk kenyamanan.

  5. Konfigurasi periode backtest yang fleksibel untuk evaluasi menyeluruh.

Risiko

Ada juga beberapa risiko yang harus dipertimbangkan:

  1. Penundaan indikator mungkin melewatkan titik pembalikan optimal.

  2. Stop agresif dapat dihentikan oleh fluktuasi jangka pendek.

  3. Pemilihan periode backtest yang tidak tepat tidak dapat sepenuhnya mengevaluasi strategi.

  4. Biaya transaksi dapat merugikan keuntungan.

Beberapa cara untuk mengatasi risiko adalah:

  1. Optimalkan parameter untuk mengurangi lag.

  2. Meningkatkan algoritma stop loss untuk menghindari dihentikan tidak perlu.

  3. Pilih periode backtest yang tepat untuk keandalan.

  4. Mengoptimalkan ukuran posisi untuk menurunkan biaya transaksi.

Peningkatan

Beberapa cara untuk lebih mengoptimalkan strategi:

  1. Masukkan indikator tren seperti MA untuk menghindari terjebak dalam tren lawan.

  2. Mengoptimalkan algoritma ukuran posisi, misalnya pecahan tetap, dinamis.

  3. Tambahkan filter volume untuk menghindari sinyal palsu dari celah.

  4. Optimasi parameter untuk menemukan kombinasi optimal.

  5. Mengimplementasikan strategi mengambil keuntungan untuk mengunci keuntungan dalam tren.

  6. Memperbaiki algoritma stop loss untuk berhenti yang lebih halus.

  7. Mengoptimalkan produk, kerangka waktu, dll untuk meningkatkan kemampuan beradaptasi.

  8. Masukkan pembelajaran mesin untuk kemampuan beradaptasi yang lebih besar.

Ringkasan

Singkatnya, ini adalah strategi sederhana dan kuat menggunakan SAR Parabolik untuk mengidentifikasi pembalikan dan trailing stop loss untuk mengendalikan risiko. Ini dapat bekerja sebagai strategi pembalikan rata-rata jangka pendek.


/*backtest
start: 2023-09-10 00:00:00
end: 2023-10-10 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("PB SAR BackTest - Colorbar", overlay=false)

// Full credit to Sawcruhteez, Lucid Investment Strategies LLC, Casey Bowman and Peter Brandt.
// This is a strategy version of the Peterbolic SAR indicator created by the above-mentioned parties.
// Original version of the indicator: https://www.tradingview.com/script/6nYrH3Vm-Peterbolic-SAR/

// SAR #1
// Lucid Sar
// Branded under the name "Lucid SAR"
// as agreed to with Lucid Investment Strategies LLC on July 9, 2019
// https://lucidinvestmentstrategies.com/
// see branch "lucid"

// SAR #2
// Peterbolic Sar
// Using the name "Peterbolic SAR"
// as agreed to by Peter Brandt on October 2, 2019
// - https://twitter.com/PeterLBrandt/status/1179365590668075008
// in response to request from Sawcruhteez
// - https://twitter.com/Sawcruhteez/status/1179213105705836544
// Sawcruhteez gives credit to @CrazyGabey for coming up with the name
// - https://twitter.com/Sawcruhteez/status/1179213196583940097
// see branch "peterbolic"

// SAR #3
// Sawcruhteez Sar
// Branded under the name "Sawcruhteez SAR"
// as agreed to with Sawcruhteez on September 11, 2019
// see branch "sawcruhteez"

// Open Source on github
// https://github.com/casey-bowman/sar/blob/peterbolic/peterbolic.pine

// Created by Casey Bowman on July 4, 2019

// MIT License

// Copyright (c) 2019 Casey Bowman

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.



TSR() =>

    // start with uptrend
    var uptrend = true
    var EP = high       // extreme price - high or low depending on trend
    var SP = low        // setup price
    var TP = float(na)  // trigger price


    var setup   = low
    var trigger = float(na)

    if barstate.isnew
        setup := low
        trigger = float(na)

    extreme_candle = false
    first_extreme_candle = false
    setup_candle = false
    trigger_candle = false

    waiting_for_setup = false
    waiting_for_trigger = false

    var since_extreme = 0
    var since_setup = 0

    waiting_for_setup   := not extreme_candle and not na(SP)
    waiting_for_trigger := not na(TP)

    if not barstate.isfirst
        if barstate.isnew and extreme_candle[1]
            trigger := float(na)
        if barstate.isnew and setup_candle[1]
            setup := float(na)
        if barstate.isnew and waiting_for_trigger
            since_setup := since_setup + 1
            trigger := TP
        if barstate.isnew and waiting_for_setup
            since_extreme := since_extreme + 1
            setup := SP
        if uptrend

            if extreme_candle
                EP := high
                SP := low
            else
                if high > EP
                    extreme_candle := true
                    EP := high
                    SP := low
                    since_extreme := 0
                    since_setup   := 0
                else
                    if waiting_for_setup
                        if barstate.isconfirmed
                            if close < SP
                                setup_candle := true
                                SP := float(na)
                                TP := low
            if waiting_for_trigger
                if low < TP
                    trigger_candle := true
                    extreme_candle := true
                    EP := low
                    SP := high
                    TP := float(na)
                    uptrend := false
                    since_extreme := 0
                    since_setup := 0
                else
                    if barstate.isconfirmed and extreme_candle
                        TP := float(na)
                        trigger := float(na)

        else
            if extreme_candle
                EP := low
                SP := high
            else
                if low <  EP
                    extreme_candle := true
                    EP := low
                    SP := high
                    since_extreme := 0
                    since_setup   := 0
                else
                    if waiting_for_setup
                        if barstate.isconfirmed
                            if close > SP
                                setup_candle := true
                                SP := float(na)
                                TP := high
            if waiting_for_trigger
                if high > TP
                    trigger_candle := true
                    extreme_candle := true
                    EP := high
                    SP := low
                    TP := float(na)
                    uptrend := true
                    since_extreme := 0
                    since_setup := 0
                else
                    if barstate.isconfirmed and extreme_candle
                        TP := float(na)
                        trigger := float(na)


    [trigger_candle, trigger, since_setup, setup_candle, setup, since_extreme, extreme_candle, uptrend]


[TC, T, SS, SC, S, SE, EC, up] = TSR()

// Make input options that configure backtest date range
StartMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
StartDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
StartYear = input(title="Start Year", type=input.integer,
     defval=(2019), minval=1800, maxval=2100)

EndMonth = input(title="End Month", type=input.integer,
     defval=1, minval=1, maxval=12)
EndDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
EndYear = input(title="End Year", type=input.integer,
     defval=(2020), minval=1800, maxval=2100)
     
// Look if the close time of the current bar falls inside the date range
inDateRange = true

buytrigger = (TC and up)
selltrigger = (TC and not up)
buysetup = (SC and not up)
sellsetup = (SC and up)

IntBuy = buytrigger ? 1 : 0
IntSB = buysetup ? 0.5 : 0

IntSell= selltrigger ? -1 : 0
IntSS = sellsetup ? -0.5 : 0

bgcolor = buytrigger ? color.green : selltrigger ? color.red : buysetup ? color.yellow : sellsetup ? color.orange : color.black
trans = buytrigger ? 20 : selltrigger ? 20 : 100

bgcolor(bgcolor, 30)

NUM = IntBuy + IntSB + IntSell + IntSS
linecolor = color.orange
plot(NUM, color=linecolor, linewidth=2)

alertcondition(NUM > 0.5, title="Buy Signal", message="Buy Alert")
alertcondition(NUM < -0.5, title="Sell Signal", message="Sell Alert")

alertcondition(NUM == 0.5, title="Buy Setup", message="Buy Setup")
alertcondition(NUM == -0.5, title="Sell Setup", message="Sell Setup")

//Switch on for strategy moves

if(inDateRange and buytrigger)
    strategy.exit("SHORT", "SHORT_SL", comment="Short_Exit")
    strategy.entry("LONG", strategy.long, comment="")
if(inDateRange and selltrigger)
    strategy.exit("LONG", "LONG_SL", comment="Long_Exit")
    strategy.entry("SHORT", strategy.short, comment="")
if (not inDateRange)
    strategy.close_all()

// plotshape(SC and not up, color = color.yellow, style = shape.triangleup, location = location.belowbar, size = size.auto, transp = 0, title = "Setup to Buy")
// plotshape(TC and up, color = color.green, style = shape.triangleup, location = location.belowbar, size = size.auto, title = "Trigger to Buy")
// plotshape(SC and up, color = color.yellow, style = shape.triangledown, location = location.abovebar, size = size.auto, transp = 0, title = "Setup to Sell")
// plotshape(TC and not up, color = color.red, style = shape.triangledown, location = location.abovebar, size = size.auto, title = "Trigger to Sell")


Lebih banyak