Files
xMQL5/MQLTestWorkspace/BKPS/BKP/x121 old style indicators/Helpers/x-saherelm.x121.xich.helper.mq5
T

690 lines
14 KiB
Plaintext

///////////////////////////////////////////////////////
//
// 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;
}
};