Guidance/Assistance with - array/for loops

Hello, I was looking to get more in depth with learning thinkscript and found what appears to be a more popular TV S/R script that is worth learning from and get benefit from.

I can get past most of the basics but need some guidance how to handle array and for loops . I've wrapped the original code in comments under the new for reference. Any guidance would be greatly appreciated.

The script is a dynamic Support and Resistance script.
https://www.tradingview.com/script/va09eWAp-Support-Resistance-Dynamic-v2/

thanks.

Code:
#https://www.tradingview.com/script/va09eWAp-Support-Resistance-Dynamic-v2/
#// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
 
#// © LonesomeTheBlue

#//@version=4
#study("Support Resistance - Dynamic v2", "SRv2", overlay = true)
input prd =  10; # pivot period
input ppsrc = HL2;
input maxnumpp = 20; # max number of pivots
input ChannelW = 10; #max channel width
input maxnumsr = 5;  # Maximum Number of S/R
input min_strength = 2; #Minimum Strength
input labelloc = 20 ;# "Label Location"  "Positive numbers reference future bars, negative numbers reference histical bars
input linestyle = {default Dashed, Line };
input linewidth = 2;
#resistancecolor = input(defval = color.red, title = "Resistance Color", type = input.color, group = "Colors")
#supportcolor = input(defval = color.lime, title = "Support Color", type = input.color, group = "Colors")
input showpp = yes;
def na = double.nan;

def src1 =  if ppsrc == HL2 then high else Max(close, open);
#float src1 =  ppsrc == 'High/Low' ? high : max(close, open)
def src2 = if ppsrc == HL2 then low else Min(close, open);
#float src2 =  ppsrc == 'High/Low' ? low: min(close, open)

def bn = BarNumber();
def lastBar = HighestAll(if IsNaN(close) then 0 else bn);
def offset = Min(prd - 1, lastBar - bn);
def pl = low < Lowest(src1, prd - 1) and low == GetValue(Lowest(src1, prd), -offset);
def ph = high > Highest(src2, prd - 1) and high == GetValue(Highest(src2, prd), -offset);
#float ph = pivothigh(src1, prd, prd)
#float pl = pivotlow(src2, prd, prd)


plot  PHLine = ( if  showpp then ph  else Double.NaN);
#plotshape(ph and showpp, text = "H",  style = shape.labeldown, color = na, textcolor = color.red, location = location.abovebar,  offset = -prd)
PHLine.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
plot  PlLine = ( if  showpp then pl  else Double.NaN);
#plotshape(pl and showpp, text = "L",  style = shape.labelup, color = na, textcolor = color.lime, location = location.belowbar,  offset = -prd)
PlLine.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
     
#//calculate maximum S/R channel zone width
def prdhighest =  Highest(300);
def prdlowest = Lowest(300);
def cwidth = (prdhighest - prdlowest) * ChannelW / 100;

def pivotvals = array.new_float(0);
#var pivotvals= array.new_float(0);


if ph or pl
   then{
      def ph1 = if ph then ph else pl;
       array.unshift(pivotvals,ph1 );
    }else {
        if{array.size(pivotvals) > maxnumpp            ## limit the array size
            then array.pop(pivotvals);
         else double.nan;
        };
    };

#if ph or pl
#    array.unshift(pivotvals, ph ? ph : pl)
#    if array.size(pivotvals) > maxnumpp // limit the array size
#        array.pop(pivotvals)


script get_sr_vals{
input ind = 0;  
   def lo = array.get(pivotvals, ind);
   def hi = lo;                      
   def numpp = 0;                    
    for y = 0 to array.size(pivotvals) - 1
       def cpp = array.get(pivotvals, y);
       def wdth = if cpp <= lo then hi - cpp else cpp - lo;
        if wdth <= cwidth ## fits the max channel width?
            then {        
            lo = if cpp <= lo then cpp else lo ;
            hi = if cpp > lo then cpp else hi;                            
            numpp= 1;
            }
            [hi, lo, numpp]
};
 #############################
