Smoothed Heikin-Ashi for ThinkorSwim

chillc15

New member
Wondering if anyone has or has come across the smoothed Heiken Ashi code for TOS. I found the below but the constant problem I have seen is that it will not color the down candles to red. It all remains green. Anyone have any insight? I cannot remember where I came across the original code. Thanks

Rich (BB code):
input period = 6;
input hideCandles = YES;
input candleSmoothing = {default Valcu, Vervoort};

DefineGlobalColor("RisingMA", color.green);
DefineGlobalColor("FallingMA", color.red);

input movingAverageType = {default Simple, Exponential, Weighted, Hull, Variable, TEMA};

def openMA;
def closeMA; 
def highMA; 
def lowMA; 

switch (movingAverageType) {
case Simple:
openMA = compoundValue(1, Average(open, period), open);
closeMA = compoundValue(1, Average(close, period), close);
highMA = compoundValue(1, Average(high, period), high);
lowMA = compoundValue(1, Average(low, period), low);
case Exponential:
openMA = compoundValue(1, ExpAverage(open, period), open);
closeMA = compoundValue(1, ExpAverage(close, period), close);
highMA = compoundValue(1, ExpAverage(high, period), high);
lowMA = compoundValue(1, ExpAverage(low, period), low);
case Weighted:
openMA = compoundValue(1, WMA(open, period), open);
closeMA = compoundValue(1, WMA(close, period), close);
highMA = compoundValue(1, WMA(high, period), high);
lowMA = compoundValue(1, WMA(low, period), low);
Case Hull:
openMA = compoundValue(1, HullMovingAvg(open, period), open);
closeMA = compoundValue(1, HullMovingAvg(close, period), close);
highMA = compoundValue(1, HullMovingAvg(high, period), high);
lowMA = compoundValue(1, HullMovingAvg(low, period), low);
case variable:
openMA = compoundValue(1, VariableMA(open, period), open);
closeMA = compoundValue(1, VariableMA(close, period), close);
highMA = compoundValue(1, VariableMA(high, period), high);
lowMA = compoundValue(1, VariableMA(low, period), low);
case TEMA:
openMA = compoundValue(1, TEMA(open, period), open);
closeMA = compoundValue(1, TEMA(close, period), close);
highMA = compoundValue(1, TEMA(high, period), high);
lowMA = compoundValue(1, TEMA(low, period), low);
}

hidePricePlot(hideCandles);

def haOpen;
def haClose;

switch(candleSmoothing) {
case Valcu:

haOpen = CompoundValue(1, ( (haOpen[1] + (openMA[1] + highMA[1] + lowMA[1] + closeMA[1]) /4.0)/2.0), open);
haClose = ((OpenMA + HighMA + LowMA + CloseMA)/4.0) ;

case Vervoort:
haOpen = CompoundValue(1, ( (haOpen[1] + (openMA[1] + highMA[1] + lowMA[1] + closeMA[1]) /4.0)/2.0), open);
haClose = ((((OpenMA + HighMA + LowMA + CloseMA)/4.0) + haOpen + Max(HighMA, haOpen) + Min(LowMA, haOpen))/4.0);

}

plot o = haopen;
o.hide();

def haLow = min(lowMA, haOpen);
def haHigh = max(highMA,haOpen); 

AddChart(high = haHigh, low = haLow, open = o, close = haclose, type = ChartType.CANDLE, growColor = GlobalColor("RisingMA"), fallColor = GlobalColor("FallingMA"), neutralColor = color.gray);
 
Last edited by a moderator:
  • Like
Reactions: JTP

mc01439

Well-known member
2019 Donor
VIP
Try this one.

Code:
# Heikin Ashi Smoothed
# HoboTheClown / blt
# 9.15.2016

# HoboTheClown: I recently found a code for smoothed heiken ashi bars,
# however for some reason all the bars are displayed as one color (going up or down).
#
# blt: Modified the code and replaced the addchart code at the bottom,
# you should now see proper coloring. This is how that was coded to plot
# as an overlay to the chart candlesticks. That is two sets of candles,
# with different coloring for each. If you have the heikin ashi candle
# coloring code on your chart, then they will likely appear the same color.

input period = 6;
input hideCandles = YES;
input candleSmoothing = {default Valcu, Vervoort};

DefineGlobalColor("RisingMA", color.green);
DefineGlobalColor("FallingMA", color.red);

input movingAverageType = {Simple, default Exponential, Weighted, Hull, Variable, TEMA};

def openMA;
def closeMA;
def highMA;
def lowMA;

switch (movingAverageType) {
case Simple:
    openMA = compoundValue(1, Average(open, period), open);
    closeMA = compoundValue(1, Average(close, period), close);
    highMA = compoundValue(1, Average(high, period), high);
    lowMA = compoundValue(1, Average(low, period), low);
case Exponential:
    openMA = compoundValue(1, ExpAverage(open, period), open);
    closeMA = compoundValue(1, ExpAverage(close, period), close);
    highMA = compoundValue(1, ExpAverage(high, period), high);
    lowMA = compoundValue(1, ExpAverage(low, period), low);
case Weighted:
    openMA = compoundValue(1, WMA(open, period), open);
    closeMA = compoundValue(1, WMA(close, period), close);
    highMA = compoundValue(1, WMA(high, period), high);
    lowMA = compoundValue(1, WMA(low, period), low);
Case Hull:
    openMA = compoundValue(1, HullMovingAvg(open, period), open);
    closeMA = compoundValue(1, HullMovingAvg(close, period), close);
    highMA = compoundValue(1, HullMovingAvg(high, period), high);
    lowMA = compoundValue(1, HullMovingAvg(low, period), low);
case variable:
    openMA = compoundValue(1, VariableMA(open, period), open);
    closeMA = compoundValue(1, VariableMA(close, period), close);
    highMA = compoundValue(1, VariableMA(high, period), high);
    lowMA = compoundValue(1, VariableMA(low, period), low);
case TEMA:
    openMA = compoundValue(1, TEMA(open, period), open);
    closeMA = compoundValue(1, TEMA(close, period), close);
    highMA = compoundValue(1, TEMA(high, period), high);
    lowMA = compoundValue(1, TEMA(low, period), low);
}

#hidePricePlot(hideCandles);

def haOpen;
def haClose;

switch(candleSmoothing) {
case Valcu:
    haOpen = CompoundValue(1, ( (haOpen[1] + (openMA[1] + highMA[1] + lowMA[1] + closeMA[1]) /4.0)/2.0), open);
    haClose = ((OpenMA + HighMA + LowMA + CloseMA)/4.0) ;

case Vervoort:
    haOpen = CompoundValue(1, ( (haOpen[1] + (openMA[1] + highMA[1] + lowMA[1] + closeMA[1]) /4.0)/2.0), open);
    haClose = ((((OpenMA + HighMA + LowMA + CloseMA)/4.0) + haOpen + Max(HighMA, haOpen) + Min(LowMA, haOpen))/4.0);
}

plot o = haopen;
o.hide();

def haLow = min(lowMA, haOpen);
def haHigh = max(highMA,haOpen);

### NO LONGER SUPPORTED BY TOS
###
### AddChart(high = haHigh, low = haLow, open = o, close = haclose, type = ChartType.CANDLE, growColor = GlobalColor("RisingMA"), fallColor = GlobalColor("FallingMA"), neutralColor = color.gray);

input charttype = ChartType.CANDLE;
def haopen_ = if haopen>haclose
              then HAopen + 0
              else double.nan;
def HAhi   = if haopen>=haclose
              then hahigh
              else double.nan;
def HAlo    = if haopen>=haclose
              then halow
              else double.nan;

AddChart(growColor = color.red, fallColor = Color.green, neutralColor = Color.current, high = HAhi, low = HAlow, open = haopen_, close = HAclose, type = ChartType.CANDLE);

def HAclose1 = ohlc4;
def HAopen1  = if haopen<=haclose
               then CompoundValue(1, (HAopen[1] + HAclose[1]) / 2, (open[1] + close[1]) / 2)            
               else double.nan;
def haopen_1 = if haopen<=haclose
               then HAopen1 + 0
               else double.nan;
def HAhigh1  = hahigh;
def HAlow1   = halow;

AddChart(growColor = Color.green, fallColor = Color.red, neutralColor = Color.current, high = HAhigh1, low = HAlow1, open = haopen_1, close = HAclose1, type = ChartType.CANDLE);

# End Study
##############################################################################

https://tos.mx/8UUAc2

t6dqxtn.png
 
Last edited:

WaveRiderJ

New member
Here is a study that I call the HAMACD. It is the moving average of the Heiken Ashi candle difference.

Rich (BB code):
#HAMACD
#
declare lower;  

def haclose = (open + high + low + close) / 4; 
def haopen = CompoundValue(1, (haopen[1] + haclose[1]) / 2, (open[1] + close[1]) / 2); 
def diff = (haclose - haopen)*100; 
def HADiff = diff; 

input fastLength = 12;
input slowLength = 26;
input MACDLength = 9;
input averageType = AverageType.EXPONENTIAL;
input showBreakoutSignals = yes;

plot Value = MovingAverage(averageType, diff, fastLength) - MovingAverage(averageType, diff, slowLength);
plot Avg2 = MovingAverage(averageType, Value, MACDLength);

plot Diff2 = Value - Avg2;
plot ZeroLine = 0;

plot UpSignal = if value crosses above avg2 then avg2 else Double.NaN;
plot DownSignal = if  value crosses below avg2 then avg2 else Double.NaN;
plot UpEND = if Diff2 > 0 && diff2 < diff2[1] && diff2[1] > diff2[2] then Diff2 else double.nan;
plot DnEND = if Diff2 < 0 && diff2 > diff2[1] && diff2[1] < diff2[2] then Diff2 else double.nan;
UpSignal.SetHiding(!showBreakoutSignals);
DownSignal.SetHiding(!showBreakoutSignals);

Value.SetDefaultColor(GetColor(1));
Avg2.SetDefaultColor(GetColor(8));
Diff2.SetDefaultColor(GetColor(5));
Diff2.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
Diff2.SetLineWeight(3);
Diff2.DefineColor("Positive and Up", Color.GREEN);
Diff2.DefineColor("Positive and Down", Color.DARK_GREEN);
Diff2.DefineColor("Negative and Down", Color.RED);
Diff2.DefineColor("Negative and Up", Color.DARK_RED);
Diff2.AssignValueColor(
           if Diff2 >= 0 then if Diff2 > Diff2[1] then Diff2.color("Positive and Up")      
           else Diff2.color("Positive and Down")         
           else if Diff2 < Diff2[1] then Diff2.color("Negative and Down") 
           else Diff2.color("Negative and Up"));
ZeroLine.SetDefaultColor(GetColor(0));
UpSignal.SetDefaultColor(Color.green);
UpSignal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
upsignal.SetLineWeight(5);
DownSignal.SetDefaultColor(Color.red);
DownSignal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
downsignal.SetLineWeight(5);
DnEND.SetDefaultColor(Color.UPTICK);
DnEND.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
DnEND.SetLineWeight(1);
UpEND.SetDefaultColor(Color.DOWNTICK);
UpEND.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);
UpEND.SetLineWeight(1);
#
 
Last edited by a moderator:

markos

Well-known member
VIP
@Shinthus Google Sylvain Vervoort and HACOLT which is built into ToS. Generaly thought of as longer term indicators, some use Fib numbers for smoothing. It's seen used in futures and forex trading. @mc01439 , do you have an opinion?
 

mc01439

Well-known member
2019 Donor
VIP
@markos and @Shinthus

https://tos.mx/8UUAc2 (Smoothed HA) gives you a good visual of the current chart trend. Can be hard to trade if you do not understand the calculations. Some become confused due to the HA close not being the real close.

You can use plot close to counter this if you wish.

Code:
plot price = close;
price.setDefaultColor(GetColor(9));
price.SetPaintingStrategy(PaintingStrategy.DASHES);
price.SetLineWeight(2);

https://tos.mx/UqwvPP - This is one way it can be used.
 
Last edited:

markos

Well-known member
VIP
@shizah please google Candle + Space + Payne. Robert Payne made a script for that a while back. It's actually pretty cool.
 

horserider

Well-known member
VIP
Code:
# +--------------------------------------------------+
# |      Example: Add Space Between Candles rev 2    |
# |                   Robert Payne                   |
# |               rrpayne.blogspot.com               |
# +--------------------------------------------------+

# hide the default candles
HidePricePlot();

# how many bars do you want between candles?
input BarsBetween = 1;

# calculate the offset
def lastBar = HighestAll(if !IsNaN(close) then BarNumber() else 0);
def offset = BarsBetween * ((lastBar - BarNumber()) / (BarsBetween + 1));

# build the candle
def o;
def h;
def l;
def c;
if offset % 1 == 0
then {
    o = GetValue(open, -offset);
    h = GetValue(high, -offset);
    l = GetValue(low, -offset);
    c = GetValue(close, -offset);
} else {
    o = Double.NaN;
    h = Double.NaN;
    l = Double.NaN;
    c = Double.NaN;
}

# just the UP candles
def UpO;
def UpH;
def UpL;
def UpC;
if o <= c
then {
    UpO = o;
    UpH = h;
    UpL = l;
    UpC = c;
} else {
    UpO = Double.NaN;
    UpH = Double.NaN;
    UpL = Double.NaN;
    UpC = Double.NaN;
}

# just the DOWN candles
def DnO;
def DnH;
def DnL;
def DnC;
if o > c
then {
    DnO = o;
    DnH = h;
    DnL = l;
    DnC = c;
} else {
    DnO = Double.NaN;
    DnH = Double.NaN;
    DnL = Double.NaN;
    DnC = Double.NaN;
}

# Plot the new Chart
# solid green (note that the open and close prices have been swapped
# to trick the function into filling in the candle bodies
AddChart(high = UpH, low = UpL, open = UpC, close = UpO, type = ChartType.CANDLE, growcolor = Color.UPTICK);
# solid red
AddChart(high = DnH, low = DnL, open = DnO, close = DnC, type = ChartType.CANDLE, growcolor = Color.DOWNTICK);
# outline green candles
AddChart(high = UpH, low = UpL, open = UpO, close = UpC, type = ChartType.CANDLE, growcolor = Color.BLACK);
# outline red candles
AddChart(high = DnH, low = DnL, open = DnC, close = DnO, type = ChartType.CANDLE, growcolor = Color.BLACK);
 

markos

Well-known member
VIP
@horserider thank you for grabbing that bar spacer above. (y) Hopefully that will help @shizah out.
Would you mind making a duplicate, new, post under Custom Indicators just stating that someone was inquiring how to put a space between lines?
If so, it's greatly appreciated!
 

HighBredCloud

Well-known member
VIP
Does anyone know if the Heikin Ashi color trend can be implemented on regular candle sticks with time aggregation? I would really like to see this sort of version of a SuperTrend for more precise entries and exists especially with time aggregation...
 

HighBredCloud

Well-known member
VIP
@mc01439 do you or anyone else here possibly know how to make the RED candles NOT fill in on that particular study? Basically make them the same as the not filled in GREEN candles.
 

JBTrades

New member
I found this alternative version of the heikin ashi smoothed and was curious as to others thoughts on this. It seems to be a cleaner version.

https://tos.mx/D3cQCON

