MTF Arrows: choose 1 of 3 sets, of 5 periods

halcyonguy

Moderator - Expert
VIP
Lifetime
EDIT -- 22-01-7
version 2
study has been updated

had a request to turn some labels off, the stat labels, but keep the time labels visible, so i added a 2nd input.
one to control the stat labels, and one to control just the MTF time labels.

---------------------------------------------

This study draws 5 arrows and labels, to indicate price movements, from 5 different aggregation times.

...choose 1 of 3 sets of aggregations: short, medium, long.
. set1 - short , 3,5,10,15,30
. set2 - med , 15,30,H,2H,4H
. set3 - long , D,W,M,Q,Y
...a bubble is drawn that has the time description text for the periods. it can be drawn below the arrows or to the right of them.
...choose data type: current bar, open to close. or bar to bar, close
. if bar to bar, can pick how many bars apart
...if agg time is less than chart time, the label will be light blue, and a triangle will be drawn instead of an arrow.

It won't create an error if an aggregation time is less than the chart time.
It compares aggregations and doesn't assign a time period to a variable, if it is less than the chart time.
This is one way to avoid aggregation errors, that can stop a study from running.

I used inputs to set text values to variables, for the time period descriptions. this made it easier to reference the data, instead of using long if-thens to choose the text. if the input text is changed then the aggregation times in the code will have to be changed. one doesn't auto change the other.

this is one i have looked at now and then and decided to finish it.
I searched, but didn't see a study like this.

1NLqhWZ.jpg


Code:
# mtf_arrows_02

#-----------------
# 22-01-7
# EDIT  chg how labels are visible. separate stats and times
# version 2
#-----------------
# 21-11-19
# MTF arrows
# halcyonguy
#-----------------

#hint: \n <b> MTF Arrows </b> \n Determine price changes, from 5 different aggregations, \n and draw arrows and labels, to indicate the price directions. \n  ...1 of 3 sets of aggregations: short, medium, long. \n...data: current bar, open to close, or bar to bar, close \n ...if bar to bar, pick how many bars apart \n ...if agg time is less than chart time, the label will be light blue, and a triangle will be drawn instead of an arrow

# ------------------------------

def na = Double.NaN;
def bn = BarNumber();
def cls = close;

# ------------------------------
def chartagg = GetAggregationPeriod();
def chartmin = (chartagg / 1000) / 60;
#AddLabel(1, "chartmin " + chartmin, Color.MAGENTA);

# -----------------------------

input mtf_time_group = { default short, med, long };
#  set1 - short , 3,5,10,15,30
#  set2 - med   , 15,30,H,2H,4H
#  set3 - long  , D,W,M,Q,Y