# get_sr_vals(ind)=>
#  float lo = array.get(pivotvals, ind)
#  float hi = lo
#  int numpp = 0
#    for y = 0 to array.size(pivotvals) - 1
#       float cpp = array.get(pivotvals, y)
#       float wdth = cpp <= lo ? hi - cpp : cpp - lo
#        if wdth <= cwidth             ## fits the max channel width?
#          lo := cpp <= lo ? cpp : lo
#          hi := cpp > lo ? cpp : hi
#           numpp += 1
#   [hi, lo, numpp]
 #################################

    def sr_up_level = array.new_float(0);
    def sr_dn_level = array.new_float(0);
    def sr_strength = array.new_float(0);

##############################
#    find_loc(strength)=>
#    ret = array.size(sr_strength)
#    for i = (ret > 0 ? array.size(sr_strength) - 1 : na) to 0
#        if strength <= array.get(sr_strength, i)
#            break
#        ret := i
#    ret
##############################
script check_sr{
input hi = high;
input lo = low;
input strength = 1;

 def  ret = 1;
    for i = 0 to (if array.size(sr_up_level) > 0 then array.size(sr_up_level) - 1 else na)
        //included?
        if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi  or
           array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
            if strength >= array.get(sr_strength, i)
                array.remove(sr_strength, i)
                array.remove(sr_up_level, i)
                array.remove(sr_dn_level, i)
                ret
            else
                ret = 0;

};
##############################
#check_sr(hi, lo, strength)=>
#    ret = true
#    for i = 0 to (array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na)
#        //included?
#        if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi  or
#           array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
#            if strength >= array.get(sr_strength, i)
#                array.remove(sr_strength, i)
#               array.remove(sr_up_level, i)
#                array.remove(sr_dn_level, i)
#                ret
#            else
#                ret := false
#            break
#    ret
##############################

plot sr_lines = array.new_line(11, na);
 def sr_labels = array.new_label(11, na);
#var sr_lines = array.new_line(11, na)
#var sr_labels = array.new_label(11, na)
 for x = 1 to 10
    {
    sr_lines.setPaintingStrategy(paintingStrategy.HORIZONTAL);
    };
# def rate = 100 * (label.get_y(array.get(sr_labels, x)) - close) / close;
 
 ######################################
