Multi-TimeFrame Candles Overlay for ThinkOrSwim

@Townsend @RobertPayne made some progress on the script but there's something off with my aggregation of bars leading to some oddities. Was wondering if you guys could provide some feedback. You can see with the alternating cyan/red lines on the lower study my calculated bars of a day are larger than the actual bar for the day

3sdeJeQ.png


I know the issue lies here but not sure how to fix (Full Code Below):

Code:
def lowerPeriod = GetAggregationPeriod();
def numberOfLowerInHigher = agg/lowerPeriod;

def counter = counter[1] +1;
def pSwitch = if counter % numberOfLowerInHigher == 0 then if pSwitch[1] == 1 then 0 else 1 else pSwitch[1];

def per1 = if pSwitch == 0 then 1 else double.nan;
def per2 = if pSwitch == 1 then 1 else double.nan;
def per3 = if counter % numberOfLowerInHigher == RoundDown(numberOfLowerInHigher/2,0) then barnumber() else double.nan;

AddCloud( if (per1, c, double.nan), if (per1, o, double.nan), Color.Green, Color.Red);
AddCloud( if (per2, c, double.nan), if (per2, o, double.nan), Color.Green, Color.Red);
# end


FULL CODE:

Code:
# Multi-Time-Frame Candle Overlay version 2.4
# 2020 Paul Townsend modified by User1m
# with code from UseThinkScript.com

input agg = AggregationPeriod.DAY;
input OpenCloseLines = yes;
input HighLowLines = yes;
input HighLowGray = no;
input LineWeight =2;

addlabel(yes,"[" + agg/60000 + "]",color.white);

plot o = open(period = agg);
plot c = close(period = agg);
def h = high(period = agg);
def l = low(period = agg);

o.sethiding(!OpenCloseLines);
c.sethiding(!OpenCloseLines);

o.setLineWeight(lineweight);
c.setLineWeight(lineweight);

o.AssignValueColor(if o==c then color.white else if o > c then Color.red else Color.green);
c.AssignValueColor(if o==c then color.white else if o > c then Color.red else Color.green);

def lowerPeriod = GetAggregationPeriod();
def numberOfLowerInHigher = agg/lowerPeriod;

def counter = counter[1] +1;
def pSwitch = if counter % numberOfLowerInHigher == 0 then if pSwitch[1] == 1 then 0 else 1 else pSwitch[1];

def per1 = if pSwitch == 0 then 1 else double.nan;
def per2 = if pSwitch == 1 then 1 else double.nan;
def per3 = if counter % numberOfLowerInHigher == RoundDown(numberOfLowerInHigher/2,0) then barnumber() else double.nan;

AddCloud( if (per1, c, double.nan), if (per1, o, double.nan), Color.Green, Color.Red);
AddCloud( if (per2, c, double.nan), if (per2, o, double.nan), Color.Green, Color.Red);

o.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
c.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

plot pH = if per3 then h else double.nan;
plot pL = if per3 then l else double.nan;

pH.SetPaintingStrategy(PaintingStrategy.POINTS);
pL.SetPaintingStrategy(PaintingStrategy.POINTS);

pH.sethiding(!HighLowLines);
pL.sethiding(!HighLowLines);

pH.setLineWeight(lineweight);
pL.setLineWeight(lineweight);

pH.AssignValueColor(if highlowgray then color.gray else if o==c then color.white else if o > c then Color.red else Color.green);
pL.AssignValueColor(if highlowgray then color.gray else if o==c then color.white else if o > c then Color.red else Color.green);

def hb = if per3 then h else double.nan;
def lb = if per3 then l else double.nan;

AddChart(high = hb, low = lb, open = double.nan, close = double.nan, type = ChartType.bar, growcolor = color.white);
# end
 
Last edited:
Oh cool! I hadn't seen the new code. I adapted Paul's study to my STRAT candle study but I didn't realize this was an issue. Did it fix it?

Does it make a difference if you select/deselect extended hours?
 
Last edited by a moderator:
This is very interesting @bperott7 . I am working on something similar for tick charts. Basically to aggregate and show what the 5000 tick chart looks like when viewing a 500 tick chart. Do you have thoughts on modifying this code to make it work for non-time-based charts? I basically just need to aggregate 10 candles on the smaller chart to equal one on the larger...but the open/high/low/close calculations seem trickier than using aggperiod for the time-based charts.
 
Hello could you post the code verse a link ? thanks
Yeah for sure @Trading51 , even though it is accessible from importing that link.

