CSA Trading Dashboard for ThinkorSwim

netarchitech

netarchitech

Well-known member
VIP
Please Note: This indicator is currently under development...



Code:
# filename: MR__EZ_Trading_Dashboard_
# idea source: @HighBredCloud and https://usethinkscript.com/threads/adding-breakouts-and-dss-to-macd-indicator-for-thinkorswim.957/post-8699

# V11.12.2019 - Initial design and development by netarchitech per HighBredCloud request


# MACD with a more Normal Distribution
# Mobius
# V01.09.2015
#Hint: Plots a Gaussian distribution. If Normal Distribution is met, then at minimum, 68.2% of the close values should be inside a One Standard Deviation Envelope and 95.4% of the close values should be inside a 2 Standard Deviation Envelope.

declare lower;

def zeroLine = 0;

input fastLength = 12;
input slowLength = 26;
input MACDLength = 9;

# Four Pole Filter
script g {
    input length = 4;
    input betaDev = 2;
    input price = OHLC4;
    def c;
    def w;
    def beta;
    def alpha;
    def G;
    c = price;
    w = (2 * Double.Pi / length);
    beta = (1 - Cos(w)) / (Power(1.414, 2.0 / betaDev) - 1 );
    alpha = (-beta + Sqrt(beta * beta + 2 * beta));
    G = Power(alpha, 4) * c +
4 * (1 – alpha) * G[1] – 6 * Power( 1 - alpha, 2 ) * G[2] +
4 * Power( 1 - alpha, 3 ) * G[3] - Power( 1 - alpha, 4 ) * G[4];
    plot Line = G;
}

# Modified MACD
def MACD_Value = g(length = fastLength) - g(length = slowLength);
def MACD_Avg = g(price = MACD_Value, length = MACDLength);
def Diff = MACD_Value - MACD_Avg;

plot MACDdiff_LED = if !IsNaN(close) then 1.01 else Double.NaN;
MACDdiff_LED.SetPaintingStrategy(PaintingStrategy.POINTS);
MACDdiff_LED.DefineColor("OverZero", Color.GREEN);
MACDdiff_LED.DefineColor("Normal", GetColor(7));
MACDdiff_LED.DefineColor("UnderZero", Color.RED);
MACDdiff_LED.AssignValueColor(if Diff > zeroLine then MACDdiff_LED.Color("OverZero") else if Diff < zeroLine then MACDdiff_LED.Color("UnderZero") else MACDdiff_LED.Color("Normal"));
MACDdiff_LED.SetLineWeight(5);
MACDdiff_LED.HideBubble();
MACDdiff_LED.HideTitle();



# Forward / Reverse EMA
# (c) 2017 John F. Ehlers
# Ported to TOS 07.16.2017
# Mobius

# Inputs:
input AA = .1;

# Vars:
def CC;
def RE1;
def RE2;
def RE3;
def RE4;
def RE5;
def RE6;
def RE7;
def RE8;
def EMA;

CC = if CC[1] == 0 then .9 else 1 – AA;
EMA = AA * close + CC * EMA[1];
RE1 = CC * EMA + EMA[1];
RE2 = Power(CC, 2) * RE1 + RE1[1];
RE3 = Power(CC, 4) * RE2 + RE2[1];
RE4 = Power(CC, 8) * RE3 + RE3[1];
RE5 = Power(CC, 16) * RE4 + RE4[1];
RE6 = Power(CC, 32) * RE5 + RE5[1];
RE7 = Power(CC, 64) * RE6 + RE6[1];
RE8 = Power(CC, 128) * RE7 + RE7[1];

def EMA_Signal = EMA – AA * RE8;

plot FREMA_LED = if !IsNaN(close) then 1 else Double.NaN;
FREMA_LED.SetPaintingStrategy(PaintingStrategy.POINTS);
FREMA_LED.DefineColor("OverZero", Color.GREEN);
FREMA_LED.DefineColor("Normal", GetColor(7));
FREMA_LED.DefineColor("UnderZero", Color.RED);
FREMA_LED.AssignValueColor(if EMA_Signal > zeroLine then FREMA_LED.Color("OverZero") else if EMA_Signal < zeroLine then FREMA_LED.Color("UnderZero") else FREMA_LED.Color("Normal"));
FREMA_LED.SetLineWeight(5);
FREMA_LED.HideBubble();
FREMA_LED.HideTitle();



