Chiến lược dừng lỗ theo xu hướng siêu việt


Ngày tạo: 2023-12-19 11:20:15 sửa đổi lần cuối: 2023-12-19 11:20:15
sao chép: 0 Số nhấp chuột: 607
1
tập trung vào
1621
Người theo dõi

Chiến lược dừng lỗ theo xu hướng siêu việt

Tổng quan

Chiến lược này dựa trên chỉ số siêu xu hướng và theo dõi dừng để mở vị trí hòa bình. Nó sử dụng 4 báo động để mở vị trí hòa bình và sử dụng chiến lược siêu xu hướng. Chiến lược này được thiết kế đặc biệt cho robot và có chức năng theo dõi dừng.

Nguyên tắc chiến lược

Chiến lược này sử dụng chỉ số ATR để tính toán đường lên và đường xuống. Khi giá đóng cửa phá vỡ đường lên, nó tạo ra tín hiệu mua, và khi phá vỡ đường xuống, nó tạo ra tín hiệu bán. Chiến lược cũng sử dụng đường xu hướng siêu để xác định hướng xu hướng. Khi đường xu hướng siêu đi, nó cho thấy thị trường bò bắt đầu; khi đường xu hướng siêu đi, nó cho thấy thị trường gấu bắt đầu.

Phân tích lợi thế

Chiến lược này kết hợp các ưu điểm của chỉ số siêu xu hướng để xác định hướng xu hướng và chỉ số ATR để thiết lập dừng lỗ, có thể lọc hiệu quả các phá vỡ giả. Theo dõi dừng lỗ có thể rất tốt để khóa lợi nhuận và giảm rút lui. Ngoài ra, chiến lược được thiết kế đặc biệt cho robot, có thể tự động hóa giao dịch.

Phân tích rủi ro

Chỉ số siêu xu hướng dễ tạo ra nhiều tín hiệu sai. Khi giá dừng điều chỉnh lớn, nó sẽ làm tăng khả năng phá vỡ lệnh dừng. Ngoài ra, giao dịch robot cũng phải đối mặt với các rủi ro kỹ thuật như máy chủ sụp đổ, gián đoạn mạng.

Để giảm khả năng tín hiệu sai, bạn có thể điều chỉnh tham số ATR thích hợp hoặc thêm các chỉ số khác để lọc. Cần cân bằng lợi nhuận và rủi ro khi điều chỉnh độ dài theo dõi dừng lỗ. Đồng thời, hãy chuẩn bị các máy chủ và mạng dự phòng để phòng ngừa rủi ro lỗi kỹ thuật.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa ở một số khía cạnh:

  1. Thêm các chỉ số hoặc điều kiện để lọc tín hiệu nhập cảnh, tránh tín hiệu sai. Ví dụ: có thể thêm chỉ số MACD.

  2. Có thể thử nghiệm các kết hợp khác nhau của tham số ATR để tìm tham số tối ưu.

  3. Có thể tối ưu hóa theo dõi mức độ dừng để tìm điểm cân bằng tốt nhất.

  4. Bạn có thể thêm giá dừng lỗ để thực hiện dừng lỗ theo lô.

  5. Có thể xây dựng kiến trúc máy chủ dự phòng đôi để chuyển đổi nhanh chóng khi máy chủ chính bị hỏng.

Tóm tắt

Chiến lược này tích hợp các lợi thế của chỉ số vượt quá xu hướng và theo dõi dừng lỗ, có thể tự động mở vị trí và dừng lỗ. Các biện pháp cải tiến kết hợp với hướng tối ưu hóa trong thực tế có thể trở thành một chiến lược giao dịch định lượng rất hữu ích.

Mã nguồn chiến lược
/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © arminomid1375
//@version=5
strategy('Mizar_BOT_super trend', overlay=true, default_qty_value=100, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=100, max_bars_back=4000)


//===== INPUTS ==========================================================================//

factor = input.float(4.5, title='ATR Factor', step=0.1,group = 'ATR')
period = input.int(59, minval=1, maxval=100, title='ATR Period',group = 'ATR')
up = (high + low) / 2 - factor * ta.atr(period)
down = (high + low) / 2 + factor * ta.atr(period)
trend_up = 0.0
trend_up := close[1] > trend_up[1] ? math.max(up, trend_up[1]) : up
trend_down = 0.0
trend_down := close[1] < trend_down[1] ? math.min(down, trend_down[1]) : down
trend = 0.0
trend := close > trend_down[1] ? 1 : close < trend_up[1] ? -1 : nz(trend[1], 1)
tsl = trend == 1 ? trend_up : trend_down
line_color = trend == 1 ? 'green' : 'red'
long_signal = trend == 1 and trend[1] == -1
short_signal = trend == -1 and trend[1] == 1
background = true


//ss =  input.float(defval=15.0, minval=0.0, title=' stop loss %',group = 'stop loss')
use_sl = input(title='trailing stop ?', defval=true,group = 'stop loss')
initial_sl_pct = input.float(defval=15.0, minval=0.0, title='trailing stop %',group = 'stop loss')

Tpactive1 = input(title='Take profit1 On/Off ?', defval=true, group='take profit')
tp1percent = input.float(5.0, title='TP1 %', group='take profit') *100
tp1amt = input.int(10, title='TP1 Amount %', group='take profit')
Tpactive2 = input(title='Take profit2 On/Off ?', defval=true, group='take profit')
tp2percent = input.float(10, title='TP2 %', group='take profit') *100
tp2amt = input.int(15, title='TP2 Amount %', group='take profit')
Tpactive3 = input(title='Take profit3 On/Off ?', defval=true, group='take profit')
tp3percent = input.float(15, title='TP3 %', group='take profit')*100
tp3amt = input.int(20, title='TP3 Amount %', group='take profit')