Code:
DECLARE UPPER;
#------------------------------------
# MTF SECTION
#------------------------------------
input Time_Frame = AggregationPeriod.FIFTEEN_MIN;
DEF H = high(period = Time_Frame);
DEF L = low(period = Time_Frame);
DEF O = open(period = Time_Frame);
DEF C = close(period = Time_Frame);
def NA = double.Nan;


#------------------------------------
# ADD CLOUDS
#------------------------------------
input addcloud = yes;
def side = if side[1] == 1 then 2 else 1;
DEF sider = side;
AddCloud( if sider == 2 then O else Double.NaN, if sider == 2 then C else Double.NaN, COLOR.light_Red, COLOR.light_Green);
AddCloud( if sider == 1 then O else Double.NaN, if sider == 1 then C else Double.NaN, COLOR.light_red, COLOR.light_green);

Def newbar = if O != O[1] then 1 else 0;

# Number of bars within the lower timeframe
def lowerTimeFrameBarCount =  Time_Frame / GetAggregationPeriod();
def bn = BarNumber();
# Determine the position of each bar using the remainder with value of 0 = lowerTimeFrameBarCount
def remainder = bn % lowerTimeFrameBarCount;
def bar = if remainder == 0 then lowerTimeFrameBarCount else remainder;
#Find the middle bar in the lower timeframe - odd numbers add 0.5 to plot the wicks on the higher time frame
def midBar = if lowerTimeFrameBarCount % 2 == 0 then lowerTimeFrameBarCount/2 else lowerTimeFrameBarCount/2 + 0.5;

def openbar = if lowerTimeFrameBarCount % 2 == 0 then LowertimeFrameBarCount else LowerTimeFrameBarCount - 5;

### making stuff up here drawing the wick through the middle candle.
def nan = double.nan;
def hb = if bar == midBar then h else nan;
def lb = if bar == midBar then l else nan;
def bb = c > o;



AddChart(if bb then hb else na, if bb then lb else na, if bb then o else na, if bb then c else na, type = ChartType.bar, growcolor = color.light_green );

AddChart( if !bb then hb else na, if !bb then lb else na, if !bb then o else na, if !bb then c else na, type = ChartType.Bar, growColor = color.Light_red);



plot highs = if bb then hb else na;
highs.setpaintingStrategy(PaintingStrategy.POINTS);
highs.setDefaultColor(Color.Green);

plot lhighs = if !bb then hb else na;
lhighs.setpaintingStrategy(paintingstrategy.points);
lhighs.setdefaultColor(Color.Red);

plot lows = if bb then lb else na;
lows.setpaintingStrategy(PaintingStrategy.Points);
lows.setdefaultColor(Color.Green);

plot llows = if !bb then lb else na;
llows.setpaintingStrategy(PaintingStrategy.POINTS);
llows.SetDefaultColor(Color.Red);



#------------------------------------
# ADD LABEL
#------------------------------------
input Show_Label = yes;
AddLabel(Show_Label, Concat(if Time_Frame < 3600000 then Time_Frame / 60000 + "m" else if Time_Frame < 86400000 then Time_Frame / 3600000 + "h" else if Time_Frame < 604800000 then Time_Frame / 86400000 + "D" else if Time_Frame < 2592000000 then Time_Frame / 604800000 + "Wk" else if Time_Frame < 31536000000 then Time_Frame / 2592000000 + "Mo" else Time_Frame / 31536000000 + "Yr", if Time_Frame then " CANDLES" else ""), Color.light_Gray);

# end
 
with TOS update not sure why when i open the link it doesn't allow to save under a name so i can find it i use to have no issues
 
This is very interesting @bperott7 . I am working on something similar for tick charts. Basically to aggregate and show what the 5000 tick chart looks like when viewing a 500 tick chart. Do you have thoughts on modifying this code to make it work for non-time-based charts? I basically just need to aggregate 10 candles on the smaller chart to equal one on the larger...but the open/high/low/close calculations seem trickier than using aggperiod for the time-based charts.
I honestly don't know enough about tick charts in TOS to know if this is really even possible

with TOS update not sure why when i open the link it doesn't allow to save under a name so i can find it i use to have no issues
They did an update over the weekend that changed how that process works but I think they changed it for the better honestly, when you import it may send the screen to the background but you should be able to rename and everything from the same screen after pressing open shared item and preview.
 
I honestly don't know enough about tick charts in TOS to know if this is really even possible


They did an update over the weekend that changed how that process works but I think they changed it for the better honestly, when you import it may send the screen to the background but you should be able to rename and everything from the same screen after pressing open shared item and preview.
thanks i will check it
 
