/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Helper Class Library // ---------------------------------------------- // Name: XCX121XICHHelper // Description: provides all Indicator // Helper 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 // // Imports ... #include "../Classes/x-saherelm.x-helper.class.mq5" // // Definitions ... // // Definitions ... enum ENUM_X121_XICH_BUFFERS { X121_XICH_TENKANSEN_LINE = 0, X121_XICH_KIJUNSEN_LINE = 1, X121_XICH_CHIKOUSPAN_LINE = 2, X121_XICH_SENKOUSPANA_LINE = 3, X121_XICH_SENKOUSPANB_LINE = 4, }; // // Input Models ... struct X121XICHInputs { // // Props ... // // Market ... ENUM_X_PRICE chikouSpanMode; // ChikouSpan Mode int tenkanSenLength; // TenkanSen Length ENUM_X_BOUNDARY_PRICE tenkanSenMode; // TencanSen Mode int kijunSenLength; // KijunSen Length ENUM_X_BOUNDARY_PRICE kijunSenMode; // KijunSen Mode int senkouSpanBLength; // SenkouSpan B Length ENUM_X_BOUNDARY_PRICE senkouSpanBMode; // SenkouSpan B Mode // // Presentation ... int startCalculationForLastBars; // Calculate Last n Bars bool shiftKumo; // Shift Kumo bool showTenkanSen; // Show TenkanSen bool showKijunSen; // Show KijunSen bool showChikouSpan; // Show ChikouSpan bool showSenkouSpanA; // Show Senkou Span A bool showSenkouSpanB; // Show Senkou Span B bool showKumo; // Show Kumo // // Constructor(s) ... X121XICHInputs() { Clean(); } // // Tools ... // // Clean ... void Clean() { // // Market ... chikouSpanMode = X_PRICE_NONE; // ChikouSpan Mode tenkanSenLength = 0; // TenkanSen Length tenkanSenMode = X_BOUNDARY_PRICE_NONE; // TencanSen Mode kijunSenLength = 0; // KijunSen Length kijunSenMode = X_BOUNDARY_PRICE_NONE; // KijunSen Mode senkouSpanBLength = 0; // SenkouSpan B Length senkouSpanBMode = X_BOUNDARY_PRICE_NONE; // SenkouSpan B Mode // // Presentation ... startCalculationForLastBars = 0; // Calculate Last n Bars shiftKumo = false; // Shift Kumo showTenkanSen = false; // Show TenkanSen showKijunSen = false; // Show KijunSen showChikouSpan = false; // Show ChikouSpan showSenkouSpanA = false; // Show Senkou Span A showSenkouSpanB = false; // Show Senkou Span B showKumo = false; // Show Kumo // ZeroMemory(this); } // // Default ... void Default() { // // Market ... chikouSpanMode = X_PRICE_CLOSE; // ChikouSpan Mode tenkanSenLength = 9; // TenkanSen Length tenkanSenMode = X_BOUNDARY_PRICE_HIGH_LOW; // TencanSen Mode kijunSenLength = 26; // KijunSen Length kijunSenMode = X_BOUNDARY_PRICE_HIGH_LOW; // KijunSen Mode senkouSpanBLength = 52; // SenkouSpan B Length senkouSpanBMode = X_BOUNDARY_PRICE_HIGH_LOW; // SenkouSpan B Mode // // Presentation ... startCalculationForLastBars = 1000; // Calculate Last n Bars shiftKumo = true; // Shift Kumo showTenkanSen = true; // Show TenkanSen showKijunSen = true; // Show KijunSen showChikouSpan = true; // Show ChikouSpan showSenkouSpanA = true; // Show Senkou Span A showSenkouSpanB = true; // Show Senkou Span B showKumo = true; // Show Kumo } // // Validate ... bool IsValid() { // bool result = false; // result = // kijunSenLength > 0 && tenkanSenLength > 0 && senkouSpanBLength > 0 && IsValid(kijunSenMode) && IsValid(tenkanSenMode) && IsValid(chikouSpanMode) && IsValid(senkouSpanBMode) // ; // return result; } // // Retrieve MAx Length ... int Max() { // int result = 0; // result = MathMax(kijunSenLength, tenkanSenLength); result = MathMax(result, senkouSpanBLength); // return result; } }; // // Conditions ... struct X121XICHConditions { // // Common ... string symbol; ENUM_TIMEFRAMES period; datetime time; // // Buffers ... // double kijunSenBuffer[]; double tenkanSenBuffer[]; double chikouSpanBuffer[]; double senkouSpanABuffer[]; double senkouSpanBBuffer[]; // // Conditions ... // bool isTenkanSenOverKijunSen; bool isTenkanSenUnderKijunSen; // bool isTenkanSenCrossedOverKijunSen; bool isTenkanSenCrossedUnderKijunSen; // bool isSenkouSpanAOverB; bool isSenkouSpanAUnderB; // bool isSenkouSpanACrossedOverB; bool isSenkouSpanACrossedUnderB; // // Constructor ... X121XICHConditions() { Clean(); } // // Tools ... /** * Cleaning Up ... */ void Clean() { // // Commons ... symbol = NULL; period = NULL; time = NULL; // // Buffers ... // Clean(kijunSenBuffer); Clean(tenkanSenBuffer); Clean(chikouSpanBuffer); Clean(senkouSpanABuffer); Clean(senkouSpanBBuffer); // ArraySetAsSeries(kijunSenBuffer, true); ArraySetAsSeries(tenkanSenBuffer, true); ArraySetAsSeries(chikouSpanBuffer, true); ArraySetAsSeries(senkouSpanABuffer, true); ArraySetAsSeries(senkouSpanBBuffer, true); // // Conditions ... // isTenkanSenOverKijunSen = false; isTenkanSenUnderKijunSen = false; // isTenkanSenCrossedOverKijunSen = false; isTenkanSenCrossedUnderKijunSen = false; // isSenkouSpanAOverB = false; isSenkouSpanAUnderB = false; // isSenkouSpanACrossedOverB = false; isSenkouSpanACrossedUnderB = false; // ZeroMemory(this); } /** * Generate Conditions Scores ... * * @param bullishScore: Double, Directional Scores Reference ... * @param bearishScore: Double, Directional Scores Reference ... */ void GenerateScore( double &bullishScore, double &bearishScore // ) { // bullishScore = 0; bearishScore = 0; // // TODO: Implement if Required ... } /** * Generate Summary String for Represent Conditions State ... * * @param onlyCommons: Boolean, Just Generate Only Commons Conditions ... * @param onlyConditions: Boolean, Just Generate Only Conditions ... * @param includeScores: Boolean, Attach Scores Representations on Result ... * @param ignoreFalseConditions: Boolean, Ignore False Conditions on Result ... * @param separator: String, Separate Lines ... * * @return ( string ) */ string GenerateSummary( bool onlyCommons = false, bool onlyConditions = false, bool includeScores = true, bool ignoreFalseConditions = true, string separator = "\n" // ) { // string result = NULL; // double bullishScore = 0; double bearishScore = 0; GenerateScore( bullishScore, bearishScore // ); // string scoresStr = // "Scores: " + separator + "---------------" + separator + "Bullish: " + ToString(bullishScore) + separator + "Bearish: " + ToString(bearishScore) + separator + "" // ; // string commonStr = GenerateSpecifiedCommonSummary( this, separator, includeScores // ); // string conditionsStr = // ToString("isTenkanSenOverKijunSen", isTenkanSenOverKijunSen, ignoreFalseConditions, separator) + ToString("isTenkanSenUnderKijunSen", isTenkanSenUnderKijunSen, ignoreFalseConditions, separator) + ToString("isTenkanSenCrossedOverKijunSen", isTenkanSenCrossedOverKijunSen, ignoreFalseConditions, separator) + ToString("isTenkanSenCrossedUnderKijunSen", isTenkanSenCrossedUnderKijunSen, ignoreFalseConditions, separator) + ToString("isSenkouSpanAOverB", isSenkouSpanAOverB, ignoreFalseConditions, separator) + ToString("isSenkouSpanAUnderB", isSenkouSpanAUnderB, ignoreFalseConditions, separator) + ToString("isSenkouSpanACrossedOverB", isSenkouSpanACrossedOverB, ignoreFalseConditions, separator) + ToString("isSenkouSpanACrossedUnderB", isSenkouSpanACrossedUnderB, ignoreFalseConditions, separator) + // "" // ; // result = // "[" + GetTag() + "]" + separator + (onlyConditions ? "" : commonStr) + (!includeScores ? "" : scoresStr) + " " + separator + (onlyCommons ? "" : conditionsStr) + "" // ; // return result; } /** * Retrieve nique Tag Identifier ... * * @return ( string ) */ string GetTag() { return GetTypeName(this); } // }; // // Class ... class XCX121XICHHelper : public XCBaseHelper { // // Public ... public: // // Props ... // // Constructors ... XCX121XICHHelper() : XCBaseHelper(_Symbol, _Period) { } // // Deconstructor ... ~XCX121XICHHelper() { // Clean(kijunSenBuffer); Clean(tenkanSenBuffer); Clean(chikouSpanBuffer); Clean(senkouSpanABuffer); Clean(senkouSpanBBuffer); // mInputs.Clean(); } // // Tools ... bool Init( string symbol, // Trading Symbol ENUM_TIMEFRAMES period, // Trading Period X121XICHInputs &inputs // Inputs ) { // bool result = false; // mSymbol = symbol; mPeriod = period; // result = inputs.IsValid(); if (!result) { return result; } // ArraySetAsSeries(kijunSenBuffer, true); ArraySetAsSeries(tenkanSenBuffer, true); ArraySetAsSeries(chikouSpanBuffer, true); ArraySetAsSeries(senkouSpanABuffer, true); ArraySetAsSeries(senkouSpanBBuffer, true); // mInputs = inputs; // mHandler = iCustom( mSymbol, mPeriod, "x-saherelm.x121.xich", // // Inputs ... // // Market ... "", mInputs.chikouSpanMode, // ChikouSpan Mode mInputs.tenkanSenLength, // TenkanSen Length mInputs.tenkanSenMode, // TencanSen Mode mInputs.kijunSenLength, // KijunSen Length mInputs.kijunSenMode, // KijunSen Mode mInputs.senkouSpanBLength, // SenkouSpan B Length mInputs.senkouSpanBMode, // SenkouSpan B Mode // // Presentation ... "", mInputs.startCalculationForLastBars, // Calculate Last n Bars mInputs.shiftKumo, // Shift Kumo mInputs.showTenkanSen, // Show TenkanSen mInputs.showKijunSen, // Show KijunSen mInputs.showChikouSpan, // Show ChikouSpan mInputs.showSenkouSpanA, // Show Senkou Span A mInputs.showSenkouSpanB, // Show Senkou Span B mInputs.showKumo // Show Kumo // ); result = mHandler != INVALID_HANDLE; if (!result) { return result; } // return result; } // // Inputs ... // X121XICHInputs GetInputs() { return mInputs; } // bool SetInputs( X121XICHInputs &inputs // Configs ) { // return Init( mSymbol, mPeriod, inputs // ); } // // Readers ... // double GetTenkanSen( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(tenkanSenBuffer); if (barIndex >= count) { barIndex = count - 1; } // return tenkanSenBuffer[barIndex]; } // int CopyTenkanSen( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, tenkanSenBuffer, buffer, forceClean // ); } // double GetKijunSen( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(kijunSenBuffer); if (barIndex >= count) { barIndex = count - 1; } // return kijunSenBuffer[barIndex]; } // int CopyKijunSen( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, kijunSenBuffer, buffer, forceClean // ); } // double GetChikouSpan( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(chikouSpanBuffer); if (barIndex >= count) { barIndex = count - 1; } // return chikouSpanBuffer[barIndex]; } // int CopyChikouSpan( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, chikouSpanBuffer, buffer, forceClean // ); } // double GetSenkouSpanA( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(senkouSpanABuffer); if (barIndex >= count) { barIndex = count - 1; } // return senkouSpanABuffer[barIndex]; } // int CopySenkouSpanA( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, senkouSpanABuffer, buffer, forceClean // ); } // double GetSenkouSpanB( int barIndex // Bar Index ) { // if (barIndex < 0) { barIndex = 0; } // Calculate(); // int count = ArraySize(senkouSpanBBuffer); if (barIndex >= count) { barIndex = count - 1; } // return senkouSpanBBuffer[barIndex]; } // int CopySenkouSpanB( int start, // Start int count, // Number of Items for read double &buffer[], // Dest Buffer bool forceClean = true // Force To Clean buffer ) { // // Update Calculations ... Calculate(); // // Copy Items ... return Copy( start, count, senkouSpanBBuffer, buffer, forceClean // ); } // void Free() override { Cleanup(10); } // bool GetConditions( X121XICHConditions &conditions, // int barIndex = 0, // int loopback = 5 // ) { // bool result = true; // if (loopback < 5) { loopback = 5; } // conditions.Clean(); // conditions.symbol = mSymbol; conditions.period = mPeriod; conditions.time = TimeCurrent(); // int zIndex = barIndex; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // XOHCL zBar; result = zBar.Init( mSymbol, mPeriod, zIndex // ); if (!result) { return result; } // XOHCL cBar; result = cBar.Init( mSymbol, mPeriod, cIndex // ); if (!result) { return result; } // XOHCL pBar; result = pBar.Init( mSymbol, mPeriod, pIndex // ); if (!result) { return result; } // // Buffers ... // CopyTenkanSen( zIndex, loopback, conditions.tenkanSenBuffer // ); // CopyKijunSen( zIndex, loopback, conditions.kijunSenBuffer // ); // CopyChikouSpan( zIndex, loopback, conditions.chikouSpanBuffer // ); // CopySenkouSpanA( zIndex, loopback, conditions.senkouSpanABuffer // ); // CopySenkouSpanB( zIndex, loopback, conditions.senkouSpanBBuffer // ); // // Conditions ... // int cIDX = 1; int pIDX = cIDX + 1; // bool isTenkanSenOverKijunSen = conditions.tenkanSenBuffer[cIDX] > conditions.kijunSenBuffer[cIDX]; bool isTenkanSenOverKijunSenPrev = conditions.tenkanSenBuffer[pIDX] > conditions.kijunSenBuffer[pIDX]; // bool isTenkanSenUnderKijunSen = conditions.tenkanSenBuffer[cIDX] < conditions.kijunSenBuffer[cIDX]; bool isTenkanSenUnderKijunSenPrev = conditions.tenkanSenBuffer[pIDX] < conditions.kijunSenBuffer[pIDX]; // bool isTenkanSenCrossedOverKijunSen = isTenkanSenOverKijunSen && !isTenkanSenOverKijunSenPrev; bool isTenkanSenCrossedUnderKijunSen = isTenkanSenUnderKijunSen && !isTenkanSenUnderKijunSenPrev; // bool isSenkouSpanAOverB = conditions.senkouSpanABuffer[cIDX] > conditions.senkouSpanBBuffer[cIDX]; bool isSenkouSpanAOverBPrev = conditions.senkouSpanABuffer[pIDX] > conditions.senkouSpanBBuffer[pIDX]; // bool isSenkouSpanAUnderB = conditions.senkouSpanABuffer[cIDX] < conditions.senkouSpanBBuffer[cIDX]; bool isSenkouSpanAUnderBPrev = conditions.senkouSpanABuffer[pIDX] < conditions.senkouSpanBBuffer[pIDX]; // bool isSenkouSpanACrossedOverB = isSenkouSpanAOverB && !isSenkouSpanAOverBPrev; bool isSenkouSpanACrossedUnderB = isSenkouSpanAUnderB && !isSenkouSpanAUnderBPrev; // conditions.isSenkouSpanAOverB = isSenkouSpanAOverB; conditions.isSenkouSpanAUnderB = isSenkouSpanAUnderB; conditions.isTenkanSenOverKijunSen = isTenkanSenOverKijunSen; conditions.isTenkanSenUnderKijunSen = isTenkanSenUnderKijunSen; conditions.isSenkouSpanACrossedOverB = isSenkouSpanACrossedOverB; conditions.isSenkouSpanACrossedUnderB = isSenkouSpanACrossedUnderB; conditions.isTenkanSenCrossedOverKijunSen = isTenkanSenCrossedOverKijunSen; conditions.isTenkanSenCrossedUnderKijunSen = isTenkanSenCrossedUnderKijunSen; // Cleanup(); // zBar.Clean(); cBar.Clean(); pBar.Clean(); // return result; } // // Protected ... protected: // // Private ... private: // // Props ... X121XICHInputs mInputs; // Inputs ... // // Buffers ... double kijunSenBuffer[]; double tenkanSenBuffer[]; double chikouSpanBuffer[]; double senkouSpanABuffer[]; double senkouSpanBBuffer[]; // void Calculate( int maxRequiredBars = 100 // ) { // // Buffers ... // CopyBuffer( mHandler, X121_XICH_KIJUNSEN_LINE, 0, maxRequiredBars, kijunSenBuffer // ); // CopyBuffer( mHandler, X121_XICH_TENKANSEN_LINE, 0, maxRequiredBars, tenkanSenBuffer // ); // CopyBuffer( mHandler, X121_XICH_CHIKOUSPAN_LINE, 0, maxRequiredBars, chikouSpanBuffer // ); // CopyBuffer( mHandler, X121_XICH_SENKOUSPANA_LINE, 0, maxRequiredBars, senkouSpanABuffer // ); // CopyBuffer( mHandler, X121_XICH_SENKOUSPANB_LINE, 0, maxRequiredBars, senkouSpanBBuffer // ); } // void Cleanup( int maxAllowed = 100 // ) { // CleanupArray( kijunSenBuffer, maxAllowed // ); // CleanupArray( tenkanSenBuffer, maxAllowed // ); // CleanupArray( chikouSpanBuffer, maxAllowed // ); // CleanupArray( senkouSpanABuffer, maxAllowed // ); // CleanupArray( senkouSpanBBuffer, maxAllowed // ); // } // }; // // Tools ...