# PPO Multiple Moving Averages
# Based on earlier PPO FREMAS code from netarchitect
# Revamped by tomsk
# 11.11.2019

input fastPeriod   = 12;
input slowPeriod   = 26;
input signalPeriod = 9;
input price        = close;
input movingAverageType = {"Simple MA", default "Exponential MA", "Wilders Smoothing", "Weighted MA", "Hull MA", "Adaptive MA", "Triangular MA", "Variable MA", "Dema MA", "Tema MA", "EHMA", "THMA"};

def fast;
def slow;

switch (movingAverageType) {
case "Simple MA":
    fast = Average(price, fastPeriod);
    slow = Average(price, slowPeriod);

case "Exponential MA":
    fast = ExpAverage(price, fastPeriod);
    slow = ExpAverage(price, slowPeriod);

case "Wilders Smoothing":
    fast = WildersAverage(price, fastPeriod);
    slow = WildersAverage(price, slowPeriod);

case "Weighted MA":
    fast = wma(price, fastPeriod);
    slow = wma(price, slowPeriod);

case "Hull MA":
    fast = HullMovingAvg(price, fastPeriod);
    slow = HullMovingAvg(price, slowPeriod);

case "Adaptive MA":
    fast = MovAvgAdaptive(price, fastPeriod);
    slow = MovAvgAdaptive(price, slowPeriod);

case "Triangular MA":
    fast = MovAvgTriangular(price, fastPeriod);
    slow = MovAvgTriangular(price, slowPeriod);

case "Variable MA":
    fast = variableMA(price, fastPeriod);
    slow = variableMA(price, slowPeriod);

case "Dema MA":
    fast = DEMA(price, fastPeriod);
    slow = DEMA(price, slowPeriod);

case "Tema MA":
    fast = TEMA(price, fastPeriod);
    slow = TEMA(price, slowPeriod);

case EHMA:
    fast = ExpAverage(2 * ExpAverage(price, fastPeriod / 2) - ExpAverage(price, fastPeriod), Round(Sqrt(fastPeriod)));
    slow = ExpAverage(2 * ExpAverage(price, slowPeriod / 2) - ExpAverage(price, slowPeriod), Round(Sqrt(slowPeriod)));

case THMA:
    fast = WMA(WMA(price, (fastPeriod / 2) / 3) * 3 - WMA(price, (fastPeriod / 2) / 2) - WMA(price, (fastPeriod / 2)), (fastPeriod / 2));
    slow = WMA(WMA(price, (slowPeriod / 2) / 3) * 3 - WMA(price, (slowPeriod / 2) / 2) - WMA(price, (slowPeriod / 2)), (slowPeriod / 2));
}

def periodOK  = fastPeriod < slowPeriod;
AddLabel(!periodOK, "ERROR: fastPeriod MUST be less than slowPeriod");
def _ppo      = if periodOK then ((fast - slow) / slow) * 100 else 0;
def _signal;

switch (movingAverageType) {
case "Simple MA":
    _signal = Average(_ppo, signalPeriod);

case "Exponential MA":
    _signal = ExpAverage(_ppo, signalPeriod);

case "Wilders Smoothing":
    _signal = WildersAverage(_ppo, signalPeriod);

case "Weighted MA":
    _signal = wma(_ppo, signalPeriod);

case "Hull MA":
    _signal = HullMovingAvg(_ppo, signalPeriod);

case "Adaptive MA":
    _signal = MovAvgAdaptive(_ppo, signalPeriod);

case "Triangular MA":
    _signal = MovAvgTriangular(_ppo, signalPeriod);

case "Variable MA":
    _signal = variableMA(_ppo, signalPeriod);

case "Dema MA":
    _signal = DEMA(_ppo, signalPeriod);

case "Tema MA":
    _signal = TEMA(_ppo, signalPeriod);

case EHMA:
    _signal = ExpAverage(2 * ExpAverage(_ppo, signalPeriod / 2) - ExpAverage(_ppo, signalPeriod), Round(Sqrt(signalPeriod)));

case THMA:
    _signal = WMA(WMA(_ppo, (signalPeriod / 2) / 3) * 3 - WMA(_ppo, (signalPeriod / 2) / 2) - WMA(_ppo, (signalPeriod / 2)), (signalPeriod / 2));
}

