#property indicator_chart_window
#property copyright "sakisf"
#property link "https://www.forexfactory.com/sakisf"

#property strict
#property indicator_buffers 10
#property indicator_color1 clrBlack
#property indicator_color2 clrBlue
#property indicator_color3 clrDarkGreen
#property indicator_color4 clrRed
#property indicator_color5 clrWhite

#property indicator_color6 clrBlack
#property indicator_color7 clrBlue
#property indicator_color8 clrDarkGreen
#property indicator_color9 clrRed
#property indicator_color10 clrWhite

extern int periods = 7200; // Periods back to check
extern int depth = 1; // Depth from 1 to 5
extern ENUM_TIMEFRAMES DROP_TF = PERIOD_M1; //Check every X period

double up1[], up2[], up3[], up4[], up5[];
double dn1[], dn2[], dn3[], dn4[], dn5[];
int multi;

int OnInit()
{
	if (depth < 1) depth = 1;
	if (depth > 5) depth = 5;

	if (depth <= 1) {
		SetIndexStyle(0, DRAW_ARROW, 0, 1);
		SetIndexArrow(0, 140);
		SetIndexStyle(5, DRAW_ARROW, 0, 1);
		SetIndexArrow(5, 140);
		SetIndexBuffer(0, up1);
		SetIndexBuffer(5, dn1);
	}
	else {
		SetIndexStyle(0, DRAW_NONE);
		SetIndexStyle(5, DRAW_NONE);
		SetIndexBuffer(0, up1);
		SetIndexBuffer(5, dn1);
	}


	if (depth <= 2) {
		SetIndexStyle(1, DRAW_ARROW, 0, 2);
		SetIndexArrow(1, 141);
		SetIndexStyle(6, DRAW_ARROW, 0, 2);
		SetIndexArrow(6, 141);
		SetIndexBuffer(1, up2);
		SetIndexBuffer(6, dn2);
	}
	else {
		SetIndexStyle(1, DRAW_NONE);
		SetIndexStyle(6, DRAW_NONE);
		SetIndexBuffer(1, up2);
		SetIndexBuffer(6, dn2);
	}

	if (depth <= 3) {
		SetIndexStyle(2, DRAW_ARROW, 0, 3);
		SetIndexArrow(2, 142);
		SetIndexStyle(7, DRAW_ARROW, 0, 3);
		SetIndexArrow(7, 142);
		SetIndexBuffer(2, up3);
		SetIndexBuffer(7, dn3);
	}
	else {
		SetIndexStyle(2, DRAW_NONE);
		SetIndexStyle(7, DRAW_NONE);
		SetIndexBuffer(2, up3);
		SetIndexBuffer(7, dn3);
	}

	if (depth <= 4) {
		SetIndexStyle(3, DRAW_ARROW, 0, 4);
		SetIndexArrow(3, 143);
		SetIndexStyle(8, DRAW_ARROW, 0, 4);
		SetIndexArrow(8, 143);
		SetIndexBuffer(3, up4);
		SetIndexBuffer(8, dn4);
	}
	else {
		SetIndexStyle(3, DRAW_NONE);
		SetIndexStyle(8, DRAW_NONE);
		SetIndexBuffer(3, up4);
		SetIndexBuffer(8, dn4);
	}

	SetIndexStyle(4, DRAW_ARROW, 0, 5);
	SetIndexArrow(4, 144);
	SetIndexBuffer(4, up5);
	SetIndexStyle(9, DRAW_ARROW, 0, 5);
	SetIndexArrow(9, 144);
	SetIndexBuffer(9, dn5);

	if (ChartPeriod() == 1) multi = 20;
	if (ChartPeriod() == 5) multi = 30;
	if (ChartPeriod() == 15) multi = 40;
	if (ChartPeriod() == 30) multi = 60;
	if (ChartPeriod() == 60) multi = 80;
	if (ChartPeriod() == 240) multi = 100;
	if (ChartPeriod() == 1440) multi = 200;
	if (ChartPeriod() == 10080) multi = 400;
	if (ChartPeriod() == 43200) multi = 800;

	return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
	const int prev_calculated,
	const datetime &time[],
	const double &open[],
	const double &high[],
	const double &low[],
	const double &close[],
	const long &tick_volume[],
	const long &volume[],
	const int &spread[])
{
	bool new_1m_check = false;
	static datetime start_1m_time = 0;
	if (start_1m_time < iTime(NULL, DROP_TF, 0))
	{
		new_1m_check = true;
		start_1m_time = iTime(NULL, DROP_TF, 0);
	}
	if (new_1m_check)
	{
		blue();
		new_1m_check = false;
	}

	return(rates_total);
}

void OnDeinit(const int reason)
{
	return;
}

void blue() {
	if (periods > Bars) periods = Bars;

	for (int x = periods - 5; x >= 0; x--) {
		if (depth <= 1) { if ((Open[x] - Close[x]) < 0 && (Open[x + 1] - Close[x + 1]) > 0 && (MathAbs(Open[x] - Close[x]) > ((Open[x + 1] - Close[x + 1])))) up1[x] = 1; else up1[x] = EMPTY_VALUE; }
		if (depth <= 2) { if ((Open[x] - Close[x]) < 0 && (Open[x + 1] - Close[x + 1]) > 0 && (Open[x + 2] - Close[x + 2]) > 0 && (MathAbs(Open[x] - Close[x]) > ((Open[x + 1] - Close[x + 1]) + (Open[x + 2] - Close[x + 2])))) up2[x] = 1; else up2[x] = EMPTY_VALUE; }
		if (depth <= 3) { if ((Open[x] - Close[x]) < 0 && (Open[x + 1] - Close[x + 1]) > 0 && (Open[x + 2] - Close[x + 2]) > 0 && (Open[x + 3] - Close[x + 3]) > 0 && (MathAbs(Open[x] - Close[x]) > ((Open[x + 1] - Close[x + 1]) + (Open[x + 2] - Close[x + 2]) + (Open[x + 3] - Close[x + 3])))) up3[x] = 1; else up3[x] = EMPTY_VALUE; }
		if (depth <= 4) { if ((Open[x] - Close[x]) < 0 && (Open[x + 1] - Close[x + 1]) > 0 && (Open[x + 2] - Close[x + 2]) > 0 && (Open[x + 3] - Close[x + 3]) > 0 && (Open[x + 4] - Close[x + 4]) > 0 && (MathAbs(Open[x] - Close[x]) > ((Open[x + 1] - Close[x + 1]) + (Open[x + 2] - Close[x + 2]) + (Open[x + 3] - Close[x + 3]) + (Open[x + 4] - Close[x + 4])))) up4[x] = 1; else up4[x] = EMPTY_VALUE; }
		if (depth <= 5) { if ((Open[x] - Close[x]) < 0 && (Open[x + 1] - Close[x + 1]) > 0 && (Open[x + 2] - Close[x + 2]) > 0 && (Open[x + 3] - Close[x + 3]) > 0 && (Open[x + 4] - Close[x + 4]) > 0 && (Open[x + 5] - Close[x + 5]) > 0 && (MathAbs(Open[x] - Close[x]) > ((Open[x + 1] - Close[x + 1]) + (Open[x + 2] - Close[x + 2]) + (Open[x + 3] - Close[x + 3]) + (Open[x + 4] - Close[x + 4]) + (Open[x + 5] - Close[x + 5])))) up5[x] = 1; else up5[x] = EMPTY_VALUE; }

		if (depth <= 1) { if ((Open[x] - Close[x]) > 0 && (Open[x + 1] - Close[x + 1]) < 0 && ((Open[x] - Close[x]) > (MathAbs(Open[x + 1] - Close[x + 1])))) dn1[x] = 1; else dn1[x] = EMPTY_VALUE; }
		if (depth <= 2) { if ((Open[x] - Close[x]) > 0 && (Open[x + 1] - Close[x + 1]) < 0 && (Open[x + 2] - Close[x + 2]) < 0 && ((Open[x] - Close[x]) > (MathAbs(Open[x + 1] - Close[x + 1]) + MathAbs(Open[x + 2] - Close[x + 2])))) dn2[x] = 1; else dn2[x] = EMPTY_VALUE; }
		if (depth <= 3) { if ((Open[x] - Close[x]) > 0 && (Open[x + 1] - Close[x + 1]) < 0 && (Open[x + 2] - Close[x + 2]) < 0 && (Open[x + 3] - Close[x + 3]) < 0 && ((Open[x] - Close[x]) > (MathAbs(Open[x + 1] - Close[x + 1]) + MathAbs(Open[x + 2] - Close[x + 2]) + MathAbs(Open[x + 3] - Close[x + 3])))) dn3[x] = 1; else dn3[x] = EMPTY_VALUE; }
		if (depth <= 4) { if ((Open[x] - Close[x]) > 0 && (Open[x + 1] - Close[x + 1]) < 0 && (Open[x + 2] - Close[x + 2]) < 0 && (Open[x + 3] - Close[x + 3]) < 0 && (Open[x + 4] - Close[x + 4]) < 0 && ((Open[x] - Close[x]) > (MathAbs(Open[x + 1] - Close[x + 1]) + MathAbs(Open[x + 2] - Close[x + 2]) + MathAbs(Open[x + 3] - Close[x + 3]) + MathAbs(Open[x + 4] - Close[x + 4])))) dn4[x] = 1; else dn4[x] = EMPTY_VALUE; }
		if (depth <= 5) { if ((Open[x] - Close[x]) > 0 && (Open[x + 1] - Close[x + 1]) < 0 && (Open[x + 2] - Close[x + 2]) < 0 && (Open[x + 3] - Close[x + 3]) < 0 && (Open[x + 4] - Close[x + 4]) < 0 && (Open[x + 5] - Close[x + 5]) < 0 && ((Open[x] - Close[x]) > (MathAbs(Open[x + 1] - Close[x + 1]) + MathAbs(Open[x + 2] - Close[x + 2]) + MathAbs(Open[x + 3] - Close[x + 3]) + MathAbs(Open[x + 4] - Close[x + 4]) + MathAbs(Open[x + 5] - Close[x + 5])))) dn5[x] = 1; else dn5[x] = EMPTY_VALUE; }
	}
	for (int x = periods - 5; x >= 0; x--) {
		if (up5[x] == 1) { up1[x] = EMPTY_VALUE; up2[x] = EMPTY_VALUE; up3[x] = EMPTY_VALUE; up4[x] = EMPTY_VALUE; up5[x] = Open[x] - multi*Point; }
		if (up4[x] == 1) { up1[x] = EMPTY_VALUE; up2[x] = EMPTY_VALUE; up3[x] = EMPTY_VALUE; up4[x] = Open[x] - multi*Point; }
		if (up3[x] == 1) { up1[x] = EMPTY_VALUE; up2[x] = EMPTY_VALUE; up3[x] = Open[x] - multi*Point; }
		if (up2[x] == 1) { up1[x] = EMPTY_VALUE; up2[x] = Open[x] - multi*Point; }
		if (up1[x] == 1) { up1[x] = Open[x] - multi*Point; }

		if (dn5[x] == 1) { dn1[x] = EMPTY_VALUE; dn2[x] = EMPTY_VALUE; dn3[x] = EMPTY_VALUE; dn4[x] = EMPTY_VALUE; dn5[x] = Open[x] + multi*Point; }
		if (dn4[x] == 1) { dn1[x] = EMPTY_VALUE; dn2[x] = EMPTY_VALUE; dn3[x] = EMPTY_VALUE; dn4[x] = Open[x] + multi*Point; }
		if (dn3[x] == 1) { dn1[x] = EMPTY_VALUE; dn2[x] = EMPTY_VALUE; dn3[x] = Open[x] + multi*Point; }
		if (dn2[x] == 1) { dn1[x] = EMPTY_VALUE; dn2[x] = Open[x] + multi*Point; }
		if (dn1[x] == 1) { dn1[x] = Open[x] + multi*Point; }
	}
}