#   for x = 1 to 10
#    rate = 100 * (label.get_y(array.get(sr_labels, x)) - close) / close
#    label.set_text(array.get(sr_labels, x), text = tostring(label.get_y(array.get(sr_labels, x))) + "(" + tostring(rate,'#.##') + "%)")
#    label.set_x(array.get(sr_labels, x), x = bar_index + labelloc)
#    label.set_color(array.get(sr_labels, x), color = label.get_y(array.get(sr_labels, x)) >= close ? color.red : color.lime)
#    label.set_textcolor(array.get(sr_labels, x), textcolor = label.get_y(array.get(sr_labels, x)) >= close ? color.white : color.black)
#    label.set_style(array.get(sr_labels, x), style = label.get_y(array.get(sr_labels, x)) >= close ? label.style_labeldown : label.style_labelup)
#    line.set_color(array.get(sr_lines, x), color = line.get_y1(array.get(sr_lines, x)) >= close ? resistancecolor : supportcolor)
########################################################
if ph or pl
then {    ##because of new calculation, remove old S/R levels
    array.clear(sr_up_level)
    array.clear(sr_dn_level)
    array.clear(sr_strength)
    ##find S/R zones
    for x = 0 to array.size(pivotvals) - 1
        [hi, lo, strength] = get_sr_vals(x)
        if check_sr(hi, lo, strength)
            loc = find_loc(strength)
            ## if strength is in first maxnumsr sr then insert it to the arrays
            if loc < maxnumsr and strength >= min_strength
                array.insert(sr_strength, loc, strength)
                array.insert(sr_up_level, loc, hi)
                array.insert(sr_dn_level, loc, lo)
               ##/ keep size of the arrays = 5
                if array.size(sr_strength) > maxnumsr
                    array.pop(sr_strength)
                    array.pop(sr_up_level)
                    array.pop(sr_dn_level)
   
    for x = 1 to 10
        line.delete(array.get(sr_lines, x))
        label.delete(array.get(sr_labels, x))
     
    for x = 0 to (array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na)
        float mid = round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        rate = 100 * (mid - close) / close
        array.set(sr_labels, x + 1,
          label.new( x = bar_index + labelloc,
                     y = mid, text = tostring(mid) + "(" + tostring(rate,'#.##') + "%)",
                     color = mid >= close ? color.red : color.lime,
                     textcolor = mid >= close ? color.white : color.black,
                     style = mid >= close ? label.style_labeldown : label.style_labelup))
                   
        array.set(sr_lines, x + 1,
                  line.new(x1 = bar_index, y1 = mid, x2 = bar_index - 1, y2 = mid,
                  extend = extend.both,
                  color = mid >= close ? resistancecolor : supportcolor,
                  style = Lstyle,
                  width = linewidth))


#######################################  ALERTS ## LOW priority ##################################
script f_crossed_over{
    input ret = 0;
    for x = 0 to (array.size(sr_up_level) > 0 then array.size(sr_up_level) - 1 else double.nan)
        def mid = round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if close[1] <= mid and close > mid
            ret = 1;
 }
############################
#f_crossed_over()=>
#    ret = false
#    for x = 0 to (array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na)
#        float mid = round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
#        if close[1] <= mid and close > mid
#            ret := true
#    ret
#################################
script f_crossed_under{
   input ret = 0;
    for x = 0 to (array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na)
        float mid = round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
        if close[1] >= mid and close < mid then
            ret = 1 else ret;
};
#####################################
#f_crossed_under()=>
#    ret = false
#    for x = 0 to (array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na)
#        float mid = round_to_mintick((array.get(sr_up_level, x) + array.get(sr_dn_level, x)) / 2)
#        if close[1] >= mid and close < mid
#            ret := true
#    ret
###################################

Alert(f_crossed_over(), "Resistance Broken",Alert.bar,sound.Ding);
Alert(f_crossed_under(), "Support Broken",Alert.bar,sound.Ding);

#alertcondition(f_crossed_over(), title='Resistance Broken', message='Resistance Broken')
#alertcondition(f_crossed_under(), title='Support Broken', message='Support Broken')
 
Last edited by a moderator:

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

On quick glance, thinkscript does not support that type of array. Basically everything in thinkscript is a natural array indexed by bar, but you can not define a proper array, in whole, at a single bar index.
 
petergluis - thanks. your # 4 and 7 are scripts i was trying to work on. it was more about learning than the indicator itself. but i see most of these use arrays and joshua shed some light as to why the difficulty. the dynamic structure looks more doable and promising, thanks for suggestions.

Joshua - thanks, answers my questions as to why i couldn't figure it out or find anything on arrays. would there be any workarounds that you are familiar with?

do you know if that's the same case for "for" statements?
 
Last edited by a moderator:
petergluis - thanks. your # 4 and 7 are scripts i was trying to work on. it was more about learning than the indicator itself. but i see most of these use arrays and joshua shed some light as to why the difficulty. the dynamic structure looks more doable and promising, thanks for suggestions.

Joshua - thanks, answers my questions as to why i couldn't figure it out or find anything on arrays. would there be any workarounds that you are familiar with?

do you know if that's the same case for "for" statements?

thinkscript has fold to process a loop.
it is very limited. it can't generate any drawing within it. all it does is calculate 1 number.
i talk through some examples here
https://usethinkscript.com/threads/...onfirming-a-thinkscript-line.6662/#post-64430
 
thinkscript has fold to process a loop.
it is very limited. it can't generate any drawing within it. all it does is calculate 1 number.
i talk through some examples here
https://usethinkscript.com/threads/...onfirming-a-thinkscript-line.6662/#post-64430
Do you know if fold would be the option to convert the valuewhen function?

input boxp = 5;

def LL = Lowest(low, boxp);
def k1 = Highest(high, boxp);
def k2 = Highest(high, boxp - 1);
def k3 = Highest(high, boxp - 2);
def bar = BarNumber();
def NH = valuewhen(high>k1[1],high,0);
def box1 = k3 < k2;
plot TopBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, NH, 0);
plot BottomBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, LL, 0);
 