There's an indicator sold on FunWithThinkScript which draws larger candle images from a longer timeframe onto a shorter timeframe chart:

Draw-Big-Bars-In-To-S.jpg


I can't find any reference to the kind of drawing/graphics tools in TS which would be required to do this sort of work... can anyone explain how this can be done, or provide a link to a helpful reference, please?
 
@bperott7 Hey, I've been trying to use your indicator code but the wicks are skewed. It seems like TOS does a wierd thing at the end of the day where the last bar is not quite the full size and this skews the calculations or something.

2021-02-10-23-44-32.png

23o1hhk.png
 
@bperott7 Hey, I've been trying to use your indicator code but the wicks are skewed. It seems like TOS does a wierd thing at the end of the day where the last bar is not quite the full size and this skews the calculations or something.

2021-02-10-23-44-32.png

23o1hhk.png
That's because 1 hour candles aren't even numbers for each day, use a 65 minute chart instead
 
is there any way to have the Open and Close of the last M15 candle projected forward by 15 minutes on the M1 chart?


Code:
# Multi-Time-Frame Candle Overlay version 2.4
# 2020 Paul Townsend
# with code from UseThinkScript.com

input agg = AggregationPeriod.fifteen_min;
input OpenCloseLines = yes;
input HighLowLines = yes;
input HighLowGray = no;
input LineWeight =2;


addlabel(yes,"[" + agg/60000 + "]",color.white);

plot o = open(period = agg);
plot c = close(period = agg);
plot h = high(period = agg);
plot l = low(period = agg);

o.sethiding(!OpenCloseLines);
c.sethiding(!OpenCloseLines);
h.sethiding(!HighLowLines);
l.sethiding(!HighLowLines);

o.setLineWeight(lineweight);
c.setLineWeight(lineweight);
h.setLineWeight(lineweight);
l.setLineWeight(lineweight);

o.AssignValueColor(if o==c then color.white else if o > c then Color.red else Color.green);
c.AssignValueColor(if o==c then color.white else if o > c then Color.red else Color.green);
h.AssignValueColor(if highlowgray then color.gray else if o==c then color.white else if o > c then Color.red else Color.green);
l.AssignValueColor(if highlowgray then color.gray else if o==c then color.white else if o > c then Color.red else Color.green);

def side = if side[1] == 1 then 2 else 1; plot sider = side; sider.hide();
AddCloud( if sider==2 then c else double.nan, o, Color.green, Color.red);
AddCloud( if sider==1 then c else double.nan, o, Color.green, Color.red);

o.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
c.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
h.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
l.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

# end
 
Here is the MTF candlestick indicator for ThinkorSwim. This indicator will overlay higher time frame candles onto your chart.


Here are the following modifications to the candlestick chart overlay script:

Code:
# Multi-Time-Frame Candle Overlay version 2.4a
# 2020 Paul Townsend
# with code from UseThinkScript.com
# 01.25.2021 - BLT - Modified Addcloud to match horizontal lines

# 04.20.2021 - Sleepyz - Added Bar method instead of aggregationperiod method to create overlay candles. Used TOS VolumeProfile() code to make the candles.

# Label Display: On tick or range charts, it will display the number of Bars
#                On Day or Higher charts, it will dispaly the number of Days
#                On Intraday Charts, it will display then number of minutes

# Examples: numberofbars == 8 on a 1 minute chart ==  8 minute bars
#           numberofbars == 6 on a 5 minute chart == 30 minute bars
#           numberofbars == 10 on a 1 Day chart == 2 Week or 10 Day bars
# Intraday, the bars start @regular trading day start time
 
input numberofbars   = 10;
input OpenCloseLines = yes;
input HighLowLines   = yes;
input HighLowGray    = no;
input LineWeight     = 2;
input showlabel      = yes;

AddLabel(showlabel,  if getaggregationPeriod()/60000 <1
                     then numberofbars + " Bars"
                     else if GetAggregationPeriod() < AggregationPeriod.DAY
                     then numberofbars * GetAggregationPeriod() / 60000 + " minutes"
                     else + numberofbars + " Days" , Color.WHITE);

#TOS VolumeProfile used to determine high/low and break per numberofbars
def period  = BarNumber() - 1;
def count   = CompoundValue(1, if GetAggregationPeriod() < AggregationPeriod.DAY and
                               GetTime() crosses above RegularTradingStart(GetYYYYMMDD())
                               then 0
                               else if period != period[1]
                               then (count[1] + period - period[1]) % (numberofbars)
                               else count[1], 0);
def cond    = count < count[1] + period - period[1];

