Strategi PB SAR Backtest dengan Stop Loss Elastik

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

Ringkasan

Strategi ini adalah berdasarkan penunjuk stop loss yang fleksibel, menetapkan isyarat beli dan jual, menjalankan operasi posisi panjang dan pendek. Lakukan lebih banyak apabila isyarat beli muncul; buat kosong apabila isyarat jual muncul. Strategi ini juga menggabungkan mekanisme stop loss yang mengesan untuk mengawal risiko dengan berkesan.

Prinsip

Strategi ini menggunakan penunjuk hentian elastik untuk mengenal pasti titik perubahan trend, untuk melakukan operasi pembalikan. Indikator ini menggunakan penunjuk julat sebenar dalam indikator untuk mengenal pasti harga terhad, yang dianggap sebagai kemerosotan yang luar biasa apabila harga melebihi batas, untuk menentukan kemungkinan pembalikan trend. Secara khusus, indikator ini mengekalkan dua pemboleh ubah dalam indikator: harga terhad (EP) dan harga pencetus (TP). EP mewakili harga tertinggi atau terendah di bawah trend semasa.

Dalam trend menaik, apabila harga lebih tinggi daripada EP, ia dianggap sebagai penembusan yang luar biasa, di mana EP diperbaharui sebagai harga tertinggi, TP sebagai harga terendah. Apabila harga lebih rendah daripada TP, ia ditentukan sebagai pembalikan trend dan menghasilkan isyarat jual. Dalam trend menurun, prinsipnya sama.

Strategi ini digabungkan dengan mekanisme pengesanan stop loss, apabila posisi dibuka, ia akan mengesan harga stop loss terbaik dalam masa nyata untuk mengawal risiko sambil memastikan keuntungan. Secara khusus, selepas melakukan banyak, barisan stop loss akan mengikuti titik penutupan yang rendah; selepas kosong, barisan stop loss akan mengikuti titik penutupan yang tinggi.

Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Dengan menggunakan penunjuk untuk mengenal pasti titik pembalikan trend, mereka tidak mudah ditangkap.

  2. Mengikuti mekanisme menghentikan kerugian, boleh mengunci keuntungan dan mengelakkan kerugian berkembang.

  3. Parameter penunjuk adalah mudah dan mudah dilaksanakan.

  4. Tanda isyarat jual beli boleh disesuaikan, mudah digunakan.

  5. Fleksibiliti untuk mengkonfigurasi kitaran pengkajian semula untuk menilai keseluruhan kesan strategi.

Risiko

Tetapi ada juga beberapa risiko dengan strategi ini:

  1. Indikator ini berlagu dan mungkin terlepas titik terbaik untuk membalikkan trend.

  2. Penghentian kerugian terlalu radikal dan mungkin terhalang oleh pergerakan harga jangka pendek.

  3. Pengujian semula kitaran pilihan yang tidak betul dan tidak dapat menilai sepenuhnya kesan strategi.

  4. Perhatian perlu diberikan kepada kesan kos urus niaga terhadap keuntungan.

Menghadapi risiko, optimalisasi boleh dilakukan dari segi berikut:

  1. Mengubah parameter penunjuk, mengurangkan kelewatan.

  2. Mengoptimumkan algoritma stop loss untuk mengelakkan ditipu.

  3. Memilih kitaran pemeriksaan semula yang sesuai untuk memastikan kebolehpercayaan.

  4. Mengoptimumkan pengurusan kedudukan dan mengurangkan kos urus niaga.

Arah pengoptimuman

Strategi ini boleh dioptimumkan lebih lanjut dalam hal berikut:

  1. Menggabungkan penunjuk trend untuk mengelakkan perdagangan terbalik yang disatukan. Indikator seperti MA boleh digunakan untuk menentukan trend besar.

  2. Mengoptimumkan algoritma pengurusan kedudukan, seperti kedudukan nisbah tetap, kedudukan dinamik, dan lain-lain.

  3. Menambah penapisan jumlah dagangan untuk mengelakkan perdagangan salah yang disebabkan oleh jurang.

  4. Mengoptimumkan parameter untuk mencari kombinasi parameter yang terbaik.

  5. Mengikut strategi yang digunakan untuk menghentikan kemerosotan, kemerosotan berlaku tepat pada masanya.

  6. Mengoptimumkan strategi stop loss untuk menjadikan stop loss lebih lancar. Algoritma stop loss seperti Chandelier Exit boleh diuji.

  7. Mengoptimumkan jenis dagangan, tempoh masa, dan lain-lain untuk meningkatkan kesesuaian strategi.

  8. Menggabungkan algoritma pembelajaran mesin menjadikan strategi lebih adaptif.

