Files
MQL5Data/Helpers/x-saherelm.x121.xich.helper.mq5
T
2025-03-26 05:25:00 +03:30

1061 lines
24 KiB
Plaintext

///////////////////////////////////////////////////////
//
// 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.senkouSpanABuffer[cIDX];
bool isSenkouSpanAOverBPrev =
conditions.senkouSpanABuffer[pIDX] > conditions.senkouSpanABuffer[pIDX];
//
bool isSenkouSpanAUnderB =
conditions.senkouSpanABuffer[cIDX] < conditions.senkouSpanABuffer[cIDX];
bool isSenkouSpanAUnderBPrev =
conditions.senkouSpanABuffer[pIDX] < conditions.senkouSpanABuffer[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 ...