Chiến lược giao dịch tự động thuật toán kênh đôi


Ngày tạo: 2023-10-10 15:25:53 sửa đổi lần cuối: 2023-10-10 15:25:53
sao chép: 0 Số nhấp chuột: 639
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này sử dụng hai chỉ số Supertrend và StochRSI để phân tích xu hướng giá và tình trạng mua bán quá mức trong các chu kỳ thời gian khác nhau để xác định các tín hiệu mua và bán tiềm năng. Chiến lược này được thiết kế để giao dịch theo hướng xu hướng chính, nắm bắt hướng chính của giá trên đường trung và dài.

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

Chiến lược này sử dụng các chỉ số Supertrend trong hai chu kỳ thời gian 1 giờ và 4 giờ để xác định hướng của xu hướng giá. Khi hai chu kỳ Supertrend ở cùng một hướng, chúng ta có thể coi đó là một xu hướng giá mạnh hơn.

Ngoài ra, các chiến lược sử dụng chỉ số StochRSI để xác định xem có quá mua hay quá bán không. Chỉ số StochRSI kết hợp lợi thế của cả hai chỉ số RSI và Stochastic Oscillator.

Để xác minh tín hiệu hơn nữa, chiến lược cũng thiết lập một thời gian lùi, sau khi tín hiệu bán tháo bán tháo của StochRSI được hiển thị, cần phải lùi một số dòng K nhất định. Nếu trong thời gian này, xu hướng giá xác nhận tín hiệu của StochRSI, thì sẽ kích hoạt mua hoặc bán.

Nhìn chung, chiến lược này sử dụng Supertrend của hai khung thời gian để đánh giá xu hướng lớn và phương pháp StochRSI để đánh giá điều chỉnh địa phương để giao dịch theo xu hướng trên đường dài và trung bình.

Lợi thế chiến lược

  • Sử dụng các chỉ số thời gian đa chu kỳ để đánh giá, có thể lọc hiệu quả các tín hiệu sai
  • Lợi thế của Supertrend và StochRSI để đánh giá xu hướng và đánh giá quá mua quá bán
  • Thiết lập thời gian quay trở lại để xác minh tín hiệu, tránh giao dịch không cần thiết
  • Sử dụng chiến lược hoạt động đường dài trung bình để giảm lỗ điểm trượt do giao dịch quá thường xuyên
  • Giao diện hai chỉ số dễ hiểu, điều chỉnh các tham số linh hoạt

Rủi ro chiến lược

  • Xu hướng đường dài trung bình không rõ ràng, có thể có nhiều tín hiệu sai
  • Quá lâu để có thể bỏ lỡ cơ hội mua/bán tốt hơn
  • StochRSI tham số không được thiết lập đúng, có thể có tín hiệu mua quá mức sai
  • Các tham số Supertrend được thiết lập không đúng, có thể đánh giá sai hướng xu hướng
  • Theo dõi các tín hiệu chỉ số một cách máy móc, dễ dàng bỏ qua những thay đổi cơ bản quan trọng

Cách tối ưu hóa:

  • Tối ưu hóa các tham số của StochRSI và Supertrend
  • Điều chỉnh độ dài chu kỳ hồi quy cho các môi trường đĩa lớn khác nhau
  • Kiểm tra kết hợp với các chỉ số như khối lượng giao dịch
  • Theo dõi các thông tin cơ bản quan trọng và can thiệp khi cần thiết

Hướng tối ưu hóa chiến lược

  • Thêm nhiều chỉ số Supertrend khác nhau trong các chu kỳ thời gian khác nhau, tạo ra lọc đa cấp
  • Thay thế chỉ số StochRSI bằng các chỉ số khác của loại overbought/oversold như KD, RSI, v.v.
  • Tăng chiến lược dừng lỗ di động để kiếm được lợi nhuận lớn hơn theo xu hướng
  • Kết hợp các chỉ số đường trung bình quan trọng như đường trung bình 30 chu kỳ để đánh giá xu hướng lớn
  • Phát triển chương trình tối ưu hóa tham số tự động để làm cho chiến lược trở nên mạnh mẽ hơn

Tóm tắt

Chiến lược nồi bếp hai kênh tận dụng tối đa phương pháp Supertrend để xác định xu hướng lớn và StochRSI để xác định điều chỉnh địa phương, để thực hiện một chiến lược theo dõi xu hướng đáng tin cậy. Chiến lược này chủ yếu là điều khiển đường dài trung bình, có thể tránh hiệu quả thiệt hại thu nhập do giao dịch quá thường xuyên. Bằng các phương tiện như tối ưu hóa tham số và kiểm tra chỉ số kết hợp, chiến lược này có thể thu được lợi nhuận tích cực ổn định.

Mã nguồn chiến lược
/*backtest
start: 2023-09-09 00:00:00
end: 2023-10-09 00:00:00
period: 4h
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/
// © Baby_whale_to_moon

//@version=5
strategy('Kitchen [ilovealgotrading]', overlay=true, format=format.price, initial_capital = 1000)

// BACKTEST DATE
Start_Time = input(defval=timestamp('01 January 2017 13:30 +0000'), title='Start_Time', group = " ################# BACKTEST DATE ################ " )
End_Time = input(defval=timestamp('30 April 2024 19:30 +0000'), title='End_Time', group = " ################# BACKTEST DATE ################ " )

// supertrend 
atrPeriod = input(10, 'ATR Length', group = " #################  Supertrend  ################ ")
factor = input(3, 'Factor', group = " #################  Supertrend  ################ ")

time1 = input.string(title='Short Time Period', defval='07 1h', options=['01 1m','02 3m','03 5m',  '04 15m', '05 30m', '06 45m', '07 1h', '08 2h', '09 3h', '10 4h', '11 1D', '12 1W' ], group = " #################  Supertrend  ################ ",tooltip = "this timeframe is the value of our short-time supertrend indicator")
time2 = input.string(title='Long Time Period', defval='10 4h', options=[ '01 1m','02 3m','03 5m', '04 15m', '05 30m', '06 45m', '07 1h', '08 2h', '09 3h', '10 4h', '11 1D', '12 1W' ], group = " #################  Supertrend  ################ ",tooltip = "this timeframe is the value of our long-time supertrend indicator")


res(Resolution) =>
    if Resolution == '00 Current'
        timeframe.period
    else
        if Resolution == '01 1m'
            '1'
        else
            if Resolution == '02 3m'
                '3'
            else
                if Resolution == '03 5m'
                    '5'
                else
                    if Resolution == '04 15m'
                        '15'
                    else
                        if Resolution == '05 30m'
                            '30'
                        else
                            if Resolution == '06 45m'
                                '45'
                            else
                                if Resolution == '07 1h'
                                    '60'
                                else
                                    if Resolution == '08 2h'
                                        '120'
                                    else
                                        if Resolution == '09 3h'
                                            '180'
                                        else
                                            if Resolution == '10 4h'
                                                '240'
                                            else
                                                if Resolution == '11 1D'
                                                    '1D'
                                                else
                                                    if Resolution == '12 1W'
                                                        '1W'
                                                    else
                                                        if Resolution == '13 1M'
                                                            '1M'


// supertrend Long time period 
[supertrend2, direction2] = request.security(syminfo.tickerid, res(time2), ta.supertrend(factor, atrPeriod))
bodyMiddle4 = plot((open + close) / 2, display=display.none)
upTrend2 = plot(direction2 < 0 ? supertrend2 : na, 'Up Trend', color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2)
downTrend2 = plot(direction2 < 0 ? na : supertrend2, 'Down Trend', color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2)

// supertrend short time period 
[supertrend1, direction1] = request.security(syminfo.tickerid, res(time1), ta.supertrend(factor, atrPeriod))
bodyMiddle = plot((open + close) / 2, display=display.none)
upTrend = plot(direction1 < 0 ? supertrend1 : na, 'Up Trend', color=color.new(color.yellow, 0), style=plot.style_linebr)
downTrend = plot(direction1 < 0 ? na : supertrend1, 'Down Trend', color=color.new(color.orange, 0), style=plot.style_linebr)


// Stochastic RSI
low_limit_stoch_rsi = input.float(title = 'Stoch Rsi Low Limit', step=0.5, defval=15, group = " #################  Stoch RSI   ################ ", tooltip = "when Stock rsi value crossover Low Limit value we get Long")
up_limit_stoch_rsi = input.float(title = 'Stoch Rsi Up Limit', step=0.5, defval=85, group = " #################  Stoch RSI   ################ ", tooltip = "when Stock rsi value crossunder Up Limit value we get Short")
stocrsi_back_length = input.int(20, 'Stoch Rsi retroactive length', minval=1, group = " #################  Stoch RSI   ################ ", tooltip = "How many candles are left behind, even if there is a buy or sell signal, it will be valid now")
smoothK = input.int(3, 'Stochastic RSI K', minval=1, group = " #################  Stoch RSI   ################ ")
lengthRSI = input.int(14, 'RSI Length', minval=1, group = " #################  Stoch RSI   ################ ")
lengthStoch = input.int(14, 'Stochastic Length', minval=1, group = " #################  Stoch RSI   ################ ")
src_rsi = input(close, title='RSI Source', group = " #################  Stoch RSI   ################ ")
rsi1 = request.security(syminfo.tickerid, '240', ta.rsi(src_rsi, lengthRSI))
k = request.security(syminfo.tickerid, '240', ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK))

// Strategy settings 
dollar = input.float(title='Dollar Cost Per Position ', defval=20000, group = " #################  Strategy Settings  ################ ")
trade_direction = input.string(title='Trade_direction', group = " #################  Strategy Settings  ################ ", options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')
Long_message_open = input('Long Open', title = "Long Open Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Long Open Message ")
Short_message_open = input('Short Open', title = "Short Open Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Short Open Message ")
Long_message_close = input('Long Close', title = "Long Close Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Long Close Message ")
Short_message_close = input('Short Close', title = "Short Close Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Short Close Message ")

Time_interval = true
bgcolor(Time_interval ? color.rgb(255, 235, 59, 95) : na)

back_long = 0
back_short = 0

for i = 1 to stocrsi_back_length by 1
    if ta.crossover(k, low_limit_stoch_rsi)[i] == true 
        back_long += i
        back_long
    if ta.crossunder(k, up_limit_stoch_rsi)[i] == true 
        back_short += i
        back_short

// bgcolor(back_long>0?color.rgb(153, 246, 164, 54):na)
// bgcolor(back_short>0?color.rgb(246, 153, 153, 54):na)

buy_signal = false
sell_signal = false

if direction2 < 0 and direction1 < 0 and back_long > 0
    buy_signal := true
    buy_signal

if direction2 > 0 and direction1 > 0 and back_short > 0
    sell_signal := true
    sell_signal


//bgcolor(buy_signal  ? color.new(color.lime,90) : na ,title="BUY bgcolor")
plotshape( buy_signal[1] == false and  strategy.opentrades == 0 and Time_interval and buy_signal  ? supertrend2 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)

//bgcolor(sell_signal  ? color.new(color.red,90) : na ,title="SELL bgcolor")
plotshape(sell_signal[1] == false and strategy.opentrades == 0 and Time_interval and sell_signal  ? supertrend2 : na , title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)


// Strategy entries 
if strategy.opentrades == 0 and Time_interval and buy_signal and ( trade_direction == 'LONG' or trade_direction == 'BOTH')
    strategy.entry('Long_Open', strategy.long, qty=dollar / close, alert_message=Long_message_open)

if strategy.opentrades == 0 and Time_interval and sell_signal and ( trade_direction == 'SHORT' or trade_direction == 'BOTH')
    strategy.entry('Short_Open', strategy.short, qty=dollar / close, alert_message=Short_message_open)


// Strategy Close
if close < supertrend1 and strategy.position_size > 0 
    strategy.exit('Long_Close',from_entry = "Long_Open", stop=close, qty_percent=100, alert_message=Long_message_close)

if close > supertrend1 and strategy.position_size < 0 
    strategy.exit('Short_Close',from_entry = "Short_Open", stop=close, qty_percent=100, alert_message=Short_message_close)