Indicator · Pine Script v4 · On the chart

RTF Indicator

by blackcat1402

The RTF Indicator plots Bollinger Band signals on the price chart for trading signals.

View on GitHub

GitHub stars3on the repository
Pine versionv4older, still runs
Lines of code590
Settings7inputs
LicenceMIT
Last update5 years ago19 Dec 2020

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

590 lines of Pine Script v4 from indicator/multi/run_towards_fear.pine, published under MIT. Keep the author's credit and licence lines when you reuse it.

run_towards_fear.pine
//@version=4



// -------------------------------------------------------------------------- //



study(title="RTF Indicator", overlay=true)



// -------------------------------------------------------------------------- //



bbl = input(title="BBI Band Length",    type=input.integer, defval=26,   minval=1,    step=1  )
bbs = input(title="BBI Band Stddev",    type=input.float,   defval=2.00, minval=0.1,  step=0.1)
bpp = input(title="BBI Pivot Point",    type=input.float,   defval=20,   minval=0.01, step=1  )
hrb = input(title="HPI Recent Bar",     type=input.integer, defval=200,  minval=1,    step=1  )
rlt = input(title="RTF Loss Tolerance", type=input.float,   defval=0.6,  minval=0.1,  step=0.1)
rpb = input(title="RTF Pause Bar",      type=input.integer, defval=11,   minval=1,    step=1  )
rtp = input(title="RTF Take Profit",    type=input.float,   defval=0.5,  minval=0.1,  step=0.1)



// -------------------------------------------------------------------------- //



var HR = #d32f2f // Hex Red. The red color for our color scheme indicating short trades.
var HG = #388e3c // Hex Green. The green color for our color scheme indicating long trades.



// -------------------------------------------------------------------------- //



var OS = "OS" // Open Short. The signal to start a short trade.
var CS = "CS" // Close Short. The signal to end a short trade.
var OL = "OL" // Open Long. The signal to start a long trade.
var CL = "CL" // Close Long. The signal to end a long trade.

var DS = "DS" // Direction Short. Trading to win from falling prices.
var DL = "DL" // Direction Long. Trading to win from rising prices.

var FP = "FP" // First Price. The entry price of our current trade.
var LP = "LP" // Last Price. The exit price of our current trade.



// -------------------------------------------------------------------------- //



// Current Cycle. The cycle of the current trade. Either OS, CS, OL or CL.
var CC = array.new_string(4, "")

emp_ccc() =>
    nos = array.get(CC, 0) == ""
    ncs = array.get(CC, 1) == ""
    nol = array.get(CC, 2) == ""
    ncl = array.get(CC, 3) == ""

    nos and ncs and nol and ncl

has_ccc(v) =>
    has = false

    if v == OS
        has := array.get(CC, 0) == OS
    if v == CS
        has := array.get(CC, 1) == CS
    if v == OL
        has := array.get(CC, 2) == OL
    if v == CL
        has := array.get(CC, 3) == CL

    has

onl_ccc(v) =>
    has = false

    if v == OS
        has := array.get(CC, 0) == OS and array.get(CC, 1) == "" and array.get(CC, 2) == "" and array.get(CC, 3) == ""
    if v == CS
        has := array.get(CC, 0) == "" and array.get(CC, 1) == CS and array.get(CC, 2) == "" and array.get(CC, 3) == ""
    if v == OL
        has := array.get(CC, 0) == "" and array.get(CC, 1) == "" and array.get(CC, 2) == OL and array.get(CC, 3) == ""
    if v == CL
        has := array.get(CC, 0) == "" and array.get(CC, 1) == "" and array.get(CC, 2) == "" and array.get(CC, 3) == CL

    has

rem_ccc(v) =>
    if v == OS
        array.set(CC, 0, "")
    if v == CS
        array.set(CC, 1, "")
    if v == OL
        array.set(CC, 2, "")
    if v == CL
        array.set(CC, 3, "")

set_ccc(v) =>
    if v == OS
        array.set(CC, 0, v)
    if v == CS
        array.set(CC, 1, v)
    if v == OL
        array.set(CC, 2, v)
    if v == CL
        array.set(CC, 3, v)



// -------------------------------------------------------------------------- //



// Debug Flag. Only used for development. In complex decision trees we can print
// labels based on the position the global was modified. This can help a great
// deal figuring out why a certain trade was made.
var DF = array.new_string(8, "")

has_cdf(v) =>
    has = false

    if v == "1"
        has := array.get(DF, 0) != ""
    if v == "2"
        has := array.get(DF, 1) != ""
    if v == "3"
        has := array.get(DF, 2) != ""
    if v == "4"
        has := array.get(DF, 3) != ""
    if v == "5"
        has := array.get(DF, 4) != ""
    if v == "6"
        has := array.get(DF, 5) != ""
    if v == "7"
        has := array.get(DF, 6) != ""
    if v == "8"
        has := array.get(DF, 7) != ""

    has

