update workspace ...

This commit is contained in:
2024-05-17 04:54:01 +03:30
parent 3fa288c92c
commit 642713072e
429 changed files with 111729 additions and 9330 deletions
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -1,443 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCX121EA
// Description: an Expert Class which
// used X121 Setup ...
//
//
// 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 ...
//
//
// END Definitions ...
//
//
// START Import and Inclused requirements ...
//
//
// Includes ...
#include "../Classes/x-saherelm.xea.class.mq5"
#include "../Libraries/x-saherelm.x121.draw.lib.mq5"
#include "../Classes/x-saherelm.x121.provider.class.mq5"
//
// END Import and Inclused requirements ...
//
//
// START Overrides ...
//
//
// END Overrides ...
//
//
// an Expert Advisor Class by X121Provider ...
class XSCX121EA : public XSCBaseEA
{
//
// Public ...
public:
//
// Props ...
XSCX121Provider *mProvider;
//
// Constructor ...
void XSCX121EA(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period, // Trading Time Frame
ulong magic, // Magic Number
int slippage, // Slippgae
OnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler
OnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler
OnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler
OnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler
OnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler
OnTradeStateChanged onTradeStateChangedHandler = NULL, // On Trade State Changed Event Handler
TOnSignalConditions onSignalConditions = NULL // On SignalConditions Event Handler
) : XSCBaseEA(symbol,
period,
magic,
slippage,
onStopLossTriggered,
onTakeProfitTriggered,
onDealsChangedHandler,
onOrdersChangedHandler,
onPositionsChangedHandler,
onTradeStateChangedHandler)
{
//
mOnSignalConditions = onSignalConditions;
//
InitProvider();
}
//
// DeConstructor ...
void ~XSCX121EA()
{
delete mProvider;
}
//
// START Inheritance Functions ...
//
//
void PrepareTag()
{
mTag = "X121EA:" + mSymbol + "," + ToString(mPeriod) + (string)mMagic;
}
//
bool CheckGuard(XGuard &guards[])
{
return mProvider.GuardCheck(guards);
}
//
bool SignalCheck(XSignal &signals[])
{
//
// Detect Pivot Points ...
int foundedPivots = mProvider.CountPivots();
int reuiredPivots = mProvider.GetMinPivots();
if (foundedPivots < reuiredPivots)
{
//
mProvider.ProccessPivotPoints();
//
LogMessage("Founding Pivots: " + ToString(foundedPivots) + "/" + ToString(reuiredPivots));
return false;
}
//
X121MarketConditions conditions;
bool result = mProvider.ProcessTick(conditions);
//
if (result)
{
//
// TODO: Here we Do all Signal Preparations such as TP/SL Calculations
// or Support and Resistance usage or Volume Calculations ...
// then pass prepared Signal to Execution ...
//
ulong mTicket = MathRand() * 100000;
//
DrawSignal(
mTicket,
conditions.signal);
//
DrawSupportResistance(
0,
conditions.supportResistances,
conditions.signal.providers[0]);
//
// IGNORE SIGNAL EXECUTTION ...
return false;
//
Add(
conditions.signal,
signals);
}
//
return result;
}
//
// END Inheritance Functions ...
//
//
// START Provided Actions ...
//
//
// END Provided Actions ...
//
//
// Protected ...
protected:
//
// Private ...
private:
//
// Props ...
X121ProviderInputs mProviderConfig;
TOnSignalConditions mOnSignalConditions;
//
// Actions ...
//
// Prepare Default Configurations for X121Provider Setup ...
void PrepareProviderConfig()
{
//
// XCT ...
// Candle Timing ...
mProviderConfig.xctConfig.clr = clrBlueViolet;
mProviderConfig.xctConfig.corner = CORNER_RIGHT_UPPER;
mProviderConfig.xctConfig.showCandleTime = true;
//
// XCC ...
// Candle Styling ...
mProviderConfig.xccConfig.upColor = clrLime;
mProviderConfig.xccConfig.downColor = clrRed;
mProviderConfig.xccConfig.lineColor = clrLime;
mProviderConfig.xccConfig.bearishColor = clrRed;
mProviderConfig.xccConfig.bullishColor = clrLime;
mProviderConfig.xccConfig.volumesColor = clrGreen;
mProviderConfig.xccConfig.showCandles = true;
//
// XHK ...
// HikenAshi Candle Representing ...
mProviderConfig.xhkConfig.drawCandleLines = false;
//
// XTM ...
// Trend Magic ...
mProviderConfig.xtmConfig.length = 35;
mProviderConfig.xtmConfig.shift = 0;
mProviderConfig.xtmConfig.method = MODE_SMA;
mProviderConfig.xtmConfig.appliedTo = PRICE_LOW;
mProviderConfig.xtmConfig.showLine = false;
//
// XPV ...
// Peaks And Vales ...
mProviderConfig.xpvConfig.shortLength = 9;
mProviderConfig.xpvConfig.mediumLength = 17;
mProviderConfig.xpvConfig.longLength = 26;
mProviderConfig.xpvConfig.hindLength = 35;
mProviderConfig.xpvConfig.fiboLevel1 = 0.382;
mProviderConfig.xpvConfig.fiboLevel2 = 0.5;
mProviderConfig.xpvConfig.fiboLevel3 = 0.618;
mProviderConfig.xpvConfig.hhMode = MODE_HIGH;
mProviderConfig.xpvConfig.llMode = MODE_LOW;
mProviderConfig.xpvConfig.showPeaksAndVales = false;
mProviderConfig.xpvConfig.showLevels = false;
mProviderConfig.xpvConfig.showFibo1Levels = false;
mProviderConfig.xpvConfig.showFibo2Levels = false;
mProviderConfig.xpvConfig.showFibo3Levels = false;
//
// XAMA ...
// Adaptive Moving Average ...
mProviderConfig.xamaConfig.length = 52;
mProviderConfig.xamaConfig.fastEMA = 2;
mProviderConfig.xamaConfig.slowEMA = 30;
mProviderConfig.xamaConfig.maShift = 0;
mProviderConfig.xamaConfig.appliedTo = PRICE_LOW;
mProviderConfig.xamaConfig.showLine = false;
//
// XMRB ...
// Moving Average Ribbon ...
mProviderConfig.xmrbConfig.fast1Length = 3;
mProviderConfig.xmrbConfig.slow1Length = 5;
mProviderConfig.xmrbConfig.fast2Length = 8;
mProviderConfig.xmrbConfig.slow2Length = 13;
mProviderConfig.xmrbConfig.fast3Length = 21;
mProviderConfig.xmrbConfig.slow3Length = 34;
mProviderConfig.xmrbConfig.fast4Length = 55;
mProviderConfig.xmrbConfig.slow4Length = 89;
mProviderConfig.xmrbConfig.fast5Length = 144;
mProviderConfig.xmrbConfig.slow5Length = 233;
mProviderConfig.xmrbConfig.ribbonMode = MODE_EMA;
mProviderConfig.xmrbConfig.ribbonAppliedTo = PRICE_CLOSE;
mProviderConfig.xmrbConfig.showFastMa = false;
mProviderConfig.xmrbConfig.showSlowMa = false;
mProviderConfig.xmrbConfig.showRibbon = false;
//
// XCHE ...
// Chandelier Exit Points ...
mProviderConfig.xcheConfig.length = 35;
mProviderConfig.xcheConfig.loopback = 26;
mProviderConfig.xcheConfig.multiplier1 = 3;
mProviderConfig.xcheConfig.multiplier2 = 3.5;
mProviderConfig.xcheConfig.upAppliedTo = PRICE_HIGH;
mProviderConfig.xcheConfig.downAppliedTo = PRICE_LOW;
mProviderConfig.xcheConfig.showLongExit1Line = false;
mProviderConfig.xcheConfig.showShortExit1Line = false;
mProviderConfig.xcheConfig.showLongExit2Line = false;
mProviderConfig.xcheConfig.showShortExit2Line = false;
//
// XICH ...
// Ichimopku Kinko Hyo ...
mProviderConfig.xichConfig.tenkanSenLength = 9;
mProviderConfig.xichConfig.tenkanSenMode = X_XICH_HH_LL_MODE;
mProviderConfig.xichConfig.kijunSenLength = 26;
mProviderConfig.xichConfig.kijunSenMode = X_XICH_HH_LL_MODE;
mProviderConfig.xichConfig.senkouSpanBLength = 52;
mProviderConfig.xichConfig.senkouSpanBMode = X_XICH_HH_LL_MODE;
mProviderConfig.xichConfig.chikuoSpanAppliedTo = PRICE_CLOSE;
mProviderConfig.xichConfig.showTenkanSen = false;
mProviderConfig.xichConfig.showKijunSen = false;
mProviderConfig.xichConfig.showKijunSenPlus = false;
mProviderConfig.xichConfig.showKijunSenNegative = false;
mProviderConfig.xichConfig.showChikouSpan = false;
mProviderConfig.xichConfig.showSenkouSpanA = false;
mProviderConfig.xichConfig.showSenkouSpanB = false;
mProviderConfig.xichConfig.showKumo = false;
mProviderConfig.xichConfig.shiftKumo = true;
//
// XTRND ...
// Trend Detector ...
mProviderConfig.xtrndConfig.cycleLength = 2;
mProviderConfig.xtrndConfig.numberOfVerifications = 2;
mProviderConfig.xtrndConfig.hhMode = MODE_HIGH;
mProviderConfig.xtrndConfig.llMode = MODE_LOW;
mProviderConfig.xtrndConfig.l1Method = X_PERIOD_AUTO;
mProviderConfig.xtrndConfig.l1Period = NULL;
mProviderConfig.xtrndConfig.l2Method = X_PERIOD_AUTO;
mProviderConfig.xtrndConfig.l2Period = NULL;
mProviderConfig.xtrndConfig.l3Method = X_PERIOD_AUTO;
mProviderConfig.xtrndConfig.l3Period = NULL;
mProviderConfig.xtrndConfig.showConsolidations = false;
mProviderConfig.xtrndConfig.showTrend = false;
mProviderConfig.xtrndConfig.showL1Trend = false;
mProviderConfig.xtrndConfig.showL2Trend = false;
mProviderConfig.xtrndConfig.showL3Trend = false;
//
// XSSLC ...
// SSL Channel ...
mProviderConfig.xsslcConfig.length = 36;
mProviderConfig.xsslcConfig.method = MODE_SMA;
mProviderConfig.xsslcConfig.upAppliedTo = PRICE_HIGH;
mProviderConfig.xsslcConfig.downAppliedTo = PRICE_LOW;
mProviderConfig.xsslcConfig.showUp = false;
mProviderConfig.xsslcConfig.showDown = false;
//
// XHULL ...
// Hull Trend Detection Channel ...
mProviderConfig.xhullConfig.length = 72;
mProviderConfig.xhullConfig.divisor = 2;
mProviderConfig.xhullConfig.upAppliedTo = PRICE_HIGH;
mProviderConfig.xhullConfig.downAppliedTo = PRICE_LOW;
mProviderConfig.xhullConfig.showUpZone = false;
mProviderConfig.xhullConfig.showDownZone = false;
//
// Default Configs For Different States ...
bool showPV = true;
bool showHK = true;
bool showCHE = true;
bool showTRND = true;
bool simpleIchi = true;
//
if (showHK)
{
//
// Hiken Ashi ...
mProviderConfig.xccConfig.showCandles = false;
mProviderConfig.xhkConfig.drawCandles = true;
}
if (showPV)
{
//
// Peaks and Vales ...
mProviderConfig.xpvConfig.showFibo1Levels = true;
mProviderConfig.xpvConfig.showFibo2Levels = true;
mProviderConfig.xpvConfig.showFibo3Levels = true;
mProviderConfig.xpvConfig.showPeaksAndVales = true;
}
if (simpleIchi)
{
//
// Simple Ichimoku Kinko Hyo ...
mProviderConfig.xichConfig.showKijunSen = true;
mProviderConfig.xichConfig.showTenkanSen = true;
mProviderConfig.xichConfig.showSenkouSpanA = true;
mProviderConfig.xichConfig.showSenkouSpanB = true;
}
if (showCHE)
{
//
// Chandelier Exit ...
mProviderConfig.xcheConfig.showLongExit1Line = true;
mProviderConfig.xcheConfig.showLongExit2Line = true;
mProviderConfig.xcheConfig.showShortExit1Line = true;
mProviderConfig.xcheConfig.showShortExit2Line = true;
}
if (showTRND)
{
//
// Show Trend ...
mProviderConfig.xtrndConfig.showL1Trend = true;
mProviderConfig.xtrndConfig.showL2Trend = true;
mProviderConfig.xtrndConfig.showL3Trend = true;
}
}
//
// Initialize X121Provider ...
void InitProvider()
{
//
PrepareProviderConfig();
//
mProvider = new XSCX121Provider(
mSymbol,
mPeriod);
//
if (mOnSignalConditions != NULL)
{
//
// Attach Event Handlers ...
mProvider.AddOnSignalConditionEventHandler(mOnSignalConditions);
}
//
// Initialize Provider ...
mProvider.SetConfig(mProviderConfig);
}
};
//
// START Usefull Functions ...
//
//
// END Usefull Functions ...
//
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,444 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCDataCollector
// Description: provides Data Collection 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 "../Libraries/x-saherelm.common.lib.mq5"
//
template <typename T>
class XSCDataCollector
{
//
// Public ...
public:
//
// Props ...
//
// Constructors ...
void XSCDataCollector(
string path = NULL, // Base Folder for Data Store
string fileName = NULL // File Name for Data Store
)
{
//
if (!IsValid(path))
{
path = GetType();
}
//
if (!IsValid(fileName))
{
fileName = GetType() + ".txt";
}
//
Path(path);
FileName(fileName);
}
//
// Deconstructor ...
void ~XSCDataCollector() {}
//
// Properties ...
//
bool Path(string value)
{
//
bool result = false;
//
result = IsValid(value);
if (!result)
{
return result;
}
//
result = value != mPath;
if (!result)
{
return result;
}
//
mPath = value;
//
return result;
}
//
string Path()
{
return mPath;
}
//
bool FileName(string value)
{
//
bool result = false;
//
result = IsValid(value);
if (!result)
{
return result;
}
//
result = value != mFileName;
if (!result)
{
return result;
}
//
mFileName = value;
//
return result;
}
//
string FileName()
{
return mFileName;
}
//
// Tools ...
//
// Clear Exists Collected Data ...
void Clear()
{
//
ResetLastError();
//
string dataStorePath = GetStorePath();
//
// Check Data Store Exists or not ...
bool isExists = FileIsExist(dataStorePath);
if (!isExists)
{
return;
}
//
FileDelete(dataStorePath);
}
//
// Collect All Stored Items ...
int Collect(
T &items[] // Hold Result
)
{
//
int result = 0;
//
Clean(items);
//
// Reading Store Whole Content ...
//
string storePath = GetStorePath();
int mFileHandler = FileOpen(
storePath,
FILE_READ | FILE_TXT);
result = mFileHandler != INVALID_HANDLE;
if (!result)
{
return result;
}
//
// Parse Store Content and Read Data ...
while (!FileIsEnding(mFileHandler))
{
//
// Each Line Represent One Model ...
string content = FileReadString(mFileHandler);
//
T iItem;
bool isValid = iItem.Parse(content);
if (isValid)
{
//
AddRef(
iItem,
items
//
);
}
}
//
// Close File ...
FileClose(mFileHandler);
//
result = ArraySize(items);
//
return result;
}
//
// Add Item ...
bool Add(
T &item // Item to Store
)
{
//
bool result = false;
//
result = item.IsValid();
if (!result)
{
return result;
}
//
string content = item.ToString();
result = IsValid(content);
if (!result)
{
return result;
}
//
string storePath = GetStorePath();
int mFileHandler = FileOpen(
storePath,
FILE_READ | FILE_WRITE | FILE_TXT);
result = mFileHandler != INVALID_HANDLE;
if (!result)
{
return result;
}
//
FileSeek(mFileHandler, 0, SEEK_END);
FileWrite(mFileHandler, content);
FileFlush(mFileHandler);
FileClose(mFileHandler);
//
return result;
}
//
// Add Items ...
int Add(
T &items[] // Items to Add ...
)
{
//
int result = 0;
//
int itemsCount = ArraySize(items);
if (itemsCount <= 0)
{
return result;
}
//
for (int i = 0; i < itemsCount; i++)
{
//
T iItem = items[i];
//
if (!iItem.IsValid())
{
continue;
}
//
bool isAdded = Add(iItem);
if (isAdded)
{
result++;
}
}
//
return result;
}
//
// Remove Item ...
bool Remove(
T &item // Item to Remove
)
{
//
bool result = false;
//
result = item.IsValid();
if (!result)
{
return result;
}
//
T items[];
int itemsCount = Collect(items);
if (itemsCount <= 0)
{
return result;
}
//
int itemIndex = item.FindIndex(items);
result = ArrayRemove(
items,
itemIndex,
1);
if (!result)
{
return result;
}
//
Clear();
//
int itemsAdded = Add(items);
//
result = itemsAdded == ArraySize(items);
//
return result;
}
//
// Protected ...
protected:
//
// Tools ...
//
// Retrieve Type of Class as String ...
string GetType()
{
//
string mType = (string) typename(T);
//
string result = mType;
//
string parts[];
int partsCount = SplitContent(
parts,
result,
" "
//
);
if (partsCount <= 0)
{
//
result = mType;
return result;
}
//
bool hasLastPart = GetLastItem(
result,
parts
//
);
if (!hasLastPart)
{
//
result = mType;
return result;
}
//
return result;
}
//
// Pricate ...
private:
//
// Props ...
//
string mPath; // Path
string mFileName; // Data Store File Name
//
// Tools ...
//
// Generate Full File Path ...
string GetFilePath(string fileName)
{
//
string result = "";
//
result =
//
Path() + "\\" + fileName
//
;
//
return result;
}
//
// Retrieve Data Store File Address ...
string GetStorePath()
{
//
string result = NULL;
//
result = GetFilePath(mFileName);
//
return result;
}
};
//
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -20,33 +20,12 @@
#property version "1.00"
#property strict
//
// START Definitions ...
//
//
// END Definitions ...
//
//
// START Import and Inclused requirements ...
//
//
// Includes ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// END Import and Inclused requirements ...
//
//
// START Overrides ...
//
//
// END Overrides ...
//
// Definitions ...
//
// a Class for Handle base requirements ...
@@ -59,40 +38,25 @@ public:
//
// Constructor ...
void XSCBaseHelper(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period // Trading Time Frame
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period // Trading Time Frame
)
{
//
mSymbol = symbol;
mPeriod = period;
//
LoopBack(52);
}
//
// Deconstructor ...
void ~XSCBaseHelper()
{
//
IndicatorRelease(mHandler);
}
//
// START Properties ...
//
//
// Loopback Bars ...
void LoopBack(int value)
{
mLoopbackBars = value;
}
int Loopback()
{
return mLoopbackBars;
}
// Setter(s) / Getter(s) ...
//
// Symbol ...
@@ -108,16 +72,9 @@ public:
return mPeriod;
}
//
// Tag ...
string GetTag()
{
return mTag;
}
//
// Retrieve Bars ...
int GetBars()
int CountBars()
{
//
int result =
@@ -130,49 +87,19 @@ public:
}
//
int GetCalculatedBars()
int CountCalculatedBars()
{
return BarsCalculated(mHandler);
}
//
// END Properties ...
//
//
// START Provided Functions ...
//
//
// Prepare Tag ...
virtual void PrepareTag() {}
//
// Reading Buffers based on Given Bar Index ...
virtual void Calculate(
int barIndex // Given Bar Index
);
//
// Retrieve MAx Required Length for Calculations ...
virtual int GetMaxLength();
//
// END Provided Functions ...
//
// Functions ...
//
// Protected ...
protected:
//
string GetTagPrefix()
{
//
string result = "(" + mSymbol + ")(" + ToString(mPeriod) + ")";
//
return result;
}
// Props ...
//
// Symbol ...
@@ -186,14 +113,6 @@ protected:
// Indicator Handler ...
int mHandler;
//
// Number Of Items Read Per Tick ...
int mLoopbackBars;
//
// Tag Identifier ...
string mTag;
//
// Private ...
private:
@@ -201,9 +120,4 @@ private:
};
//
// START Usefull Functions ...
//
//
// END Usefull Functions ...
//
// Tools ....
Binary file not shown.
@@ -0,0 +1,441 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCMD5
// Description: Provides MD5 Hashing 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 ...
//
//
static uchar _md5_PADDING[64] =
{
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//
#define _md5_F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define _md5_G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define _md5_H(x, y, z) ((x) ^ (y) ^ (z))
#define _md5_I(x, y, z) ((y) ^ ((x) | (~z)))
#define _md5_ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
//
#define _md5_FF(a, b, c, d, x, s, ac) \
{ \
(a) += _md5_F((b), (c), (d)) + (x) + (uint)(ac); \
(a) = _md5_ROTATE_LEFT((a), (s)); \
(a) += (b); \
}
//
#define _md5_GG(a, b, c, d, x, s, ac) \
{ \
(a) += _md5_G((b), (c), (d)) + (x) + (uint)(ac); \
(a) = _md5_ROTATE_LEFT((a), (s)); \
(a) += (b); \
}
//
#define _md5_HH(a, b, c, d, x, s, ac) \
{ \
(a) += _md5_H((b), (c), (d)) + (x) + (uint)(ac); \
(a) = _md5_ROTATE_LEFT((a), (s)); \
(a) += (b); \
}
//
#define _md5_II(a, b, c, d, x, s, ac) \
{ \
(a) += _md5_I((b), (c), (d)) + (x) + (uint)(ac); \
(a) = _md5_ROTATE_LEFT((a), (s)); \
(a) += (b); \
}
//
#define _md5_INIT_STATE_0 0x67452301
#define _md5_INIT_STATE_1 0xefcdab89
#define _md5_INIT_STATE_2 0x98badcfe
#define _md5_INIT_STATE_3 0x10325476
//
#define _md5_S11 7
#define _md5_S12 12
#define _md5_S13 17
#define _md5_S14 22
//
#define _md5_S21 5
#define _md5_S22 9
#define _md5_S23 14
#define _md5_S24 20
//
#define _md5_S31 4
#define _md5_S32 11
#define _md5_S33 16
#define _md5_S34 23
//
#define _md5_S41 6
#define _md5_S42 10
#define _md5_S43 15
#define _md5_S44 21
//
// END Definitions ...
//
//
// XCMD5 a library for Hashing ...
class XSCMD5
{
//
// Public Provides ...
public:
//
// Protected Provides ...
//
// Constructor ...
XSCMD5(void) {}
//
// Deconstructor ...
~XSCMD5(void) {}
//
// Hash Specified Char Array ...
string Hash(
uchar &mSource[], // Specify Char Array to Hash
int mLength = 0 // Specify Length of Char Array which required to hash
)
{
//
string result = "";
//
int sourceCount = ArraySize(mSource);
//
// Validate Args ...
if (
sourceCount <= 0 ||
(sourceCount > 0 && mLength > sourceCount))
{
return result;
}
//
// Normalize Args ...
if (mLength == 0)
{
mLength = sourceCount;
}
//
// Init MD5 ...
MD5Init();
//
// Update Buffer ...
MD5Update(mSource, mLength);
//
// Calculate Result ...
result = MD5Final();
//
return result;
}
//
// Hash Specified String ...
string Hash(
string mSource // Specified String
)
{
//
string result = "";
//
// Converts String to Char Array ...
uchar bytes[];
StringToCharArray(
mSource,
bytes,
0,
StringLen(mSource));
//
result = Hash(
bytes,
ArraySize(bytes));
//
return result;
}
protected:
//
// Private Provides ...
private:
//
uint m_lMD5[4];
uint m_nCount[2];
uchar m_lpszBuffer[64];
//
// Convert Byte to DWord ...
void ByteToDWord(int &out[], uint &in[], uint len)
{
//
uint i = 0;
uint j = 0;
//
for (; j < len; i++, j += 4)
{
out[i] = (int)in[j] | (int)in[j + 1] << 8 | (int)in[j + 2] << 16 | (int)in[j + 3] << 24;
}
}
//
// Convert DWord to Byte ...
void DWordToByte(uchar &out[], int &in[], uint len)
{
//
uint i = 0;
uint j = 0;
//
for (; j < len; i++, j += 4)
{
//
out[j] = (uchar)(in[i] & 0xff);
out[j + 1] = (uchar)((in[i] >> 8) & 0xff);
out[j + 2] = (uchar)((in[i] >> 16) & 0xff);
out[j + 3] = (uchar)((in[i] >> 24) & 0xff);
}
}
//
// Init MD5 Array ...
void MD5Init()
{
//
ArrayInitialize(m_lpszBuffer, 64);
//
m_nCount[0] = m_nCount[1] = 0;
m_lMD5[0] = _md5_INIT_STATE_0;
m_lMD5[1] = _md5_INIT_STATE_1;
m_lMD5[2] = _md5_INIT_STATE_2;
m_lMD5[3] = _md5_INIT_STATE_3;
}
//
// Update MD5 ...
void MD5Update(uchar &inBuf[], uint inLen)
{
//
int i, ii;
int mdi;
//
uint in[16];
int i0 = 0;
//
mdi = (int)((m_nCount[0] >> 3) & 0x3F);
//
if ((m_nCount[0] + ((uint)inLen << 3)) < m_nCount[0])
{
m_nCount[1]++;
}
//
m_nCount[0] += ((uint)inLen << 3);
m_nCount[1] += ((uint)inLen >> 29);
//
while ((inLen--) > 0)
{
//
m_lpszBuffer[mdi++] = inBuf[i0++];
if (mdi == 0x40)
{
//
for (i = 0, ii = 0; i < 16; i++, ii += 4)
{
in[i] = (((uint)m_lpszBuffer[ii + 3]) << 24) | (((uint)m_lpszBuffer[ii + 2]) << 16) | (((uint)m_lpszBuffer[ii + 1]) << 8) | ((uint)m_lpszBuffer[ii]);
}
//
Transform(m_lMD5, in);
//
mdi = 0;
}
}
}
//
// Finalize an MD5 Expression ...
string MD5Final()
{
//
uchar bits[8];
int nIndex;
uint nPadLen;
const int nMD5Size = 16;
uchar lpszMD5[16];
string temp;
string out = "";
int i;
//
DWordToByte(bits, m_nCount, 8);
nIndex = (int)((m_nCount[0] >> 3) & 0x3f);
nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);
MD5Update(_md5_PADDING, nPadLen);
MD5Update(bits, 8);
DWordToByte(lpszMD5, m_lMD5, nMD5Size);
//
for (i = 0; i < nMD5Size; i++)
{
//
if (lpszMD5[i] == 0)
{
temp = "00";
}
else if (lpszMD5[i] <= 15)
{
temp = StringFormat("0%x", lpszMD5[i]);
}
else
{
temp = StringFormat("%x", lpszMD5[i]);
}
//
out += temp;
}
//
lpszMD5[0] = '\0';
//
return (out);
}
//
// Transform Buffers ...
void Transform(uint &buf[], uint &in[])
{
//
uint a = buf[0], b = buf[1], c = buf[2], d = buf[3];
//
_md5_FF(a, b, c, d, in[0], _md5_S11, 0xD76AA478);
_md5_FF(d, a, b, c, in[1], _md5_S12, 0xE8C7B756);
_md5_FF(c, d, a, b, in[2], _md5_S13, 0x242070DB);
_md5_FF(b, c, d, a, in[3], _md5_S14, 0xC1BDCEEE);
_md5_FF(a, b, c, d, in[4], _md5_S11, 0xF57C0FAF);
_md5_FF(d, a, b, c, in[5], _md5_S12, 0x4787C62A);
_md5_FF(c, d, a, b, in[6], _md5_S13, 0xA8304613);
_md5_FF(b, c, d, a, in[7], _md5_S14, 0xFD469501);
_md5_FF(a, b, c, d, in[8], _md5_S11, 0x698098D8);
_md5_FF(d, a, b, c, in[9], _md5_S12, 0x8B44F7AF);
_md5_FF(c, d, a, b, in[10], _md5_S13, 0xFFFF5BB1);
_md5_FF(b, c, d, a, in[11], _md5_S14, 0x895CD7BE);
_md5_FF(a, b, c, d, in[12], _md5_S11, 0x6B901122);
_md5_FF(d, a, b, c, in[13], _md5_S12, 0xFD987193);
_md5_FF(c, d, a, b, in[14], _md5_S13, 0xA679438E);
_md5_FF(b, c, d, a, in[15], _md5_S14, 0x49B40821);
//
_md5_GG(a, b, c, d, in[1], _md5_S21, 0xF61E2562);
_md5_GG(d, a, b, c, in[6], _md5_S22, 0xC040B340);
_md5_GG(c, d, a, b, in[11], _md5_S23, 0x265E5A51);
_md5_GG(b, c, d, a, in[0], _md5_S24, 0xE9B6C7AA);
_md5_GG(a, b, c, d, in[5], _md5_S21, 0xD62F105D);
_md5_GG(d, a, b, c, in[10], _md5_S22, 0x02441453);
_md5_GG(c, d, a, b, in[15], _md5_S23, 0xD8A1E681);
_md5_GG(b, c, d, a, in[4], _md5_S24, 0xE7D3FBC8);
_md5_GG(a, b, c, d, in[9], _md5_S21, 0x21E1CDE6);
_md5_GG(d, a, b, c, in[14], _md5_S22, 0xC33707D6);
_md5_GG(c, d, a, b, in[3], _md5_S23, 0xF4D50D87);
_md5_GG(b, c, d, a, in[8], _md5_S24, 0x455A14ED);
_md5_GG(a, b, c, d, in[13], _md5_S21, 0xA9E3E905);
_md5_GG(d, a, b, c, in[2], _md5_S22, 0xFCEFA3F8);
_md5_GG(c, d, a, b, in[7], _md5_S23, 0x676F02D9);
_md5_GG(b, c, d, a, in[12], _md5_S24, 0x8D2A4C8A);
//
_md5_HH(a, b, c, d, in[5], _md5_S31, 0xFFFA3942);
_md5_HH(d, a, b, c, in[8], _md5_S32, 0x8771F681);
_md5_HH(c, d, a, b, in[11], _md5_S33, 0x6D9D6122);
_md5_HH(b, c, d, a, in[14], _md5_S34, 0xFDE5380C);
_md5_HH(a, b, c, d, in[1], _md5_S31, 0xA4BEEA44);
_md5_HH(d, a, b, c, in[4], _md5_S32, 0x4BDECFA9);
_md5_HH(c, d, a, b, in[7], _md5_S33, 0xF6BB4B60);
_md5_HH(b, c, d, a, in[10], _md5_S34, 0xBEBFBC70);
_md5_HH(a, b, c, d, in[13], _md5_S31, 0x289B7EC6);
_md5_HH(d, a, b, c, in[0], _md5_S32, 0xEAA127FA);
_md5_HH(c, d, a, b, in[3], _md5_S33, 0xD4EF3085);
_md5_HH(b, c, d, a, in[6], _md5_S34, 0x04881D05);
_md5_HH(a, b, c, d, in[9], _md5_S31, 0xD9D4D039);
_md5_HH(d, a, b, c, in[12], _md5_S32, 0xE6DB99E5);
_md5_HH(c, d, a, b, in[15], _md5_S33, 0x1FA27CF8);
_md5_HH(b, c, d, a, in[2], _md5_S34, 0xC4AC5665);
//
_md5_II(a, b, c, d, in[0], _md5_S41, 0xF4292244);
_md5_II(d, a, b, c, in[7], _md5_S42, 0x432AFF97);
_md5_II(c, d, a, b, in[14], _md5_S43, 0xAB9423A7);
_md5_II(b, c, d, a, in[5], _md5_S44, 0xFC93A039);
_md5_II(a, b, c, d, in[12], _md5_S41, 0x655B59C3);
_md5_II(d, a, b, c, in[3], _md5_S42, 0x8F0CCC92);
_md5_II(c, d, a, b, in[10], _md5_S43, 0xFFEFF47D);
_md5_II(b, c, d, a, in[1], _md5_S44, 0x85845DD1);
_md5_II(a, b, c, d, in[8], _md5_S41, 0x6FA87E4F);
_md5_II(d, a, b, c, in[15], _md5_S42, 0xFE2CE6E0);
_md5_II(c, d, a, b, in[6], _md5_S43, 0xA3014314);
_md5_II(b, c, d, a, in[13], _md5_S44, 0x4E0811A1);
_md5_II(a, b, c, d, in[4], _md5_S41, 0xF7537E82);
_md5_II(d, a, b, c, in[11], _md5_S42, 0xBD3AF235);
_md5_II(c, d, a, b, in[2], _md5_S43, 0x2AD7D2BB);
_md5_II(b, c, d, a, in[9], _md5_S44, 0xEB86D391);
//
buf[0] += a;
buf[1] += b;
buf[2] += c;
buf[3] += d;
}
};
@@ -1,295 +0,0 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCNotifier
// Description: provides all Base Notification 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 ...
//
//
// a Notification Model ...
typedef void (*OnMessage)(
string, // action ...
string // payload ...
);
//
struct XNotifierEventListener
{
string action;
OnMessage listeners[];
};
//
// END Definitions ...
//
//
// START Import and Inclused requirements ...
//
//
// Includes ...
#include "../Libraries/x-saherelm.models.lib.mq5"
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// END Import and Inclused requirements ...
//
//
// START Overrides ...
//
//
// END Overrides ...
//
//
// a Class for Handle base requirements ...
// for indicators ...
class XSCNotifier
{
//
// Public ...
public:
//
// Constructor ...
void XSCNotifier()
{
}
//
// Deconstructor ...
void ~XSCNotifier()
{
}
//
// START Properties ...
//
//
// END Properties ...
//
//
// START Provided Functions ...
//
bool AddEventListener(
string action, // Specific Action ...
OnMessage listener // Specific Listener ...
)
{
//
bool result = false;
//
int aIndex = FindActionIndex(action);
if (aIndex < 0)
{
//
// Create a New Structure ...
XNotifierEventListener model;
//
model.action = action;
//
Add(
listener,
model.listeners);
//
Add(
model,
mEventListeners);
//
result = true;
}
else
{
//
// Just Add Listener to Exists model ...
Add(
listener,
mEventListeners[aIndex].listeners);
//
result = true;
}
//
return result;
}
//
bool NotifyEvent(
string action, // action ...
string payload // payload ...
)
{
//
bool result = false;
//
int actionIndex = FindActionIndex(action);
result = actionIndex >= 0;
if (!result)
{
return result;
}
//
int aListenersCount = ArraySize(mEventListeners[actionIndex].listeners);
result = aListenersCount > 0;
if (!result)
{
return result;
}
//
for (int i = 0; i < aListenersCount; i++)
{
//
OnMessage iListener = mEventListeners[actionIndex].listeners[i];
//
// Call Listener ...
iListener(
action,
payload);
}
//
return result;
}
//
// END Provided Functions ...
//
//
// Protected ...
protected:
//
//
// Private ...
private:
//
XNotifierEventListener mEventListeners[];
//
// Find Specific Actions Index in Registered Event Listeners ...
int FindActionIndex(string action)
{
//
int result = -1;
//
int listenersCount = ArraySize(mEventListeners);
if (listenersCount <= 0)
{
return result;
}
//
for (int i = 0; i < listenersCount; i++)
{
//
XNotifierEventListener iModel = mEventListeners[i];
//
if (iModel.action == action)
{
//
result = i;
break;
}
}
//
return result;
}
};
//
// START Usefull Functions ...
//
//
void Clean(
OnMessage &buffer[] // Buffer ...
)
{
//
ArrayFree(buffer);
//
ArrayResize(
buffer,
0);
}
void Clean(
XNotifierEventListener &buffer[] // Buffer ...
)
{
//
ArrayFree(buffer);
//
ArrayResize(
buffer,
0);
}
//
void Add(
OnMessage item, // Item ...
OnMessage &buffer[] // Buffer ...
)
{
//
ArrayResize(
buffer,
ArraySize(buffer) + 1);
//
buffer[ArraySize(buffer) - 1] = item;
}
void Add(
XNotifierEventListener &item, // Item ...
XNotifierEventListener &buffer[] // Buffer ...
)
{
//
ArrayResize(
buffer,
ArraySize(buffer) + 1);
//
buffer[ArraySize(buffer) - 1] = item;
}
//
// END Usefull Functions ...
//
@@ -76,7 +76,8 @@ public:
}
void XSCEABaseProvider(
string symbol,
ENUM_TIMEFRAMES period)
ENUM_TIMEFRAMES period,
bool ignoreTicksAfterSignalTillNewCandle = true)
{
//
mSymbol = symbol;
@@ -87,6 +88,9 @@ public:
//
mIsInTestMode = IsRunningOnTestMode();
//
mIgnoreTicksAfterSignalTillNewCandle = ignoreTicksAfterSignalTillNewCandle;
}
//
@@ -96,15 +100,23 @@ public:
}
//
bool CanIgnoreTick() {
bool CanIgnoreTick()
{
//
mIsNewCandle = IsNewCandle(
mSymbol,
mPeriod);
bool result = mIsInTestMode
? !mIsNewCandle
: !mIsNewCandle && mWaitUntilNewCandle;
? !mIsNewCandle
: !mIsNewCandle && mWaitUntilNewCandle;
//
if (result)
{
//
result = mIgnoreTicksAfterSignalTillNewCandle;
}
//
return result;
}
@@ -240,6 +252,9 @@ private:
//
// Signal Event Handlers ...
OnSignal mSignalEventHandlers[];
//
bool mIgnoreTicksAfterSignalTillNewCandle;
};
//
Binary file not shown.
File diff suppressed because it is too large Load Diff