def Ppo      = _ppo;
def PpoEma   = _signal;
def PPOdiff  = _ppo - _signal;

plot PPOdiff_LED = if !IsNaN(close) then 0.99 else Double.NaN;
PPOdiff_LED.SetPaintingStrategy(PaintingStrategy.POINTS);
PPOdiff_LED.DefineColor("OverZero", Color.GREEN);
PPOdiff_LED.DefineColor("Normal", GetColor(7));
PPOdiff_LED.DefineColor("UnderZero", Color.RED);
PPOdiff_LED.AssignValueColor(if PPOdiff > zeroLine then PPOdiff_LED.Color("OverZero") else if PPOdiff < zeroLine then PPOdiff_LED.Color("UnderZero") else PPOdiff_LED.Color("Normal"));
PPOdiff_LED.SetLineWeight(5);
PPOdiff_LED.HideBubble();
PPOdiff_LED.HideTitle();
 
netarchitech

netarchitech

Well-known member
VIP
@BenTen Up and running...Let me know if there is anything else I should do when you have a chance...

Thanks for your continued assistance and support :cool: Much appreciated!
 
H

HighBredCloud

Well-known member
VIP
@netarchitech Well you sure didn't waste any time with this one...LOL...It's gonna be one of those nights I already know...checking right.
 
H

HighBredCloud

Well-known member
VIP
@netarchitech I have a few suggestions to make about the 3in1...The idea behind this is to focus on the histogram changes on both the MACD and PPO...FREMA seems to be more of a continual trend...Are you able to incorporate the "Negative and Down" "Negative and Up" "Positive and Down" "Positive and Up" colors on the dots?

Both the MACD and PPO use histograms so that I am assuming could be doable...BUT FREMA does not. With that said...Are you able to assign the same color values to FREMA as it starts to climb up and or down?

Instead of just having under and above ZERO...That way when all 3 line up in the specific color we know when to engage in a trade and when to potentially exit a trade when the Histogram colors change from let say BrightGreen to DarkGreen.

ALSO..on the side somewhere...are you able to put some sort of a bubble or a label so that we know what each line is:

MACD
FREMA or FRMA
PPO

Please see below.


EDIT: On second thought...you can leave FREMA GREEN and RED...for now...as long as the new indicator can reflect GREEN or RED in the beginning of the upward or downward trend. FREMA could be that guide line and when the histograms on MACD and PPO match up with FREMA then the entry is confirmed.

ALSO...anyway that you an use the script @tomsk made for PPO as you can assign different moving average types that will alter the histogram...and therefore the colors on the new indicator...The script for that PPO is below.

PPO Code:

# PPO Multiple Moving Averages
# Based on earlier PPO FREMAS code from netarchitect
# Revamped by tomsk
# 11.11.2019

declare lower;

input fastPeriod = 12;
input slowPeriod = 26;
input signalPeriod = 9;
input price = close;
input showBreakoutSignals = yes;
input ma_length = 21; #Length(180-200 for floating S/R , 55 for swing entry
input movingAverageType = {"Simple MA", default "Exponential MA", "Wilders Smoothing", "Weighted MA", "Hull MA", "Adaptive MA", "Triangular MA", "Variable MA", "Dema MA", "Tema MA", "EHMA", "THMA"};

def fast;
def slow;