set_cdf(v) =>
    if v == "1"
        array.set(DF, 0, v)
    if v == "2"
        array.set(DF, 1, v)
    if v == "3"
        array.set(DF, 2, v)
    if v == "4"
        array.set(DF, 3, v)
    if v == "5"
        array.set(DF, 4, v)
    if v == "6"
        array.set(DF, 5, v)
    if v == "7"
        array.set(DF, 6, v)
    if v == "8"
        array.set(DF, 7, v)

// Note that we need to clear the array's content in order to work with a fresh
// copy on each bar when the script is executed again.
array.fill(DF, "")



// -------------------------------------------------------------------------- //



// Failure Count.
var FC = array.new_int(1, 0)

get_cfc() =>
    array.get(FC, 0)

inc_cfc() =>
    array.set(FC, 0, array.get(FC, 0) + 1)

res_cfc() =>
    array.set(FC, 0, 0)



// -------------------------------------------------------------------------- //



// Pause Count.
var PC = array.new_int(1, 0)

get_cpc() =>
    array.get(PC, 0)

inc_cpc() =>
    array.set(PC, 0, array.get(PC, 0) + 1)

res_cpc() =>
    array.set(PC, 0, 0)



// -------------------------------------------------------------------------- //



// Trade Price. The entry price and exit price of our current trade. Based on
// these prices and their delta we decide when to take profit and when to move
// on.
var TP = array.new_float(2, 0.0)

get_ctp(v) =>
    val = 0.0

    if v == FP
        val := array.get(TP, 0)
    if v == LP
        val := array.get(TP, 1)

    val

// gre_ctp returns the trade price delta for long directional trades. If the
// result is greater zero it means the long trade made profit.
gre_ctp() =>
    array.get(TP, 1) - array.get(TP, 0)

// les_ctp returns the trade price delta for short directional trades. If the
// result is greater zero it means the short trade made profit.
les_ctp() =>
    array.get(TP, 0) - array.get(TP, 1)

set_ctp(v) =>
    if v == FP
        array.set(TP, 0, close)
    if v == LP
        array.set(TP, 1, close)



// -------------------------------------------------------------------------- //



// new_per calculates the percentage of a fraction based on the given absolute
// value.
//
//     new_per(500, 5) => 1
//
new_per(abs, fra) =>
    fra * 100 / abs



// -------------------------------------------------------------------------- //



// new_bbu returns the upper bollinger band based on the length given by bbl and
// the standard deviation given by bbs. Here bbu means bollinger band upper.
new_bbu(src, bbl, bbs) =>
    sma(src, bbl) + bbs * stdev(src, bbl)

new_bbi(src, bbl, bbs) =>
    bbu = new_bbu(src, bbl, bbs)

    cou = 0
    bac = 8

    for i = 0 to bac
        cou := high[i] > bbu[i] and bbu[i] > low[i] ? cou + 1 : cou

    new_per(bac, cou) > bpp and not (high[0] > bbu[0] and bbu[0] > low[0])



// -------------------------------------------------------------------------- //



// new_rsb returns the relative strength indicator for the current bar, based on
// the running moving average. Here rsb means relative strength bar.
new_rsb(src, rsl) =>
    upw = rma( max(change(src), 0), rsl)
    dow = rma(-min(change(src), 0), rsl)

    dow == 0 ? 100 : upw == 0 ? 0 : 100 - (100 / (1 + upw / dow))

// new_rsi returns the relative strength indicator for overbought price peaks.
new_rsi(src) =>
    one = new_rsb(src, 120)[1] < 57 and new_rsb(src, 120)[0] > 57
    two = new_rsb(src, 50 )[1] < 65 and new_rsb(src, 50 )[0] > 65
    thr = new_rsb(src, 30 )[1] < 70 and new_rsb(src, 30 )[0] > 70
    fou = new_rsb(src, 17 )[1] < 63 and new_rsb(src, 17 )[0] > 63

    one or two or thr or fou



// -------------------------------------------------------------------------- //



// new_hpi returns a high price indicator for the most recent bars since hrb.
// Here hpi means high price indicator.
new_hpi(hrb) =>
    highest(close, hrb) == close

// new_lpi returns a low price indicator for the most recent bars since hrb.
// Here lpi means low price indicator.
new_lpi(hrb) =>
    lowest(close, hrb) == close



// -------------------------------------------------------------------------- //



new_lfs() =>
    100 - new_per(close, get_ctp(FP)) >= rlt

new_lfl() =>
    100 - new_per(get_ctp(FP), close) >= rlt



// -------------------------------------------------------------------------- //