def set;
def t1agg;
def t2agg;
def t3agg;
def t4agg;
def t5agg;
def t1;
def t2;
def t3;
def t4;
def t5;
switch (mtf_time_group) {
case short:
    set = 1;
#    t1 = AggregationPeriod.FIVE_MIN;
#    t2 = AggregationPeriod.TEN_MIN;
#    t3 = AggregationPeriod.FIFTEEN_MIN;
#    t4 = AggregationPeriod.THIRTY_MIN;
#    t5 = AggregationPeriod.HOUR;

# if an agg time is assigned to a variable, that is less than the chart agg, it causes an error
#  check for invalid agg time , before assigning agg to a var
#  if an invalid agg, set var to the chart agg. set other var to 1 , t1agg,..
    t1agg = if (chartagg > AggregationPeriod.FIVE_MIN) then 1 else 0;
    t2agg = if (chartagg > AggregationPeriod.TEN_MIN) then 1 else 0;
    t3agg = if (chartagg > AggregationPeriod.FIFTEEN_MIN) then 1 else 0;
    t4agg = if (chartagg > AggregationPeriod.THIRTY_MIN) then 1 else 0;
    t5agg = if (chartagg > AggregationPeriod.HOUR) then 1 else 0;

    t1 = if (chartagg > AggregationPeriod.FIVE_MIN) then chartagg else  AggregationPeriod.FIVE_MIN;
    t2 = if (chartagg > AggregationPeriod.TEN_MIN) then chartagg else  AggregationPeriod.TEN_MIN;
    t3 = if (chartagg > AggregationPeriod.FIFTEEN_MIN) then chartagg else  AggregationPeriod.FIFTEEN_MIN;
    t4 = if (chartagg > AggregationPeriod.THIRTY_MIN) then chartagg else  AggregationPeriod.THIRTY_MIN;
    t5 = if (chartagg > AggregationPeriod.HOUR) then chartagg else  AggregationPeriod.HOUR;
case med:
    set = 2;
#   t1 = AggregationPeriod.THIRTY_MIN;
#   t2 = AggregationPeriod.HOUR;
#   t3 = AggregationPeriod.two_HOURS;
#   t4 = AggregationPeriod.FOUR_HOURS;
#   t5 = AggregationPeriod.DAY;

    t1agg = if (chartagg > AggregationPeriod.THIRTY_MIN) then 1 else 0;
    t2agg = if (chartagg > AggregationPeriod.HOUR) then 1 else 0;
    t3agg = if (chartagg > AggregationPeriod.TWO_HOURS) then 1 else 0;
    t4agg = if (chartagg > AggregationPeriod.FOUR_HOURS) then 1 else 0;
    t5agg = if (chartagg > AggregationPeriod.DAY) then 1 else 0;

    t1 = if (chartagg > AggregationPeriod.THIRTY_MIN) then chartagg else  AggregationPeriod.THIRTY_MIN;
    t2 = if (chartagg > AggregationPeriod.HOUR) then chartagg else  AggregationPeriod.HOUR;
    t3 = if (chartagg > AggregationPeriod.TWO_HOURS) then chartagg else  AggregationPeriod.TWO_HOURS;
    t4 = if (chartagg > AggregationPeriod.FOUR_HOURS) then chartagg else  AggregationPeriod.FOUR_HOURS;
    t5 = if (chartagg > AggregationPeriod.DAY) then chartagg else  AggregationPeriod.DAY;
case long:
    set = 3;
#    t1 = AggregationPeriod.DAY;  # 1440 minutes
#    t2 = AggregationPeriod.WEEK; # 10080 min
#    t3 = AggregationPeriod.MONTH; # 43200 min
#    t4 = AggregationPeriod.QUARTER; # 129600 min
#    t5 = AggregationPeriod.YEAR;

    t1agg = if (chartagg > AggregationPeriod.DAY) then 1 else 0;
    t2agg = if (chartagg > AggregationPeriod.WEEK) then 1 else 0;
    t3agg = if (chartagg > AggregationPeriod.MONTH) then 1 else 0;
    t4agg = if (chartagg > AggregationPeriod.QUARTER) then 1 else 0;
    t5agg = if (chartagg > AggregationPeriod.YEAR) then 1 else 0;

    t1 = if (chartagg > AggregationPeriod.DAY) then chartagg else  AggregationPeriod.DAY;
    t2 = if (chartagg > AggregationPeriod.WEEK) then chartagg else  AggregationPeriod.WEEK;
    t3 = if (chartagg > AggregationPeriod.MONTH) then chartagg else  AggregationPeriod.MONTH;
    t4 = if (chartagg > AggregationPeriod.QUARTER) then chartagg else  AggregationPeriod.QUARTER;
    t5 = if (chartagg > AggregationPeriod.YEAR) then chartagg else  AggregationPeriod.YEAR;
}

# time minutes
# check if there was an agg error
def n1 = if t1agg then 0 else t1 / 60000;
def n2 = if t2agg then 0 else t2 / 60000;
def n3 = if t3agg then 0 else t3 / 60000;
def n4 = if t4agg then 0 else t4 / 60000;
def n5 = if t5agg then 0 else t5 / 60000;

#--------------------------------

#options, arrow layouts ,   1. current bar  ,  2. bar to bar
input arrow_data = { default current_bar_open_to_close , bar_to_bar_close };