profile vol = VolumeProfile("startNewProfile" = cond, "onExpansion" = no, "numberOfProfiles" = 1000, "pricePerRow" = PricePerRow.AUTOMATIC, "value area percent" = 0);

def hProfile = if IsNaN(vol.GetHighest()) then hProfile[1] else vol.GetHighest();
def lProfile = if IsNaN(vol.GetLowest())  then lProfile[1] else vol.GetLowest();


def p = if cond % (numberofbars) then p[1] + 1 else p[1];
def x = if !IsNaN(close) and IsNaN(close[-1]) then p else Double.NaN;

def o1 = if p != p[1]  then open else o1[1];
def c1 = if p != p[-1] then close else c1[1];
def c2 = HighestAll(if IsNaN(close[-1]) and !IsNaN(close) then close else Double.NaN);

plot o = o1;
plot c = if p==highestall(x) then c2 else GetValue(c1[1], - numberofbars);
plot h = if p>highestall(x) then double.nan else hProfile;
plot l = if p>highestall(x) then double.nan else lProfile;

o.SetHiding(!OpenCloseLines);
c.SetHiding(!OpenCloseLines);
h.SetHiding(!HighLowLines);
l.SetHiding(!HighLowLines);

o.SetLineWeight(LineWeight);
c.SetLineWeight(LineWeight);
h.SetLineWeight(LineWeight);
l.SetLineWeight(LineWeight);

o.AssignValueColor(if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);
c.AssignValueColor(if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);
h.AssignValueColor(if HighLowGray then Color.GRAY else if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);
l.AssignValueColor(if HighLowGray then Color.GRAY else if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);

input addcloud = yes;
def side = if p[-1] != p then 2 else 1;
plot sider = side;
sider.Hide();
AddCloud( if sider == 2 then c else Double.NaN, o, Color.GREEN, Color.RED);
AddCloud( if sider == 1 then c else Double.NaN, o, Color.GREEN, Color.RED);
AddCloud( if sider!=sider[-1] then c else Double.NaN, o, Color.GREEN, Color.RED);

o.SetPaintingStrategy(PaintingStrategy.DASHES);
c.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
h.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
l.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

o.hidebubble();
c.hidebubble();
h.hidebubble();
l.hidebubble();

# end

Time chart
time.jpg
Tick Chart
range.jpg

Range Chart
range.jpg
 
Last edited:
Here is an update to the modification above:

Added sides to overlay candles and a psuedo buying/selling volume bubbles option for each overlay candle, based upon the formula commoningly used for this, as TOS does provide for actual amounts; buying (close-low)/(high-low) * volume
selling (high-close)/(high-low)* volume


The overlay should work on all chart types. You can create custom timeframes on time based charts beyond the preset TOS aggregationperiods.
Capture.jpg

Code:
# Multi-Time-Frame Candle Overlay version 2.4b
# 2020 Paul Townsend
# with code from UseThinkScript.com
# 01.25.2021 - BLT - Modified Addcloud to match horizontal lines

# 04.20.2021 - Sleepyz - Added Bar method instead of aggregationperiod method to create overlay candles. Used TOS VolumeProfile() code to make the candles.

# Label Display: On tick or range charts, it will display the number of Bars
#                On Day or Higher charts, it will dispaly the number of Days
#                On Intraday Charts, it will display then number of minutes

# Examples: numberofbars == 39 on a 1 minute chart ==  39 minute bars
#           numberofbars == 6  on a 5 minute chart == 30 minute bars
#           numberofbars == 10 on a 1 Day chart == 2 Week or 10 Day bars
# Intraday, the bars start @regular trading day start time
#
# 4.26.2021 = Sleepyz - Added sides to overlay candles and a psuedo buying/selling volume bubbles option for each overlay candle, based upon the formula commoningly used for this, as TOS does provide for actual amounts; buying  (close-low)/(high-low) * volume
#                   selling (high-close)/(high-low)* volume
 
input numberofbars   = 5;#Hint numberofbars: Minimum numberofbars == 3 for best overlay clouds
input OpenCloseLines = yes;
input HighLowLines   = yes;
input HighLowGray    = no;
input LineWeight     = 2;
input showlabel      = yes;

AddLabel(showlabel,  if GetAggregationPeriod() / 60000 < 1
                     then numberofbars + " Bars"
                     else if GetAggregationPeriod() < AggregationPeriod.DAY
                     then numberofbars * GetAggregationPeriod() / 60000 + " minutes"
                     else + numberofbars + " Days" , Color.WHITE);