// new_cos returns a signal to open a short position. This signals the beginning
// of a trade aiming to profit from downward trends. After opening a short
// position we wait for the close short signal. Here cos means cycle open short.
new_cos() =>
    src = close

    bbi = new_bbi(src, bbl, bbs)
    hpi = new_hpi(hrb) or new_hpi(hrb / 2)
    rsi = new_rsi(src)

    bhi = (bbi[0] and hpi[0]) or (bbi[0] and hpi[1]) or (bbi[1] and hpi[0])
    bri = (bbi[0] and rsi[0]) or (bbi[0] and rsi[1]) or (bbi[1] and rsi[0])
    hri = (hpi[0] and rsi[0]) or (hpi[0] and rsi[1]) or (hpi[1] and rsi[0])

    bhi or bri or hri

// new_ccs returns a signal to close a short position. This signals the end of a
// trade aiming to profit from downward trends. After closing a short position
// we wait for the open long signal. Here ccs means cycle close short.
new_ccs() =>
    100 - new_per(get_ctp(FP), close) >= rtp

// new_col returns a signal to open a long position. This signals the beginning
// of a trade aiming to profit from upward trends. After opening a long position
// we wait for the close long signal. Here col means cycle open long.
new_col() =>
    new_lpi(hrb) or new_lpi(hrb / 2)

// new_ccl returns a signal to close a long position. This signals the end of a
// trade aiming to profit from upward trends. After closing a long position we
// wait for the open short signal. Here ccl means cycle close long.
new_ccl() =>
    100 - new_per(close, get_ctp(FP)) >= rtp



// -------------------------------------------------------------------------- //



new_cyc() =>
    lfs = new_lfs()
    lfl = new_lfl()

    cos = new_cos()
    ccs = new_ccs()
    col = new_col()
    ccl = new_ccl()

    cct = false // Constant Cycle Tracked.

    if emp_ccc()
        if cos
            set_ccc(OS)
            rem_ccc(CS)
            rem_ccc(OL)
            rem_ccc(CL)

            cos := true
            ccs := false
            col := false
            ccl := false

            cct := true

            set_cdf("1")

        else if col
            rem_ccc(OS)
            rem_ccc(CS)
            set_ccc(OL)
            rem_ccc(CL)

            cos := false
            ccs := false
            col := true
            ccl := false

            cct := true

            set_cdf("2")

    else
        if onl_ccc(OS)
            if ccs
                set_ccc(OS)
                rem_ccc(CS)
                rem_ccc(OL)
                rem_ccc(CL)

                cos := true
                ccs := true
                col := false
                ccl := false

                cct := true

                set_cdf("3")

            else if lfs
                rem_ccc(OS)
                rem_ccc(CS)
                set_ccc(OL)
                rem_ccc(CL)

                cos := false
                ccs := true
                col := true
                ccl := false

                cct := true

                set_cdf("4")

        else
            if onl_ccc(OL)
                if ccl
                    rem_ccc(OS)
                    rem_ccc(CS)
                    set_ccc(OL)
                    rem_ccc(CL)

                    cos := false
                    ccs := false
                    col := true
                    ccl := true

                    cct := true

                    set_cdf("5")

                else if lfl
                    set_ccc(OS)
                    rem_ccc(CS)
                    rem_ccc(OL)
                    rem_ccc(CL)

                    cos := true
                    ccs := false
                    col := false
                    ccl := true

                    cct := true

                    set_cdf("6")

    if not cct
        cos := false
        ccs := false
        col := false
        ccl := false

        set_cdf("7")

    if get_cpc() > 0
        rem_ccc(OS)
        rem_ccc(CS)
        rem_ccc(OL)
        rem_ccc(CL)

        cos := false
        ccs := false
        col := false
        ccl := false

        set_cdf("8")

    [cos, ccs, col, ccl]


// -------------------------------------------------------------------------- //



[cos, ccs, col, ccl] = new_cyc()



// -------------------------------------------------------------------------- //



// It is super important to set the last price of the current trade first. This
// allows us to calculate the profit or loss considering the sequential nature
// of pine script execution. Only after the last price is tracked and the loss
// statement is collected we can track the new first price of the next trade.
// Here ffs means failure for short. Here ffl means failure for long.



set_ctp(ccs or ccl ? LP : "")

ffs = ccs and les_ctp() < 0 ? true : false
ffl = ccl and gre_ctp() < 0 ? true : false

set_ctp(cos or col ? FP : "")



// -------------------------------------------------------------------------- //



if ffs or ffl
    inc_cfc()

    cos := false
    col := false

if get_cfc() >= 1 or get_cpc() > 0
    inc_cpc()

    if get_cpc() >= rpb
        res_cfc()
        res_cpc()



// -------------------------------------------------------------------------- //



