add MQL5Test Workspace Content as BKP Solution ...
This commit is contained in:
+690
@@ -0,0 +1,690 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user