Do you know if fold would be the option to convert the valuewhen function?

input boxp = 5;

def LL = Lowest(low, boxp);
def k1 = Highest(high, boxp);
def k2 = Highest(high, boxp - 1);
def k3 = Highest(high, boxp - 2);
def bar = BarNumber();
def NH = valuewhen(high>k1[1],high,0);
def box1 = k3 < k2;
plot TopBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, NH, 0);
plot BottomBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, LL, 0);

there is another thread about valuewhen. i made a study that mimics it.
user picks,
..a condition
..and which condition number it is to find in the past, first, 2nd, 3rd,...

it looks for the crossing of 2 averages.
all of the average formulas would need to be replaced with your formulas that define your condition.
https://usethinkscript.com/threads/...ew-equivalent-in-thinkscript.3666/#post-96790
 
there is another thread about valuewhen. i made a study that mimics it.
user picks,
..a condition
..and which condition number it is to find in the past, first, 2nd, 3rd,...

it looks for the crossing of 2 averages.
all of the average formulas would need to be replaced with your formulas that define your condition.
https://usethinkscript.com/threads/...ew-equivalent-in-thinkscript.3666/#post-96790
Thanks, I did see that, but am not able to grasp the concept in relation to my example. Is there any way you can turn it into a function script that can be called or review the code below in how to apply it? thanks

Code:
input boxp = 5;

def LL = Lowest(low, boxp);
def k1 = Highest(high, boxp);
def k2 = Highest(high, boxp - 1);
def k3 = Highest(high, boxp - 2);

def bn = barnumber();
def na = double.nan;

def lastbarbn = HighestAll(If(IsNaN(close), 0, bn));
def lastbar = if (bn == lastbarbn) then 1 else 0;
def NH = if (lastbar > k1[1]) then lastbar else 0;
#def NH =   valuewhen(high > k1[1], high, 0);

def cond1 = k3 < k2;
 
plot TopBox =  if NH == boxp - 2 and cond1 then NH else 0;
#topbox.setPaintingStrategy(curve.FIRM);
plot BottomBox =  if NH == boxp - 2 and cond1 then LL else 0;
#BottomBox.setPaintingStrategy(curve.FIRM);
 
Thanks, I did see that, but am not able to grasp the concept in relation to my example. Is there any way you can turn it into a function script that can be called or review the code below in how to apply it? thanks

Code:
input boxp = 5;

def LL = Lowest(low, boxp);
def k1 = Highest(high, boxp);
def k2 = Highest(high, boxp - 1);
def k3 = Highest(high, boxp - 2);

def bn = barnumber();
def na = double.nan;

def lastbarbn = HighestAll(If(IsNaN(close), 0, bn));
def lastbar = if (bn == lastbarbn) then 1 else 0;
def NH = if (lastbar > k1[1]) then lastbar else 0;
#def NH =   valuewhen(high > k1[1], high, 0);

def cond1 = k3 < k2;
 
plot TopBox =  if NH == boxp - 2 and cond1 then NH else 0;
#topbox.setPaintingStrategy(curve.FIRM);
plot BottomBox =  if NH == boxp - 2 and cond1 then LL else 0;
#BottomBox.setPaintingStrategy(curve.FIRM);

