Chiến lược PB SAR Backtest với Elastic Stop Loss

Tác giả:ChaoZhang, Ngày: 2023-10-11 15:22:26
Tags:

Thông tin chi tiết

Chiến lược này dựa trên các chỉ số dừng lỗ linh hoạt, thiết lập tín hiệu mua và bán, thực hiện các hoạt động mua và mua ngắn.

Nguyên tắc

Chiến lược này chủ yếu sử dụng các chỉ số dừng đàn áp để xác định điểm chuyển đổi của xu hướng và thực hiện các hoạt động đảo ngược. Chỉ số sử dụng chỉ số phạm vi thực để xác định giá cực, xem giá vượt quá giới hạn là bất thường và xác định khả năng đảo ngược xu hướng. Cụ thể, chỉ số duy trì hai biến thể bên trong: giá cực (EP) và giá kích hoạt (TP). EP đại diện cho giá cao nhất hoặc thấp nhất dưới xu hướng hiện tại. TTP được tính bởi EP.

Trong xu hướng tăng, khi giá cao hơn EP, nó được xác định là đột phá bất thường, khi đó EP được cập nhật là giá cao nhất và TP là giá thấp nhất. Khi giá thấp hơn TP, xu hướng được xác định là đảo ngược, tạo ra tín hiệu bán. Trong xu hướng giảm, các quy tắc tương tự.

Chiến lược này kết hợp với cơ chế theo dõi dừng lỗ, sau khi mở vị trí, theo dõi giá dừng lỗ tối ưu trong thời gian thực, trong khi đảm bảo lợi nhuận, kiểm soát rủi ro. Cụ thể, sau khi làm nhiều, đường dừng lỗ sẽ theo dõi điểm đóng thấp; sau khi làm trống, đường dừng lỗ sẽ theo dõi điểm đóng cao.

Ưu điểm

Chiến lược này có những lợi thế sau:

  1. Các nhà nghiên cứu cho rằng, việc sử dụng các chỉ số để xác định điểm đảo ngược xu hướng là một cách khó khăn.

  2. Theo dõi các cơ chế dừng lỗ, có thể khóa lợi nhuận và tránh tổn thất mở rộng.

  3. Các tham số chỉ số đơn giản và dễ thực hiện.

  4. Có thể cấu hình các tín hiệu mua bán, dễ sử dụng.

  5. Có thể linh hoạt cấu hình chu kỳ kiểm tra lại, đánh giá toàn diện hiệu quả chiến lược.

Rủi ro

Một số người cho rằng chiến lược này cũng có một số rủi ro:

  1. Các chỉ số có sự chậm trễ và có thể bỏ lỡ điểm tốt nhất để đảo ngược xu hướng.

  2. Trong khi đó, các nhà đầu tư cũng cho rằng giá cả của các sản phẩm có thể bị ảnh hưởng bởi sự biến động trong thời gian ngắn.

  3. Việc lựa chọn chu kỳ kiểm tra lại không phù hợp và không thể đánh giá toàn diện hiệu quả của chiến lược.

  4. Các nhà đầu tư cần quan tâm đến tác động của chi phí giao dịch đến lợi nhuận.

Các công ty có thể sử dụng các công cụ này để đảm bảo an toàn và an toàn cho doanh nghiệp.

  1. Điều chỉnh các tham số chỉ số, giảm chậm trễ.

  2. Tối ưu hóa thuật toán dừng lỗ để tránh bị lừa.

  3. Chọn chu kỳ kiểm tra lại phù hợp để đảm bảo độ tin cậy.

  4. Tối ưu hóa quản lý vị trí và giảm chi phí giao dịch.

Định hướng tối ưu

Chiến lược này có thể được tối ưu hóa thêm trong các khía cạnh sau:

  1. Kết hợp với các chỉ số xu hướng, tránh giao dịch đảo ngược được đặt.

  2. Tối ưu hóa các thuật toán quản lý vị trí, chẳng hạn như vị trí tỷ lệ cố định, vị trí động, v.v.

  3. Thêm vào đó là lọc khối lượng giao dịch để tránh các giao dịch sai do lỗ hổng.

  4. Xây dựng một hệ thống tối ưu hóa tham số để tìm ra sự kết hợp tốt nhất.

  5. Một số người cho rằng, "Điều này là một điều đáng chú ý", và "Điều này là một điều đáng chú ý".

  6. Tối ưu hóa chiến lược dừng lỗ để làm cho dừng lỗ mượt hơn. Bạn có thể thử các thuật toán dừng lỗ như Chandelier Exit.

  7. Tối ưu hóa các loại giao dịch, khoảng thời gian, v.v. để cải thiện tính thích ứng chiến lược.

  8. Các chiến lược này sẽ được cải thiện bằng việc tích hợp các thuật toán học máy.

Tóm lại

