/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // -------------------------------------- // Name: XIchimoku Indicator Provider // Description: Provides Features ... // // // 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 Import and Inclused requirements ... // // // Includes ... #include "../Libraries/x-saherelm.alert.lib.mq5" #include "../Libraries/x-saherelm.models.lib.mq5" #include "../Libraries/x-saherelm.common.lib.mq5" // // END Import and Inclused requirements ... // // // START Definitions ... // // // Ichimoku Lines Calculator Mode ... enum ENUM_X_ICHIMOKU_CALCULATION_MODE { // X_XICH_HH_LL_MODE = 1, // Highest High and Lowest Low X_XICH_HO_LC_MODE = 2, // Highest Open and Lowest Close }; // // Ichimoku Indicator Exported Buffers ... enum ENUM_X_ICHIMOKU_BUFFERS { // X_TENKANSEN_LINE = 0, X_KIJUNSEN_LINE = 1, X_CHIKOUSPAN_LINE = 4, X_SENKOUSPAN_A_LINE = 5, X_SENKOUSPAN_B_LINE = 6, }; // // Model Ichimoku Data ... struct XIchiInfo { // int bar; // double tenkanSen; double kijunSen; // double senkouSpanA; double senkouSpanB; // double senkouSpanAFuture; double senkouSpanBFuture; }; // // END Definitions ... // // // START Overrides ... // // // END Overrides ... // class XSCXICHHelper { // // Public ... public: // // Properties ... double tenkanSenBuffer[]; double kijunSenBuffer[]; double chikouSpanBuffer[]; double senkouSpanABuffer[]; double senkouSpanBBuffer[]; // // Constructor ... void XSCXICHHelper() { mSymbol = _Symbol; mPeriod = _Period; } void XSCXICHHelper( // // Symbol ... string symbol, // // Period ... ENUM_TIMEFRAMES period, // // Buffer Reading ... int numberOfItemsReadPerTick = 52, // // TenkanSen ... int tenkanSenLength = 9, ENUM_X_ICHIMOKU_CALCULATION_MODE tenkanSenMode = X_XICH_HH_LL_MODE, // // KijunSen ... int kijunSenLength = 26, ENUM_X_ICHIMOKU_CALCULATION_MODE kijunSenMode = X_XICH_HH_LL_MODE, // // Senkou Span B ... int senkouSpanBLength = 52, ENUM_X_ICHIMOKU_CALCULATION_MODE senkouSpanBMode = X_XICH_HH_LL_MODE, // // Chikou Span ... ENUM_APPLIED_PRICE chikuoSpanAppliedTo = PRICE_CLOSE // ) { // // Setting Requirements ... // // Symbol ... mSymbol = symbol; // // Period ... mPeriod = period; // // Number of Reading Buffer Items per Tick ... mNumberOfItemsReadPerTick = numberOfItemsReadPerTick; // // TenkanSen ... mKijunSenMode = kijunSenMode; mKijunSenLength = kijunSenLength; // // KijunSen ... mTenkanSenMode = tenkanSenMode; mTenkanSenLength = tenkanSenLength; // // Senkou Span B ... mSenkouSpanBMode = senkouSpanBMode; mSenkouSpanBLength = senkouSpanBLength; // mSenkouSpanBTopMode = NULL; mSenkouSpanBBottomMode = NULL; // // Chikou Span ... mChikuoSpanAppliedTo = chikuoSpanAppliedTo; // mTag = "XICH " + mSymbol + ", " + ToString(mPeriod); // // Initial Handler ... mHandler = iCustom( mSymbol, mPeriod, "x-saherelm.x121.xich", // // Inputs ... // // TENKANSEN ... "", mTenkanSenLength, mTenkanSenMode, // // KIJUNSEN ... "", kijunSenLength, kijunSenMode, // // SENKOUSPANB ... "", senkouSpanBLength, senkouSpanBMode, // // CHIKOUSPAN ... "", mChikuoSpanAppliedTo, // // PRESENTATION ... "", false, false, false, false, false, false, false, false, true // Shift Kumo ... // ); if (mHandler == INVALID_HANDLE) { // LogMessage("failed to Initialize Indicator: " + (string)GetLastError()); } // ArraySetAsSeries(tenkanSenBuffer, true); ArraySetAsSeries(kijunSenBuffer, true); ArraySetAsSeries(chikouSpanBuffer, true); ArraySetAsSeries(senkouSpanABuffer, true); ArraySetAsSeries(senkouSpanBBuffer, true); } // // DeConstructor ... void ~XSCXICHHelper() { // // Release Indicators ... IndicatorRelease(mHandler); } // // Reading Buffers ... void ReadBuffers() { // // TENKANSEN ... CopyBuffer( mHandler, X_TENKANSEN_LINE, 0, mNumberOfItemsReadPerTick, tenkanSenBuffer); // // KIJUNSEN ... CopyBuffer( mHandler, X_KIJUNSEN_LINE, 0, mNumberOfItemsReadPerTick, kijunSenBuffer); // // CHIKOUSPAN ... CopyBuffer( mHandler, X_CHIKOUSPAN_LINE, mKijunSenLength - 1, mNumberOfItemsReadPerTick, chikouSpanBuffer); // // SENKOUSPANA ... CopyBuffer( mHandler, X_SENKOUSPAN_A_LINE, -mKijunSenLength + 1, mNumberOfItemsReadPerTick, senkouSpanABuffer); // // SENKOUSPANB ... CopyBuffer( mHandler, X_SENKOUSPAN_B_LINE, -mKijunSenLength + 1, mNumberOfItemsReadPerTick, senkouSpanBBuffer); } // // START Tools Functions ... // // // Retrieve Ichimoku Data at Specific Bar Index ... XIchiInfo GetInfo( int bar_index // Bar Index ... ) { // XIchiInfo result = {}; // result.bar = bar_index; result.tenkanSen = tenkanSenBuffer[bar_index]; result.kijunSen = kijunSenBuffer[bar_index]; result.senkouSpanA = senkouSpanABuffer[bar_index + mKijunSenLength]; result.senkouSpanB = senkouSpanBBuffer[bar_index + mKijunSenLength]; result.senkouSpanAFuture = senkouSpanABuffer[bar_index]; result.senkouSpanBFuture = senkouSpanBBuffer[bar_index]; // return result; } // // Check Tenkan Sen Over Kijun Sen ... bool IsTenkanSenOverKijunSen( int bar_index // Bar Index ... ) { // bool result = false; // if (!IsValidArraySize(bar_index)) { return result; } // result = // tenkanSenBuffer[bar_index] > kijunSenBuffer[bar_index] // ; // return result; } // // Is Tenkan Sen Under Kijun Sen ... bool IsTenkanSenUnderKijunSen( int bar_index // Bar Index ... ) { // bool result = false; // if (!IsValidArraySize(bar_index)) { return result; } // result = // tenkanSenBuffer[bar_index] < kijunSenBuffer[bar_index] // ; // return result; } // // Tenkan Sen Croosed Over Kijun Sen ... bool IsTenkanSenCrossedOverKijunSen( int bar_index // Bar Index ... ) { // bool result = false; // if (!IsValidArraySize(bar_index + 2)) { return result; } // result = IsCrossOver( tenkanSenBuffer, kijunSenBuffer, bar_index); // return result; } // // Tenkan Sen Croosed Under Kijun Sen ... bool IsTenkanSenCrossedUnderKijunSen( int bar_index // Bar Index ... ) { // bool result = false; // if (!IsValidArraySize(bar_index + 2)) { return result; } // result = IsCrossUnder( tenkanSenBuffer, kijunSenBuffer, bar_index); // return result; } // // Check Kumo is Bullish ... bool IsKumoBullish( int bar_index, // Bar Index ... bool onFuture = false // Future Check ... ) { // bool result = false; // int start = 0; // if (!onFuture) { start = (mKijunSenLength - bar_index); } else { start = (mKijunSenLength - bar_index) * 2; } // if (!IsValidArraySize(start)) { return result; } // result = // senkouSpanABuffer[start + 1] > senkouSpanBBuffer[start + 1] && senkouSpanABuffer[start] > senkouSpanBBuffer[start] // ; // return result; } // // Check Kumo is Bearish ... bool IsKumoBearish( int bar_index, // Bar Index ... bool onFuture = false // Future Check ... ) { // bool result = false; // int start = 0; // if (!onFuture) { start = (mKijunSenLength - bar_index); } else { start = (mKijunSenLength - bar_index) * 2; } // if (!IsValidArraySize(start)) { return result; } // result = // senkouSpanABuffer[start + 1] < senkouSpanBBuffer[start + 1] && senkouSpanABuffer[start] < senkouSpanBBuffer[start] // ; // return result; } // // Check Kumo is Change to Bullish ... bool IsKumoSwitchedToBullish( int bar_index, // Bar Index ... bool onFuture = false // Future Check ... ) { // bool result = false; // int start = 0; // if (!onFuture) { start = (mKijunSenLength - bar_index); } else { start = (mKijunSenLength - bar_index) * 2; } // if (!IsValidArraySize(start)) { return result; } // result = // senkouSpanABuffer[start + 1] > senkouSpanBBuffer[start + 1] && senkouSpanABuffer[start] <= senkouSpanBBuffer[start] // ; // return result; } // // Check Kumo is Change to Bearish ... bool IsKumoSwitchedToBearish( int bar_index, // Bar Index ... bool onFuture = false // Future Check ... ) { // bool result = false; // int start = 0; // if (!onFuture) { start = (mKijunSenLength - bar_index); } else { start = (mKijunSenLength - bar_index) * 2; } // if (!IsValidArraySize(start)) { return result; } // result = // senkouSpanABuffer[start + 1] < senkouSpanBBuffer[start + 1] && senkouSpanABuffer[start] >= senkouSpanBBuffer[start] // ; // return result; } // // Check Ichimokou Common Conditions for Long Trades ... // TenkanSen > Kumo // KijunSen > Kumo // ChikouSpan > Kumo // Kumo has Good Body bool CheckCommonLongConditions() { // bool result = false; // // TODO: Complete this ... // return result; } // // Check Ichimoku Common Conditions for Short Trades ... // TenkanSen < Kumo // KijunSen < Kumo // ChikouSpan < Kumo // Kumo has Good Body bool CheckCommonShortConditions() { // bool result = false; // // TODO: Complete this ... // return result; } // // END Tools Functions ... // // // Protected ... protected: // // Private ... private: // // Symbol ... string mSymbol; // // Period ... ENUM_TIMEFRAMES mPeriod; // // Buffer Reading ... int mNumberOfItemsReadPerTick; // // TenkanSen ... int mTenkanSenLength; ENUM_X_ICHIMOKU_CALCULATION_MODE mTenkanSenMode; // // KijunSen ... int mKijunSenLength; ENUM_X_ICHIMOKU_CALCULATION_MODE mKijunSenMode; // // Senkou Span B ... int mSenkouSpanBLength; ENUM_X_ICHIMOKU_CALCULATION_MODE mSenkouSpanBMode; // ENUM_SERIESMODE mSenkouSpanBTopMode; ENUM_SERIESMODE mSenkouSpanBBottomMode; // // Chikou Span ... ENUM_APPLIED_PRICE mChikuoSpanAppliedTo; // string mTag; // int mHandler; // bool IsValidArraySize(int bar_index) { // bool result = false; // if (bar_index < 0) { return result; } // int rCount = ArraySize(tenkanSenBuffer); result = rCount > bar_index + 1; // return result; } };