switch (movingAverageType) {
case "Simple MA":
fast = Average(price, fastPeriod);
slow = Average(price, slowPeriod);

case "Exponential MA":
fast = ExpAverage(price, fastPeriod);
slow = ExpAverage(price, slowPeriod);

case "Wilders Smoothing":
fast = WildersAverage(price, fastPeriod);
slow = WildersAverage(price, slowPeriod);

case "Weighted MA":
fast = wma(price, fastPeriod);
slow = wma(price, slowPeriod);

case "Hull MA":
fast = HullMovingAvg(price, fastPeriod);
slow = HullMovingAvg(price, slowPeriod);

case "Adaptive MA":
fast = MovAvgAdaptive(price, fastPeriod);
slow = MovAvgAdaptive(price, slowPeriod);

case "Triangular MA":
fast = MovAvgTriangular(price, fastPeriod);
slow = MovAvgTriangular(price, slowPeriod);

case "Variable MA":
fast = variableMA(price, fastPeriod);
slow = variableMA(price, slowPeriod);

case "Dema MA":
fast = DEMA(price, fastPeriod);
slow = DEMA(price, slowPeriod);

case "Tema MA":
fast = TEMA(price, fastPeriod);
slow = TEMA(price, slowPeriod);

case EHMA:
fast = ExpAverage(2 * ExpAverage(price, fastPeriod / 2) - ExpAverage(price, fastPeriod), Round(Sqrt(fastPeriod)));
slow = ExpAverage(2 * ExpAverage(price, slowPeriod / 2) - ExpAverage(price, slowPeriod), Round(Sqrt(slowPeriod)));

case THMA:
fast = WMA(WMA(price, (fastPeriod / 2) / 3) * 3 - WMA(price, (fastPeriod / 2) / 2) - WMA(price, (fastPeriod / 2)), (fastPeriod / 2));
slow = WMA(WMA(price, (slowPeriod / 2) / 3) * 3 - WMA(price, (slowPeriod / 2) / 2) - WMA(price, (slowPeriod / 2)), (slowPeriod / 2));
}

def periodOK = fastPeriod < slowPeriod;
AddLabel(!periodOK, "ERROR: fastPeriod MUST be less than slowPeriod");
def _ppo = if periodOK then ((fast - slow) / slow) * 100 else 0;
def _signal;

switch (movingAverageType) {
case "Simple MA":
_signal = Average(_ppo, signalPeriod);

case "Exponential MA":
_signal = ExpAverage(_ppo, signalPeriod);

case "Wilders Smoothing":
_signal = WildersAverage(_ppo, signalPeriod);

case "Weighted MA":
_signal = wma(_ppo, signalPeriod);

case "Hull MA":
_signal = HullMovingAvg(_ppo, signalPeriod);

case "Adaptive MA":
_signal = MovAvgAdaptive(_ppo, signalPeriod);

case "Triangular MA":
_signal = MovAvgTriangular(_ppo, signalPeriod);

case "Variable MA":
_signal = variableMA(_ppo, signalPeriod);

case "Dema MA":
_signal = DEMA(_ppo, signalPeriod);

case "Tema MA":
_signal = TEMA(_ppo, signalPeriod);

case EHMA:
_signal = ExpAverage(2 * ExpAverage(_ppo, signalPeriod / 2) - ExpAverage(_ppo, signalPeriod), Round(Sqrt(signalPeriod)));

case THMA:
_signal = WMA(WMA(_ppo, (signalPeriod / 2) / 3) * 3 - WMA(_ppo, (signalPeriod / 2) / 2) - WMA(_ppo, (signalPeriod / 2)), (signalPeriod / 2));
}

plot Ppo = _ppo;
Ppo.SetDefaultColor(GetColor(1));
Ppo.SetLineWeight(2);

plot PpoEma = _signal;
PpoEma.SetDefaultColor(GetColor(8));
PpoEma.SetLineWeight(2);

plot zeroLine = 0;
zeroLine.HideBubble();
zeroLine.SetDefaultColor(GetColor(4));

plot PPOdiff = 2 * (_ppo - _signal);
PPOdiff.SetDefaultColor(GetColor(5));
PPOdiff.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
PPOdiff.DefineColor("Positive and Up", Color.GREEN);
PPOdiff.DefineColor("Positive and Down", Color.DARK_GREEN);
PPOdiff.DefineColor("Negative and Down", Color.RED);
PPOdiff.DefineColor("Negative and Up", Color.DARK_RED);
PPOdiff.AssignValueColor(if PPOdiff >= 0
then if PPOdiff > PPOdiff[1]
then PPOdiff.Color("Positive and Up")
else PPOdiff.Color("Positive and Down")
else if PPOdiff < PPOdiff[1]
then PPOdiff.Color("Negative and Down")
else PPOdiff.Color("Negative and Up"));
PPOdiff.SetLineWeight(3);

plot UpSignal = if PPOdiff crosses above ZeroLine then ZeroLine else Double.NaN;
plot DownSignal = if PPOdiff crosses below ZeroLine then ZeroLine else Double.NaN;

