/////////////////////////////////////////////////////// // // 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[]; };