RedK Momentum Bars

Tác giả:ChaoZhang, Ngày: 2022-05-18 11:28:24
Tags:SMAEMAWMAHMA

Momentum Bars (Mo_Bars) cung cấp một cách khác để hình dung được động lượng (tương đối) - và sử dụng một số khái niệm TA đơn giản để cung cấp một quan điểm khác về cách chúng ta đọc các thay đổi động lượng và kết hợp điều đó trong giao dịch của chúng tôi.

Ý tưởng ở đây (và bản kịch bản chính nó) thực sự rất đơn giản, và được (rất lỏng lẻo) lấy cảm hứng từ Hệ thống xung của Elder (EIS) - sau đó phát triển để tận dụng một số khái niệm khác, và trở nên ít lộn xộn hơn và dễ đọc hơn.

Việc xây dựng Mo_Bars

Khái niệm cơ sở sử dụng 3 đường trung bình động: dòng đầu tiên là một MA tương đối nhanh với chiều dài ngắn - hoạt động như là dòng theo dõi giá chính

đường thứ hai chậm hơn một chút so với đường chính - dài hơn 2 đến 3 thanh - và mặc định sẽ sử dụng giá trị mở như nguồn - điều này hoạt động tốt hơn để xác định khi giá đóng bắt đầu di chuyển nhanh hơn so với mở (như trong, thanh thường đóng cao hơn so với khi mở) - đường này hoạt động như đường tín hiệu - có một cài đặt thêm cho một sự chậm trễ bổ sung sử dụng làm bằng WMA thường xuyên - sự chậm trễ hoạt động để phóng đại sự dịch chuyển tương đối giữa 2 MAs

Đối với cả hai MA này, tôi chọn sử dụng RSS MA (Lazy Line) - các loại MA khác có thể được sử dụng, nhưng lý do tôi sử dụng loại MA đó cụ thể là nó di chuyển gracefully - và 2 Lazy Lines di chuyển cùng nhau giảm thiểu whipsaws từ biến động giá nhỏ - tôi đã thử với các loại MA khác và thấy rằng RSS có lợi thế ở đó.

Đường thứ ba là đường MA chậm hơn nhiều (chiều dài 5 đến 6 lần đường nhanh) - và hoạt động như một bộ lọc hoặc đường cơ sở. Khi chúng ta ở trên đường đó, chúng ta nên ưa thích các vị trí dài - chúng ta đang ở vùng tăng. Khi chúng ta ở dưới đường đó, chúng ta ưa thích các vị trí ngắn, và chúng ta đang ở vùng gấu. Điều chỉnh đường này phù hợp với phong cách giao dịch và khung thời gian của bạn. (Tôi chọn sử dụng WMA như là loại MA cho dòng bộ lọc... và có một lý do tốt cho điều đó - mà tôi sẽ bỏ qua bây giờ - nhưng trong các phiên bản tương lai, chúng tôi có thể thêm các loại MA có thể chọn khác.)

Sử dụng Mo_Bars

ở một mức độ rất rộng, chúng ta có thể sử dụng Mo_Bars tương tự như cách chúng ta sử dụng MACD - cả hai đều là dao động tập trung và không bị hạn chế - lưu ý sự khác biệt rằng Mo_Bars dựa trên 3 MA thay vì 2.

chiều dài thanh Mo_Bar phản ánh khoảng cách giữa MA chính và MA tín hiệu - được vẽ tương đối với đường cơ bản (đường lọc) - điều đó có nghĩa là chiều dài thanh đại diện cho động lượng tương đối giữa 2 MA - Các Mo_Bars sau đó được sơn màu theo cách phản ánh tăng hoặc giảm giá trị của động lượng đó (hình ảnh ở đây có thể được lấy cảm hứng từ một chỉ số khác được công bố gần đây bởi một trong những phù thủy đáng kính của chúng tôi - nó hoạt động hoàn hảo - vì vậy tín dụng đáng kể ở đây:)

