SuperTrended Moving Averages from Tradingview

Forums ProRealTime English forum ProBuilder support SuperTrended Moving Averages from Tradingview

  • This topic has 9 replies, 4 voices, and was last updated 9 months ago by avatarJS.
Viewing 10 posts - 1 through 10 (of 10 total)
  • #216653

    Hi

    Please see below to code.

    //@version=5

    indicator(‘SuperTrended Moving Averages’, ‘ST MA’, overlay=true, format=format.price, precision=2, timeframe=”, timeframe_gaps=false)
    src = input(close, title=’Source’)
    mav = input.string(title=’Moving Average Type’, defval=’EMA’, options=[‘SMA’, ‘EMA’, ‘WMA’, ‘DEMA’, ‘TMA’, ‘VAR’, ‘WWMA’, ‘ZLEMA’, ‘TSF’, ‘HULL’, ‘TILL’])
    length = input.int(100, ‘Moving Average Length’, minval=1)
    Periods = input(title=’ATR Period’, defval=10)
    Multiplier = input.float(title=’ATR Multiplier’, step=0.1, defval=0.5)
    changeATR = input(title=’Change ATR Calculation Method ?’, defval=true)
    showsignals = input(title=’Show Buy/Sell Signals ?’, defval=false)
    highlighting = input(title=’Highlighter On/Off ?’, defval=true)

     

    T3a1 = input.float(0.7, ‘TILLSON T3 Volume Factor’, step=0.1)

    Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src – src[1] : 0
    vdd1 = src < src[1] ? src[1] – src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD – vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 – valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR
    VAR = Var_Func(src, length)
    DEMA = 2 * ta.ema(src, length) – ta.ema(ta.ema(src, length), length)
    Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 – wwalpha) * nz(WWMA[1])
    WWMA
    WWMA = Wwma_Func(src, length)
    Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length – 1) / 2
    zxEMAData = src + src – src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA
    ZLEMA = Zlema_Func(src, length)
    Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc – lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF
    TSF = Tsf_Func(src, length)
    HMA = ta.wma(2 * ta.wma(src, length / 2) – ta.wma(src, length), math.round(math.sqrt(length)))
    T3e1 = ta.ema(src, length)
    T3e2 = ta.ema(T3e1, length)
    T3e3 = ta.ema(T3e2, length)
    T3e4 = ta.ema(T3e3, length)
    T3e5 = ta.ema(T3e4, length)
    T3e6 = ta.ema(T3e5, length)
    T3c1 = -T3a1 * T3a1 * T3a1
    T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1
    T3c3 = -6 * T3a1 * T3a1 – 3 * T3a1 – 3 * T3a1 * T3a1 * T3a1
    T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1
    T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3

    getMA(src, length) =>
    ma = 0.0
    if mav == ‘SMA’
    ma := ta.sma(src, length)
    ma

    if mav == ‘EMA’
    ma := ta.ema(src, length)
    ma

    if mav == ‘WMA’
    ma := ta.wma(src, length)
    ma

    if mav == ‘DEMA’
    ma := DEMA
    ma

    if mav == ‘TMA’
    ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    ma

    if mav == ‘VAR’
    ma := VAR
    ma

    if mav == ‘WWMA’
    ma := WWMA
    ma

    if mav == ‘ZLEMA’
    ma := ZLEMA
    ma

    if mav == ‘TSF’
    ma := TSF
    ma

    if mav == ‘HULL’
    ma := HMA
    ma

    if mav == ‘TILL’
    ma := T3
    ma
    ma

    MA = getMA(src, length)

     

    atr2 = ta.sma(ta.tr, Periods)
    atr = changeATR ? ta.atr(Periods) : atr2
    up = MA – Multiplier * atr
    up1 = nz(up[1], up)
    up := close[1] > up1 ? math.max(up, up1) : up
    dn = MA + Multiplier * atr
    dn1 = nz(dn[1], dn)
    dn := close[1] < dn1 ? math.min(dn, dn1) : dn
    trend = 1
    trend := nz(trend[1], trend)
    trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
    upPlot = plot(trend == 1 ? up : na, title=’Up Trend’, color=color.new(color.green, 100), linewidth=0, style=plot.style_linebr)
    buySignal = trend == 1 and trend[1] == -1
    plotshape(buySignal ? up : na, title=’UpTrend Begins’, location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 100))
    plotshape(buySignal and showsignals ? up : na, title=’Buy’, text=’Buy’, location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))
    dnPlot = plot(trend == 1 ? na : dn, title=’Down Trend’, style=plot.style_linebr, linewidth=0, color=color.new(color.red, 100))
    sellSignal = trend == -1 and trend[1] == 1
    plotshape(sellSignal ? dn : na, title=’DownTrend Begins’, location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 100))
    plotshape(sellSignal and showsignals ? dn : na, title=’Sell’, text=’Sell’, location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))
    mPlot = plot(ohlc4, title=”, style=plot.style_circles, linewidth=0)
    colorup = input.color(defval = color.new(color.green, 60), title = “ColorU”, inline = ‘color’)
    colordown = input.color(defval = color.new(color.red, 60), title = “ColorD”, inline = ‘color’)
    longFillColor = highlighting ? trend == 1 ? colorup : color.white : color.new(color.white, 100)
    shortFillColor = highlighting ? trend == -1 ? colordown : color.white : color.new(color.white, 100)
    fill(mPlot, upPlot, title=’UpTrend Highligter’, color=longFillColor)
    fill(mPlot, dnPlot, title=’DownTrend Highligter’, color=shortFillColor)
    alertcondition(buySignal, title=’SuperTrend Buy’, message=’SuperTrend Buy!’)
    alertcondition(sellSignal, title=’SuperTrend Sell’, message=’SuperTrend Sell!’)
    changeCond = trend != trend[1]
    alertcondition(changeCond, title=’SuperTrend Direction Change’, message=’SuperTrend has changed direction!’)

     

    Cheers

    #216663

    Yes I see the code above thank you.

    #216704
    JS

    Hi @AndrewtUK

    Hereby the conversion of “Super Trended Moving Averages” from TradingView…

    The color fill is not in the code (does not work optimally) but is set in the graph under “color zones”…

    Next time, please provide some more information than just pasting the code on the forum… 🙂

     

    #216710
    JS

    Hi,

    Hereby the trading system based on the “Super Trended MA” indicator…

    When the trend changes from 1 to -1: SHORT…

    When the trend changes from -1 to 1: LONG…

    Number of contracts can be adjusted in “PositionSize” now standard 1 contract…

     

    3 users thanked author for this post.
    #217647

    Thank You JS for converting the above code.

    Attached results on DJI M10 over 1K bars spread = 5.  .itf attached also.

    Only trouble is the System gets Rejected (insufficient history) at the 1st bar when code tries to execute. It is the System which spawned the Topic below

    https://www.prorealcode.com/topic/long-time-to-run-system-code-causes-rejection/

    I sent in a Technical Report to PRT and got amended code back as below, only thing is the PRT amended code does not take any trades. I found this also (prior to Tech Report submission) … if the variable values used do not take trades then the System does not get Rejected.

    So the values above are my values, but gets Rejected.

    Code below is PRT amended code after Tech Report.  The PRT version code is copied from an email. Would have been easier / more useful had PRT sent the .itf as the code below needs sorting due to line lengths etc.

    I have tried everything I can think of and got depressed (temporary! 🙂 ) yesterday over it, so I’m submitting here if anybody has any solution to the Rejection please?

    Who knows … if we find why Rejected with this System it may have knock-ons for other Systems which have been Rejected lately for insufficient history??

     

     

     

    #217655
    JS

    Hi GraHal,

    I only translated the code and didn’t participate in anything else, not “Live/Demo”…

    When I start the code in demo I get the same error message (insufficient historical data)…

    What strikes me in the statistics of the positions is that the average time between positions is a negative number (e.g. -8 sec / -30 bars)… I don’t know what to make of that but it’s not right…

    I think I’ve read something about it on the forum…

    1 user thanked author for this post.
    #217664

    average time between positions is a negative number (e.g. -8 sec / -30 bars)

    Are you getting above from attached in some way that I can’t see?? 🙂

    0 bars is odd though as the Chart is on M10 TF so 30 mins should be 3 bars?

    The Algo is always onmarket. The 30 mins between trades shown on attached is at the start before it takes any trades.

    The really odd thing is that the Algo always gets Rejected at the end of the 1st bar when the Algo likely not even opening a trade (as in attached).

    #217666
    JS

    Hi,

    Below is from a trading system that is “Live”…

    As you can see, the average time between positions is zero seconds…

    This system is also always on the market and alternates between Long and Short…

    #217668

    Algo always gets Rejected at the end of the 1st bar when the Algo likely not even opening a trade

    Hahaha after typing above, I thought … sooo what if the System did open a trade at the end of the 1st bar?

    I added below at top of the code and the System did not get Rejected either on Demo or on Live!!

    Success at last!!!!!  I’ll sleep better tonight!!!

    Thank You JS for cross-fertilising thoughts and ideas!

    Onwards & Upwards!!!!

     

    1 user thanked author for this post.
    avatar JS
    #217670
    JS

    Hi,

    Nice that it’s been fixed…

    I think the problems arise when in a trading system the positions go from long to short at once and vice versa… instead of closing the current position and then reversing…

    I have noticed in other systems that if a position is turns directly then the code is not read during the “Open”… So the orders are executed first and only then the code is read…

    You can check this when the size of your position is linked to the “StrategyProfit”,

    When the position turns directly (i.e. immediately from Long to Short or vice versa) then the “StrategyProfit” is not recalculated so the code is not read when the position is rotated directly…

    1 user thanked author for this post.
Viewing 10 posts - 1 through 10 (of 10 total)

Create your free account now and post your request to benefit from the help of the community
Register or Login