add MQL5Test Workspace Content as BKP Solution ...
This commit is contained in:
+707
@@ -0,0 +1,707 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class Library
|
||||
// --------------------------------------
|
||||
// Name: XPV Indicator Provider
|
||||
// Description: Peaks and Vales ...
|
||||
//
|
||||
//
|
||||
// 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 ...
|
||||
//
|
||||
|
||||
//
|
||||
// XPeaksAndVales Exported Buffers ...
|
||||
enum ENUM_X_XPV_BUFFERS
|
||||
{
|
||||
//
|
||||
// PEAKSANDVALES ...
|
||||
X_PV_P_LINE = 0,
|
||||
X_PV_V_LINE = 1,
|
||||
//
|
||||
// SUPPORTRESISTANCE ...
|
||||
X_PV_R_LINE = 2,
|
||||
X_PV_S_LINE = 4,
|
||||
//
|
||||
// SHORT ...
|
||||
X_PV_SHH_LINE = 6,
|
||||
X_PV_SLL_LINE = 7,
|
||||
//
|
||||
// MEDIUM ...
|
||||
X_PV_MHH_LINE = 8,
|
||||
X_PV_MLL_LINE = 9,
|
||||
//
|
||||
// LONG ...
|
||||
X_PV_LHH_LINE = 10,
|
||||
X_PV_LLL_LINE = 11,
|
||||
//
|
||||
// HIND ...
|
||||
X_PV_HHH_LINE = 12,
|
||||
X_PV_HLL_LINE = 13,
|
||||
};
|
||||
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Overrides ...
|
||||
//
|
||||
|
||||
//
|
||||
// END Overrides ...
|
||||
//
|
||||
|
||||
class XSCXPVHelper
|
||||
{
|
||||
//
|
||||
public:
|
||||
//
|
||||
// Properties ...
|
||||
double pBuffer[];
|
||||
double vBuffer[];
|
||||
double rBuffer[];
|
||||
double sBuffer[];
|
||||
double sHHBuffer[];
|
||||
double sLLBuffer[];
|
||||
double mHHBuffer[];
|
||||
double mLLBuffer[];
|
||||
double lHHBuffer[];
|
||||
double lLLBuffer[];
|
||||
double hHHBuffer[];
|
||||
double hLLBuffer[];
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
void XSCXPVHelper()
|
||||
{
|
||||
mSymbol = _Symbol;
|
||||
mPeriod = _Period;
|
||||
}
|
||||
void XSCXPVHelper(
|
||||
//
|
||||
// Symbol ...
|
||||
string symbol,
|
||||
//
|
||||
// Period ...
|
||||
ENUM_TIMEFRAMES period,
|
||||
//
|
||||
// Buffer Reading ...
|
||||
int numberOfItemsReadPerTick = 52,
|
||||
//
|
||||
// MARKET ...
|
||||
int shortLength = 9,
|
||||
int mediumLength = 17,
|
||||
int longLength = 26,
|
||||
int hindLength = 35,
|
||||
//
|
||||
// TREND ...
|
||||
int numOfShoulder = 10,
|
||||
//
|
||||
// DETECTION ...
|
||||
ENUM_SERIESMODE hhMode = MODE_HIGH,
|
||||
ENUM_SERIESMODE llMode = MODE_LOW
|
||||
//
|
||||
)
|
||||
{
|
||||
//
|
||||
// Setting Requirements ...
|
||||
|
||||
//
|
||||
// Symbol ...
|
||||
mSymbol = symbol;
|
||||
|
||||
//
|
||||
// Period ...
|
||||
mPeriod = period;
|
||||
|
||||
//
|
||||
// Number of Reading Buffer Items per Tick ...
|
||||
mNumberOfItemsReadPerTick = numberOfItemsReadPerTick;
|
||||
|
||||
//
|
||||
// MARKET ...
|
||||
mShortLength = shortLength;
|
||||
mMediumLength = mediumLength;
|
||||
mLongLength = longLength;
|
||||
mHindLength = hindLength;
|
||||
|
||||
//
|
||||
// TREND ...
|
||||
mNumOfShoulder = numOfShoulder;
|
||||
|
||||
//
|
||||
// DETECTION ...
|
||||
mHhMode = hhMode;
|
||||
mLlMode = llMode;
|
||||
|
||||
//
|
||||
mTag = "XPV " + mSymbol + ", " + ToString(mPeriod);
|
||||
|
||||
//
|
||||
// Initial Handler ...
|
||||
mHandler = iCustom(
|
||||
mSymbol,
|
||||
mPeriod,
|
||||
"x-saherelm.x121.xpv",
|
||||
//
|
||||
// Inputs ...
|
||||
//
|
||||
// MARKET ...
|
||||
"",
|
||||
mShortLength,
|
||||
mMediumLength,
|
||||
mLongLength,
|
||||
mHindLength,
|
||||
//
|
||||
// TREND ...
|
||||
"",
|
||||
mNumOfShoulder,
|
||||
//
|
||||
// DETECTION ...
|
||||
"",
|
||||
mHhMode,
|
||||
mLlMode,
|
||||
//
|
||||
"",
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
//
|
||||
);
|
||||
if (mHandler == INVALID_HANDLE)
|
||||
{
|
||||
LogMessage("failed to Initialize Indicator: " + (string)GetLastError());
|
||||
}
|
||||
|
||||
//
|
||||
// PEAKSANDVALES ...
|
||||
ArraySetAsSeries(pBuffer, true);
|
||||
ArraySetAsSeries(vBuffer, true);
|
||||
//
|
||||
// RESISTANCESUPPORT ...
|
||||
ArraySetAsSeries(rBuffer, true);
|
||||
ArraySetAsSeries(sBuffer, true);
|
||||
//
|
||||
// SHORT ...
|
||||
ArraySetAsSeries(sHHBuffer, true);
|
||||
ArraySetAsSeries(sLLBuffer, true);
|
||||
//
|
||||
// MEDIUM ...
|
||||
ArraySetAsSeries(mHHBuffer, true);
|
||||
ArraySetAsSeries(mLLBuffer, true);
|
||||
//
|
||||
// LONG ...
|
||||
ArraySetAsSeries(lHHBuffer, true);
|
||||
ArraySetAsSeries(lLLBuffer, true);
|
||||
//
|
||||
// HIND ...
|
||||
ArraySetAsSeries(lHHBuffer, true);
|
||||
ArraySetAsSeries(lLLBuffer, true);
|
||||
}
|
||||
|
||||
//
|
||||
// DeConstructor ...
|
||||
void ~XSCXPVHelper()
|
||||
{
|
||||
//
|
||||
// Release Indicators ...
|
||||
IndicatorRelease(mHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Reading Buffers ...
|
||||
void ReadBuffers()
|
||||
{
|
||||
//
|
||||
// PEAKS ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_P_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
pBuffer);
|
||||
|
||||
//
|
||||
// VALES ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_V_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
vBuffer);
|
||||
|
||||
//
|
||||
// R ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_R_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
rBuffer);
|
||||
|
||||
//
|
||||
// S ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_S_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
sBuffer);
|
||||
|
||||
//
|
||||
// SHORT ...
|
||||
|
||||
//
|
||||
// HIGH ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_SHH_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
sHHBuffer);
|
||||
|
||||
//
|
||||
// LOW ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_SLL_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
sLLBuffer);
|
||||
|
||||
//
|
||||
// MEIUM ...
|
||||
|
||||
//
|
||||
// HIGH ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_MHH_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
mHHBuffer);
|
||||
|
||||
//
|
||||
// LOW ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_MLL_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
mLLBuffer);
|
||||
|
||||
//
|
||||
// LONG ...
|
||||
|
||||
//
|
||||
// HIGH ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_LHH_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
lHHBuffer);
|
||||
|
||||
//
|
||||
// LOW ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_LLL_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
lLLBuffer);
|
||||
|
||||
//
|
||||
// HIND ...
|
||||
|
||||
//
|
||||
// HIGH ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_HHH_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
hHHBuffer);
|
||||
|
||||
//
|
||||
// LOW ...
|
||||
CopyBuffer(
|
||||
mHandler,
|
||||
X_PV_HLL_LINE,
|
||||
0,
|
||||
mNumberOfItemsReadPerTick,
|
||||
hLLBuffer);
|
||||
}
|
||||
|
||||
//
|
||||
// START Tools Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Check isPeak ...
|
||||
bool IsPeak(int bar_index)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = rBuffer[bar_index] == hHHBuffer[bar_index] &&
|
||||
hHHBuffer[bar_index] == lHHBuffer[bar_index] &&
|
||||
lHHBuffer[bar_index] == mHHBuffer[bar_index] &&
|
||||
mHHBuffer[bar_index] == sHHBuffer[bar_index];
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check isVale ...
|
||||
bool IsVale(int bar_index)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = sBuffer[bar_index] == hLLBuffer[bar_index] &&
|
||||
hLLBuffer[bar_index] == lLLBuffer[bar_index] &&
|
||||
lLLBuffer[bar_index] == mLLBuffer[bar_index] &&
|
||||
mLLBuffer[bar_index] == sLLBuffer[bar_index];
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Is Strong Support ...
|
||||
bool IsStrongSupport(int bar_index)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index + 3))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
hLLBuffer[bar_index + 1] == hLLBuffer[bar_index + 2] &&
|
||||
hLLBuffer[bar_index + 2] == hLLBuffer[bar_index + 3] &&
|
||||
//
|
||||
lLLBuffer[bar_index + 1] == lLLBuffer[bar_index + 2] &&
|
||||
lLLBuffer[bar_index + 2] == lLLBuffer[bar_index + 3] &&
|
||||
//
|
||||
mLLBuffer[bar_index + 1] == mLLBuffer[bar_index + 2] &&
|
||||
mLLBuffer[bar_index + 2] == mLLBuffer[bar_index + 3] &&
|
||||
//
|
||||
sLLBuffer[bar_index + 1] == sLLBuffer[bar_index + 2] &&
|
||||
sLLBuffer[bar_index + 2] == sLLBuffer[bar_index + 3]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Is Strong Resistance ...
|
||||
bool IsStrongResistance(int bar_index)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
hHHBuffer[bar_index + 1] == hHHBuffer[bar_index + 2] &&
|
||||
hHHBuffer[bar_index + 2] == hHHBuffer[bar_index + 3] &&
|
||||
//
|
||||
lHHBuffer[bar_index + 1] == lHHBuffer[bar_index + 2] &&
|
||||
lHHBuffer[bar_index + 2] == lHHBuffer[bar_index + 3] &&
|
||||
//
|
||||
mHHBuffer[bar_index + 1] == mHHBuffer[bar_index + 2] &&
|
||||
mHHBuffer[bar_index + 2] == mHHBuffer[bar_index + 3] &&
|
||||
//
|
||||
sHHBuffer[bar_index + 1] == sHHBuffer[bar_index + 2] &&
|
||||
sHHBuffer[bar_index + 2] == sHHBuffer[bar_index + 3]
|
||||
//
|
||||
;
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Last Strong Support ...
|
||||
double GetLastStrongSupport(
|
||||
int bar_index, // Bar Index ...
|
||||
int length // LoopBack ...
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
bool isBarIndexSupport = IsStrongSupport(bar_index);
|
||||
if (isBarIndexSupport)
|
||||
{
|
||||
length += bar_index;
|
||||
}
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index + length + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = bar_index; i < bar_index + length; i++)
|
||||
{
|
||||
//
|
||||
if (IsStrongSupport(i))
|
||||
{
|
||||
//
|
||||
result = sLLBuffer[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Last Strong Resistance ...
|
||||
double GetLastStrongResistance(
|
||||
int bar_index, // Bar Index ...
|
||||
int length // LoopBack ...
|
||||
)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
bool isBarIndexResistance = IsStrongResistance(bar_index);
|
||||
if (isBarIndexResistance)
|
||||
{
|
||||
length += bar_index;
|
||||
}
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index + length + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = bar_index; i < bar_index + length; i++)
|
||||
{
|
||||
//
|
||||
if (IsStrongResistance(i))
|
||||
{
|
||||
//
|
||||
result = sHHBuffer[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Strong Support Break Stop ...
|
||||
bool IsSupportBreakedStop(
|
||||
int bar_index, // Bar Index ...
|
||||
int length // LoopBack ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isBaIndexSupport = IsStrongSupport(bar_index);
|
||||
if (isBaIndexSupport)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index + length + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isAllStrongSupport = true;
|
||||
for (int i = bar_index; i < bar_index + length; i++)
|
||||
{
|
||||
//
|
||||
if (!IsStrongSupport(i) && isAllStrongSupport)
|
||||
{
|
||||
//
|
||||
isAllStrongSupport = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = !isBaIndexSupport && isAllStrongSupport;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Strong Resistance Break Stop ...
|
||||
bool IsResistanceBreakedStop(
|
||||
int bar_index, // Bar Index ...
|
||||
int length // LoopBack ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isBaIndexResistance = IsStrongResistance(bar_index);
|
||||
if (isBaIndexResistance)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
if (!IsValidArraySize(bar_index + length + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool isAllStrongResistance = true;
|
||||
for (int i = bar_index; i < bar_index + length; i++)
|
||||
{
|
||||
//
|
||||
if (!IsStrongResistance(i) && isAllStrongResistance)
|
||||
{
|
||||
//
|
||||
isAllStrongResistance = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = !isBaIndexResistance && isAllStrongResistance;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END Tools Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
protected:
|
||||
//
|
||||
private:
|
||||
//
|
||||
// Symbol ...
|
||||
string mSymbol;
|
||||
|
||||
//
|
||||
// Period ...
|
||||
ENUM_TIMEFRAMES mPeriod;
|
||||
|
||||
//
|
||||
// Buffer Reading ...
|
||||
int mNumberOfItemsReadPerTick;
|
||||
|
||||
//
|
||||
// MARKET ...
|
||||
int mShortLength;
|
||||
int mMediumLength;
|
||||
int mLongLength;
|
||||
int mHindLength;
|
||||
|
||||
//
|
||||
// TREND ...
|
||||
int mNumOfShoulder;
|
||||
|
||||
//
|
||||
// DETECTION ...
|
||||
ENUM_SERIESMODE mHhMode;
|
||||
ENUM_SERIESMODE mLlMode;
|
||||
|
||||
//
|
||||
string mTag;
|
||||
|
||||
//
|
||||
int mHandler;
|
||||
|
||||
//
|
||||
bool IsValidArraySize(int bar_index)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (bar_index < 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int rCount = ArraySize(rBuffer);
|
||||
result = rCount > bar_index + 1;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user