UpSignal.SetHiding(!showBreakoutSignals);
DownSignal.SetHiding(!showBreakoutSignals);

UpSignal.SetDefaultColor(Color.DOWNTICK);
UpSignal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
UpSignal.SetLineWeight(2);
DownSignal.SetDefaultColor(Color.UPTICK);
DownSignal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
DownSignal.SetLineWeight(2);
# END CODE
 
Last edited:
netarchitech

netarchitech

Well-known member
VIP
@HighBredCloud I read through your latest post above...With that said, I think it would be a good idea to invite @tomsk to participate in this project if his schedule permits...

He did a great job on the PPO_MMA recode...I'm sure he would be a valuable contributor on this project...

Are you able to incorporate the "Negative and Down" "Negative and Up" "Positive and Down" "Positive and Up" colors on the dots?
At this particular moment, all I can say is we'll see...I would like to give a more definitive answer, but we're in uncharted territory...at least for me...

Are you able to assign the same color values to FREMA as it starts to climb up and or down?
I don't know the answer to this either right now...this is why I'm hoping @tomsk , @diazlaz or another talented scripter will join the team...

ALSO..on the side somewhere...are you able to put some sort of a bubble or a label so that we know what each line is:

MACD
FREMA or FRMA
PPO
Yes...I believe we will be able to do this ...I've seen it done before...I just need to find the corresponding code snippet...

EDIT: On second thought...you can leave FREMA GREEN and RED...for now...as long as the new indicator can reflect GREEN or RED in the beginning of the upward or downward trend. FREMA could be that guide line and when the histograms on MACD and PPO match up with FREMA then the entry is confirmed.
OK...we'll incorporate it with the list of requirements...
 
H

HighBredCloud

Well-known member
VIP
@HighBredCloud I read through your latest post above...With that said, I think it would be a good idea to invite @tomsk to participate in this project if his schedule permits...

He did a great job on the PPO_MMA recode...I'm sure he would be a valuable contributor on this project...


At this particular moment, all I can say is we'll see...I would like to give a more definitive answer, but we're in uncharted territory...at least for me...


I don't know the answer to this either right now...this is why I'm hoping @tomsk , @diazlaz or another talented scripter will join the team...


Yes...I believe we will be able to do this ...I've seen it done before...I just need to find the corresponding code snippet...


OK...we'll incorporate it with the list of requirements...
@netarchitech sounds good. I am really curious to see how this will turn out and if this will be beneficial to use...I've been watching closely the histograms in actions and they work well. The issue that I always found was the other distractions around them that essentially took your focus away from what's at hand. Hopefully this new indicator will do just that...keep you focused with minimal distractions.

I have no idea what it takes in converting a histogram to the dots that reflect the same colors...So like you said if others want to help you out on this then the more the merrier.

Not to complicate things...in regards to FREMA...you can leave just the two colors GREEN and RED for now as the dotted line in the MACD_FREMA reflects...just set it up in a way where the colors start and change the same way as in the MACD_FREMA. That way FREMA will play a role of the "Trend" while MACD and PPO histograms will be the entries and exit points.

EDIT: I know I said no more than 3 Histogram indicators to compare...BUT if anyone has any other recommendations on which indicators that have Histograms would work well together is more than welcome to contribute...

I've been looking into StochasticFullDiff in TOS...and it also seems to follow MACD and even hits faster at times than the MACD. Ideally if we could find a good mix of indicators that measure thing such as momentum...or price would be ideal.


ALSO PLEASE NOTE The Histogram in the MACD_FREMA plots differently than standard MACD Histogram found in TOS...I think the MACD_FREMA is better...IMO
 
Last edited:
netarchitech

netarchitech

Well-known member
VIP
Not to complicate things...in regards to FREMA...you can leave just the two colors GREEN and RED for now as the dotted line in the MACD_FREMA reflects...just set it up in a way where the colors start and change the same way as in the MACD_FREMA. That way FREMA will play a role of the "Trend" while MACD and PPO histograms will be the entries and exit points.
OK...Sounds good...we'll see if FREMA will play along :)
 
H

HighBredCloud

Well-known member
VIP
"
OK I read through the thread of your latest project. My interpretation is that you'd like the dots to reflect the four states:

Positive and Up
Positive and Down
Negative and Down
Negative and Up