#TOS VolumeProfile used to determine high/low and break per numberofbars
def period  = BarNumber() - 1;
def count   = CompoundValue(1, if GetAggregationPeriod() < AggregationPeriod.DAY and
                               GetTime() crosses above RegularTradingStart(GetYYYYMMDD())
                               then 0
                               else if period != period[1]
                               then (count[1] + period - period[1]) % (numberofbars)
                               else count[1], 0);
def cond    = count < count[1] + period - period[1];

profile vol = VolumeProfile("startNewProfile" = cond, "onExpansion" = no, "numberOfProfiles" = 1000, "pricePerRow" = PricePerRow.AUTOMATIC, "value area percent" = 100);

def hProfile = if IsNaN(vol.GetHighest()) then hProfile[1] else vol.GetHighest();
def lProfile = if IsNaN(vol.GetLowest())  then lProfile[1] else vol.GetLowest();

def p = if cond % (numberofbars) then p[1] + 1 else p[1];
def x = if !IsNaN(close) and IsNaN(close[-1]) then p else Double.NaN;

def o1 = if p != p[1]  then open else o1[1];
def c1 = if p != p[-1] then close else c1[1];
def c2 = HighestAll(if IsNaN(close[-1]) and !IsNaN(close) then close else Double.NaN);

plot o = o1;
plot c = if p == HighestAll(x) then c2 else GetValue(c1[1], - numberofbars);
plot h = if p > HighestAll(x) then Double.NaN else hProfile;
plot l = if p > HighestAll(x) then Double.NaN else lProfile;

o.SetHiding(!OpenCloseLines);
c.SetHiding(!OpenCloseLines);
h.SetHiding(!HighLowLines);
l.SetHiding(!HighLowLines);

o.SetLineWeight(LineWeight);
c.SetLineWeight(LineWeight);
h.SetLineWeight(LineWeight);
l.SetLineWeight(LineWeight);

o.AssignValueColor(if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);
c.AssignValueColor(if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);
h.AssignValueColor(if HighLowGray then Color.GRAY else if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);
l.AssignValueColor(if HighLowGray then Color.GRAY else if o == c then Color.WHITE else if o > c then Color.RED else Color.GREEN);

input addcloud = yes;
def side = if p[-1] != p then 2 else 1;
plot sider = side;
sider.Hide();
AddCloud( if sider == 2 then c else Double.NaN, o, Color.GREEN, Color.RED);
AddCloud( if sider == 1 then c else Double.NaN, o, Color.GREEN, Color.RED);
AddCloud( if sider != sider[-1] then c else Double.NaN, o, Color.GREEN, Color.RED);

o.SetPaintingStrategy(PaintingStrategy.DASHES);
c.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
h.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
l.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);

o.HideBubble();
c.HideBubble();
h.HideBubble();
l.HideBubble();

def h2 = if sider != sider[1] and o > c then h else Double.NaN;
def l2 = if sider != sider[1] and o > c then l else Double.NaN;
AddChart(h2, l2, o, c, ChartType.BAR, growColor = Color.RED);

def h3 = if sider != sider[1] and o < c then h else Double.NaN;
def l3 = if sider != sider[1] and o < c then l else Double.NaN;
AddChart(h3, l3, o, c, ChartType.BAR, growColor = Color.GREEN);

def h4 = if sider != sider[1] and o == c then h else Double.NaN;
def l4 = if sider != sider[1] and o == c then l else Double.NaN;
AddChart(h4, l4, o, c, ChartType.BAR, growColor = Color.WHITE);


input showvolume_bubble = yes;
def b  = -(numberofbars - 1);
def b1 = b - 1;

def vup = if p != p[1] then (close - low) / (high - low) * volume else if p == p[1] then vup[1] + (close - low) / (high - low) * volume else if p != p[1] then 0 else vup[1];
AddChartBubble(showvolume_bubble and p < HighestAll(x) and p[b] != p[b1], h[b], Round(vup[b], 0), Color.GREEN);
AddChartBubble(showvolume_bubble and p == HighestAll(x) and !IsNaN(close) and IsNaN(close[-1]), h, Round(vup, 0), Color.GREEN);

def vdn = if p != p[1] then (high - close) / (high - low) * volume else if p == p[1] then vdn[1] + (high - close) / (high - low) * volume else if p != p[1] then 0 else vdn[1];
AddChartBubble(showvolume_bubble and p < HighestAll(x)  and p[b] != p[b1], h[b], Round(vdn[b], 0), Color.RED);
AddChartBubble(showvolume_bubble and p == HighestAll(x) and !IsNaN(close) and IsNaN(close[-1]), h, Round(vdn, 0));

# end
 

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
265 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