# 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.
#Update that "fixes" the green candles.
#JTP
#02/7/2021
input period = 20;
input hideCandles = Yes; #Now functional - JTP
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 + 0;
o.Hide();
### Wicks and Shadows
def haLow = Min(lowMA, haOpen);
def haHigh = Max(highMA, haOpen);
input debug = no;
def last = if haOpen[1] < haClose[1] and haOpen > haClose then BarNumber() else if haOpen[1] > haClose[1] and haOpen < haClose then BarNumber() else Double.NaN;
AddLabel(debug, HighestAll(last));
plot xlast = if !debug then Double.NaN else BarNumber();
xlast.SetPaintingStrategy(PaintingStrategy.VALUES_BELOW);
### 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);
#Red Candlesticks -----------------------------------------------------------------|
input charttype = ChartType.CANDLE;
def haOpen_fall = if haOpen > haClose
then haOpen
else Double.NaN;
def haHigh_fall = if haOpen >= haClose
then haHigh
else Double.NaN;
def haLow_fall = if haOpen >= haClose
then haLow
else Double.NaN;
def haClose_fall = if haOpen >= haClose
then haClose
else Double.NaN;
AddChart(growColor = Color.RED, fallColor = Color.GREEN, neutralColor = Color.CURRENT, high = if BarNumber() >= HighestAll(last) then haHigh_fall else Double.NaN, low = haLow_fall, open = haOpen_fall, close = haClose_fall , type = ChartType.CANDLE);
AddChart(growColor = Color.GRAY, fallColor = Color.GREEN, neutralColor = Color.CURRENT, high = if BarNumber() < HighestAll(last) then haHigh_fall else Double.NaN, low = haLow_fall, open = haOpen_fall, close = haClose_fall , type = ChartType.CANDLE);
#Green Candlesticks -----------------------------------------------------------------|
#Removed and/or replaced - JTP
#def HAclose1 = if haOpen<=haClose
# then hahigh
# else double.nan;
#def HAclose1 = ohlc4 -1;
#def HAopen1 = if haopen<=haclose
# then haclose
# then CompoundValue(1, (HAopen[1] + HAclose[1]) /2, (open[1] + close[1]) / 2)
# else double.nan;
def haOpen_rise = if haOpen < haClose
then haClose
else Double.NaN;
def haHigh_rise = if haOpen <= haClose
then haHigh
else Double.NaN;
def haLow_rise = if haOpen <= haClose
then haLow
else Double.NaN;
def haClose_rise = if haOpen <= haClose
then haOpen
else Double.NaN;
AddChart(growColor = Color.GREEN, fallColor = Color.RED, neutralColor = Color.CURRENT, high = if BarNumber() >= HighestAll(last) then haHigh_rise else Double.NaN, low = haLow_rise, open = haOpen_rise, close = haClose_rise, type = ChartType.CANDLE);
AddChart(growColor = Color.GRAY, fallColor = Color.RED, neutralColor = Color.CURRENT, high = if BarNumber() < HighestAll(last) then haHigh_rise else Double.NaN, low = haLow_rise, open = haOpen_rise, close = haClose_rise, type = ChartType.CANDLE);
# End Study
##############################################################################