John Snyder
New member
#This is an indicator inspired by the concept of "candlestick math". It aggregates multiple candles into one. Furthermore, it does so for both traditional Japanese candles and Heikin Ashi candles.
#Written by John Snyder. Contributed to the public domain April 3, 2022.
declare lower;
input AggWidth = 0;
input CandleType = {default JapaneseCandles, HeikinAshiCandles};
DefineGlobalColor("G1", CreateColor(102, 255, 102)); #Green
DefineGlobalColor("G2", CreateColor(55, 210, 55)); #51, 204, 51)); #Green
DefineGlobalColor("G3", CreateColor(28, 165, 28)); #25, 153, 25)); #Green
DefineGlobalColor("G4", CreateColor(0, 127, 0)); #Green
DefineGlobalColor("G5", CreateColor(0, 102, 0)); #Green
DefineGlobalColor("G6", CreateColor(0, 80, 0)); #Green
DefineGlobalColor("R1", CreateColor(255, 0, 0)); #Red
DefineGlobalColor("R2", CreateColor(215, 0, 0)); #Red
DefineGlobalColor("R3", CreateColor(180, 0, 0)); #Red
DefineGlobalColor("R4", CreateColor(150, 0, 0)); #Red
DefineGlobalColor("R5", CreateColor(125, 0, 0)); #Red
DefineGlobalColor("R6", CreateColor(105, 0, 0)); #Red
DefineGlobalColor("Y1", CreateColor(255, 255, 0)); #Yellow
DefineGlobalColor("Y2", CreateColor(219, 219, 0)); #Yellow
DefineGlobalColor("Y3", CreateColor(186, 186, 0)); #Yellow
DefineGlobalColor("Y4", CreateColor(153, 153, 0)); #Yellow
DefineGlobalColor("M1", CreateColor(255, 0, 255)); #Magenta
DefineGlobalColor("M2", CreateColor(219, 0, 219)); #Magenta
DefineGlobalColor("M3", CreateColor(186, 0, 186)); #Magenta
DefineGlobalColor("M4", CreateColor(153, 0, 153)); #Magenta
DefineGlobalColor("B1", CreateColor(51, 204, 255)); #Blue
DefineGlobalColor("B2", CreateColor(38, 154, 255)); #Blue
DefineGlobalColor("B3", CreateColor(31, 136, 236)); #Blue
DefineGlobalColor("B4", CreateColor(20, 102, 224)); #Blue
DefineGlobalColor("Gray", CreateColor(28, 28, 28)); #Gray
script UIStudy { # Multiple Candlestick Aggregation Periods
input AggWidth = 0;
def AggOpen = close[AggWidth + 1];
def AggHigh = Highest(high, AggWidth + 1);
def AggLow = Lowest (low, AggWidth + 1);
def AggClose = close;
plot Lwick = AggLow;
plot Lbody = if AggOpen < AggClose then AggOpen else AggClose;
plot Ubody = if AggOpen > AggClose then AggOpen else AggClose;
plot Uwick = AggHigh;
plot UIclose = AggClose;
plot UIopen = AggOpen;
}
script HAStudy { # Multiple Candlestick Aggregation Periods
input AggWidth = 0;
def AggClose = close;
def AggOpen = close[AggWidth + 1]; #to accomodate Renko charts
def AggHigh = Highest(high, AggWidth + 1);
def AggLow = Lowest (low, AggWidth + 1);
def HA_close = (AggOpen + AggHigh + AggLow + AggClose) * 0.25;
def HA_open = CompoundValue(AggWidth + 1, (HA_open[AggWidth + 1] + HA_close[AggWidth + 1]) * 0.5, (AggOpen[AggWidth + 1] + AggClose[AggWidth + 1]) * 0.5);
def HA_high = Max(Max(AggHigh, HA_open), HA_close);
def HA_low = Min(Min(AggLow, HA_open), HA_close);
plot LWick = HA_low;
plot Lbody = if HA_close < HA_open then HA_close else HA_open;
plot UBody = if HA_close > HA_open then HA_close else HA_open;
plot Uwick = HA_high;
plot HAclose = HA_close;
plot HAopen = HA_open;
}
def LWick;
def LBody;
def UBody;
def UWick;
def UIclose;
def UIopen;
switch (CandleType) {
case JapaneseCandles:
LWick = UIStudy(AggWidth).Lwick;
LBody = UIStudy(AggWidth).Lbody;
UBody = UIStudy(AggWidth).Ubody;
UWick = UIStudy(AggWidth).Uwick;
UIclose = UIStudy(AggWidth).UIclose;
UIopen = UIStudy(AggWidth).UIopen;
case HeikinAshiCandles:
LWick = HAStudy(AggWidth).Lwick;
LBody = HAStudy(AggWidth).Lbody;
UBody = HAStudy(AggWidth).Ubody;
UWick = HAStudy(AggWidth).Uwick;
UIclose = HAStudy(AggWidth).HAclose;
UIopen = HAStudy(AggWidth).HAopen;
}
plot Tr_LowerWick = LWick;
#Tr_LowerWick.hide();
Tr_LowerWick.AssignValueColor(GlobalColor("Gray"));
Tr_LowerWick.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_LowerBody = LBody;
#Tr_LowerBody.hide();
Tr_LowerBody.AssignValueColor(if UIclose > UIopen then GlobalColor("G6") else GlobalColor("R6"));
Tr_LowerBody.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_UpperBody = UBody;
#Tr_UpperBody.hide();
Tr_UpperBody.AssignValueColor(if UIclose > UIopen then Color.GREEN else Color.RED);
Tr_UpperBody.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_UpperWick = UWick;
#Tr_UpperWick.hide();
Tr_UpperWick.AssignValueColor(if UIclose > UIopen then GlobalColor("G6") else GlobalColor("R6"));
Tr_UpperWick.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_high = UWick;
Tr_high.AssignValueColor(Color.GRAY);
plot Tr_low = LWick;
Tr_low.AssignValueColor(Color.GRAY);
plot Tr_avg = (UBody + LBody) * 0.5;
Tr_Avg.AssignVAlueColor(Color.YELLOW);
This is how Japanese candle compression looks with the 4 previous candles are aggregated into the current candle.
http://tos.mx/UJwW3No
Hmmm ... I don't know why those black vertical lines are showing up in this picture, because they don't show up when the indicator is loaded into ThinkorSwim. It looks like when this picture was converted from a black background to a white background, the display code:
Tr_LowerWick.AssignValueColor(GlobalColor("Gray"));
caused what was otherwise hidden in the black background to become visible. If one chooses to use a white background, one would need to change the color specified by this line of code to white.
#Written by John Snyder. Contributed to the public domain April 3, 2022.
declare lower;
input AggWidth = 0;
input CandleType = {default JapaneseCandles, HeikinAshiCandles};
DefineGlobalColor("G1", CreateColor(102, 255, 102)); #Green
DefineGlobalColor("G2", CreateColor(55, 210, 55)); #51, 204, 51)); #Green
DefineGlobalColor("G3", CreateColor(28, 165, 28)); #25, 153, 25)); #Green
DefineGlobalColor("G4", CreateColor(0, 127, 0)); #Green
DefineGlobalColor("G5", CreateColor(0, 102, 0)); #Green
DefineGlobalColor("G6", CreateColor(0, 80, 0)); #Green
DefineGlobalColor("R1", CreateColor(255, 0, 0)); #Red
DefineGlobalColor("R2", CreateColor(215, 0, 0)); #Red
DefineGlobalColor("R3", CreateColor(180, 0, 0)); #Red
DefineGlobalColor("R4", CreateColor(150, 0, 0)); #Red
DefineGlobalColor("R5", CreateColor(125, 0, 0)); #Red
DefineGlobalColor("R6", CreateColor(105, 0, 0)); #Red
DefineGlobalColor("Y1", CreateColor(255, 255, 0)); #Yellow
DefineGlobalColor("Y2", CreateColor(219, 219, 0)); #Yellow
DefineGlobalColor("Y3", CreateColor(186, 186, 0)); #Yellow
DefineGlobalColor("Y4", CreateColor(153, 153, 0)); #Yellow
DefineGlobalColor("M1", CreateColor(255, 0, 255)); #Magenta
DefineGlobalColor("M2", CreateColor(219, 0, 219)); #Magenta
DefineGlobalColor("M3", CreateColor(186, 0, 186)); #Magenta
DefineGlobalColor("M4", CreateColor(153, 0, 153)); #Magenta
DefineGlobalColor("B1", CreateColor(51, 204, 255)); #Blue
DefineGlobalColor("B2", CreateColor(38, 154, 255)); #Blue
DefineGlobalColor("B3", CreateColor(31, 136, 236)); #Blue
DefineGlobalColor("B4", CreateColor(20, 102, 224)); #Blue
DefineGlobalColor("Gray", CreateColor(28, 28, 28)); #Gray
script UIStudy { # Multiple Candlestick Aggregation Periods
input AggWidth = 0;
def AggOpen = close[AggWidth + 1];
def AggHigh = Highest(high, AggWidth + 1);
def AggLow = Lowest (low, AggWidth + 1);
def AggClose = close;
plot Lwick = AggLow;
plot Lbody = if AggOpen < AggClose then AggOpen else AggClose;
plot Ubody = if AggOpen > AggClose then AggOpen else AggClose;
plot Uwick = AggHigh;
plot UIclose = AggClose;
plot UIopen = AggOpen;
}
script HAStudy { # Multiple Candlestick Aggregation Periods
input AggWidth = 0;
def AggClose = close;
def AggOpen = close[AggWidth + 1]; #to accomodate Renko charts
def AggHigh = Highest(high, AggWidth + 1);
def AggLow = Lowest (low, AggWidth + 1);
def HA_close = (AggOpen + AggHigh + AggLow + AggClose) * 0.25;
def HA_open = CompoundValue(AggWidth + 1, (HA_open[AggWidth + 1] + HA_close[AggWidth + 1]) * 0.5, (AggOpen[AggWidth + 1] + AggClose[AggWidth + 1]) * 0.5);
def HA_high = Max(Max(AggHigh, HA_open), HA_close);
def HA_low = Min(Min(AggLow, HA_open), HA_close);
plot LWick = HA_low;
plot Lbody = if HA_close < HA_open then HA_close else HA_open;
plot UBody = if HA_close > HA_open then HA_close else HA_open;
plot Uwick = HA_high;
plot HAclose = HA_close;
plot HAopen = HA_open;
}
def LWick;
def LBody;
def UBody;
def UWick;
def UIclose;
def UIopen;
switch (CandleType) {
case JapaneseCandles:
LWick = UIStudy(AggWidth).Lwick;
LBody = UIStudy(AggWidth).Lbody;
UBody = UIStudy(AggWidth).Ubody;
UWick = UIStudy(AggWidth).Uwick;
UIclose = UIStudy(AggWidth).UIclose;
UIopen = UIStudy(AggWidth).UIopen;
case HeikinAshiCandles:
LWick = HAStudy(AggWidth).Lwick;
LBody = HAStudy(AggWidth).Lbody;
UBody = HAStudy(AggWidth).Ubody;
UWick = HAStudy(AggWidth).Uwick;
UIclose = HAStudy(AggWidth).HAclose;
UIopen = HAStudy(AggWidth).HAopen;
}
plot Tr_LowerWick = LWick;
#Tr_LowerWick.hide();
Tr_LowerWick.AssignValueColor(GlobalColor("Gray"));
Tr_LowerWick.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_LowerBody = LBody;
#Tr_LowerBody.hide();
Tr_LowerBody.AssignValueColor(if UIclose > UIopen then GlobalColor("G6") else GlobalColor("R6"));
Tr_LowerBody.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_UpperBody = UBody;
#Tr_UpperBody.hide();
Tr_UpperBody.AssignValueColor(if UIclose > UIopen then Color.GREEN else Color.RED);
Tr_UpperBody.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_UpperWick = UWick;
#Tr_UpperWick.hide();
Tr_UpperWick.AssignValueColor(if UIclose > UIopen then GlobalColor("G6") else GlobalColor("R6"));
Tr_UpperWick.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
plot Tr_high = UWick;
Tr_high.AssignValueColor(Color.GRAY);
plot Tr_low = LWick;
Tr_low.AssignValueColor(Color.GRAY);
plot Tr_avg = (UBody + LBody) * 0.5;
Tr_Avg.AssignVAlueColor(Color.YELLOW);
This is how Japanese candle compression looks with the 4 previous candles are aggregated into the current candle.
http://tos.mx/UJwW3No
Hmmm ... I don't know why those black vertical lines are showing up in this picture, because they don't show up when the indicator is loaded into ThinkorSwim. It looks like when this picture was converted from a black background to a white background, the display code:
Tr_LowerWick.AssignValueColor(GlobalColor("Gray"));
caused what was otherwise hidden in the black background to become visible. If one chooses to use a white background, one would need to change the color specified by this line of code to white.
Last edited: