Files
xMQL5/X121-EA/V1.0/Helpers/x-saherelm.xpv.helper.mq5
T
2024-10-11 19:46:23 +03:30

3237 lines
75 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Helper Class Library
// ----------------------------------------------
// Name: XSCXPVHelper
// 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.xhelper.class.mq5"
//
// Definitions ...
//
enum ENUM_XPV_BUFFERS
{
//
// Peaks and Vales ...
XPV_PEAKS_LINE = 0,
XPV_VALES_LINE = 1,
//
// Support and Resistances ...
XPV_RESISTANCE_LINE = 2,
XPV_SUPPORT_LINE = 4,
//
// Fibonacci ...
XPV_FIB_1_LINE = 6,
XPV_FIB_2_LINE = 8,
XPV_FIB_3_LINE = 10,
XPV_FIB_4_LINE = 12,
XPV_FIB_5_LINE = 14,
//
// Short ...
XPV_SC_HH_LINE = 16,
XPV_SC_LL_LINE = 18,
//
// Medium ...
XPV_MC_HH_LINE = 20,
XPV_MC_LL_LINE = 22,
//
// Long ...
XPV_LC_HH_LINE = 24,
XPV_LC_LL_LINE = 26,
//
// Hind ...
XPV_HC_HH_LINE = 28,
XPV_HC_LL_LINE = 30,
};
//
// Input Models ...
struct XPVInputs
{
//
// Props ...
//
// Makret Cycles ...
//
// Short ...
ENUM_X_PERIOD_METHOD scMethod; // How to Find Period
ENUM_TIMEFRAMES scPeriod; // Time Period
//
// Medium ...
ENUM_X_PERIOD_METHOD mcMethod; // How to Find Period
ENUM_TIMEFRAMES mcPeriod; // Time Period
//
// Long ...
ENUM_X_PERIOD_METHOD lcMethod; // How to Find Period
ENUM_TIMEFRAMES lcPeriod; // Time Period
//
// Hind ...
ENUM_X_PERIOD_METHOD hcMethod; // How to Find Period
ENUM_TIMEFRAMES hcPeriod; // Time Period
//
// Fibonacci ...
double fiboLevel1; // Fibio 1st Level
double fiboLevel2; // Fibio 2st Level
double fiboLevel3; // Fibio 3rd Level
double fiboLevel4; // Fibio 4th Level
double fiboLevel5; // Fibio 5th Level
//
// Boundary Detection Modes ...
ENUM_SERIESMODE hhMode; // Highest High Calculation Method
ENUM_SERIESMODE llMode; // Lowest Low Calculation Method
//
// Presentation ...
bool showPeaksAndVales; // Show Peaks and Vales
bool showLevels; // Show Levels
bool showConsolidations; // Show Consolidations
bool showFibo1Levels; // Show Fibo 1st Level
bool showFibo2Levels; // Show Fibo 2nd Level
bool showFibo3Levels; // Show Fibo 3rd Level
bool showFibo4Levels; // Show Fibo 4th Level
bool showFibo5Levels; // Show Fibo 5th Level
//
// Constructor(s) ...
XPVInputs()
{
//
Clean();
}
//
// Tools ...
//
// Clean ...
void Clean()
{
//
// Makret Cycles ...
//
// Short ...
scMethod = X_PERIOD_NOTHING;
scPeriod = NULL;
//
// Medium ...
mcMethod = X_PERIOD_NOTHING;
mcPeriod = NULL;
//
// Long ...
lcMethod = X_PERIOD_NOTHING;
lcPeriod = NULL;
//
// Hind ...
hcMethod = X_PERIOD_NOTHING;
hcPeriod = NULL;
//
// Fibonacci ...
fiboLevel1 = 0;
fiboLevel2 = 0;
fiboLevel3 = 0;
fiboLevel4 = 0;
fiboLevel5 = 0;
//
// Boundary Detection Modes ...
hhMode = MODE_HIGH;
llMode = MODE_LOW;
//
// Presentation ...
showPeaksAndVales = false;
showLevels = false;
showConsolidations = false;
showFibo1Levels = false;
showFibo2Levels = false;
showFibo3Levels = false;
showFibo4Levels = false;
showFibo5Levels = false;
}
//
// Default ...
void Default()
{
//
// Makret Cycles ...
//
// Short ...
scMethod = X_PERIOD_AUTO;
scPeriod = NULL;
//
// Medium ...
mcMethod = X_PERIOD_AUTO;
mcPeriod = NULL;
//
// Long ...
lcMethod = X_PERIOD_AUTO;
lcPeriod = NULL;
//
// Hind ...
hcMethod = X_PERIOD_AUTO;
hcPeriod = NULL;
//
// Fibonacci ...
fiboLevel1 = 0.236;
fiboLevel2 = 0.382;
fiboLevel3 = 0.5;
fiboLevel4 = 0.618;
fiboLevel5 = 0.764;
//
// Boundary Detection Modes ...
hhMode = MODE_HIGH;
llMode = MODE_LOW;
//
// Presentation ...
showPeaksAndVales = true;
showLevels = false;
showConsolidations = false;
showFibo1Levels = true;
showFibo2Levels = true;
showFibo3Levels = true;
showFibo4Levels = true;
showFibo5Levels = true;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
IsValid(scMethod, scPeriod) &&
IsValid(mcMethod, mcPeriod) &&
IsValid(lcMethod, lcPeriod) &&
IsValid(hcMethod, hcPeriod)
//
;
//
return result;
}
//
// Retrieve MAx Length ...
int Max()
{
//
int result = 0;
//
result = MathMax(result, 0);
//
return result;
}
};
//
// Conditions ...
struct XPVConditions
{
//
// Common ...
string symbol;
ENUM_TIMEFRAMES period;
datetime time;
//
// Buffers ...
double peaks[];
double vales[];
double resistances[];
double supports[];
double fib1s[];
double fib2s[];
double fib3s[];
double fib4s[];
double fib5s[];
double sCHHs[];
double sCLLs[];
double mCHHs[];
double mCLLs[];
double lCHHs[];
double lCLLs[];
double hCHHs[];
double hCLLs[];
//
// Conditions ...
//
bool isNewPeak;
bool isNewPeakOverLast;
bool isNewPeakUnderLast;
//
bool isNewVale;
bool isNewValeOverLast;
bool isNewValeUnderLast;
//
bool isFiboIncreased;
bool isFiboDecreased;
bool isFiboSectionChanged;
//
// SC ...
//
bool isSCBullish;
bool isSCHHBullish;
bool isSCLLBullish;
bool isSCSwitchedToBullish;
bool isSCHHSwitchedToBullish;
bool isSCLLSwitchedToBullish;
//
bool isSCBearish;
bool isSCHHBearish;
bool isSCLLBearish;
bool isSCSwitchedToBearish;
bool isSCHHSwitchedToBearish;
bool isSCLLSwitchedToBeraish;
//
// MC ...
//
bool isMCBullish;
bool isMCHHBullish;
bool isMCLLBullish;
bool isMCSwitchedToBullish;
bool isMCHHSwitchedToBullish;
bool isMCLLSwitchedToBullish;
//
bool isMCBearish;
bool isMCHHBearish;
bool isMCLLBearish;
bool isMCSwitchedToBearish;
bool isMCHHSwitchedToBearish;
bool isMCLLSwitchedToBeraish;
//
// LC ...
//
bool isLCBullish;
bool isLCHHBullish;
bool isLCLLBullish;
bool isLCSwitchedToBullish;
bool isLCHHSwitchedToBullish;
bool isLCLLSwitchedToBullish;
//
bool isLCBearish;
bool isLCHHBearish;
bool isLCLLBearish;
bool isLCSwitchedToBearish;
bool isLCHHSwitchedToBearish;
bool isLCLLSwitchedToBeraish;
//
// HC ...
//
bool isHCBullish;
bool isHCHHBullish;
bool isHCLLBullish;
bool isHCSwitchedToBullish;
bool isHCHHSwitchedToBullish;
bool isHCLLSwitchedToBullish;
//
bool isHCBearish;
bool isHCHHBearish;
bool isHCLLBearish;
bool isHCSwitchedToBearish;
bool isHCHHSwitchedToBearish;
bool isHCLLSwitchedToBeraish;
//
// Fibonachi Conditions ...
//
bool isCloseOverFib1;
bool isCloseOverFib2;
bool isCloseOverFib3;
bool isCloseOverFib4;
bool isCloseOverFib5;
//
bool isCloseUnderFib1;
bool isCloseUnderFib2;
bool isCloseUnderFib3;
bool isCloseUnderFib4;
bool isCloseUnderFib5;
//
bool isCloseCrossedOverFib1;
bool isCloseCrossedOverFib2;
bool isCloseCrossedOverFib3;
bool isCloseCrossedOverFib4;
bool isCloseCrossedOverFib5;
//
bool isCloseCrossedUnderFib1;
bool isCloseCrossedUnderFib2;
bool isCloseCrossedUnderFib3;
bool isCloseCrossedUnderFib4;
bool isCloseCrossedUnderFib5;
//
void Clean()
{
//
Clean(peaks);
Clean(vales);
Clean(resistances);
Clean(supports);
Clean(fib1s);
Clean(fib2s);
Clean(fib3s);
Clean(fib4s);
Clean(fib5s);
Clean(sCHHs);
Clean(sCLLs);
Clean(mCHHs);
Clean(mCLLs);
Clean(lCHHs);
Clean(lCLLs);
Clean(hCHHs);
Clean(hCLLs);
//
ArraySetAsSeries(peaks, true);
ArraySetAsSeries(vales, true);
ArraySetAsSeries(resistances, true);
ArraySetAsSeries(supports, true);
ArraySetAsSeries(fib1s, true);
ArraySetAsSeries(fib2s, true);
ArraySetAsSeries(fib3s, true);
ArraySetAsSeries(fib4s, true);
ArraySetAsSeries(fib5s, true);
ArraySetAsSeries(sCHHs, true);
ArraySetAsSeries(sCLLs, true);
ArraySetAsSeries(mCHHs, true);
ArraySetAsSeries(mCLLs, true);
ArraySetAsSeries(lCHHs, true);
ArraySetAsSeries(lCLLs, true);
ArraySetAsSeries(hCHHs, true);
ArraySetAsSeries(hCLLs, true);
//
isNewPeak = false;
isNewPeakOverLast = false;
isNewPeakUnderLast = false;
isNewVale = false;
isNewValeOverLast = false;
isNewValeUnderLast = false;
isFiboIncreased = false;
isFiboDecreased = false;
isFiboSectionChanged = false;
isCloseOverFib1 = false;
isCloseOverFib2 = false;
isCloseOverFib3 = false;
isCloseOverFib4 = false;
isCloseOverFib5 = false;
isCloseUnderFib1 = false;
isCloseUnderFib2 = false;
isCloseUnderFib3 = false;
isCloseUnderFib4 = false;
isCloseUnderFib5 = false;
isCloseCrossedOverFib1 = false;
isCloseCrossedOverFib2 = false;
isCloseCrossedOverFib3 = false;
isCloseCrossedOverFib4 = false;
isCloseCrossedOverFib5 = false;
isCloseCrossedUnderFib1 = false;
isCloseCrossedUnderFib2 = false;
isCloseCrossedUnderFib3 = false;
isCloseCrossedUnderFib4 = false;
isCloseCrossedUnderFib5 = false;
isSCBullish = false;
isSCHHBullish = false;
isSCLLBullish = false;
isSCSwitchedToBullish = false;
isSCHHSwitchedToBullish = false;
isSCLLSwitchedToBullish = false;
isSCBearish = false;
isSCHHBearish = false;
isSCLLBearish = false;
isSCSwitchedToBearish = false;
isSCHHSwitchedToBearish = false;
isSCLLSwitchedToBeraish = false;
isMCBullish = false;
isMCHHBullish = false;
isMCLLBullish = false;
isMCSwitchedToBullish = false;
isMCHHSwitchedToBullish = false;
isMCLLSwitchedToBullish = false;
isMCBearish = false;
isMCHHBearish = false;
isMCLLBearish = false;
isMCSwitchedToBearish = false;
isMCHHSwitchedToBearish = false;
isMCLLSwitchedToBeraish = false;
isLCBullish = false;
isLCHHBullish = false;
isLCLLBullish = false;
isLCSwitchedToBullish = false;
isLCHHSwitchedToBullish = false;
isLCLLSwitchedToBullish = false;
isLCBearish = false;
isLCHHBearish = false;
isLCLLBearish = false;
isLCSwitchedToBearish = false;
isLCHHSwitchedToBearish = false;
isLCLLSwitchedToBeraish = false;
isHCBullish = false;
isHCHHBullish = false;
isHCLLBullish = false;
isHCSwitchedToBullish = false;
isHCHHSwitchedToBullish = false;
isHCLLSwitchedToBullish = false;
isHCBearish = false;
isHCHHBearish = false;
isHCLLBearish = false;
isHCSwitchedToBearish = false;
isHCHHSwitchedToBearish = false;
isHCLLSwitchedToBeraish = false;
}
//
void GenerateScore(
double &bullishScore,
double &bearishScore //
)
{
//
bullishScore = 0;
bearishScore = 0;
//
if (isNewPeak)
{
}
if (isNewPeakOverLast)
{
}
if (isNewPeakUnderLast)
{
}
//
if (isNewVale)
{
}
if (isNewValeOverLast)
{
}
if (isNewValeUnderLast)
{
}
//
if (isFiboIncreased)
{
}
if (isFiboDecreased)
{
}
if (isFiboSectionChanged)
{
}
//
if (isSCBullish)
{
bullishScore++;
}
if (isSCHHBullish)
{
bullishScore++;
}
if (isSCLLBullish)
{
bullishScore++;
}
if (isSCSwitchedToBullish)
{
bullishScore++;
}
if (isSCHHSwitchedToBullish)
{
bullishScore++;
}
if (isSCLLSwitchedToBullish)
{
bullishScore++;
}
//
if (isSCBearish)
{
bearishScore++;
}
if (isSCHHBearish)
{
bearishScore++;
}
if (isSCLLBearish)
{
bearishScore++;
}
if (isSCSwitchedToBearish)
{
bearishScore++;
}
if (isSCHHSwitchedToBearish)
{
bearishScore++;
}
if (isSCLLSwitchedToBeraish)
{
bearishScore++;
}
//
if (isMCBullish)
{
bullishScore++;
}
if (isMCHHBullish)
{
bullishScore++;
}
if (isMCLLBullish)
{
bullishScore++;
}
if (isMCSwitchedToBullish)
{
bullishScore++;
}
if (isMCHHSwitchedToBullish)
{
bullishScore++;
}
if (isMCLLSwitchedToBullish)
{
bullishScore++;
}
//
if (isMCBearish)
{
bearishScore++;
}
if (isMCHHBearish)
{
bearishScore++;
}
if (isMCLLBearish)
{
bearishScore++;
}
if (isMCSwitchedToBearish)
{
bearishScore++;
}
if (isMCHHSwitchedToBearish)
{
bearishScore++;
}
if (isMCLLSwitchedToBeraish)
{
bearishScore++;
}
//
if (isLCBullish)
{
bullishScore++;
}
if (isLCHHBullish)
{
bullishScore++;
}
if (isLCLLBullish)
{
bullishScore++;
}
if (isLCSwitchedToBullish)
{
bullishScore++;
}
if (isLCHHSwitchedToBullish)
{
bullishScore++;
}
if (isLCLLSwitchedToBullish)
{
bullishScore++;
}
//
if (isLCBearish)
{
bearishScore++;
}
if (isLCHHBearish)
{
bearishScore++;
}
if (isLCLLBearish)
{
bearishScore++;
}
if (isLCSwitchedToBearish)
{
bearishScore++;
}
if (isLCHHSwitchedToBearish)
{
bearishScore++;
}
if (isLCLLSwitchedToBeraish)
{
bearishScore++;
}
if (isHCBullish)
{
bullishScore++;
}
if (isHCHHBullish)
{
bullishScore++;
}
if (isHCLLBullish)
{
bullishScore++;
}
if (isHCSwitchedToBullish)
{
bullishScore++;
}
if (isHCHHSwitchedToBullish)
{
bullishScore++;
}
if (isHCLLSwitchedToBullish)
{
bullishScore++;
}
//
if (isHCBearish)
{
bearishScore++;
}
if (isHCHHBearish)
{
bearishScore++;
}
if (isHCLLBearish)
{
bearishScore++;
}
if (isHCSwitchedToBearish)
{
bearishScore++;
}
if (isHCHHSwitchedToBearish)
{
bearishScore++;
}
if (isHCLLSwitchedToBeraish)
{
bearishScore++;
}
}
//
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("isNewPeak", isNewPeak, ignoreFalseConditions, separator) +
ToString("isNewPeakOverLast", isNewPeakOverLast, ignoreFalseConditions, separator) +
ToString("isNewPeakUnderLast", isNewPeakUnderLast, ignoreFalseConditions, separator) +
ToString("isNewVale", isNewVale, ignoreFalseConditions, separator) +
ToString("isNewValeOverLast", isNewValeOverLast, ignoreFalseConditions, separator) +
ToString("isNewValeUnderLast", isNewValeUnderLast, ignoreFalseConditions, separator) +
ToString("isFiboIncreased", isFiboIncreased, ignoreFalseConditions, separator) +
ToString("isFiboDecreased", isFiboDecreased, ignoreFalseConditions, separator) +
ToString("isFiboSectionChanged", isFiboSectionChanged, ignoreFalseConditions, separator) +
ToString("isCloseOverFib1", isCloseOverFib1, ignoreFalseConditions, separator) +
ToString("isCloseOverFib2", isCloseOverFib2, ignoreFalseConditions, separator) +
ToString("isCloseOverFib3", isCloseOverFib3, ignoreFalseConditions, separator) +
ToString("isCloseOverFib4", isCloseOverFib4, ignoreFalseConditions, separator) +
ToString("isCloseOverFib5", isCloseOverFib5, ignoreFalseConditions, separator) +
ToString("isCloseUnderFib1", isCloseUnderFib1, ignoreFalseConditions, separator) +
ToString("isCloseUnderFib2", isCloseUnderFib2, ignoreFalseConditions, separator) +
ToString("isCloseUnderFib3", isCloseUnderFib3, ignoreFalseConditions, separator) +
ToString("isCloseUnderFib4", isCloseUnderFib4, ignoreFalseConditions, separator) +
ToString("isCloseUnderFib5", isCloseUnderFib5, ignoreFalseConditions, separator) +
ToString("isCloseCrossedOverFib1", isCloseCrossedOverFib1, ignoreFalseConditions, separator) +
ToString("isCloseCrossedOverFib2", isCloseCrossedOverFib2, ignoreFalseConditions, separator) +
ToString("isCloseCrossedOverFib3", isCloseCrossedOverFib3, ignoreFalseConditions, separator) +
ToString("isCloseCrossedOverFib4", isCloseCrossedOverFib4, ignoreFalseConditions, separator) +
ToString("isCloseCrossedOverFib5", isCloseCrossedOverFib5, ignoreFalseConditions, separator) +
ToString("isCloseCrossedUnderFib1", isCloseCrossedUnderFib1, ignoreFalseConditions, separator) +
ToString("isCloseCrossedUnderFib2", isCloseCrossedUnderFib2, ignoreFalseConditions, separator) +
ToString("isCloseCrossedUnderFib3", isCloseCrossedUnderFib3, ignoreFalseConditions, separator) +
ToString("isCloseCrossedUnderFib4", isCloseCrossedUnderFib4, ignoreFalseConditions, separator) +
ToString("isCloseCrossedUnderFib5", isCloseCrossedUnderFib5, ignoreFalseConditions, separator) +
ToString("isSCBullish", isSCBullish, ignoreFalseConditions, separator) +
ToString("isSCHHBullish", isSCHHBullish, ignoreFalseConditions, separator) +
ToString("isSCLLBullish", isSCLLBullish, ignoreFalseConditions, separator) +
ToString("isSCSwitchedToBullish", isSCSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isSCHHSwitchedToBullish", isSCHHSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isSCLLSwitchedToBullish", isSCLLSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isSCBearish", isSCBearish, ignoreFalseConditions, separator) +
ToString("isSCHHBearish", isSCHHBearish, ignoreFalseConditions, separator) +
ToString("isSCLLBearish", isSCLLBearish, ignoreFalseConditions, separator) +
ToString("isSCSwitchedToBearish", isSCSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isSCHHSwitchedToBearish", isSCHHSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isSCLLSwitchedToBeraish", isSCLLSwitchedToBeraish, ignoreFalseConditions, separator) +
ToString("isMCBullish", isMCBullish, ignoreFalseConditions, separator) +
ToString("isMCHHBullish", isMCHHBullish, ignoreFalseConditions, separator) +
ToString("isMCLLBullish", isMCLLBullish, ignoreFalseConditions, separator) +
ToString("isMCSwitchedToBullish", isMCSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isMCHHSwitchedToBullish", isMCHHSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isMCLLSwitchedToBullish", isMCLLSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isMCBearish", isMCBearish, ignoreFalseConditions, separator) +
ToString("isMCHHBearish", isMCHHBearish, ignoreFalseConditions, separator) +
ToString("isMCLLBearish", isMCLLBearish, ignoreFalseConditions, separator) +
ToString("isMCSwitchedToBearish", isMCSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isMCHHSwitchedToBearish", isMCHHSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isMCLLSwitchedToBeraish", isMCLLSwitchedToBeraish, ignoreFalseConditions, separator) +
ToString("isLCBullish", isLCBullish, ignoreFalseConditions, separator) +
ToString("isLCHHBullish", isLCHHBullish, ignoreFalseConditions, separator) +
ToString("isLCLLBullish", isLCLLBullish, ignoreFalseConditions, separator) +
ToString("isLCSwitchedToBullish", isLCSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isLCHHSwitchedToBullish", isLCHHSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isLCLLSwitchedToBullish", isLCLLSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isLCBearish", isLCBearish, ignoreFalseConditions, separator) +
ToString("isLCHHBearish", isLCHHBearish, ignoreFalseConditions, separator) +
ToString("isLCLLBearish", isLCLLBearish, ignoreFalseConditions, separator) +
ToString("isLCSwitchedToBearish", isLCSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isLCHHSwitchedToBearish", isLCHHSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isLCLLSwitchedToBeraish", isLCLLSwitchedToBeraish, ignoreFalseConditions, separator) +
ToString("isHCBullish", isHCBullish, ignoreFalseConditions, separator) +
ToString("isHCHHBullish", isHCHHBullish, ignoreFalseConditions, separator) +
ToString("isHCLLBullish", isHCLLBullish, ignoreFalseConditions, separator) +
ToString("isHCSwitchedToBullish", isHCSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isHCHHSwitchedToBullish", isHCHHSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isHCLLSwitchedToBullish", isHCLLSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isHCBearish", isHCBearish, ignoreFalseConditions, separator) +
ToString("isHCHHBearish", isHCHHBearish, ignoreFalseConditions, separator) +
ToString("isHCLLBearish", isHCLLBearish, ignoreFalseConditions, separator) +
ToString("isHCSwitchedToBearish", isHCSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isHCHHSwitchedToBearish", isHCHHSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isHCLLSwitchedToBeraish", isHCLLSwitchedToBeraish, ignoreFalseConditions, separator) +
//
""
//
;
//
result =
//
"[" + GetTag() + "]" + separator +
(onlyConditions
? ""
: commonStr) +
(!includeScores
? ""
: scoresStr) +
" " + separator +
(onlyCommons
? ""
: conditionsStr) +
""
//
;
//
return result;
}
//
string GetTag()
{
return "XPV";
}
};
//
// Class ...
class XSCXPVHelper : public XSCBaseHelper
{
//
// Public ...
public:
//
// Props ...
//
// Constructors ...
XSCXPVHelper() : XSCBaseHelper(_Symbol, _Period)
{
}
//
// Deconstructor ...
~XSCXPVHelper()
{
//
Clean(fib1Buffer);
Clean(fib2Buffer);
Clean(fib3Buffer);
Clean(fib4Buffer);
Clean(fib5Buffer);
Clean(scHHBuffer);
Clean(scLLBuffer);
Clean(mcHHBuffer);
Clean(mcLLBuffer);
Clean(lcHHBuffer);
Clean(lcLLBuffer);
Clean(hcHHBuffer);
Clean(hcLLBuffer);
Clean(peaksBuffer);
Clean(valesBuffer);
Clean(supportBuffer);
Clean(resistanceBuffer);
}
//
// Tools ...
bool Init(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period, // Trading Period
XPVInputs &inputs // Inputs
)
{
//
bool result = false;
//
mSymbol = symbol;
mPeriod = period;
//
result = inputs.IsValid();
if (!result)
{
return result;
}
//
mInputs = inputs;
//
ArraySetAsSeries(peaksBuffer, true);
ArraySetAsSeries(valesBuffer, true);
ArraySetAsSeries(resistanceBuffer, true);
ArraySetAsSeries(supportBuffer, true);
ArraySetAsSeries(fib1Buffer, true);
ArraySetAsSeries(fib2Buffer, true);
ArraySetAsSeries(fib3Buffer, true);
ArraySetAsSeries(fib4Buffer, true);
ArraySetAsSeries(fib5Buffer, true);
ArraySetAsSeries(scHHBuffer, true);
ArraySetAsSeries(scLLBuffer, true);
ArraySetAsSeries(mcHHBuffer, true);
ArraySetAsSeries(mcLLBuffer, true);
ArraySetAsSeries(lcHHBuffer, true);
ArraySetAsSeries(lcLLBuffer, true);
ArraySetAsSeries(hcHHBuffer, true);
ArraySetAsSeries(hcLLBuffer, true);
//
mHandler = iCustom(
mSymbol,
mPeriod,
"x-saherelm.xpv",
//
// Inputs ...
//
// Makret Cycles ...
"",
//
// Short ...
"",
mInputs.scMethod, // How to Find Period
mInputs.scPeriod, // Time Period
//
// Medium ...
"",
mInputs.mcMethod, // How to Find Period
mInputs.mcPeriod, // Time Period
//
// Long ...
"",
mInputs.lcMethod, // How to Find Period
mInputs.lcPeriod, // Time Period
//
// Hind ...
"",
mInputs.hcMethod, // How to Find Period
mInputs.hcPeriod, // Time Period
//
// Fibonacci ...
"",
mInputs.fiboLevel1, // Fibio 1st Level
mInputs.fiboLevel2, // Fibio 2st Level
mInputs.fiboLevel3, // Fibio 3rd Level
mInputs.fiboLevel4, // Fibio 4th Level
mInputs.fiboLevel5, // Fibio 5th Level
//
// Boundary Detection Modes ...
"",
mInputs.hhMode, // Highest High Calculation Method
mInputs.llMode, // Lowest Low Calculation Method
//
// Presentation ...
"",
mInputs.showPeaksAndVales, // Show Peaks and Vales
mInputs.showLevels, // Show Levels
mInputs.showConsolidations, // Show Consolidations
mInputs.showFibo1Levels, // Show Fibo 1st Level
mInputs.showFibo2Levels, // Show Fibo 2nd Level
mInputs.showFibo3Levels, // Show Fibo 3rd Level
mInputs.showFibo4Levels, // Show Fibo 4th Level
mInputs.showFibo5Levels // Show Fibo 5th Level
//
);
result = mHandler != INVALID_HANDLE;
if (!result)
{
return result;
}
//
return result;
}
//
// Inputs ...
//
XPVInputs GetInputs()
{
return mInputs;
}
//
bool SetInputs(
XPVInputs &inputs // Configs
)
{
//
return Init(
mSymbol,
mPeriod,
inputs
//
);
}
//
// Buffers ...
//
// Peaks ...
//
double GetPeak(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(peaksBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return peaksBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyPeak(
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,
peaksBuffer,
buffer,
forceClean
//
);
}
//
bool IsSamePeak(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
peaksBuffer,
verifier,
barIndex //
);
}
//
// Vales ...
//
double GetVale(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(valesBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return valesBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyVale(
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,
valesBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameVale(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
valesBuffer,
verifier,
barIndex //
);
}
//
// Resistance ...
//
double GetResistance(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(resistanceBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return resistanceBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyResistance(
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,
resistanceBuffer,
buffer,
forceClean
//
);
}
//
// Support ...
//
double GetSupport(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(supportBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return supportBuffer[barIndex];
}
//
// Copy Required Items ...
int CopySupport(
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,
supportBuffer,
buffer,
forceClean
//
);
}
//
// Fibonacci ...
//
// Level 1 ...
//
double GetFib1(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(fib1Buffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return fib1Buffer[barIndex];
}
//
// Copy Required Items ...
int CopyFib1(
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,
fib1Buffer,
buffer,
forceClean
//
);
}
//
bool IsSameFib1(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
fib1Buffer,
verifier,
barIndex //
);
}
//
// Level 2 ...
//
double GetFib2(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(fib2Buffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return fib2Buffer[barIndex];
}
//
// Copy Required Items ...
int CopyFib2(
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,
fib2Buffer,
buffer,
forceClean
//
);
}
//
bool IsSameFib2(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
fib2Buffer,
verifier,
barIndex //
);
}
//
// Level 3 ...
//
double GetFib3(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(fib3Buffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return fib3Buffer[barIndex];
}
//
// Copy Required Items ...
int CopyFib3(
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,
fib3Buffer,
buffer,
forceClean
//
);
}
//
bool IsSameFib3(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
fib3Buffer,
verifier,
barIndex //
);
}
//
// Level 4 ...
//
double GetFib4(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(fib4Buffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return fib4Buffer[barIndex];
}
//
// Copy Required Items ...
int CopyFib4(
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,
fib4Buffer,
buffer,
forceClean
//
);
}
//
bool IsSameFib4(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
fib4Buffer,
verifier,
barIndex //
);
}
//
// Level 5 ...
//
double GetFib5(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(fib5Buffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return fib5Buffer[barIndex];
}
//
// Copy Required Items ...
int CopyFib5(
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,
fib5Buffer,
buffer,
forceClean
//
);
}
//
bool IsSameFib5(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
fib5Buffer,
verifier,
barIndex //
);
}
//
// Cycles ...
//
// Short ...
//
// HH ...
//
double GetSCHH(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(scHHBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return scHHBuffer[barIndex];
}
//
// Copy Required Items ...
int CopySCHH(
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,
scHHBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameSCHH(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
scHHBuffer,
verifier,
barIndex //
);
}
//
// LL ...
//
double GetSCLL(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(scLLBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return scLLBuffer[barIndex];
}
//
// Copy Required Items ...
int CopySCLL(
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,
scLLBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameSCLL(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
scLLBuffer,
verifier,
barIndex //
);
}
//
// Medium ...
//
// HH ...
//
double GetMCHH(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(mcHHBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return mcHHBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyMCHH(
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,
mcHHBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameMCHH(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
mcHHBuffer,
verifier,
barIndex //
);
}
//
// LL ...
//
double GetMCLL(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(mcLLBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return mcLLBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyMCLL(
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,
mcLLBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameMCLL(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
mcLLBuffer,
verifier,
barIndex //
);
}
//
// Long ...
//
// HH ...
//
double GetLCHH(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(lcHHBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return lcHHBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyLCHH(
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,
lcHHBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameLCHH(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
lcHHBuffer,
verifier,
barIndex //
);
}
//
// LL ...
//
double GetLCLL(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(lcLLBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return lcLLBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyLCLL(
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,
lcLLBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameLCLL(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
lcLLBuffer,
verifier,
barIndex //
);
}
//
// Hind ...
//
// HH ...
//
double GetHCHH(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(hcHHBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return hcHHBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyHCHH(
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,
hcHHBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameHCHH(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
hcHHBuffer,
verifier,
barIndex //
);
}
//
// LL ...
//
double GetHCLL(
int barIndex // Bar Index
)
{
//
if (barIndex < 0)
{
barIndex = 0;
}
//
Calculate();
//
int count = ArraySize(hcLLBuffer);
if (barIndex >= count)
{
barIndex = count - 1;
}
//
return hcLLBuffer[barIndex];
}
//
// Copy Required Items ...
int CopyHCLL(
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,
hcLLBuffer,
buffer,
forceClean
//
);
}
//
bool IsSameHCLL(
int barIndex, // Start Bar Index
int verifier = 71 // Number of Verifiers
)
{
//
// Update Calculations ...
Calculate();
//
return IsSame(
hcLLBuffer,
verifier,
barIndex //
);
}
//
bool GetConditions(
XPVConditions &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;
//
// Buffers ...
//
CopyPeak(
zIndex,
loopback,
conditions.peaks //
);
//
CopyVale(
zIndex,
loopback,
conditions.vales //
);
//
CopySupport(
zIndex,
loopback,
conditions.supports //
);
//
CopyResistance(
zIndex,
loopback,
conditions.resistances //
);
//
CopyFib1(
zIndex,
loopback,
conditions.fib1s //
);
//
CopyFib2(
zIndex,
loopback,
conditions.fib2s //
);
//
CopyFib3(
zIndex,
loopback,
conditions.fib3s //
);
//
CopyFib4(
zIndex,
loopback,
conditions.fib4s //
);
//
CopyFib5(
zIndex,
loopback,
conditions.fib5s //
);
//
CopySCHH(
zIndex,
loopback,
conditions.sCHHs //
);
//
CopySCLL(
zIndex,
loopback,
conditions.sCLLs //
);
//
CopyMCHH(
zIndex,
loopback,
conditions.mCHHs //
);
//
CopyMCLL(
zIndex,
loopback,
conditions.mCLLs //
);
//
CopyLCHH(
zIndex,
loopback,
conditions.lCHHs //
);
//
CopyLCLL(
zIndex,
loopback,
conditions.lCLLs //
);
//
CopyHCHH(
zIndex,
loopback,
conditions.hCHHs //
);
//
CopyHCLL(
zIndex,
loopback,
conditions.hCLLs //
);
//
// Conditions ...
//
bool isNewPeak = conditions.peaks[cIndex] != conditions.peaks[pIndex];
bool isNewPeakOverLast = isNewPeak &&
conditions.peaks[cIndex] > conditions.peaks[pIndex];
bool isNewPeakUnderLast = isNewPeak &&
conditions.peaks[cIndex] < conditions.peaks[pIndex];
//
bool isNewVale = conditions.vales[cIndex] != conditions.vales[pIndex];
bool isNewValeOverLast = isNewVale &&
conditions.vales[cIndex] > conditions.vales[pIndex];
bool isNewValeUnderLast = isNewVale &&
conditions.vales[cIndex] < conditions.vales[pIndex];
//
bool isFiboIncreased =
//
conditions.fib1s[cIndex] > conditions.fib1s[pIndex] &&
conditions.fib2s[cIndex] > conditions.fib2s[pIndex] &&
conditions.fib3s[cIndex] > conditions.fib3s[pIndex] &&
conditions.fib4s[cIndex] > conditions.fib4s[pIndex] &&
conditions.fib5s[cIndex] > conditions.fib5s[pIndex]
//
;
bool isFiboDecreased =
//
conditions.fib1s[cIndex] < conditions.fib1s[pIndex] &&
conditions.fib2s[cIndex] < conditions.fib2s[pIndex] &&
conditions.fib3s[cIndex] < conditions.fib3s[pIndex] &&
conditions.fib4s[cIndex] < conditions.fib4s[pIndex] &&
conditions.fib5s[cIndex] < conditions.fib5s[pIndex]
//
;
bool isFiboSectionChanged =
//
(isFiboDecreased &&
isNewPeakUnderLast)
//
||
//
(isFiboIncreased &&
isNewValeOverLast)
//
;
//
// SC ...
//
bool isSCHHBullish = conditions.sCHHs[cIndex] > conditions.sCHHs[pIndex];
bool isSCLLBullish = conditions.sCLLs[cIndex] > conditions.sCLLs[pIndex];
//
bool isSCHHBullishPrev = conditions.sCHHs[pIndex] > conditions.sCHHs[ppIndex];
bool isSCLLBullishPrev = conditions.sCLLs[pIndex] > conditions.sCLLs[ppIndex];
//
bool isSCBullish = isSCHHBullish &&
isSCLLBullish;
//
bool isSCBullishPrev = isSCHHBullishPrev &&
isSCLLBullishPrev;
//
bool isSCHHSwitchedToBullish = isSCHHBullish &&
!isSCHHBullishPrev;
bool isSCLLSwitchedToBullish = isSCLLBullish &&
!isSCLLBullishPrev;
//
bool isSCHHBearish = conditions.sCHHs[cIndex] < conditions.sCHHs[pIndex];
bool isSCLLBearish = conditions.sCLLs[cIndex] < conditions.sCLLs[pIndex];
//
bool isSCHHBearishPrev = conditions.sCHHs[pIndex] < conditions.sCHHs[ppIndex];
bool isSCLLBearishPrev = conditions.sCLLs[pIndex] < conditions.sCLLs[ppIndex];
//
bool isSCBearish = isSCHHBearish &&
isSCLLBearish;
//
bool isSCBearishPrev = isSCHHBearishPrev &&
isSCLLBearishPrev;
//
bool isSCHHSwitchedToBearish = isSCHHBearish &&
!isSCHHBearishPrev;
bool isSCLLSwitchedToBeraish = isSCLLBearish &&
!isSCLLBearishPrev;
//
bool isSCSwitchedToBullish =
//
(isSCHHSwitchedToBullish &&
!isSCLLBearish)
//
||
//
(isSCLLSwitchedToBullish &&
!isSCHHBearish)
//
;
//
bool isSCSwitchedToBearish =
//
(isSCHHSwitchedToBearish &&
!isSCLLBullish)
//
||
//
(isSCLLSwitchedToBeraish &&
!isSCHHBullish)
//
;
//
// MC ...
//
bool isMCHHBullish = conditions.mCHHs[cIndex] > conditions.mCHHs[pIndex];
bool isMCLLBullish = conditions.mCLLs[cIndex] > conditions.mCLLs[pIndex];
//
bool isMCHHBullishPrev = conditions.mCHHs[pIndex] > conditions.mCHHs[ppIndex];
bool isMCLLBullishPrev = conditions.mCLLs[pIndex] > conditions.mCLLs[ppIndex];
//
bool isMCBullish = isMCHHBullish &&
isMCLLBullish;
//
bool isMCBullishPrev = isMCHHBullishPrev &&
isMCLLBullishPrev;
//
bool isMCHHSwitchedToBullish = isMCHHBullish &&
!isMCHHBullishPrev;
bool isMCLLSwitchedToBullish = isMCLLBullish &&
!isMCLLBullishPrev;
//
bool isMCHHBearish = conditions.mCHHs[cIndex] < conditions.mCHHs[pIndex];
bool isMCLLBearish = conditions.mCLLs[cIndex] < conditions.mCLLs[pIndex];
//
bool isMCHHBearishPrev = conditions.mCHHs[pIndex] < conditions.mCHHs[ppIndex];
bool isMCLLBearishPrev = conditions.mCLLs[pIndex] < conditions.mCLLs[ppIndex];
//
bool isMCBearish = isMCHHBearish &&
isMCLLBearish;
//
bool isMCBearishPrev = isMCHHBearishPrev &&
isMCLLBearishPrev;
//
bool isMCHHSwitchedToBearish = isMCHHBearish &&
!isMCHHBearishPrev;
bool isMCLLSwitchedToBeraish = isMCLLBearish &&
!isMCLLBearishPrev;
//
bool isMCSwitchedToBullish =
//
(isMCHHSwitchedToBullish &&
!isMCLLBearish)
//
||
//
(isMCLLSwitchedToBullish &&
!isMCHHBearish)
//
;
//
bool isMCSwitchedToBearish =
//
(isMCHHSwitchedToBearish &&
!isMCLLBullish)
//
||
//
(isMCLLSwitchedToBeraish &&
!isMCHHBullish)
//
;
//
// LC ...
//
bool isLCHHBullish = conditions.lCHHs[cIndex] > conditions.lCHHs[pIndex];
bool isLCLLBullish = conditions.lCLLs[cIndex] > conditions.lCLLs[pIndex];
//
bool isLCHHBullishPrev = conditions.lCHHs[pIndex] > conditions.lCHHs[ppIndex];
bool isLCLLBullishPrev = conditions.lCLLs[pIndex] > conditions.lCLLs[ppIndex];
//
bool isLCBullish = isLCHHBullish &&
isLCLLBullish;
//
bool isLCBullishPrev = isLCHHBullishPrev &&
isLCLLBullishPrev;
//
bool isLCHHSwitchedToBullish = isLCHHBullish &&
!isLCHHBullishPrev;
bool isLCLLSwitchedToBullish = isLCLLBullish &&
!isLCLLBullishPrev;
//
bool isLCHHBearish = conditions.lCHHs[cIndex] < conditions.lCHHs[pIndex];
bool isLCLLBearish = conditions.lCLLs[cIndex] < conditions.lCLLs[pIndex];
//
bool isLCHHBearishPrev = conditions.lCHHs[pIndex] < conditions.lCHHs[ppIndex];
bool isLCLLBearishPrev = conditions.lCLLs[pIndex] < conditions.lCLLs[ppIndex];
//
bool isLCBearish = isLCHHBearish &&
isLCLLBearish;
//
bool isLCBearishPrev = isLCHHBearishPrev &&
isLCLLBearishPrev;
//
bool isLCHHSwitchedToBearish = isLCHHBearish &&
!isLCHHBearishPrev;
bool isLCLLSwitchedToBeraish = isLCLLBearish &&
!isLCLLBearishPrev;
//
bool isLCSwitchedToBullish =
//
(isLCHHSwitchedToBullish &&
!isLCLLBearish)
//
||
//
(isLCLLSwitchedToBullish &&
!isLCHHBearish)
//
;
//
bool isLCSwitchedToBearish =
//
(isLCHHSwitchedToBearish &&
!isLCLLBullish)
//
||
//
(isLCLLSwitchedToBeraish &&
!isLCHHBullish)
//
;
//
// HC ...
//
bool isHCHHBullish = conditions.hCHHs[cIndex] > conditions.hCHHs[pIndex];
bool isHCLLBullish = conditions.hCLLs[cIndex] > conditions.hCLLs[pIndex];
//
bool isHCHHBullishPrev = conditions.hCHHs[pIndex] > conditions.hCHHs[ppIndex];
bool isHCLLBullishPrev = conditions.hCLLs[pIndex] > conditions.hCLLs[ppIndex];
//
bool isHCBullish = isHCHHBullish &&
isHCLLBullish;
//
bool isHCBullishPrev = isHCHHBullishPrev &&
isHCLLBullishPrev;
//
bool isHCHHSwitchedToBullish = isHCHHBullish &&
!isHCHHBullishPrev;
bool isHCLLSwitchedToBullish = isHCLLBullish &&
!isHCLLBullishPrev;
//
bool isHCHHBearish = conditions.hCHHs[cIndex] < conditions.hCHHs[pIndex];
bool isHCLLBearish = conditions.hCLLs[cIndex] < conditions.hCLLs[pIndex];
//
bool isHCHHBearishPrev = conditions.hCHHs[pIndex] < conditions.hCHHs[ppIndex];
bool isHCLLBearishPrev = conditions.hCLLs[pIndex] < conditions.hCLLs[ppIndex];
//
bool isHCBearish = isHCHHBearish &&
isHCLLBearish;
//
bool isHCBearishPrev = isHCHHBearishPrev &&
isHCLLBearishPrev;
//
bool isHCHHSwitchedToBearish = isHCHHBearish &&
!isHCHHBearishPrev;
bool isHCLLSwitchedToBeraish = isHCLLBearish &&
!isHCLLBearishPrev;
//
bool isHCSwitchedToBullish =
//
(isHCHHSwitchedToBullish &&
!isHCLLBearish)
//
||
//
(isHCLLSwitchedToBullish &&
!isHCHHBearish)
//
;
//
bool isHCSwitchedToBearish =
//
(isHCHHSwitchedToBearish &&
!isHCLLBullish)
//
||
//
(isHCLLSwitchedToBeraish &&
!isHCHHBullish)
//
;
//
// Define Bars For Calculations ...
//
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
cIndex //
);
if (!result)
{
return result;
}
//
XOHCL pBar;
result = pBar.Init(
mSymbol,
mPeriod,
pIndex //
);
if (!result)
{
return result;
}
//
bool isCloseOverFib1 = cBar.close > conditions.fib1s[cIndex];
bool isCloseOverFib1Prev = pBar.close > conditions.fib1s[pIndex];
//
bool isCloseOverFib2 = cBar.close > conditions.fib2s[cIndex];
bool isCloseOverFib2Prev = pBar.close > conditions.fib2s[pIndex];
//
bool isCloseOverFib3 = cBar.close > conditions.fib3s[cIndex];
bool isCloseOverFib3Prev = pBar.close > conditions.fib3s[pIndex];
//
bool isCloseOverFib4 = cBar.close > conditions.fib4s[cIndex];
bool isCloseOverFib4Prev = pBar.close > conditions.fib4s[pIndex];
//
bool isCloseOverFib5 = cBar.close > conditions.fib5s[cIndex];
bool isCloseOverFib5Prev = pBar.close > conditions.fib5s[pIndex];
//
bool isCloseUnderFib1 = cBar.close < conditions.fib1s[cIndex];
bool isCloseUnderFib1Prev = pBar.close < conditions.fib1s[pIndex];
//
bool isCloseUnderFib2 = cBar.close < conditions.fib2s[cIndex];
bool isCloseUnderFib2Prev = pBar.close < conditions.fib2s[pIndex];
//
bool isCloseUnderFib3 = cBar.close < conditions.fib3s[cIndex];
bool isCloseUnderFib3Prev = pBar.close < conditions.fib3s[pIndex];
//
bool isCloseUnderFib4 = cBar.close < conditions.fib4s[cIndex];
bool isCloseUnderFib4Prev = pBar.close < conditions.fib4s[pIndex];
//
bool isCloseUnderFib5 = cBar.close < conditions.fib5s[cIndex];
bool isCloseUnderFib5Prev = pBar.close < conditions.fib5s[pIndex];
//
bool isCloseCrossedOverFib1 = isCloseOverFib1 &&
!isCloseOverFib1Prev;
bool isCloseCrossedOverFib2 = isCloseOverFib2 &&
!isCloseOverFib2Prev;
bool isCloseCrossedOverFib3 = isCloseOverFib3 &&
!isCloseOverFib3Prev;
bool isCloseCrossedOverFib4 = isCloseOverFib4 &&
!isCloseOverFib4Prev;
bool isCloseCrossedOverFib5 = isCloseOverFib5 &&
!isCloseOverFib5Prev;
//
bool isCloseCrossedUnderFib1 = isCloseUnderFib1 &&
!isCloseUnderFib1Prev;
bool isCloseCrossedUnderFib2 = isCloseUnderFib2 &&
!isCloseUnderFib2Prev;
bool isCloseCrossedUnderFib3 = isCloseUnderFib3 &&
!isCloseUnderFib3Prev;
bool isCloseCrossedUnderFib4 = isCloseUnderFib4 &&
!isCloseUnderFib4Prev;
bool isCloseCrossedUnderFib5 = isCloseUnderFib5 &&
!isCloseUnderFib5Prev;
//
conditions.isNewPeak = isNewPeak;
conditions.isNewPeakOverLast = isNewPeakOverLast;
conditions.isNewPeakUnderLast = isNewPeakUnderLast;
conditions.isNewVale = isNewVale;
conditions.isNewValeOverLast = isNewValeOverLast;
conditions.isNewValeUnderLast = isNewValeUnderLast;
conditions.isFiboIncreased = isFiboIncreased;
conditions.isFiboDecreased = isFiboDecreased;
conditions.isFiboSectionChanged = isFiboSectionChanged;
conditions.isCloseOverFib1 = isCloseOverFib1;
conditions.isCloseOverFib2 = isCloseOverFib2;
conditions.isCloseOverFib3 = isCloseOverFib3;
conditions.isCloseOverFib4 = isCloseOverFib4;
conditions.isCloseOverFib5 = isCloseOverFib5;
conditions.isCloseUnderFib1 = isCloseUnderFib1;
conditions.isCloseUnderFib2 = isCloseUnderFib2;
conditions.isCloseUnderFib3 = isCloseUnderFib3;
conditions.isCloseUnderFib4 = isCloseUnderFib4;
conditions.isCloseUnderFib5 = isCloseUnderFib5;
conditions.isCloseCrossedOverFib1 = isCloseCrossedOverFib1;
conditions.isCloseCrossedOverFib2 = isCloseCrossedOverFib2;
conditions.isCloseCrossedOverFib3 = isCloseCrossedOverFib3;
conditions.isCloseCrossedOverFib4 = isCloseCrossedOverFib4;
conditions.isCloseCrossedOverFib5 = isCloseCrossedOverFib5;
conditions.isCloseCrossedUnderFib1 = isCloseCrossedUnderFib1;
conditions.isCloseCrossedUnderFib2 = isCloseCrossedUnderFib2;
conditions.isCloseCrossedUnderFib3 = isCloseCrossedUnderFib3;
conditions.isCloseCrossedUnderFib4 = isCloseCrossedUnderFib4;
conditions.isCloseCrossedUnderFib5 = isCloseCrossedUnderFib5;
conditions.isSCBullish = isSCBullish;
conditions.isSCHHBullish = isSCHHBullish;
conditions.isSCLLBullish = isSCLLBullish;
conditions.isSCSwitchedToBullish = isSCSwitchedToBullish;
conditions.isSCHHSwitchedToBullish = isSCHHSwitchedToBullish;
conditions.isSCLLSwitchedToBullish = isSCLLSwitchedToBullish;
conditions.isSCBearish = isSCBearish;
conditions.isSCHHBearish = isSCHHBearish;
conditions.isSCLLBearish = isSCLLBearish;
conditions.isSCSwitchedToBearish = isSCSwitchedToBearish;
conditions.isSCHHSwitchedToBearish = isSCHHSwitchedToBearish;
conditions.isSCLLSwitchedToBeraish = isSCLLSwitchedToBeraish;
conditions.isMCBullish = isMCBullish;
conditions.isMCHHBullish = isMCHHBullish;
conditions.isMCLLBullish = isMCLLBullish;
conditions.isMCSwitchedToBullish = isMCSwitchedToBullish;
conditions.isMCHHSwitchedToBullish = isMCHHSwitchedToBullish;
conditions.isMCLLSwitchedToBullish = isMCLLSwitchedToBullish;
conditions.isMCBearish = isMCBearish;
conditions.isMCHHBearish = isMCHHBearish;
conditions.isMCLLBearish = isMCLLBearish;
conditions.isMCSwitchedToBearish = isMCSwitchedToBearish;
conditions.isMCHHSwitchedToBearish = isMCHHSwitchedToBearish;
conditions.isMCLLSwitchedToBeraish = isMCLLSwitchedToBeraish;
conditions.isLCBullish = isLCBullish;
conditions.isLCHHBullish = isLCHHBullish;
conditions.isLCLLBullish = isLCLLBullish;
conditions.isLCSwitchedToBullish = isLCSwitchedToBullish;
conditions.isLCHHSwitchedToBullish = isLCHHSwitchedToBullish;
conditions.isLCLLSwitchedToBullish = isLCLLSwitchedToBullish;
conditions.isLCBearish = isLCBearish;
conditions.isLCHHBearish = isLCHHBearish;
conditions.isLCLLBearish = isLCLLBearish;
conditions.isLCSwitchedToBearish = isLCSwitchedToBearish;
conditions.isLCHHSwitchedToBearish = isLCHHSwitchedToBearish;
conditions.isLCLLSwitchedToBeraish = isLCLLSwitchedToBeraish;
conditions.isHCBullish = isHCBullish;
conditions.isHCHHBullish = isHCHHBullish;
conditions.isHCLLBullish = isHCLLBullish;
conditions.isHCSwitchedToBullish = isHCSwitchedToBullish;
conditions.isHCHHSwitchedToBullish = isHCHHSwitchedToBullish;
conditions.isHCLLSwitchedToBullish = isHCLLSwitchedToBullish;
conditions.isHCBearish = isHCBearish;
conditions.isHCHHBearish = isHCHHBearish;
conditions.isHCLLBearish = isHCLLBearish;
conditions.isHCSwitchedToBearish = isHCSwitchedToBearish;
conditions.isHCHHSwitchedToBearish = isHCHHSwitchedToBearish;
conditions.isHCLLSwitchedToBeraish = isHCLLSwitchedToBeraish;
//
return result;
}
//
// Protected ...
protected:
//
// Private ...
private:
//
// Props ...
XPVInputs mInputs; // Inputs ...
//
// Buffers ...
double peaksBuffer[];
double valesBuffer[];
double resistanceBuffer[];
double supportBuffer[];
double fib1Buffer[];
double fib2Buffer[];
double fib3Buffer[];
double fib4Buffer[];
double fib5Buffer[];
double scHHBuffer[];
double scLLBuffer[];
double mcHHBuffer[];
double mcLLBuffer[];
double lcHHBuffer[];
double lcLLBuffer[];
double hcHHBuffer[];
double hcLLBuffer[];
//
// Tools ...
//
// Calculate Values Until Now ...
void Calculate()
{
//
int totalBars = CountBars();
if (totalBars > 1000)
{
totalBars = 1000;
}
//
// Peaks and Vales ...
//
// Peaks Buffer ...
CopyBuffer(
mHandler,
XPV_PEAKS_LINE,
0,
totalBars,
peaksBuffer
//
);
//
// Vales Buffer ...
CopyBuffer(
mHandler,
XPV_VALES_LINE,
0,
totalBars,
valesBuffer
//
);
//
// Support and Resistances ...
//
// Resistances Buffer ...
CopyBuffer(
mHandler,
XPV_RESISTANCE_LINE,
0,
totalBars,
resistanceBuffer
//
);
//
// Supports Buffer ...
CopyBuffer(
mHandler,
XPV_SUPPORT_LINE,
0,
totalBars,
supportBuffer
//
);
//
// Fibonacci ...
//
// Level 1 Buffer ...
CopyBuffer(
mHandler,
XPV_FIB_1_LINE,
0,
totalBars,
fib1Buffer
//
);
//
// Level 2 Buffer ...
CopyBuffer(
mHandler,
XPV_FIB_2_LINE,
0,
totalBars,
fib2Buffer
//
);
//
// Level 3 Buffer ...
CopyBuffer(
mHandler,
XPV_FIB_3_LINE,
0,
totalBars,
fib3Buffer
//
);
//
// Level 4 Buffer ...
CopyBuffer(
mHandler,
XPV_FIB_4_LINE,
0,
totalBars,
fib4Buffer
//
);
//
// Level 5 Buffer ...
CopyBuffer(
mHandler,
XPV_FIB_5_LINE,
0,
totalBars,
fib5Buffer
//
);
//
// Cycles ...
//
// Short ...
//
// HH ...
CopyBuffer(
mHandler,
XPV_SC_HH_LINE,
0,
totalBars,
scHHBuffer
//
);
//
// LL ...
CopyBuffer(
mHandler,
XPV_SC_LL_LINE,
0,
totalBars,
scLLBuffer
//
);
//
// Medium ...
//
// HH ...
CopyBuffer(
mHandler,
XPV_MC_HH_LINE,
0,
totalBars,
mcHHBuffer
//
);
//
// LL ...
CopyBuffer(
mHandler,
XPV_MC_LL_LINE,
0,
totalBars,
mcLLBuffer
//
);
//
// Long ...
//
// HH ...
CopyBuffer(
mHandler,
XPV_LC_HH_LINE,
0,
totalBars,
lcHHBuffer
//
);
//
// LL ...
CopyBuffer(
mHandler,
XPV_LC_LL_LINE,
0,
totalBars,
lcLLBuffer
//
);
//
// Hind ...
//
// HH ...
CopyBuffer(
mHandler,
XPV_HC_HH_LINE,
0,
totalBars,
hcHHBuffer
//
);
//
// LL ...
CopyBuffer(
mHandler,
XPV_HC_LL_LINE,
0,
totalBars,
hcLLBuffer
//
);
}
};
//
// Tools ...