i fixed my code, to work with your code, but i did it before i closely looked over your code in post8.
i was looking at it and wondering why your plots didn't draw any lines. they do, but at 0...
your NH formula is wrong and isn't even close the one commented out, it is comparing a boolean to a price,
the 2 plot formulas are wrong too. comparing nh to a constant.

looking at post6 code,
where did these 2 plot formulas come from?
you don't have any comments explaining the code.
looks like you are mixing rules and code?
plot TopBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, NH, 0);
plot BottomBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, LL, 0);

can you explain in plain words, what is supposed to happen, for the 2 plots ( in post8) to plot something?


here is post8 code and mine
Ruby:
# valuewhen_02b


# https://usethinkscript.com/threads/guidance-assistance-with-array-for-loops.10995/#post-96844
# spartan.ts   4/23 at 7:20 PM  #8
#   but am not able to grasp the concept in relation to my example.
#   Is there any way you can turn it into a function script that can be called or review the code below in how to apply it? thanks

# other link
# https://usethinkscript.com/threads/what-is-the-valuewhen-tradingview-equivalent-in-thinkscript.3666/
# What is the ValueWhen (TradingView) equivalent in ThinkScript?



def bn = barnumber();
def na = double.nan;

def lastbarbn = HighestAll(If(IsNaN(close), 0, bn));
def lastbar = if (bn == lastbarbn) then 1 else 0;



input boxp = 5;

def LL = Lowest(low, boxp);
def k1 = Highest(high, boxp);
def k2 = Highest(high, boxp - 1);
def k3 = Highest(high, boxp - 2);

def NH = if (lastbar > k1[1]) then lastbar else 0;

#def NH =   valuewhen(high > k1[1], high, 0);
def cond1 = k3 < k2;

plot TopBox =  if NH == boxp - 2 and cond1 then NH else 0;
#topbox.setPaintingStrategy(curve.FIRM);
plot BottomBox =  if NH == boxp - 2 and cond1 then LL else 0;
#BottomBox.setPaintingStrategy(curve.FIRM);

# plot BottomBox = if cond1 then LL else na;

input test1 = no;
addchartbubble(test1, low*0.999,
k1 + "  k1\n" +
k2 + "  k2\n" +
k3 + "  k3\n" +
ll + "  LL"
, color.cyan, no);




#=========================================
#=========================================
# new code to mimic valuewhen
# run only on last bar on chart
# as more bars plot, more conditions could appear, and the desired condition could move to be later in the day


# condition , k3 < k2
# price to return , high
# condition number in the past, to return , 0

#=========================================
# define some variables
#=========================================
# enable these if not in main code

#def bn = barnumber();
#def na = double.nan;
#def lastbarbn = HighestAll(If(IsNaN(close), 0, bn));
#def lastbar = if (bn == lastbarbn) then 1 else 0;

#=========================================
# replicate valuewhen
#  find the nth condition, and return a variable value (default, high)
#=========================================

#---------------------------------
# configure inputs
#---------------------------------

# set cond1 equal to your condition variable
#  already set in code above
# def cond1 = k3 < k2;

input previous_condition_price = high;
def ddr = previous_condition_price;

input nth_previous_condition = 5;


# if more than 1000 bars on the chart, then use a bigger number
def barsback = 1000;

#---------------------------------
# count the conditions

def cntx = if bn == 1 then 0 else if cond1 then cntx[1] + 1 else cntx[1];
# find quantity of conditions on the chart
#def cntx_max = highestall(cntx);

# replace highestall with these 2 formulas
# mod of Line At Price , Mobius
# save the highest count of the conditions, from lastbar
#def barsBack = 1000;
def cmax2 = if !IsNaN(close) and IsNaN(close[-1])
        then cntx
        else cmax2[1];