def typ;
switch (arrow_data) {
case current_bar_open_to_close:
#  current bar, open to close
    typ = 1;
case bar_to_bar_close:
#  prev close to current close
    typ = 2;
}

# ---------------------

input bar2bar_offset = 1;
def off2 = if typ == 1 then 0 else bar2bar_offset;

# ---------------------------

# time letters
# if agg times are changed above , in code lines 100+, these words will have to be changed
#  use inputs for default text descripters.
#  this way, won't have to use many long if-thens to find corrent text
input set1_short_times = no;
#hint set1_short_times: if the aggregation times are changed in code, in this section, \n switch (mtf_time_group) \n these words will have to be changed, to match them.
input set1_t1 = "5";
input set1_t2 = "10";
input set1_t3 = "15";
input set1_t4 = "30";
input set1_t5 = "60";

input set2_medium_times = no;
input set2_t1 = "30";
input set2_t2 = "H";
input set2_t3 = "2H";
input set2_t4 = "4H";
input set2_t5 = "D";

input set3_long_times = no;
input set3_t1 = "D";
input set3_t2 = "W";
input set3_t3 = "M";
input set3_t4 = "Q";
input set3_t5 = "Y";

# ----------------------------------------------

# last bar , most recent
def lastbar = !IsNaN(close[0]) and IsNaN(close[-1]);
# get close price from last bar, and keep, for arrow locating
def lastcls = if BarNumber() == 1 then 0 else if lastbar then close else lastcls[1];

# -----------------------

input show_stat_labels = no;
AddLabel(show_stat_labels, "-", Color.BLACK);
AddLabel(show_stat_labels, arrow_data, Color.YELLOW);
AddLabel(show_stat_labels , " [" + off2 + "] ", Color.YELLOW);

# -----------------------------------

# price change , current bar , or bar to bar
def cl1 = if t1agg then 0 else close(period = t1);
def op1 = if t1agg then 0 else if typ == 2 then close(period = t1)[bar2bar_offset] else open(period = t1);
def is1up = if lastbar then (cl1 > op1) else is1up[1];
def is1flat = if lastbar then (cl1 == op1) else is1flat[1];

def cl2 = if t2agg then 0 else close(period = t2);
def op2 = if t2agg then 0 else if typ == 2 then close(period = t2)[bar2bar_offset] else open(period = t2);
def is2up = if lastbar then (cl2 > op2) else is2up[1];
def is2flat = if lastbar then (cl2 == op2) else is2flat[1];

def cl3 = if t3agg then 0 else close(period = t3);
def op3 = if t3agg then 0 else if typ == 2 then close(period = t3)[bar2bar_offset] else open(period = t3);
def is3up = if lastbar then (cl3 > op3) else is3up[1];
def is3flat = if lastbar then (cl3 == op3) else is3flat[1];

def cl4 = if t4agg then 0 else close(period = t4);
def op4 = if t4agg then 0 else if typ == 2 then close(period = t4)[bar2bar_offset] else open(period = t4);
def is4up = if lastbar then (cl4 > op4) else is4up[1];
def is4flat = if lastbar then (cl4 == op4) else is4flat[1];

def cl5 = if t5agg then 0 else close(period = t5);
def op5 = if t5agg then 0 else if typ == 2 then close(period = t5)[bar2bar_offset] else open(period = t5);
def is5up = if lastbar then (cl5 > op5) else is5up[1];
def is5flat = if lastbar then (cl5 == op5) else is5flat[1];

# -----------------------------------

AddLabel(show_stat_labels, "-", Color.BLACK);
AddLabel(show_stat_labels,  "Agg set: " + mtf_time_group, Color.YELLOW );

input show_time_labels = yes;
AddLabel(show_time_labels, "-", Color.BLACK);
#AddLabel(show_labels, (if set == 1 then set1_t1 else if set == 2 then set2_t1 else if set == 3 then set3_t1 else "-"), (if is1up then Color.GREEN else Color.RED) );
AddLabel(show_time_labels, (if set == 1 then set1_t1 else if set == 2 then set2_t1 else if set == 3 then set3_t1 else "-"),
(if t1agg then Color.CYAN else if is1up then Color.GREEN else Color.RED) );