nói đơn giản, nếu MA chính nằm dưới tín hiệu MA, thanh màu đỏ - và khi MA chính nằm trên tín hiệu MA, thanh màu xanh lá cây - thanh màu trắng thường xuất hiện khi có sự thay đổi được phát hiện về hướng động lượng tương đối (lưu ý rằng đây không giống như hướng xu hướng - và đó là điều giúp hiển thị và khai thác hội tụ và phân kỳ - tương tự như MACD)

  • trong biểu đồ ở trên, tôi đã lưu ý một vài ví dụ về cách hình dung động lượng tương đối theo cách này cho thấy các khu vực cắt (Mo_Bars trên 0 nhưng màu đỏ hoặc di chuyển xuống, hoặc khi Mo_Bars dưới 0 và màu xanh lá cây hoặc di chuyển lên) - hội tụ / phân kỳ với giá - và làm thế nào điều này có thể hoạt động để lộ khả năng thay đổi tiềm năng trong hành động hoặc xu hướng giá.

  • có rất nhiều thứ để chơi xung quanh với thiết lập này - và có lẽ nếu có đủ sự quan tâm có thể có những bài viết chuyên dụng trong tương lai về cách sử dụng hoặc thậm chí để phát triển nó hơn nữa - có rất nhiều tiềm năng ở đây, để thêm nhiều bộ lọc (có thể dựa trên âm lượng), cảnh báo, tín hiệu... vv - vì vậy hãy xem sự quan tâm :)

Dưới đây là thiết lập chi tiết (bảng sơ đồ trên) mà Mo_Bars dựa trên Các cài đặt cho MA trên biểu đồ giá đã được phù hợp / đồng bộ hóa với các cài đặt Mo_Bars trên bảng dưới để chứng minh cách kịch bản hoạt động và cách nó dịch hành động MA trên biểu đồ giá sang những gì chúng ta thấy bên dưới.

backtest

img


