216 lines
4.6 KiB
Plaintext
216 lines
4.6 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Hull Class Library
|
|
// ----------------------------------------------
|
|
// Name: XSCHull
|
|
// Description: provides all Hull requirements ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// START Definitions ...
|
|
//
|
|
|
|
//
|
|
struct XHullData
|
|
{
|
|
//
|
|
double value;
|
|
double value3;
|
|
|
|
//
|
|
double wsum1;
|
|
double wsum2;
|
|
double wsum3;
|
|
|
|
//
|
|
double lsum1;
|
|
double lsum2;
|
|
double lsum3;
|
|
};
|
|
|
|
//
|
|
// END Definitions ...
|
|
//
|
|
|
|
//
|
|
// START Import and Inclused requirements ...
|
|
//
|
|
|
|
//
|
|
// Includes ...
|
|
#include "../Libraries/x-saherelm.log.lib.mq5"
|
|
#include "../Libraries/x-saherelm.models.lib.mq5"
|
|
#include "../Libraries/x-saherelm.common.lib.mq5"
|
|
|
|
//
|
|
// END Import and Inclused requirements ...
|
|
//
|
|
|
|
//
|
|
// START Overrides ...
|
|
//
|
|
|
|
//
|
|
// END Overrides ...
|
|
//
|
|
|
|
//
|
|
// a Class For Hull Calculations ...
|
|
class XSCHull
|
|
{
|
|
//
|
|
public:
|
|
//
|
|
// Constructor ...
|
|
XSCHull() : mFullPeriod(1), mHalfPeriod(1), mSqrtPeriod(1), mArraySize(-1)
|
|
{
|
|
//
|
|
// These are a way above to assign Private variables at Construct time ...
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
~XSCHull()
|
|
{
|
|
ArrayFree(mData);
|
|
}
|
|
|
|
//
|
|
// Initial Hull ...
|
|
bool Init(int period, double divisor)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
mFullPeriod = (int)(period > 1 ? period : 1);
|
|
mHalfPeriod = (int)(mFullPeriod > 1 ? mFullPeriod / (divisor > 1 ? divisor : 1) : 1);
|
|
mSqrtPeriod = (int)MathSqrt(mFullPeriod);
|
|
|
|
//
|
|
mArraySize = -1;
|
|
mWeight1 = mWeight2 = mWeight3 = 1;
|
|
|
|
//
|
|
result = true;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// CalCulate Specific Value ...
|
|
double Calculate(
|
|
double value,
|
|
int i,
|
|
int bars)
|
|
{
|
|
//
|
|
double result = 0;
|
|
|
|
//
|
|
if (mArraySize < bars)
|
|
{
|
|
//
|
|
mArraySize = ArrayResize(mData, bars + 500);
|
|
if (mArraySize < bars)
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mData[i].value = value;
|
|
if (i > mFullPeriod)
|
|
{
|
|
//
|
|
mData[i].wsum1 = mData[i - 1].wsum1 + value * mHalfPeriod - mData[i - 1].lsum1;
|
|
mData[i].lsum1 = mData[i - 1].lsum1 + value - mData[i - mHalfPeriod].value;
|
|
mData[i].wsum2 = mData[i - 1].wsum2 + value * mFullPeriod - mData[i - 1].lsum2;
|
|
mData[i].lsum2 = mData[i - 1].lsum2 + value - mData[i - mFullPeriod].value;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
mData[i].wsum1 = mData[i].wsum2 =
|
|
mData[i].lsum1 = mData[i].lsum2 = mWeight1 = mWeight2 = 0;
|
|
for (int k = 0, w1 = mHalfPeriod, w2 = mFullPeriod; w2 > 0 && i >= k; k++, w1--, w2--)
|
|
{
|
|
//
|
|
if (w1 > 0)
|
|
{
|
|
//
|
|
mData[i].wsum1 += mData[i - k].value * w1;
|
|
mData[i].lsum1 += mData[i - k].value;
|
|
mWeight1 += w1;
|
|
}
|
|
|
|
//
|
|
mData[i].wsum2 += mData[i - k].value * w2;
|
|
mData[i].lsum2 += mData[i - k].value;
|
|
mWeight2 += w2;
|
|
}
|
|
}
|
|
|
|
//
|
|
mData[i].value3 = 2.0 * mData[i].wsum1 / mWeight1 - mData[i].wsum2 / mWeight2;
|
|
|
|
//
|
|
if (i > mSqrtPeriod)
|
|
{
|
|
//
|
|
mData[i].wsum3 = mData[i - 1].wsum3 + mData[i].value3 * mSqrtPeriod - mData[i - 1].lsum3;
|
|
mData[i].lsum3 = mData[i - 1].lsum3 + mData[i].value3 - mData[i - mSqrtPeriod].value3;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
mData[i].wsum3 =
|
|
mData[i].lsum3 = mWeight3 = 0;
|
|
|
|
//
|
|
for (int k = 0, w3 = mSqrtPeriod; w3 > 0 && i >= k; k++, w3--)
|
|
{
|
|
//
|
|
mData[i].wsum3 += mData[i - k].value3 * w3;
|
|
mData[i].lsum3 += mData[i - k].value3;
|
|
mWeight3 += w3;
|
|
}
|
|
}
|
|
|
|
//
|
|
result = mData[i].wsum3 / mWeight3;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
int mFullPeriod;
|
|
int mHalfPeriod;
|
|
int mSqrtPeriod;
|
|
int mArraySize;
|
|
double mWeight1;
|
|
double mWeight2;
|
|
double mWeight3;
|
|
|
|
//
|
|
XHullData mData[];
|
|
}; |