Files
xMQL5/MQLTestWorkspace/Helpers/x-saherelm.x121.xmrb.helper.class.mq5
T

850 lines
18 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Helper Class Library
// ----------------------------------------------
// Name: XSCXMRBHelper
// 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
//
// START Definitions ...
//
//
// Inputs ...
struct XMRBInputs
{
//
// Ribbon 1 ...
int fast1Length; // Fast
int slow1Length; // Slow
//
// Ribbon 2 ...
int fast2Length; // Fast
int slow2Length; // Slow
//
// Ribbon 3 ...
int fast3Length; // Fast
int slow3Length; // Slow
//
// Ribbon 4 ...
int fast4Length; // Fast
int slow4Length; // Slow
//
// Ribbon 5 ...
int fast5Length; // Fast
int slow5Length; // Slow
//
// Calculation ...
ENUM_MA_METHOD ribbonMode; // Mode
ENUM_APPLIED_PRICE ribbonAppliedTo; // Applied To
//
// Presentation ...
bool showFastMa; // Show Fast
bool showSlowMa; // Show Slow
bool showRibbon; // Show Ribbon
};
//
// Index of Lines ...
enum ENUM_XMRB_BUFFERS
{
//
// Main Requirements ...
XMRB_FAST_LINE = 0,
XMRB_SLOW_LINE = 1,
//
// RIBBON 1 ...
XMRB_R1_FAST_LINE = 2,
XMRB_R1_SLOW_LINE = 3,
//
// RIBBON 2 ...
XMRB_R2_FAST_LINE = 4,
XMRB_R2_SLOW_LINE = 5,
//
// RIBBON 3 ...
XMRB_R3_FAST_LINE = 6,
XMRB_R3_SLOW_LINE = 7,
//
// RIBBON 4 ...
XMRB_R4_FAST_LINE = 8,
XMRB_R4_SLOW_LINE = 9,
//
// RIBBON 5 ...
XMRB_R5_FAST_LINE = 10,
XMRB_R5_SLOW_LINE = 11,
};
//
// Retrieve Info Model ...
struct XMRBInfo
{
//
// Symbol ...
string symbol;
//
// Period ...
ENUM_TIMEFRAMES period;
//
// Bar Time ...
datetime barTime;
//
// Bar Index ...
int barIndex;
//
// Values ...
double fast;
double slow;
double fastR1;
double slowR1;
double fastR2;
double slowR2;
double fastR3;
double slowR3;
double fastR4;
double slowR4;
double fastR5;
double slowR5;
//
// Conditions ...
//
bool isFastOverSlow;
bool isFastCrossedOverSlow;
bool isFastUnderSlow;
bool isFastCrossedUnderSlow;
//
bool isR1FastOverSlow;
bool isR1FastCrossedOverSlow;
bool isR1FastUnderSlow;
bool isR1FastCrossedUnderSlow;
//
bool isR2FastOverSlow;
bool isR2FastCrossedOverSlow;
bool isR2FastUnderSlow;
bool isR2FastCrossedUnderSlow;
//
bool isR3FastOverSlow;
bool isR3FastCrossedOverSlow;
bool isR3FastUnderSlow;
bool isR3FastCrossedUnderSlow;
//
bool isR4FastOverSlow;
bool isR4FastCrossedOverSlow;
bool isR4FastUnderSlow;
bool isR4FastCrossedUnderSlow;
//
bool isR5FastOverSlow;
bool isR5FastCrossedOverSlow;
bool isR5FastUnderSlow;
bool isR5FastCrossedUnderSlow;
};
//
// END Definitions ...
//
//
// START Import and Inclused requirements ...
//
//
// Includes ...
#include "../Libraries/x-saherelm.common.lib.mq5"
#include "../Classes/x-saherelm.xhelper.class.mq5"
//
// END Import and Inclused requirements ...
//
//
// START Overrides ...
//
//
// END Overrides ...
//
//
// a Class for Helping Indicators Requirements ...
class XSCXMRBHelper : public XSCBaseHelper
{
//
// Public ...
public:
//
// Buffers ...
double fastBuffer[];
double slowBuffer[];
double fastR1Buffer[];
double slowR1Buffer[];
double fastR2Buffer[];
double slowR2Buffer[];
double fastR3Buffer[];
double slowR3Buffer[];
double fastR4Buffer[];
double slowR4Buffer[];
double fastR5Buffer[];
double slowR5Buffer[];
//
// Constructor ...
void XSCXMRBHelper(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period // Trading Time Frame
) : XSCBaseHelper(symbol, period)
{
PrepareTag();
}
//
// Deconstructor ...
void ~XSCXMRBHelper()
{
}
//
// START Properties ...
//
//
// Show Fast ...
bool ShowFast(
bool show // Show or Hide
)
{
//
bool result = false;
//
if (mShowFastMa == show)
{
return true;
}
//
mShowFastMa = show;
result = Init();
//
return result;
}
//
// Show Slow ...
bool ShowSlow(
bool show // Show or Hide
)
{
//
bool result = false;
//
if (mShowSlowMa == show)
{
return true;
}
//
mShowSlowMa = show;
result = Init();
//
return result;
}
//
// Show Ribbon ...
bool ShowRibbon(
bool show // Show or Hide
)
{
//
bool result = false;
//
if (mShowRibbon == show)
{
return true;
}
//
mShowRibbon = show;
result = Init();
//
return result;
}
//
// END Properties ...
//
//
// START Provided Functions ...
//
//
// Prepare Tag ...
virtual void PrepareTag()
{
mTag = "XMRB" + GetTagPrefix();
}
//
virtual int GetMaxLength()
{
//
int result = -1;
//
result = MathMax(mFast1Length, mFast2Length);
result = MathMax(result, mFast3Length);
result = MathMax(result, mFast4Length);
result = MathMax(result, mFast5Length);
//
result = MathMax(result, mSlow1Length);
result = MathMax(result, mSlow2Length);
result = MathMax(result, mSlow3Length);
result = MathMax(result, mSlow4Length);
result = MathMax(result, mSlow5Length);
//
return result;
}
//
// Initial Indicator Handler ...
bool Init()
{
//
bool result = false;
//
// Validate Inputs ...
result =
//
(mFast1Length > 2 &&
mFast2Length > mFast1Length &&
mFast3Length > mFast2Length &&
mFast4Length > mFast3Length &&
mFast5Length > mFast4Length &&
mSlow1Length > mFast1Length &&
mSlow2Length > mFast2Length &&
mSlow3Length > mFast3Length &&
mSlow4Length > mFast4Length &&
mSlow5Length > mFast5Length &&
mSlow2Length > mSlow1Length &&
mSlow3Length > mSlow2Length &&
mSlow4Length > mSlow3Length &&
mSlow5Length > mSlow4Length
//
)
//
;
if (!result)
{
return result;
}
//
// Initialize Handler ...
mHandler = iCustom(
//
mSymbol,
mPeriod,
"x-saherelm.x121.xmrb",
//
// Inputs ...
//
// Ribbon 1 ...
"",
mFast1Length,
mSlow1Length,
//
// Ribbon 2 ...
"",
mFast2Length,
mSlow2Length,
//
// Ribbon 3 ...
"",
mFast3Length,
mSlow3Length,
//
// Ribbon 4 ...
"",
mFast4Length,
mSlow4Length,
//
// Ribbon 5 ...
"",
mFast5Length,
mSlow5Length,
//
// Calculation ...
"",
//
// Mode ...
mRibbonMode,
//
// Applied To ...
mRibbonAppliedTo,
//
// Presentation ...
"",
//
// Show Fast ...
mShowFastMa,
//
// Show Slow ...
mShowSlowMa,
//
// Show Ribbon ...
mShowRibbon
//
);
result = mHandler != INVALID_HANDLE;
//
return result;
}
//
// Retrieve Current Config ...
XMRBInputs GetConfig()
{
//
XMRBInputs result;
//
result.fast1Length = mFast1Length;
result.slow1Length = mSlow1Length;
result.fast2Length = mFast2Length;
result.slow2Length = mSlow2Length;
result.fast3Length = mFast3Length;
result.slow3Length = mSlow3Length;
result.fast4Length = mFast4Length;
result.slow4Length = mSlow4Length;
result.fast5Length = mFast5Length;
result.slow5Length = mSlow5Length;
result.ribbonMode = mRibbonMode;
result.ribbonAppliedTo = mRibbonAppliedTo;
result.showFastMa = mShowFastMa;
result.showSlowMa = mShowSlowMa;
result.showRibbon = mShowRibbon;
//
return result;
}
//
// Set Config ...
bool SetConfig(XMRBInputs &config)
{
//
bool result = false;
//
mFast1Length = config.fast1Length;
mSlow1Length = config.slow1Length;
mFast2Length = config.fast2Length;
mSlow2Length = config.slow2Length;
mFast3Length = config.fast3Length;
mSlow3Length = config.slow3Length;
mFast4Length = config.fast4Length;
mSlow4Length = config.slow4Length;
mFast5Length = config.fast5Length;
mSlow5Length = config.slow5Length;
mRibbonMode = config.ribbonMode;
mRibbonAppliedTo = config.ribbonAppliedTo;
mShowFastMa = config.showFastMa;
mShowSlowMa = config.showSlowMa;
mShowRibbon = config.showRibbon;
//
result = Init();
//
return result;
}
//
// Reading Buffers based on Given Bar Index ...
virtual void Calculate(
int barIndex // Given Bar Index
)
{
//
// FAST ...
ArraySetAsSeries(fastBuffer, true);
CopyBuffer(
mHandler,
XMRB_FAST_LINE,
barIndex,
mLoopbackBars,
fastBuffer);
//
// SLOW ...
ArraySetAsSeries(slowBuffer, true);
CopyBuffer(
mHandler,
XMRB_SLOW_LINE,
barIndex,
mLoopbackBars,
slowBuffer);
//
// RIBBON 1 ...
//
// FAST ...
ArraySetAsSeries(fastR1Buffer, true);
CopyBuffer(
mHandler,
XMRB_R1_FAST_LINE,
barIndex,
mLoopbackBars,
fastR1Buffer);
//
// SLOW ...
ArraySetAsSeries(slowR1Buffer, true);
CopyBuffer(
mHandler,
XMRB_R1_SLOW_LINE,
barIndex,
mLoopbackBars,
slowR1Buffer);
//
// RIBBON 2 ...
//
// FAST ...
ArraySetAsSeries(fastR2Buffer, true);
CopyBuffer(
mHandler,
XMRB_R2_FAST_LINE,
barIndex,
mLoopbackBars,
fastR2Buffer);
//
// SLOW ...
ArraySetAsSeries(slowR2Buffer, true);
CopyBuffer(
mHandler,
XMRB_R2_SLOW_LINE,
barIndex,
mLoopbackBars,
slowR2Buffer);
//
// RIBBON 3 ...
//
// FAST ...
ArraySetAsSeries(fastR3Buffer, true);
CopyBuffer(
mHandler,
XMRB_R3_FAST_LINE,
barIndex,
mLoopbackBars,
fastR3Buffer);
//
// SLOW ...
ArraySetAsSeries(slowR3Buffer, true);
CopyBuffer(
mHandler,
XMRB_R3_SLOW_LINE,
barIndex,
mLoopbackBars,
slowR3Buffer);
//
// RIBBON 4 ...
//
// FAST ...
ArraySetAsSeries(fastR4Buffer, true);
CopyBuffer(
mHandler,
XMRB_R4_FAST_LINE,
barIndex,
mLoopbackBars,
fastR4Buffer);
//
// SLOW ...
ArraySetAsSeries(slowR4Buffer, true);
CopyBuffer(
mHandler,
XMRB_R4_SLOW_LINE,
barIndex,
mLoopbackBars,
slowR4Buffer);
//
// RIBBON 5 ...
//
// FAST ...
ArraySetAsSeries(fastR5Buffer, true);
CopyBuffer(
mHandler,
XMRB_R5_FAST_LINE,
barIndex,
mLoopbackBars,
fastR5Buffer);
//
// SLOW ...
ArraySetAsSeries(slowR5Buffer, true);
CopyBuffer(
mHandler,
XMRB_R5_SLOW_LINE,
barIndex,
mLoopbackBars,
slowR5Buffer);
}
//
// Retrieve Info at Specific Bar Index ...
XMRBInfo GetInfo(
int barIndex // Given Bar Index
)
{
//
XMRBInfo result;
//
if (barIndex < 0)
{
return result;
}
//
// Do Calculations ...
Calculate(barIndex);
//
barIndex--;
if (barIndex < 0) {
barIndex = 0;
}
//
// Generate Candle Time ...
datetime barTime = GetCandleTime(
mSymbol,
mPeriod,
barIndex);
//
// Fill Result ...
result.symbol = mSymbol;
result.period = mPeriod;
result.barTime = barTime;
result.barIndex = barIndex;
//
double fast = fastBuffer[barIndex];
double fastPrev = fastBuffer[barIndex + 1];
double slow = slowBuffer[barIndex];
double slowPrev = slowBuffer[barIndex + 1];
double fastR1 = fastR1Buffer[barIndex];
double fastR1Prev = fastR1Buffer[barIndex + 1];
double slowR1 = slowR1Buffer[barIndex];
double slowR1Prev = slowR1Buffer[barIndex + 1];
double fastR2 = fastR2Buffer[barIndex];
double fastR2Prev = fastR2Buffer[barIndex + 1];
double slowR2 = slowR2Buffer[barIndex];
double slowR2Prev = slowR2Buffer[barIndex + 1];
double fastR3 = fastR3Buffer[barIndex];
double fastR3Prev = fastR3Buffer[barIndex + 1];
double slowR3 = slowR3Buffer[barIndex];
double slowR3Prev = slowR3Buffer[barIndex + 1];
double fastR4 = fastR4Buffer[barIndex];
double fastR4Prev = fastR4Buffer[barIndex + 1];
double slowR4 = slowR4Buffer[barIndex];
double slowR4Prev = slowR4Buffer[barIndex + 1];
double fastR5 = fastR5Buffer[barIndex];
double fastR5Prev = fastR5Buffer[barIndex + 1];
double slowR5 = slowR5Buffer[barIndex];
double slowR5Prev = slowR5Buffer[barIndex + 1];
//
result.fast = fast;
result.slow = slow;
result.fastR1 = fastR1;
result.slowR1 = slowR1;
result.fastR2 = fastR2;
result.slowR2 = slowR2;
result.fastR3 = fastR3;
result.slowR3 = slowR3;
result.fastR4 = fastR4;
result.slowR4 = slowR4;
result.fastR5 = fastR5;
result.slowR5 = slowR5;
//
result.isFastOverSlow =
fast > slow;
result.isFastCrossedOverSlow =
fast > slow && fastPrev <= slowPrev;
result.isFastUnderSlow =
fast < slow;
result.isFastCrossedUnderSlow =
fast < slow && fastPrev >= slowPrev;
//
result.isR1FastOverSlow =
fastR1 > slowR1;
result.isR1FastCrossedOverSlow =
fastR1 > slowR1 && fastR1Prev <= slowR1Prev;
result.isR1FastUnderSlow =
fastR1 < slowR1;
result.isR1FastCrossedUnderSlow =
fastR1 < slowR1 && fastR1Prev >= slowR1Prev;
//
result.isR2FastOverSlow =
fastR2 > slowR2;
result.isR2FastCrossedOverSlow =
fastR2 > slowR2 && fastR2Prev <= slowR2Prev;
result.isR2FastUnderSlow =
fastR2 < slowR2;
result.isR2FastCrossedUnderSlow =
fastR2 < slowR2 && fastR2Prev >= slowR2Prev;
//
result.isR3FastOverSlow =
fastR3 > slowR3;
result.isR3FastCrossedOverSlow =
fastR3 > slowR3 && fastR3Prev <= slowR3Prev;
result.isR3FastUnderSlow =
fastR3 < slowR3;
result.isR3FastCrossedUnderSlow =
fastR3 < slowR3 && fastR3Prev >= slowR3Prev;
//
result.isR4FastOverSlow =
fastR4 > slowR4;
result.isR4FastCrossedOverSlow =
fastR4 > slowR4 && fastR4Prev <= slowR4Prev;
result.isR4FastUnderSlow =
fastR4 < slowR4;
result.isR4FastCrossedUnderSlow =
fastR4 < slowR4 && fastR4Prev >= slowR4Prev;
//
result.isR5FastOverSlow =
fastR5 > slowR5;
result.isR5FastCrossedOverSlow =
fastR5 > slowR5 && fastR5Prev <= slowR5Prev;
result.isR5FastUnderSlow =
fastR5 < slowR5;
result.isR5FastCrossedUnderSlow =
fastR5 < slowR5 && fastR5Prev >= slowR5Prev;
//
return result;
}
//
// END Provided Functions ...
//
//
// Protected ...
protected:
//
// Private ...
private:
//
// Indicator Properties ...
//
// Market ...
//
// Ribbon 1 ...
int mFast1Length;
int mSlow1Length;
//
// Ribbon 2 ...
int mFast2Length;
int mSlow2Length;
//
// Ribbon 3 ...
int mFast3Length;
int mSlow3Length;
//
// Ribbon 4 ...
int mFast4Length;
int mSlow4Length;
//
// Ribbon 5 ...
int mFast5Length;
int mSlow5Length;
//
// Calculation ...
//
// Mode ...
ENUM_MA_METHOD mRibbonMode;
//
// Applied To ...
ENUM_APPLIED_PRICE mRibbonAppliedTo;
//
// Presentation ...
//
// Show Fast ...
bool mShowFastMa;
//
// Show Slow ...
bool mShowSlowMa;
//
// Show Ribbon ...
bool mShowRibbon;
};
//
// START Usefull Functions ...
//
//
// END Usefull Functions ...
//