update workspace ...
This commit is contained in:
Binary file not shown.
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 ...
|
||||
//
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -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
Binary file not shown.
@@ -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 ...
|
||||
//
|
||||
Binary file not shown.
@@ -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
Reference in New Issue
Block a user