//===== TIMEFRAME ==========================================================================//

from_month = input.int(defval=1, title='From Month', minval=1, maxval=12)
from_day = input.int(defval=1, title='From Day', minval=1, maxval=31)
from_year = input.int(defval=2019, title='From Year', minval=2017)
to_month = input.int(defval=1, title='To Month', minval=1, maxval=12)
to_day = input.int(defval=1, title='To Day', minval=1, maxval=31)
to_year = input.int(defval=9999, title='To Year', minval=2017)
start = timestamp(from_year, from_month, from_day, 00, 00)

finish = timestamp(to_year, to_month, to_day, 23, 59)
window() =>
    time >= start and time <= finish ? true : false

//===== PLOTS ==========================================================================//

// Line
line_plot = plot(tsl, color=trend == 1 ? color.green : color.red, linewidth=2, title='Trend Line')
// Labels
plotshape(long_signal and window() ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.normal, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))
plotshape(short_signal and window() ? down : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.normal, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))
// Circles
plotshape(long_signal and window() ? up : na, title='Uptrend starts', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(short_signal and window() ? down : na, title='Downtrend starts', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
// Background
long_fill = background ? trend == 1 ? color.green : na : na
short_fill = background ? trend == -1 ? color.red : na : na
candle_plot = plot(ohlc4, title='Price Line', color=trend == 1 ? long_fill : short_fill, linewidth=2, transp=90)
fill(candle_plot, line_plot, title='Long Background', color=long_fill, transp=90)
fill(candle_plot, line_plot, title='Short Background', color=short_fill, transp=90)

//===== GLOBAL ==========================================================================//

var entry_price = 0.0
var updated_entry_price = 0.0
var sl_price = 0.0

longString = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box."
longclose = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box."
shortString = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box."
shortclose = "Input your custom alert message here.\nAnd put {{strategy.order.alert_message}} in the message box."


longAlertMessage = input(title="Long Alert Message", defval="long", group="Alert Messages", tooltip=longString)
longcloseAlertMessage = input(title="Long close Alert Message", defval="long", group="Alert Messages", tooltip=longclose)
shortAlertMessage = input(title="Short Alert Message", defval="short", group="Alert Messages", tooltip=shortString)
shortcloseAlertMessage = input(title="Short close Alert Message", defval="short", group="Alert Messages", tooltip=shortclose)


has_open_trade() =>
    strategy.position_size != 0
has_no_open_trade() =>
    strategy.position_size == 0

is_long() =>
    strategy.position_size > 0 ? true : false
is_short() =>
    strategy.position_size < 0 ? true : false

plot(use_sl ? has_no_open_trade() ? close : sl_price : na, color=has_no_open_trade() ? na : color.blue, title='Stop Loss')

strategy_close() =>
    if is_long()
        strategy.close('Long')
        alert(longcloseAlertMessage)
    if is_short()
        strategy.close('Short')
        alert(shortcloseAlertMessage)

    
    
strategy_long() =>
    strategy.entry('Long', strategy.long)    

    

strategy_short() =>
    strategy.entry('Short', strategy.short)

sl_pct = initial_sl_pct
if long_signal or is_long() and not(short_signal or is_short())
    sl_pct := initial_sl_pct * -1
    sl_pct

//===== STRATEGY ==========================================================================//


crossed_sl = false
if is_long() and use_sl
    crossed_sl := close <= sl_price
    crossed_sl
if is_short() and use_sl
    crossed_sl := close >= sl_price
    crossed_sl

terminate_operation = window() and has_open_trade() and crossed_sl

if terminate_operation and not(long_signal or short_signal)  // Do not close position if trend is flipping anyways.
    entry_price := 0.0
    updated_entry_price := entry_price
    sl_price := 0.0
    strategy_close()



start_operation = window() and (long_signal or short_signal)

if start_operation
    entry_price := close
    updated_entry_price := entry_price
    sl_price := entry_price + entry_price * sl_pct / 100
    if long_signal
        strategy_long()
        if Tpactive1==true
            strategy.exit('TPL1','Long', qty_percent=tp1amt,profit =tp1percent)

        alert(shortcloseAlertMessage)
        alert(longAlertMessage)
    

    if short_signal
        strategy_short()
        if Tpactive1==true
            strategy.exit('TPL1','Short', qty_percent=tp1amt,profit =tp1percent)

        alert(longcloseAlertMessage)
        alert(shortAlertMessage)


//===== TRAILING ==========================================================================//

if is_long() and use_sl
    strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00
    if strategy_pct > 1
        sl_pct += strategy_pct - 1.0
        new_sl_price = updated_entry_price + updated_entry_price * sl_pct / 100
        sl_price := math.max(sl_price, new_sl_price)
        updated_entry_price := sl_price
        updated_entry_price
        

if is_short() and use_sl
    strategy_pct = (close - updated_entry_price) / updated_entry_price * 100.00
    if strategy_pct < -1
        sl_pct += strategy_pct + 1.0
        new_sl_price = updated_entry_price + updated_entry_price * sl_pct / 100
        sl_price := math.min(sl_price, new_sl_price)
        updated_entry_price := sl_price
        updated_entry_price