// plotshape(has_cdf( "1"), text="DEBUG  1", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "2"), text="DEBUG  2", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "3"), text="DEBUG  3", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "4"), text="DEBUG  4", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "5"), text="DEBUG  5", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "6"), text="DEBUG  6", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "7"), text="DEBUG  7", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)
// plotshape(has_cdf( "8"), text="DEBUG  8", location=location.belowbar, style=shape.labelup, size=size.small, color=color.purple, textcolor=color.white, transp=50)



// -------------------------------------------------------------------------- //



plotshape(cos,             text=OS, location=location.abovebar, style=shape.triangledown, size=size.tiny, color=HR, textcolor=color.white, transp=30)
plotshape(ccs and not ffs, text=CS, location=location.belowbar, style=shape.triangleup,   size=size.tiny, color=HR, textcolor=color.white, transp=30)
plotshape(ccs and     ffs, text=CS, location=location.belowbar, style=shape.xcross,       size=size.tiny, color=HR, textcolor=color.white, transp=30)
plotshape(col,             text=OL, location=location.abovebar, style=shape.triangledown, size=size.tiny, color=HG, textcolor=color.white, transp=30)
plotshape(ccl and not ffl, text=CL, location=location.belowbar, style=shape.triangleup,   size=size.tiny, color=HG, textcolor=color.white, transp=30)
plotshape(ccl and     ffl, text=CL, location=location.belowbar, style=shape.xcross,       size=size.tiny, color=HG, textcolor=color.white, transp=30)



// -------------------------------------------------------------------------- //



alertcondition(condition=cos, title=OS, message="Triggered Open Short Signal")
alertcondition(condition=ccs, title=CS, message="Triggered Close Short Signal")
alertcondition(condition=col, title=OL, message="Triggered Open Long Signal")
alertcondition(condition=ccl, title=CL, message="Triggered Close Long Signal")

Overview

RTF Indicator uses inputs for band length, stddev, pivot point, recent bars, loss tolerance, pause bar, and take profit to determine entry and exit points. The script manages trade cycles with states for opening and closing long or short positions. It sets green for longs and red for shorts. The indicator draws colored plots on the chart to show when to enter or exit trades based on band crossings and levels. Main settings adjust the sensitivity and risk parameters for the strategy. It has no explicit stop loss but uses loss tolerance for closing losing trades.

Details

Published by

blackcat1402 on GitHub

Type

Indicator, Pine Script v4

Draws

On the price chart

Category

Volatility & bands, Support & resistance

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
BBI Band Lengthint26bbl
BBI Band Stddevfloat2.00bbs
BBI Pivot Pointfloat20bpp
HPI Recent Barint200hrb
RTF Loss Tolerancefloat0.6rlt
RTF Pause Barint11rpb
RTF Take Profitfloat0.5rtp
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

ICT Liquidity Void Fill

by ArunKBhaskar
575 stars

This overlay indicator marks ICT liquidity void fills on the price chart and can show long and short signals. It places a Fibonacci level inside a displacement candle, defaulting to the midpoint, and draws lines in a chosen style. Optional filters limit the fi

Indicator v6 SMC / ICT / price actionSupport & resistance
Updated 1 year ago · MPL-2.0 GitHub repository of ICT Liquidity Void Fill

[RS]Donchian Fans

by ricardosantos79
261 stars

This indicator plots Donchian Channel boundary lines along with dynamic fan projections directly on the price chart. It calculates the highest high, lowest low, and median price over a customizable lookback period. Whenever price establishes a new channel high

Indicator v4 Support & resistanceTrend
Updated 4 years ago · None stated GitHub repository of [RS]Donchian Fans

Snag - VWAP

by dearvn
257 stars

This indicator plots a custom Anchored Volume-Weighted Average Price (VWAP) directly on the price chart along with optional standard deviation bands. Users can anchor the VWAP to standard time periods like sessions, weeks, or months, or to corporate events suc

Indicator v5 Moving averagesVolatility & bands Repaints
Updated 6 weeks ago · None stated GitHub repository of Snag - VWAP

Candlestick Patterns

by harryguiacorn
219 stars

This indicator plots optional candlestick pattern signals on the price chart. It detects engulfing bars, inside bars, HOLP and LOHP, kicker patterns, body-mass extremes, higher highs and lower lows, ATR warnings, and four-bar fractals. Optional pivot marks use

Indicator v5 Candlestick patternsVolatility & bands
Updated 1 year ago · None stated GitHub repository of Candlestick Patterns

Dynamic Linear Regression

by TradersPost
218 stars

Dynamic Linear Regression calculates and plots linear regression trendlines and standard deviation channels directly on the price chart over a user-selected time period. Traders can configure static channels locked at the end time, dynamic channels that contin

Indicator v6 TrendSupport & resistance
Updated 3 months ago · None stated GitHub repository of Dynamic Linear Regression

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers