Breakout Trend Follower V2


Ngày tạo: 2023-11-01 17:24:08 sửa đổi lần cuối: 2023-11-01 17:24:08
sao chép: 0 Số nhấp chuột: 746
1
tập trung vào
1617
Người theo dõi

Breakout Trend Follower V2

Tổng quan

Chiến lược này là một biến thể của chiến lược theo dõi xu hướng đột phá khác của tôi trước đây. Trong chiến lược khác, bạn có thể sử dụng đường trung bình di chuyển làm bộ lọc cho giao dịch (tức là, nếu giá thấp hơn đường trung bình di chuyển, nó sẽ không làm nhiều). Sau khi tạo ra một công cụ để phát hiện xu hướng khung thời gian cao hơn, tôi muốn xem liệu nó có thể là một bộ lọc tốt hơn đường trung bình di chuyển hay không.

Do đó, chiến lược này cho phép bạn xem xu hướng trong khung thời gian cao hơn (tức là có đỉnh cao hơn và thấp hơn? Nếu có, đó là xu hướng tăng). Bạn chỉ đặt cược theo hướng của xu hướng. Bạn có thể chọn tối đa hai xu hướng làm bộ lọc. Mỗi hướng xu hướng được hiển thị trong bảng trên biểu đồ để dễ dàng tham khảo.

Tôi nhận thấy rằng chiến lược này không hoạt động tốt so với các chiến lược khác, nhưng nó thực sự có vẻ là một chiến lược giao dịch nhạy cảm hơn. Nó cho thấy tỷ lệ thắng cao hơn và lợi nhuận tốt hơn.

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

Lập luận cốt lõi của chiến lược này là sử dụng các mức hỗ trợ và kháng cự để phá vỡ các khung thời gian cao hơn để xác định xu hướng và giao dịch theo hướng của xu hướng.

Cụ thể, nó được thực hiện thông qua các bước sau:

  1. Tính toán mức hỗ trợ và kháng cự trong khung thời gian hiện tại (ví dụ như đường 1 giờ). Điều này được thực hiện bằng cách tìm kiếm giá cao nhất và giá thấp nhất trong một chu kỳ nhất định.

  2. Tính toán vị trí hỗ trợ và kháng cự cho một hoặc nhiều khung thời gian cao hơn (như đường 4 giờ và đường mặt trời). Điều này được thực hiện bằng cách sử dụng cùng logic với khung thời gian hiện tại.

  3. Đặt các đường ngang của các mức hỗ trợ và kháng cự trên biểu đồ. Khi giá vượt qua các mức này, xu hướng sẽ thay đổi trong khung thời gian cao hơn.

  4. Định hướng xu hướng dựa trên việc giá có phá vỡ các mức quan trọng này hay không. Nếu giá phá vỡ một điểm cao, nó được coi là xu hướng tăng. Nếu phá vỡ một điểm thấp, nó được coi là xu hướng giảm.

  5. Cho phép người dùng chọn xu hướng của một hoặc nhiều khung thời gian cao hơn làm điều kiện lọc. Nghĩa là, giao dịch sẽ chỉ được xem xét khi hướng xu hướng của khung thời gian hiện tại phù hợp với hướng xu hướng của khung thời gian cao hơn.

  6. Mua hoặc bán được thực hiện khi điều kiện lọc xu hướng được đáp ứng và giá hiện tại vượt qua mức quan trọng. Mức dừng lỗ được thiết lập là mức hỗ trợ hoặc kháng cự quan trọng trước đó.

  7. Khi giá lên cao hoặc xuống thấp mới, lệnh dừng sẽ di chuyển đến mức thấp mới để khóa lợi nhuận và theo dõi xu hướng.

  8. Khi dừng lỗ được kích hoạt hoặc điểm hỗ trợ / kháng cự quan trọng bị phá vỡ, vị trí bằng phẳng sẽ được rút ra.

Thông qua phân tích xu hướng của khung thời gian đa dạng này, chiến lược cố gắng giao dịch chỉ theo hướng xu hướng mạnh hơn để tăng khả năng chiến thắng. Đồng thời, cấp độ quan trọng cung cấp tín hiệu nhập cảnh và dừng lỗ rõ ràng.

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

  • Sử dụng nhiều khung thời gian để đánh giá xu hướng, bạn có thể xác định chính xác hơn các hướng xu hướng mạnh hơn và tránh bị lừa bởi tiếng ồn thị trường.

  • Chỉ cần hoạt động theo hướng của xu hướng chính, có thể tăng tỷ lệ chiến thắng đáng kể. Theo kết quả thử nghiệm, chiến lược này cho thấy tỷ lệ chiến thắng cao hơn và tỷ lệ lợi nhuận rủi ro tốt hơn so với lọc trung bình di chuyển đơn giản.

  • Các vị trí hỗ trợ và kháng cự cung cấp mức độ nhập cảnh và dừng lỗ rõ ràng. Không cần phải chọn các điểm nhập cảnh cụ thể.

  • Điều chỉnh vị trí dừng lỗ theo xu hướng để có thể khóa lợi nhuận tối đa.

  • Lập luận chiến lược đơn giản, rõ ràng, dễ hiểu và điều chỉnh.

Rủi ro chiến lược

  • Phân định xu hướng dựa trên các đoạn đường dài hơn, dễ bị đặt khi xu hướng đảo ngược. Các chu kỳ thời gian đánh giá xu hướng nên được rút ngắn thích hợp, hoặc sử dụng các chỉ số hỗ trợ đánh giá khác.

  • Không tính đến tác động cơ bản, có thể có sự khác biệt với giá cổ phiếu khi xảy ra sự kiện lớn. Các điều kiện lọc như sự kiện ATM hoặc ngày báo cáo tài chính có thể được thêm vào.

  • Không có kiểm soát quy mô vị trí. Bạn có thể đặt kích thước vị trí dựa trên các yếu tố như quy mô tài khoản, tỷ lệ biến động.

  • Khoảng thời gian phản hồi có giới hạn. Các khoảng thời gian phản hồi nên được mở rộng để kiểm tra sự ổn định trong các môi trường thị trường khác nhau.

  • Không tính đến tác động của chi phí giao dịch. Các tham số chiến lược trong thực tế phải được điều chỉnh theo chi phí giao dịch cụ thể.

  • Chỉ xem xét giao dịch đường dài. Có thể kết hợp với các chiến lược khác để phát triển tín hiệu giao dịch đường ngắn và thực hiện mạo hiểm đa chu kỳ.

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

  • Thêm điều kiện lọc:

    • Dữ liệu cơ bản như báo cáo tài chính, tin tức và các sự kiện khác

    • Các chỉ số, như khối lượng giao dịch, ATR dừng lỗ, v.v.

  • Các tham số tối ưu hóa:

    • Chu kỳ tính toán bit hỗ trợ / kháng cự điều chỉnh

    • Khung thời gian để điều chỉnh xu hướng

  • Mở rộng chiến lược:

    • Phát triển chiến lược giao dịch ngắn hạn

    • Cân nhắc bán tháo

    • Định giá đa giống

  • Cải thiện quản lý rủi ro:

    • Kích thước vị trí tối ưu hóa theo tỷ lệ biến động và quy mô vốn

    • Tối ưu hóa các chiến lược dừng lỗ, chẳng hạn như dừng di chuyển, dừng đơn

    • Tiến hành cơ chế trừng phạt thưởng rủi ro

  • Tối ưu hóa logic thực thi:

    • Thay đổi thời gian vào sân

    • Cân nhắc vào một số vị trí

    • Tối ưu hóa chiến lược di động dừng lỗ

Tóm tắt

Chiến lược này đã thiết kế một hệ thống đột phá mạnh mẽ hơn bằng cách phân tích xu hướng trên nhiều khung thời gian. Nó cho thấy tỷ lệ lợi nhuận và rủi ro lợi nhuận cao hơn so với các chỉ số lọc như trung bình di chuyển đơn giản. Nhưng cũng có một số khía cạnh có thể được tối ưu hóa, chẳng hạn như cơ chế quản lý rủi ro không hoàn hảo, không xem xét các yếu tố cơ bản.

Mã nguồn chiến lược
/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  Enter long when recent swing high breaks out, using recent swing low as stop level.  Move stops up as higher lows print to act
// as trailing stops.  Ride trend as long as it is there and the higher lows aren't breached.  
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead 
// of an arbitrary Moving Average.  I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables 
//    1. Manually configure which dates to back test
//    2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend) 

// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Breakout Trend Follower V2", overlay=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")

// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
  tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
  tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
  tooltip = "Toggle this on to see the historical pivot points that were used.  Change the Lookback Period to adjust the frequency of these points.
  The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
  tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s).  The intent is to keep you out of bear periods and only buying when 
  price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
  tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
  tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
  will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe   Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")

//  == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==  
f_getHTF() =>
    ph = pivothigh(high, lookback, lookback)
    pl = pivotlow(low, lookback, lookback)
    highLevel = valuewhen(ph, high[lookback], 0)
    lowLevel = valuewhen(pl, low[lookback], 0)
    barsSinceHigh = barssince(ph) + lookback
    barsSinceLow = barssince(pl) + lookback
    timeSinceHigh = time[barsSinceHigh]
    timeSinceLow = time[barsSinceLow]
    [ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
    
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())

// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)

// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
    var line id = na
    // line.delete(id)
    // id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)

// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na 
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na

// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
    uptrendSignal    = high > highLevel
    downtrendSignal  = low < lowLevel
    inUptrend        = bool(na)
    inDowntrend      = bool(na) 
    inUptrend       := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
    inDowntrend     := not inUptrend
    [uptrendSignal, downtrendSignal, inUptrend, inDowntrend]

[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01)  // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02)  // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03)  // 3rd Timeframe

// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)

f_fillCell(_column, _row, _cellText, _c_color) =>
    table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)

if barstate.islast or barstate.islastconfirmedhistory
    f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
    f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
    f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)

// Conditions for entry and exit
buyConditions =  true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study

// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)