Ringkasan

Strategi ini secara keseluruhan adalah lebih mudah dan boleh dipercayai, menggunakan penunjuk stop elastik untuk mengenal pasti titik pembalikan, dan dilengkapi dengan mekanisme penghentian untuk mengawal risiko, yang boleh digunakan sebagai strategi pembalikan jangka pendek. Tetapi masih perlu berhati-hati dengan masalah seperti penunjuk yang tertunda, stop loss yang terlalu radikal. Dengan pengoptimuman lebih lanjut, kesan strategi yang lebih baik diharapkan.

Ringkasan

Strategi ini berdasarkan kepada penunjuk Parabolic SAR untuk menjana isyarat beli dan jual untuk kedudukan panjang dan pendek.

Prinsip

Inti strategi ini adalah untuk mengenal pasti titik pembalikan trend menggunakan penunjuk SAR Parabolik untuk perdagangan kontra-trend. Penunjuk menggunakan julat sebenar untuk mengesan harga melampau. Apabila harga melebihi melampau, ia dianggap sebagai pecah dan tanda pembalikan trend yang berpotensi. Khususnya, penunjuk mengekalkan dua pembolehubah: Harga Ekstrem (EP) dan Harga Trigger (TP). EP mewakili harga tertinggi / terendah trend semasa, sementara TP berasal dari EP.

Dalam trend menaik, apabila harga lebih tinggi daripada EP, ia dianggap pecah. EP kemudian dikemas kini kepada harga tertinggi dan TP kepada harga terendah. Apabila harga jatuh di bawah TP, pembalikan trend diiktiraf dan isyarat jual dihasilkan. Prinsip yang sama berlaku untuk trend penurunan.

Strategi ini juga menggabungkan mekanisme stop loss yang menyusul. Selepas membuka kedudukan, ia akan mengesan harga stop loss yang optimum dalam masa nyata, mengunci keuntungan sambil mengawal risiko. Khususnya, selepas masuk panjang, stop loss mengesan paras terendah penutupan; selepas masuk pendek, ia mengesan paras tertinggi penutupan.

Kelebihan

Kelebihan utama strategi ini ialah:

  1. Tentukan titik pembalikan trend dengan penunjuk, mengelakkan terperangkap dalam trend.

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

  3. Parameter penunjuk mudah, mudah dilaksanakan.

  4. Amaran isyarat beli / jual yang boleh dikonfigurasi untuk kemudahan.

  5. Konfigurasi tempoh backtest yang fleksibel untuk penilaian menyeluruh.

Risiko

Terdapat juga beberapa risiko yang perlu dipertimbangkan:

  1. Kelewatan penunjuk mungkin terlepas titik pembalikan optimum.

  2. Hentian agresif boleh dihentikan oleh turun naik jangka pendek.

  3. Pilihan tempoh backtest yang tidak betul tidak dapat menilai sepenuhnya strategi.

  4. Kos urus niaga boleh menjejaskan keuntungan.

Beberapa cara untuk menangani risiko adalah:

  1. Mengoptimumkan parameter untuk mengurangkan lag.

  2. Meningkatkan algoritma stop loss untuk mengelakkan berhenti tanpa perlu.

  3. Pilih tempoh backtest yang sesuai untuk kebolehpercayaan.

  4. Mengoptimumkan saiz kedudukan untuk mengurangkan kos transaksi.

Peningkatan

Beberapa cara untuk mengoptimumkan lagi strategi:

  1. Menggabungkan penunjuk trend seperti MA untuk mengelakkan terperangkap dalam trend lawan.

  2. Mengoptimumkan algoritma saiz kedudukan, contohnya pecahan tetap, dinamik.

  3. Tambah penapis kelantangan untuk mengelakkan isyarat palsu dari jurang.

  4. Pengoptimuman parameter untuk mencari kombinasi optimum.

  5. Melaksanakan strategi mengambil keuntungan untuk mengunci keuntungan dalam trend.

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

  7. Mengoptimumkan produk, kerangka masa dan lain-lain untuk meningkatkan kesesuaian.

  8. Menggabungkan pembelajaran mesin untuk fleksibiliti yang lebih besar.

Ringkasan

Ringkasnya, ini adalah strategi yang mudah dan kukuh menggunakan SAR Parabolik untuk mengenal pasti pembalikan dan kehilangan berhenti untuk mengawal risiko. Ia boleh berfungsi sebagai strategi pembalikan purata jangka pendek. Tetapi kelewatan penunjuk dan berhenti yang terlalu sensitif perlu ditangani. Pengoptimuman lanjut boleh membawa kepada peningkatan prestasi.


/*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 lanjut