Rich (BB code):
# TS_HeikinAshiSmoothed
# http://www.thinkscripter.com
# [email protected]
# Last Update 30 June 2013

### YOU MUST HAVE THE STYLE SETTING FIT STUDIES ENABLED ###
#hint: The style setting Fit Studies must be enabled to use these bars.

input period = 21;
input hideCandles = NO;
input candleSmoothing = {default Valcu, Vervoort};

DefineGlobalColor("RisingMA", color.blue);
DefineGlobalColor("FallingMA", color.red);

input movingAverageType = {default TEMA, Exponential, Weighted, Hull, Variable, SIMPLE};

def openMA;
def closeMA;
def highMA;
def lowMA;

switch (movingAverageType) {
case Simple:
    openMA = compoundValue(1, Average(open, period), open);
    closeMA = compoundValue(1, Average(close, period), close);
    highMA = compoundValue(1, Average(high, period), high);
    lowMA = compoundValue(1, Average(low, period), low);
case Exponential:
    openMA = compoundValue(1, ExpAverage(open, period), open);
    closeMA = compoundValue(1, ExpAverage(close, period), close);
    highMA = compoundValue(1, ExpAverage(high, period), high);
    lowMA = compoundValue(1, ExpAverage(low, period), low);
case Weighted:
    openMA = compoundValue(1, WMA(open, period), open);
    closeMA = compoundValue(1, WMA(close, period), close);
    highMA = compoundValue(1, WMA(high, period), high);
    lowMA = compoundValue(1, WMA(low, period), low);
Case Hull:
    openMA = compoundValue(1, HullMovingAvg(open, period), open);
    closeMA = compoundValue(1,  HullMovingAvg(close, period), close);
    highMA = compoundValue(1,  HullMovingAvg(high, period), high);
    lowMA = compoundValue(1,  HullMovingAvg(low, period), low);
case variable:
    openMA = compoundValue(1, VariableMA(open, period), open);
    closeMA = compoundValue(1, VariableMA(close, period), close);
    highMA = compoundValue(1, VariableMA(high, period), high);
    lowMA = compoundValue(1, VariableMA(low, period), low);
case TEMA:
    openMA = compoundValue(1, TEMA(open, period), open);
    closeMA = compoundValue(1, TEMA(close, period), close);
    highMA = compoundValue(1, TEMA(high, period), high);
    lowMA = compoundValue(1, TEMA(low, period), low);
}


hidePricePlot(hideCandles);

def haOpen;
def haClose;

switch(candleSmoothing) {
case Valcu:

    haOpen = CompoundValue(1, ( (haOpen[1] + (openMA[1] + highMA[1] + lowMA[1] + closeMA[1]) /4.0)/2.0), open);
    haClose = ((OpenMA + HighMA + LowMA + CloseMA)/4.0) ;
    
case Vervoort:
    haOpen = CompoundValue(1, ( (haOpen[1] + (openMA[1] + highMA[1] + lowMA[1] + closeMA[1]) /4.0)/2.0), open);
    haClose = ((((OpenMA + HighMA + LowMA + CloseMA)/4.0) + haOpen + Max(HighMA, haOpen) + Min(LowMA, haOpen))/4.0);

}

plot o = haopen;
o.hide();

def haLow =  min(lowMA, haOpen);
def haHigh = max(highMA,haOpen);

AddChart(high = haHigh, low  = haLow, open = o, close = haclose, type = ChartType.CANDLE, growColor = GlobalColor("RisingMA"), fallColor = GlobalColor("FallingMA"), neutralColor = color.gray);
 

$fusionboy16

New member
@mjlinhle @zkm

For script: https://tos.mx/D3cQCON

Go to: Studies > edit studies
On the left side of the dialog box search for your imported script
Right click on your script and select edit
In the new dialog box will be your script

You will see DefineGlobalColor("RisingMA", color.blue);

change blue to whatever color you want, do not delete or replace any other characters as you might screw up the script
 
Last edited:

Similar threads

Top