447 lines
7.9 KiB
Plaintext
447 lines
7.9 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Helper Class Library
|
|
// ----------------------------------------------
|
|
// Name: XSCXAMAHelper
|
|
// 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 XAMAInputs
|
|
{
|
|
//
|
|
// Makret ...
|
|
int length; // Length
|
|
int fastEMA; // Fast EMA Length
|
|
int slowEMA; // Slow EMA Length
|
|
int maShift; // Shift
|
|
ENUM_APPLIED_PRICE appliedTo; // Applied To
|
|
|
|
//
|
|
// Presentation ...
|
|
bool showLine; // Show Line
|
|
};
|
|
|
|
//
|
|
// Index of Lines ...
|
|
enum ENUM_XAMA_BUFFERS
|
|
{
|
|
//
|
|
// Main Requirements ...
|
|
XAMA_LINE = 0,
|
|
XAMA_STATE_LINE = 1,
|
|
};
|
|
|
|
//
|
|
// XAMA Indicator States ...
|
|
enum ENUM_XAMA_STATES
|
|
{
|
|
X_XAMA_BULLISH = 0,
|
|
X_XAMA_BEARISH = 2,
|
|
X_XAMA_NEUTURAL = 1,
|
|
};
|
|
|
|
//
|
|
// Retrieve Info Model ...
|
|
struct XAMAInfo
|
|
{
|
|
//
|
|
// Symbol ...
|
|
string symbol;
|
|
|
|
//
|
|
// Period ...
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
// Bar Time ...
|
|
datetime barTime;
|
|
|
|
//
|
|
// Bar Index ...
|
|
int barIndex;
|
|
|
|
//
|
|
// Values ...
|
|
double value;
|
|
|
|
//
|
|
double values[];
|
|
double states[];
|
|
|
|
//
|
|
// State ...
|
|
ENUM_XAMA_STATES state;
|
|
|
|
//
|
|
// Conditions ...
|
|
|
|
//
|
|
// Detect Trend is Bullish or not ...
|
|
bool isBullish;
|
|
|
|
//
|
|
// Detect Trend is Switched to Bullish Or not ...
|
|
bool isSwitchedBullish;
|
|
|
|
//
|
|
// Detect Trend is Bearish or not ...
|
|
bool isBearish;
|
|
|
|
//
|
|
// Detect Trend is Switched to Bearish Or not ...
|
|
bool isSwitchedBearish;
|
|
|
|
//
|
|
// Detect Trend is Neutural or not ...
|
|
bool isNeutural;
|
|
|
|
//
|
|
// Detect Trend is Switched to Neutural Or not ...
|
|
bool isSwitchedNeutural;
|
|
};
|
|
|
|
//
|
|
// 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 XSCXAMAHelper : public XSCBaseHelper
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Buffers ...
|
|
double valueBuffer[];
|
|
double stateBuffer[];
|
|
|
|
//
|
|
// Constructor ...
|
|
void XSCXAMAHelper(
|
|
string symbol, // Trading Symbol
|
|
ENUM_TIMEFRAMES period // Trading Time Frame
|
|
) : XSCBaseHelper(symbol, period)
|
|
{
|
|
PrepareTag();
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
void ~XSCXAMAHelper()
|
|
{
|
|
}
|
|
|
|
//
|
|
// START Properties ...
|
|
//
|
|
|
|
//
|
|
// END Properties ...
|
|
//
|
|
|
|
//
|
|
// START Provided Functions ...
|
|
//
|
|
|
|
//
|
|
// Prepare Tag ...
|
|
virtual void PrepareTag()
|
|
{
|
|
mTag = "XAMA" + GetTagPrefix();
|
|
}
|
|
|
|
//
|
|
virtual int GetMaxLength()
|
|
{
|
|
//
|
|
int result = -1;
|
|
|
|
//
|
|
result = mLength;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Initial Indicator Handler ...
|
|
bool Init()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Validate Args ...
|
|
result =
|
|
//
|
|
(mLength >= 2)
|
|
//
|
|
;
|
|
if (!result)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//
|
|
// Initialize Handler ...
|
|
mHandler = iCustom(
|
|
//
|
|
mSymbol,
|
|
mPeriod,
|
|
"x-saherelm.x121.xama",
|
|
//
|
|
// Inputs ...
|
|
//
|
|
// Makret ...
|
|
"",
|
|
//
|
|
// Length ...
|
|
mLength,
|
|
//
|
|
// Fast EMA Length ...
|
|
mFastEMA,
|
|
//
|
|
// Slow EMA Length ...
|
|
mSlowEMA,
|
|
//
|
|
// Shift ...
|
|
mMaShift,
|
|
//
|
|
// Applied To ...
|
|
mAppliedTo,
|
|
//
|
|
// Presentation ...
|
|
"",
|
|
//
|
|
// Show Line ...
|
|
mShowLine
|
|
//
|
|
);
|
|
result = mHandler != INVALID_HANDLE;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Retrieve Current Config ...
|
|
XAMAInputs GetConfig()
|
|
{
|
|
//
|
|
XAMAInputs result;
|
|
|
|
//
|
|
result.length = mLength;
|
|
result.fastEMA = mFastEMA;
|
|
result.slowEMA = mSlowEMA;
|
|
result.maShift = mMaShift;
|
|
result.appliedTo = mAppliedTo;
|
|
result.showLine = mShowLine;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Set Config ...
|
|
bool SetConfig(XAMAInputs &config)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
mLength = config.length;
|
|
mFastEMA = config.fastEMA;
|
|
mSlowEMA = config.slowEMA;
|
|
mMaShift = config.maShift;
|
|
mAppliedTo = config.appliedTo;
|
|
mShowLine = config.showLine;
|
|
|
|
//
|
|
result = Init();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Reading Buffers based on Given Bar Index ...
|
|
virtual void Calculate(
|
|
int barIndex // Given Bar Index
|
|
)
|
|
{
|
|
//
|
|
// VALUE ...
|
|
ArraySetAsSeries(valueBuffer, true);
|
|
CopyBuffer(
|
|
mHandler,
|
|
XAMA_LINE,
|
|
barIndex,
|
|
mLoopbackBars,
|
|
valueBuffer);
|
|
|
|
//
|
|
// STATE ...
|
|
ArraySetAsSeries(stateBuffer, true);
|
|
CopyBuffer(
|
|
mHandler,
|
|
XAMA_STATE_LINE,
|
|
barIndex,
|
|
mLoopbackBars,
|
|
stateBuffer);
|
|
}
|
|
|
|
//
|
|
// Retrieve Info at Specific Bar Index ...
|
|
XAMAInfo GetInfo(
|
|
int barIndex // Given Bar Index
|
|
)
|
|
{
|
|
//
|
|
XAMAInfo result;
|
|
|
|
//
|
|
if (barIndex < 0)
|
|
{
|
|
barIndex = 0;
|
|
}
|
|
|
|
//
|
|
// Do Calculations ...
|
|
Calculate(barIndex);
|
|
|
|
//
|
|
// Generate Candle Time ...
|
|
datetime barTime = GetCandleTime(
|
|
mSymbol,
|
|
mPeriod,
|
|
barIndex);
|
|
|
|
//
|
|
// Fill Result ...
|
|
result.symbol = mSymbol;
|
|
result.period = mPeriod;
|
|
result.barTime = barTime;
|
|
result.barIndex = barIndex;
|
|
|
|
//
|
|
result.value = valueBuffer[barIndex];
|
|
|
|
//
|
|
Copy(
|
|
valueBuffer,
|
|
result.values);
|
|
|
|
//
|
|
Copy(
|
|
stateBuffer,
|
|
result.states);
|
|
|
|
//
|
|
ENUM_XAMA_STATES state = (ENUM_XAMA_STATES)stateBuffer[barIndex];
|
|
ENUM_XAMA_STATES prevState = (ENUM_XAMA_STATES)stateBuffer[barIndex + 1];
|
|
result.state = state;
|
|
|
|
//
|
|
result.isBullish = state == X_XAMA_BULLISH;
|
|
result.isBearish = state == X_XAMA_BEARISH;
|
|
result.isNeutural = state == X_XAMA_NEUTURAL;
|
|
|
|
//
|
|
result.isSwitchedBullish =
|
|
state == X_XAMA_BULLISH && prevState != X_XAMA_BULLISH;
|
|
result.isSwitchedBearish =
|
|
state == X_XAMA_BEARISH && prevState != X_XAMA_BEARISH;
|
|
result.isSwitchedNeutural =
|
|
state == X_XAMA_NEUTURAL && prevState != X_XAMA_NEUTURAL;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// END Provided Functions ...
|
|
//
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
// Indicator Properties ...
|
|
//
|
|
// Market ...
|
|
//
|
|
// Length ...
|
|
int mLength;
|
|
//
|
|
// Fast EMA Length ...
|
|
int mFastEMA;
|
|
//
|
|
// Slow EMA Length ...
|
|
int mSlowEMA;
|
|
//
|
|
// Shift ...
|
|
int mMaShift;
|
|
//
|
|
// Applied To ...
|
|
ENUM_APPLIED_PRICE mAppliedTo;
|
|
//
|
|
// Presentation ...
|
|
//
|
|
// Show Line ...
|
|
bool mShowLine;
|
|
};
|
|
|
|
//
|
|
// START Usefull Functions ...
|
|
//
|
|
|
|
//
|
|
// END Usefull Functions ...
|
|
//
|