311 lines
6.4 KiB
Plaintext
311 lines
6.4 KiB
Plaintext
|
|
//
|
|
XOHCLSupRes XPVHLPFindCandleSupprtAndResistance(
|
|
int bar_index, // Bar Index ...
|
|
int verifications = 4 // Number of Verifications ...
|
|
)
|
|
{
|
|
//
|
|
XOHCLSupRes result = {};
|
|
result.res = 0;
|
|
result.highRes = 0;
|
|
result.sup = 0;
|
|
result.lowSup = 0;
|
|
|
|
//
|
|
XOHCL cBar = GetCandle(
|
|
_Symbol,
|
|
_Period,
|
|
bar_index);
|
|
|
|
//
|
|
int tries = 0;
|
|
int lastBar = bar_index;
|
|
while (
|
|
result.res == 0 ||
|
|
result.highRes == 0 ||
|
|
result.sup == 0 ||
|
|
result.lowSup == 0)
|
|
{
|
|
//
|
|
int bar = XPVHLPFindSupportBar(lastBar);
|
|
double val = XPVHLPFindSupportValue(lastBar);
|
|
|
|
//
|
|
int bar1 = XPVHLPFindResistanceBar(lastBar);
|
|
double val1 = XPVHLPFindResistanceValue(lastBar);
|
|
|
|
//
|
|
if (result.res == 0 && result.highRes == 0 && val > cBar.high && val1 > cBar.high)
|
|
{
|
|
//
|
|
result.res = MathMin(val, val1);
|
|
result.highRes = MathMax(val, val1);
|
|
}
|
|
else if (result.sup == 0 && result.lowSup == 0 && val < cBar.low && val1 < cBar.low)
|
|
{
|
|
//
|
|
result.sup = MathMax(val, val1);
|
|
result.lowSup = MathMin(val, val1);
|
|
}
|
|
else if (val > cBar.high)
|
|
{
|
|
//
|
|
if (result.res == 0 || result.highRes == 0)
|
|
{
|
|
//
|
|
if (result.res == 0)
|
|
{
|
|
result.res = val;
|
|
}
|
|
else if (val > result.res)
|
|
{
|
|
result.highRes = val;
|
|
}
|
|
else if (val < result.res)
|
|
{
|
|
//
|
|
result.highRes = result.res;
|
|
result.res = val;
|
|
}
|
|
}
|
|
}
|
|
else if (val < cBar.low)
|
|
{
|
|
//
|
|
if (result.sup == 0 || result.lowSup == 0)
|
|
{
|
|
//
|
|
if (result.sup == 0)
|
|
{
|
|
result.sup = val;
|
|
}
|
|
else if (val < result.sup)
|
|
{
|
|
result.lowSup = val;
|
|
}
|
|
else if (val > result.sup)
|
|
{
|
|
//
|
|
result.lowSup = result.sup;
|
|
result.sup = val;
|
|
}
|
|
}
|
|
}
|
|
else if (val1 > cBar.high)
|
|
{
|
|
//
|
|
if (result.res == 0 || result.highRes == 0)
|
|
{
|
|
//
|
|
if (result.res == 0)
|
|
{
|
|
result.res = val1;
|
|
}
|
|
else if (val1 > result.res)
|
|
{
|
|
result.highRes = val1;
|
|
}
|
|
else if (val1 < result.res)
|
|
{
|
|
//
|
|
result.highRes = result.res;
|
|
result.res = val1;
|
|
}
|
|
}
|
|
}
|
|
else if (val1 < cBar.low)
|
|
{
|
|
//
|
|
if (result.sup == 0 || result.lowSup == 0)
|
|
{
|
|
//
|
|
if (result.sup == 0)
|
|
{
|
|
result.sup = val1;
|
|
}
|
|
else if (val1 < result.sup)
|
|
{
|
|
result.lowSup = val1;
|
|
}
|
|
else if (val1 > result.sup)
|
|
{
|
|
//
|
|
result.lowSup = result.sup;
|
|
result.sup = val1;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
if (tries >= verifications)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
lastBar = MathMin(bar, bar1);
|
|
tries++;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
int XPVHLPFindSupportBar(
|
|
int bar_index, // Bar Index ...
|
|
int verifications = 4 // Number of Verifications ...
|
|
)
|
|
{
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
int mVerified = 0;
|
|
int idx = bar_index;
|
|
bool founded = false;
|
|
double lastValue = 0;
|
|
while (!founded)
|
|
{
|
|
//
|
|
XPVHLPReadBuffers(idx);
|
|
bool isSupport = XPVHLPIsStrongSupport(idx);
|
|
if (isSupport)
|
|
{
|
|
//
|
|
if (lastValue != pvLLLBuffer[idx])
|
|
{
|
|
//
|
|
lastValue = pvLLLBuffer[idx];
|
|
mVerified = 0;
|
|
}
|
|
else if (lastValue == pvLLLBuffer[idx])
|
|
{
|
|
mVerified++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mVerified = 0;
|
|
}
|
|
|
|
//
|
|
idx++;
|
|
|
|
//
|
|
founded = mVerified >= verifications;
|
|
if (founded)
|
|
{
|
|
result = idx;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double XPVHLPFindSupportValue(
|
|
int bar_index, // Bar Index ...
|
|
int verifications = 4 // Number of Verifications ...
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
int supportBar = XPVHLPFindSupportBar(bar_index, verifications);
|
|
if (supportBar < -1)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
return pvSLLBuffer[bar_index];
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
int XPVHLPFindResistanceBar(
|
|
int bar_index, // Bar Index ...
|
|
int verifications = 4 // Number of Verifications ...
|
|
)
|
|
{
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
int mVerified = 0;
|
|
int idx = bar_index;
|
|
bool founded = false;
|
|
double lastValue = 0;
|
|
while (!founded)
|
|
{
|
|
//
|
|
XPVHLPReadBuffers(idx);
|
|
bool isSupport = XPVHLPIsStrongResistance(idx);
|
|
if (isSupport)
|
|
{
|
|
//
|
|
if (lastValue != pvLHHBuffer[idx])
|
|
{
|
|
//
|
|
lastValue = pvLHHBuffer[idx];
|
|
mVerified = 0;
|
|
}
|
|
else if (lastValue == pvLHHBuffer[idx])
|
|
{
|
|
mVerified++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mVerified = 0;
|
|
}
|
|
|
|
//
|
|
idx++;
|
|
|
|
//
|
|
founded = mVerified >= verifications;
|
|
if (founded)
|
|
{
|
|
result = idx;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double XPVHLPFindResistanceValue(
|
|
int bar_index, // Bar Index ...
|
|
int verifications = 4 // Number of Verifications ...
|
|
)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
int supportBar = XPVHLPFindResistanceBar(bar_index, verifications);
|
|
if (supportBar < -1)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
return pvSHHBuffer[bar_index];
|
|
|
|
//
|
|
return result;
|
|
}
|