AddLabel(show_time_labels, (if set == 1 then set1_t2 else if set == 2 then set2_t2 else if set == 3 then set3_t2 else "-"),
(if t2agg then Color.CYAN else if is2up then Color.GREEN else Color.RED) );

AddLabel(show_time_labels, (if set == 1 then set1_t3 else if set == 2 then set2_t3 else if set == 3 then set3_t3 else "-"),
(if t3agg then Color.CYAN else if is3up then Color.GREEN else Color.RED) );

AddLabel(show_time_labels, (if set == 1 then set1_t4 else if set == 2 then set2_t4 else if set == 3 then set3_t4 else "-"),
(if t4agg then Color.CYAN else if is4up then Color.GREEN else Color.RED) );

AddLabel(show_time_labels, (if set == 1 then set1_t5 else if set == 2 then set2_t5 else if set == 3 then set3_t5 else "-"),
(if t5agg then Color.CYAN else if is5up then Color.GREEN else Color.RED) );

AddLabel(show_time_labels, "-", Color.BLACK);

# -----------------------------------------
input show_arrows = yes;

input offset_to_arrows = 2;
#hint offset_to_arrows: How many bars past the last bar, to draw arrows.
def bif = offset_to_arrows;
# bars in future

# define points after last bar
def x0 = IsNaN(cls[bif - 1]) and !IsNaN(cls[bif + 0]);

def x1 = IsNaN(cls[bif + 0]) and !IsNaN(cls[bif + 1]);
def x2 = IsNaN(cls[bif + 1]) and !IsNaN(cls[bif + 2]);
def x3 = IsNaN(cls[bif + 2]) and !IsNaN(cls[bif + 3]);
def x4 = IsNaN(cls[bif + 3]) and !IsNaN(cls[bif + 4]);
def x5 = IsNaN(cls[bif + 4]) and !IsNaN(cls[bif + 5]);

def x6 = IsNaN(cls[bif + 5]) and !IsNaN(cls[bif + 6]);
def x7 = IsNaN(cls[bif + 6]) and !IsNaN(cls[bif + 7]);

# ===================================================

input mtf_bubble_location = { default below_arrows , after_arrows };

def xpos;
def bubble_vert;
switch (mtf_bubble_location) {
case below_arrows:
    xpos = x1;
#  bubble_vert = 0.001;
    bubble_vert = 0.003;
case after_arrows:
    xpos = x6;
    bubble_vert = 0.0;
}

# ===================================================

# draw horz line , after last bar, at close level, arrow line
input horz_line_after_lastbar = yes;
def hl = (x0 or x1 or x2 or x3 or x4 or x5 or x6);
def arrowline = if !show_arrows then na else hl;
plot al = if (horz_line_after_lastbar and arrowline) then lastcls else na;
al.SetDefaultColor(Color.LIGHT_GRAY);

# ===================================================

# vertical pos of bubble. level for either below or after
def bubvert = (lastcls * (1 - ((set ) * bubble_vert)));

# show 1 of 3 bubbles, with time descriptions
# short
AddChartBubble(set == 1 and xpos and show_arrows, bubvert, ( set1_t1 + "|" + set1_t2 + "|" + set1_t3 + "|" + set1_t4 + "|" + set1_t5) , Color.YELLOW, no );

# medium
AddChartBubble(set == 2 and xpos and show_arrows, bubvert, ( set2_t1 + "|" + set2_t2 + "|" + set2_t3 + "|" + set2_t4 + "|" + set2_t5), Color.YELLOW, no );

# long
AddChartBubble(set == 3 and xpos and show_arrows, bubvert, ( set3_t1 + "|" + set3_t2 + "|" + set3_t3 + "|" + set3_t4 + "|" + set3_t5), Color.YELLOW, no );


# --------------------------------------------------------------
# experiment with vertical arrow adjustments, so up and down arrows would be side by side.
# gave up , too many price ranges, scales.
# input arrow_vert = 0.0012;
# input v = 4;
# def arrow_vert = 0.0012/v;
def arrow_vert = 0;
# plot arrows after last close

# ==============================================================
# 1st arrow , x1 , T1

# 1st , up
plot k1u = if (show_arrows and x1 and is1up and !is1flat and !t1agg) then (lastcls * (1 + arrow_vert)) else na;
k1u.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
k1u.SetDefaultColor(Color.GREEN);
k1u.SetLineWeight(4);

# 1st , down
plot k1d = if (show_arrows and x1 and !is1up and !is1flat and !t1agg) then (lastcls * (1 - arrow_vert)) else na;
k1d.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
k1d.SetDefaultColor(Color.RED);
k1d.SetLineWeight(4);

# 1st , flat
plot k1f = if (show_arrows and x1 and is1flat and !t1agg) then lastcls else na;
k1f.SetPaintingStrategy(PaintingStrategy.SQUARES);
k1f.SetDefaultColor(Color.WHITE);
k1f.SetLineWeight(4);

# 1st bad agg
plot k1z = if (show_arrows and x1 and t1agg) then lastcls else na;
k1z.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
k1z.SetDefaultColor(Color.CYAN);
k1z.SetLineWeight(4);


# ============================================

# 2nd arrow , x2 , T2

# 2nd , up
plot k2u = if (show_arrows and x2 and is2up and !is2flat and !t2agg) then (lastcls * (1 + arrow_vert)) else na;
k2u.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
k2u.SetDefaultColor(Color.GREEN);
k2u.SetLineWeight(4);

# 2nd , down
plot k2d = if (show_arrows and x2 and !is2up and !is2flat and !t2agg) then (lastcls * (1 - arrow_vert)) else na;
k2d.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
k2d.SetDefaultColor(Color.RED);
k2d.SetLineWeight(4);

# 2nd , flat
plot k2f = if (show_arrows and x2 and is2flat and !t2agg) then lastcls else na;
k2f.SetPaintingStrategy(PaintingStrategy.SQUARES);
k2f.SetDefaultColor(Color.WHITE);
k2f.SetLineWeight(4);

# 2nd bad agg
plot k2z = if (show_arrows and x2 and t2agg) then lastcls else na;
k2z.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
k2z.SetDefaultColor(Color.CYAN);
k2z.SetLineWeight(4);

# ============================================

# 3rd arrow , x3 , T3

# 3rd , up
plot k3u = if (show_arrows and x3 and is3up and !is3flat and !t3agg) then (lastcls * (1 + arrow_vert)) else na;
k3u.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
k3u.SetDefaultColor(Color.GREEN);
k3u.SetLineWeight(4);

# 3rd , down
plot k3d = if (show_arrows and x3 and !is3up and !is3flat and !t3agg) then (lastcls * (1 - arrow_vert)) else na;
k3d.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
k3d.SetDefaultColor(Color.RED);
k3d.SetLineWeight(4);

# 3rd , flat
plot k3f = if (show_arrows and x3 and is3flat and !t3agg) then lastcls else na;
k3f.SetPaintingStrategy(PaintingStrategy.SQUARES);
k3f.SetDefaultColor(Color.WHITE);
k3f.SetLineWeight(4);

# 1st bad agg
plot k3z = if (show_arrows and x3 and t3agg) then lastcls else na;
k3z.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
k3z.SetDefaultColor(Color.CYAN);
k3z.SetLineWeight(4);

# ============================================

# 4th arrow , x4 , T4

# 4th , up
plot k4u = if (show_arrows and x4 and is4up and !is4flat and !t4agg) then (lastcls * (1 + arrow_vert)) else na;
k4u.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
k4u.SetDefaultColor(Color.GREEN);
k4u.SetLineWeight(4);

# 4th , down
plot k4d = if (show_arrows and x4 and !is4up and !is4flat and !t4agg) then (lastcls * (1 - arrow_vert)) else na;
k4d.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
k4d.SetDefaultColor(Color.RED);
k4d.SetLineWeight(4);