plot cntx_max = if isNaN(close[-barsBack])
            then cmax2[-barsBack]
            else Double.NaN;

# create reverse count of conditions
def revcntx = if cond1 then cntx_max - cntx + 1 else cntx_max - cntx + 0;

# --------------------------------
# check if desired condition number is valid
def prevnum = if nth_previous_condition > cntx_max then cntx_max else if nth_previous_condition < 1 then 1 else nth_previous_condition;

# --------------------------------
# outputs , barnumber of condition and a price
#---------------------------------
def off = if !lastbar then na else GetMaxValueOffset(( if revcntx == prevnum then revcntx else 0) , barsback);

# mod of Line At Price , Mobius
# save the barnumber of desired bar
#input barsBack = 1000;
def c = if !IsNaN(close) and IsNaN(close[-1])
        then (bn - off)
        else c[1];
plot cond_bn = if isNaN(close[-barsBack])
            then c[-barsBack]
            else Double.NaN;

def cond_price = if bn == 1 then na else if bn == cond_bn then round(ddr,2) else cond_price[1];

# --------------------------------
# outputs

# extend price level as a line from condition bar
input plot_condition_price_line = yes;
plot ext1 = if plot_condition_price_line and !isnan(close[1]) then cond_price else na;
ext1.SetDefaultColor(Color.cyan);
ext1.setlineweight(1);
#ext1.hidebubble();

# if no line, then show a point and price bubble
plot cond1_level = if !plot_condition_price_line and bn == cond_bn then cond_price else na;
cond1_level.SetPaintingStrategy(PaintingStrategy.POINTS);
cond1_level.SetDefaultColor(Color.cyan);
cond1_level.setlineweight(1);
#cond1_level.hidebubble();

input show_labels = yes;
addlabel(show_labels, "find the nth previous condition " + prevnum + "/" + cntx_max, color.yellow);
addlabel(show_labels, cond_price + " signal $, at bn " + cond_bn + "/" + lastbarbn, color.yellow);

input show_vertical_lines_on_condition = no;
# vertical lines before and after the condition bar
def x = if (revcntx[0] == prevnum and revcntx[-1] <> prevnum ) then 1 else 0;
addverticalline(show_vertical_lines_on_condition and (x or x[1]), "-", color.cyan);

# --------------------------------
# test stuff

input test1_cond_counts = no;
addchartbubble(test1_cond_counts, low*0.998,
 bn + " bn\n" +
 cntx + " cnt\n" +
 revcntx + " rev\n" +
 off + " off\n" +
 cond_bn + " cbn\n" +
 cond_price + " $"
, ( if bn == cond_bn then color.cyan else color.gray), no);
#
#
 
Last edited:
i fixed my code, to work with your code, but i did it before i closely looked over your code in post8.
i was looking at it and wondering why your plots didn't draw any lines. they do, but at 0...
your NH formula is wrong and isn't even close the one commented out, it is comparing a boolean to a price,
the 2 plot formulas are wrong too. comparing nh to a constant.

looking at post6 code,
where did these 2 plot formulas come from?
you don't have any comments explaining the code.
looks like you are mixing rules and code?
plot TopBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, NH, 0);
plot BottomBox = valuewhen(barssince(high > k1[1]) == boxp - 2 and box1, LL, 0);

can you explain in plain words, what is supposed to happen, for the 2 plots ( in post8) to plot something?
Thanks for taking the time to respond.
The code is a modified version or period based Daravs Box (https://www.tradingview.com/v/cRqNbBLU/) there isn't much information, but like the traditional DarvasBox, it's following the trend plotting new high and low transition lines.

the original code from post#6 shows 3 valuewhen conditions.
first appears to be checking high against lowest low
2nd seems to be checking against high against last high
and 3rd condition looks to be testing last high against last 2 bars to identify latest low.

i was merely trying to plug values, so i'm sure i've not done it correctly.
 

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
522 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top