Chiến lược này nói chung là đơn giản và đáng tin cậy, sử dụng các chỉ số dừng đàn hồi để xác định điểm đảo ngược, và được trang bị để theo dõi cơ chế dừng để kiểm soát rủi ro, có thể được sử dụng như một chiến lược đảo ngược ngắn hạn. Tuy nhiên, vẫn cần phải chú ý đến các vấn đề như chậm chạp của chỉ số, dừng quá mạnh. Bằng cách tối ưu hóa thêm, có thể đạt được hiệu quả chiến lược tốt hơn.

Tổng quan

Chiến lược này dựa trên chỉ số Parabolic SAR để tạo ra tín hiệu mua và bán cho các vị trí dài và ngắn. Nó cũng kết hợp một cơ chế dừng lỗ để kiểm soát rủi ro một cách hiệu quả.

Nguyên tắc

Cốt lõi của chiến lược này là xác định các điểm đảo ngược xu hướng bằng cách sử dụng chỉ số Parabolic SAR để giao dịch chống xu hướng. Chỉ số sử dụng phạm vi thực sự để phát hiện giá cực. Khi giá vượt quá mức cực, nó được coi là một sự đột phá và một dấu hiệu của sự đảo ngược xu hướng tiềm năng. Cụ thể, chỉ số duy trì hai biến: Giá cực (EP) và Giá kích hoạt (TP).

Trong một xu hướng tăng, khi giá cao hơn EP, nó được coi là đột phá. EP sau đó được cập nhật lên mức giá cao nhất và TP xuống mức giá thấp nhất. Khi giá giảm xuống dưới TP, một sự đảo ngược xu hướng được xác định và một tín hiệu bán được tạo ra.

Chiến lược này cũng kết hợp một cơ chế dừng lỗ. Sau khi mở một vị trí, nó sẽ theo dõi giá dừng lỗ tối ưu trong thời gian thực, khóa lợi nhuận trong khi kiểm soát rủi ro. Cụ thể, sau khi tham gia dài, dừng lỗ theo dõi mức thấp đóng; sau khi tham gia ngắn, nó theo dõi mức cao đóng.

Ưu điểm

Những lợi thế chính của chiến lược này là:

  1. Xác định các điểm đảo ngược xu hướng với chỉ số, tránh bị mắc kẹt trong xu hướng.

  2. Việc dừng lỗ theo dõi khóa lợi nhuận và ngăn ngừa tổn thất lớn hơn.

  3. Các thông số chỉ số đơn giản, dễ thực hiện.

  4. Các cảnh báo tín hiệu mua / bán có thể cấu hình để thuận tiện.

  5. Cấu hình thời gian backtest linh hoạt để đánh giá kỹ lưỡng.

Rủi ro

Ngoài ra còn có một số rủi ro cần xem xét:

  1. Sự chậm trễ của chỉ số có thể bỏ lỡ các điểm đảo ngược tối ưu.

  2. Các điểm dừng mạnh có thể bị dừng lại bởi các biến động ngắn hạn.

  3. Việc lựa chọn thời gian backtest không đúng không thể đánh giá đầy đủ chiến lược.

  4. Chi phí giao dịch có thể làm giảm lợi nhuận.

Một số cách để giải quyết rủi ro là:

  1. Tối ưu hóa các thông số để giảm chậm.

  2. Cải thiện thuật toán dừng lỗ để tránh bị dừng ra không cần thiết.

  3. Chọn thời gian kiểm tra hậu quả phù hợp cho độ tin cậy.

  4. Tối ưu hóa kích thước vị trí để giảm chi phí giao dịch.

Tăng cường

Một số cách để tối ưu hóa thêm chiến lược:

  1. Kết hợp các chỉ số xu hướng như MA để tránh bị mắc kẹt trong các xu hướng đối lập.

  2. Tối ưu hóa các thuật toán kích thước vị trí, ví dụ: phân số cố định, động.

  3. Thêm bộ lọc âm lượng để tránh tín hiệu sai từ khoảng trống.

  4. Tối ưu hóa tham số để tìm kết hợp tối ưu.

  5. Thực hiện chiến lược thu lợi nhuận để khóa lợi nhuận trong xu hướng.

  6. Cải thiện các thuật toán dừng lỗ để dừng trơn tru hơn. Thử nghiệm với Chandelier Exit vv

  7. Tối ưu hóa trên các sản phẩm, khung thời gian vv để cải thiện khả năng thích nghi.

  8. Kết hợp máy học để thích nghi tốt hơn.

Tóm lại

Tóm lại, đây là một chiến lược đơn giản và mạnh mẽ sử dụng Parabolic SAR để xác định sự đảo ngược và dừng lỗ để kiểm soát rủi ro. Nó có thể hoạt động như một chiến lược đảo ngược trung bình ngắn hạn.


/*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")


Thêm nữa