/*backtest
start: 2022-05-10 00:00:00
end: 2022-05-16 23:59:00
period: 3m
basePeriod: 1m
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/
// © RedKTrader

//@version=5
indicator('[dev]RedK Momentum Bars', shorttitle='RedK MoBars v3.0', explicit_plot_zorder = true, timeframe='', timeframe_gaps=false)

// A trading system composed of 2 short Lazy Lines (preferably one open and one close - 2-3 bars apart) and a WMA long filter 
// loosely inspired by Edler Impulse
// v2.0 cleaned up code and added MA options to be able to mix and match, and experiment with various setups 
// default values (my personal preference) remain the same as in v1.0 
// for example, some traders will consider "bear territory" only below SMA50, others will use EMA30 .. and so on.
// ---------------------------------------------------------------------------------------------------------------
// MoBars v3.0: 
// updated defaults to match the most common 3x MA cross-over set-up of SMA (10, 20, 50)
// updated visuals to push the 0 line to the background of the plot (using the explcit_plot_zorder param)
// and added alerts for crossing up, down and swing around the 0 line (the Bullish/Bearish Filter MA)

//==============================================================================
f_LazyLine(_data, _length) =>
    w1 = 0,     w2 = 0,     w3 = 0
    L1 = 0.0,   L2 = 0.0,   L3 = 0.0
    w = _length / 3

    if _length > 2
        w2 := math.round(w)
        w1 := math.round((_length - w2) / 2)
        w3 := int((_length - w2) / 2)

        L1 := ta.wma(_data, w1)
        L2 := ta.wma(L1, w2)
        L3 := ta.wma(L2, w3)
        
    else
        L3 := _data
        
    L3
//==============================================================================

// =============================================================================    
f_getMA(source, length, type) =>
    type == "SMA" ? ta.sma(source, length) : 
      type == "EMA" ? ta.ema(source, length) :
      type == "WMA" ? ta.wma(source, length) :
      type == "HMA" ? ta.hma(source, length) :
      f_LazyLine(source, length)
// =============================================================================    

// ------------------------------------------------------------------------------------------------
// Inputs
// Note, in v3.0, changed default lengths to 10, 20 and 50  -- and all MA types to SMA. 
// ------------------------------------------------------------------------------------------------

Fast_Src    = input.source(close,   title='Fast MA Source',          inline = 'Fast')
Fast_Length = input.int(10,          title = 'Length',   minval = 1, inline = 'Fast')
Fast_Type   = input.string('SMA', title = 'Type',                    inline = 'Fast',
  options = ['RSS_WMA', 'WMA', 'EMA', 'SMA', 'HMA'])

Slow_Src    = input.source(close,    title='Slow MA Source',         inline = 'Slow')
Slow_Length = input.int(20,          title='Length',     minval = 1, inline = 'Slow')
Slow_Type   = input.string('SMA', title = 'Type',                    inline = 'Slow',
  options = ['RSS_WMA', 'WMA', 'EMA', 'SMA', 'HMA'])

Slow_Delay  = input.int(3,          title='Delay (1 = None)',       minval = 1)

Fil_Length  = input.int(50,       title='Filter MA Length', minval = 1, inline = 'Filter')
Fil_Type    = input.string('SMA', title = 'Type',                   inline = 'Filter',
  options = ['RSS_WMA', 'WMA', 'EMA', 'SMA', 'HMA'])


// ------------------------------------------------------------------------------------------------
// Calculation
// ------------------------------------------------------------------------------------------------

Fast    = f_getMA(Fast_Src, Fast_Length, Fast_Type)
Slow    = f_getMA(Slow_Src, Slow_Length, Slow_Type)

Filter  = f_getMA(close, Fil_Length, Fil_Type)

Fast_M  = Fast - Filter
Slow_M  = Slow - Filter

Rel_M   = ta.wma(Slow_M, Slow_Delay)

// prep the Momentum bars
o = Rel_M
c = Fast_M
h = math.max(o, c)
l = math.min(o, c)

rising      = ta.change(c) > 0


// ------------------------------------------------------------------------------------------------
// Colors & Plots
// ------------------------------------------------------------------------------------------------

hline(0, title = 'Zero Line', color = color.blue, linestyle = hline.style_solid)

c_barup     = #11ff20ff
c_bardn     = #ff1111ff
c_bardj     = #ffffffff

c_barupb    = #1b5e20ff
c_bardnb    = #981919ff
c_bardjb    = #9598a1ff

barcolor    = c > o and rising ? c_barup : c < o and not rising ? c_bardn : c_bardj
borcolor    = c > o and rising ? c_barupb : c < o and not rising ? c_bardnb : c_bardjb
//plotcandle(o, h, l, c, 'MoBars', barcolor, barcolor, bordercolor = borcolor)


// ===========================================================================================================
//      v3.0 adding alerts 
// these alerts will trigger as soon as the Momentum Bar touches above the filter line 
// this approach can lead to "false signals" but also has an advantage (of alerting to a possible mood/mode change)
// another option - maybe in an updated version - could be to trigger alerts *only* when the full Momentum Bar completely clears the filter line (above or below)
// and it's easy to make that a user choice in the study inputs
// ===========================================================================================================

Alert_up    = ta.crossover(h,0)
Alert_dn    = ta.crossunder(l,0)
Alert_swing = Alert_up or Alert_dn

// "." in alert title for the alerts to show in the right order up/down/swing 
alertcondition(Alert_up,    ".   MoBars Crossing 0 Up",         "MoBars Up - Bullish Mode Detected!")
alertcondition(Alert_dn,    "..  MoBars Crossing 0 Down",       "MoBars Down - Bearish Mode Detected!")
alertcondition(Alert_swing, "... MoBars Crossing 0",            "Mobars Swing - Possible Reversal Detected!")



if Alert_up
    strategy.entry("Enter Long", strategy.long)
else if Alert_dn
    strategy.entry("Enter Short", strategy.short)

Có liên quan

Thêm nữa