If so you'd need to represent this with 4 different colors and if you look at this visually, some of the colors may not be easily distinguishable.
Hence my input is that you may want it to remain at 2 colors so that at one glance you'll be able to determine the general trend
Not real sure if a 4 color granularity helps with interpretation though. Just my $0.02

My apologies if I have misunderstood your intent"

@tomsk I will just reply here to you as this is the place for this project...that way we can keep things more organized.

Yes...4 colors would be ideal as people read the histogram differently...For instance Dark Green may just be a loss of momentum not necessarily an indication of trend. BUT if possible we should allow people to change the colors and from 4 colors make 2 colors if they want to keep it simple as you suggested...Basically what I am looking for is the same color palette and format as standard MACD...

The only one that should have two colors in my opinion would be FREMA...as that would be the indicator dots that determine the "trend." The other histograms would only serve as entry and exits when they line up.

The trickiest one here would be PPO...as with the code that you revamped the user can select different moving averages and therefore changing the histogram based on those particular MA's selected.

MACD_FREMA and StochasticFullDiff seem to closely resemble one another...with one or the other giving the same or earlier entries...

The goal is wait for a moment when the histograms are in sync or at least majority of them are...and FREMA also being of the same trend in order to enter the trade...I hope this makes a bit more sense...
 
netarchitech

netarchitech

Well-known member
VIP
@tomsk @HighBredCloud I like the proof of concept...can we make the necessary adjustments to work within the project parameters? 4 Color w/o the MTF aspect?
 
T

tomsk

Well-known member
VIP
@HighBredCloud @netarchitech There's been a whole lot of posts and cross posts and I've lost track of things.
I'll be happy to help make the necessary adjustments. So can one of you find folks summarize what you're looking to achieve?
 
netarchitech

netarchitech

Well-known member
VIP
@tomsk Thank you for offering your assistance...To answer your question, I'll quote @HighBredCloud :

Yes...4 colors would be ideal as people read the histogram differently...For instance Dark Green may just be a loss of momentum not necessarily an indication of trend. BUT if possible we should allow people to change the colors and from 4 colors make 2 colors if they want to keep it simple as you suggested...Basically what I am looking for is the same color palette and format as standard MACD...

The only one that should have two colors in my opinion would be FREMA...as that would be the indicator dots that determine the "trend." The other histograms would only serve as entry and exits when they line up.

The trickiest one here would be PPO...as with the code that you revamped the user can select different moving averages and therefore changing the histogram based on those particular MA's selected.

MACD_FREMA and StochasticFullDiff seem to closely resemble one another...with one or the other giving the same or earlier entries...

The goal is wait for a moment when the histograms are in sync or at least majority of them are...and FREMA also being of the same trend in order to enter the trade...I hope this makes a bit more sense...
I look forward to your thoughts and insights...
 
H

HighBredCloud

Well-known member
VIP
@netarchitech @tomsk guys I like this code! Can we make one adjustment? Make one more line so total of 5...

Here is what I was thinking:

1st line: MACD (FREMA Edition)
2nd line: StochasticFullDiff
3rd line: FREMA...this one could just be 2 colors GREEN RED...or any other color the user chooses NOT dynamic colors if possible
4th line: PPO
5th line: Ehlers Ultimate Oscillator

The end user will be able to chose whatever they want to display simply by un-clicking "show plot"

lines 1 and 2 would show the very similar not so volatile moves of the MACD and StochasticFullDiff

while lines 4 and 5 would show the very volatile moves of the PPO when set to TEMA or DEMA setting along with the Ehlers Ultimate Oscillator that I found works really good as an exit indicator.

FREMA would be line 3...and maybe the user can chose their own colors there...that would be the basic "short trend" and a nice divider between the histograms...

Thoughts?
 
H

HighBredCloud

Well-known member
VIP
IF FREMA will be a problem...how about a Tillson T3 line in place of it? on a 5 min timeframe a T3 with a 8 period setting is a nice compromise and a good indicator of either a pullback or a trend reversal as compared to a slim ribbon type indicator with MA's of 5, 8, 13...

 
netarchitech

netarchitech

Well-known member
VIP
@HighBredCloud @tomsk I like the plan, layout and attention to not only entries, but exits as well... :cool:
 

Similar threads

Top