# 4th , flat
plot k4f = if (show_arrows and x4 and is4flat and !t4agg) then lastcls else na;
k4f.SetPaintingStrategy(PaintingStrategy.SQUARES);
k4f.SetDefaultColor(Color.WHITE);
k4f.SetLineWeight(4);

# 1st bad agg
plot k4z = if (show_arrows and x4 and t4agg) then lastcls else na;
k4z.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
k4z.SetDefaultColor(Color.CYAN);
k4z.SetLineWeight(4);

# ============================================

# 5th arrow , x5 , T5

# 5th , up
plot k5u = if (show_arrows and x5 and is5up and !is5flat and !t5agg) then (lastcls * (1 + arrow_vert)) else na;
k5u.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
k5u.SetDefaultColor(Color.GREEN);
k5u.SetLineWeight(4);

# 5th , down
plot k5d = if (show_arrows and x5 and !is5up and !is5flat and !t5agg) then (lastcls * (1 - arrow_vert)) else na;
k5d.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
k5d.SetDefaultColor(Color.RED);
k5d.SetLineWeight(4);

# 5th , flat
plot k5f = if (show_arrows and x5 and is5flat and !t5agg) then lastcls else na;
k5f.SetPaintingStrategy(PaintingStrategy.SQUARES);
k5f.SetDefaultColor(Color.WHITE);
k5f.SetLineWeight(4);

# 1st bad agg
plot k5z = if (show_arrows and x5 and t5agg) then lastcls else na;
k5z.SetPaintingStrategy(PaintingStrategy.TRIANGLES);
k5z.SetDefaultColor(Color.CYAN);
k5z.SetLineWeight(4);

# ============================================

# test price data
input test3_mtf_prices = no;
#hint test3_mtf_prices: Show a bubble, with start and stop prices, for each of the 5 time periods.

AddChartBubble(test3_mtf_prices and lastbar , (lastcls * 1.002),
 "start  /  stop  /  offset: " + off2 + "\n" +
 "t1  " + is1up + "  " + op1 + "  /  " + cl1 + "\n" +
 "t2  " + is2up + "  " + op2 + "  /  " + cl2 + "\n" +
 "t3  " + is3up + "  " + op3 + "  /  " + cl3 + "\n" +
 "t4  " + is4up + "  " + op4 + "  /  " + cl4 + "\n" +
 "t5  " + is5up + "  " + op5 + "  /  " + cl5 , Color.YELLOW, yes);

# ============================================

# code not used

# draw a box with a vert line for bad agg
#  this works, but too involved. will just draw a triangle.
#  test with x6,  is true on one bar after the last bar
#def vfac = 0.0004;
#def ac1open = if !x6 then na else ( lastcls - (lastcls * vfac));
#def ac1close = if !x6 then na else (lastcls + (lastcls * vfac));
# draw the high at the open, to put a vert line in box
#def ac1hi = if !x6 then na else ac1open;
#def ac1lo = if !x6 then na else ac1open;
#AddChart(growColor = Color.cyan, fallColor = Color.cyan, high = ac1hi, low = ac1lo, open = ac1open, close = ac1close, type = ChartType.CANDLE);

# ============================================
#
hal_arrow, hal_agg
 
Last edited:
Which to pick and Why? choose data type: current bar, open to close. or bar to bar, close

why?
because i like to figure out how to do things, several ways.
to give people options.
because not everyone looks at the same data.

which?
whichever change in price value that you want to look at.

...
i have no opinion for its use. i don't use it. i didn't see anything like it here, so i made it, for the challenge of coding it and for others.
 
why?
because i like to figure out how to do things, several ways.
to give people options.
because not everyone looks at the same data.

which?
whichever change in price value that you want to look at.

...
i have no opinion for its use. i don't use it. i didn't see anything like it here, so i made it, for the challenge of coding it and for others.
Thank you very much for making this. It looks like this was made in 2021. I just came across this and find it extremely helpful. Thank you for your generosity. 😄
 
First, Nice job on the study.

I came across this while searching and think it might be useful to others and should be link with the Rob Smith Strat section.
 

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

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
484 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