backup all works even x121 ...

This commit is contained in:
2024-07-30 03:03:28 +03:30
parent ca11ce988a
commit d0820387a5
249 changed files with 165974 additions and 0 deletions
Binary file not shown.
@@ -0,0 +1,81 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XBaseClass
// Description: provides all based classes for use ...
//
//
// 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
//
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// XBase Class ...
class XSCBase
{
//
// Public ...
public:
//
// Protected ...
//
// Represent Basic Unique Tag ...
virtual string GetTag();
//
// Retrieve Class Token ...
virtual string GetToken();
//
// Protected
protected:
//
// Private ...
private:
};
//
template <typename T>
string GenerateSpecifiedCommonSummary(
T &mItem,
string separator = "\n",
bool includeScores = true,
bool setLabel = false //
)
{
//
string result = NULL;
//
result =
//
(!setLabel
? ""
: "Commons:" + separator) +
"---------------" + separator +
"Symbol: " + mItem.symbol + separator +
"Period: " + ToString(mItem.period) + separator +
"Time: " + ToString(mItem.time) + separator +
""
//
;
//
return result;
}
//
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,835 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCX121SetupCycle
// Description: provides implementation of X121
// Setup on Specified Market Cycle ...
//
//
// 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 <Arrays/ArrayObj.mqh>
#include "../Classes/x-saherelm.x121.setup.class.mq5"
//
// Definitions ...
//
// Inputs ...
struct X121SetupCycleInputs
{
//
// Props ...
//
XMarketCycle cycle; // Market Cycle
//
X121SetupInputs inputs; // Inputs
//
XSCX121Setup *setup; // Setup
//
// Constructor ...
void X121SetupCycleInputs()
{
}
//
// Deconstructor Constructor ...
void ~X121SetupCycleInputs()
{
delete setup;
}
//
// Initialization ...
bool Init(
X121SetupInputs &_inputs, // Configurations
ENUM_TIMEFRAMES _hostPeriod, // Host Period
ENUM_X_MARKET_CYCLES _cycle, // Init Cycle
ENUM_X_PERIOD_METHOD _method, // Period Selection Method
ENUM_TIMEFRAMES _period, // Provided Period
string _prefix = "" // Prefix
)
{
//
bool result = false;
//
// Validate Inputs ...
result =
//
IsValid(_inputs.symbol)
//
;
if (!result)
{
return result;
}
//
// Init Cycle ...
result = cycle.Init(
inputs.symbol,
_hostPeriod,
_cycle,
_method,
_period,
_prefix //
);
if (!result)
{
return result;
}
//
cycle.Update(0);
//
_inputs.period = cycle.period;
//
result = _inputs.IsValid();
if (!result)
{
return result;
}
//
this.inputs = _inputs;
//
setup = new XSCX121Setup();
result = setup.Init(
inputs //
);
//
return result;
}
//
// Tools ...
//
string GetSymbol()
{
return inputs.symbol;
}
//
ENUM_TIMEFRAMES GetPeriod()
{
return inputs.period;
}
//
bool CanProcessBar()
{
return cycle.barTracker.CanProcessBar();
}
//
void WaitsUntilNextBar()
{
cycle.barTracker.Waits();
}
//
bool GetConditions(
X121SetupConditions &conditions, //
int barIndex = 0, //
int loopback = 5 //
)
{
//
bool result = false;
//
result = cycle.Update(
barIndex //
);
//
result = setup.GetConditions(
conditions,
barIndex,
loopback //
);
//
return result;
}
};
//
// Class ...
class XSCX121SetupCycles : public XSCBaseAlert
{
//
// Public ...
public:
//
// Props ...
X121SignalGenerator signalGenerator;
//
X121SetupCycleInputs cCycle; // Current (Host) Cycle
X121SetupCycleInputs sCycle; // Short Cycle
X121SetupCycleInputs mCycle; // Medium Cycle
X121SetupCycleInputs lCycle; // Long Cycle
X121SetupCycleInputs hCycle; // Hind Cycle
//
// Constructor(s) ...
void XSCX121SetupCycles() {}
//
// Deconstructor ...
void ~XSCX121SetupCycles() {}
//
// Initialized ...
bool Init(
X121SetupInputs &_inputs, // Configurations
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _hostPeriod, // Host Period
ENUM_X_PERIOD_METHOD _sMethod = X_PERIOD_AUTO, // Short Period Selection Method
ENUM_TIMEFRAMES _sPeriod = NULL, // Short Provided Period
ENUM_X_PERIOD_METHOD _mMethod = X_PERIOD_AUTO, // Medium Period Selection Method
ENUM_TIMEFRAMES _mPeriod = NULL, // Medium Provided Period
ENUM_X_PERIOD_METHOD _lMethod = X_PERIOD_AUTO, // Long Period Selection Method
ENUM_TIMEFRAMES _lPeriod = NULL, // Long Provided Period
ENUM_X_PERIOD_METHOD _hMethod = X_PERIOD_AUTO, // Hind Period Selection Method
ENUM_TIMEFRAMES _hPeriod = NULL // Hind Provided Period
)
{
//
bool result = false;
//
// Check Validation of Symbol and Period ...
result =
//
IsValid(_symbol) &&
IsValid(_hostPeriod)
//
;
if (!result)
{
return result;
}
//
// Initialize Market Cycles ...
//
// Current ...
_inputs.symbol = _symbol;
result = cCycle.Init(
_inputs,
_hostPeriod,
X_MARKET_CYCLE_SHORT,
X_PERIOD_MANUALLY,
_hostPeriod,
"CURR" //
);
if (!result)
{
return result;
}
//
result = cBarTracker.Init(
_inputs.symbol,
_hostPeriod //
);
if (!result)
{
return result;
}
//
// Short ...
result = sCycle.Init(
_inputs,
_hostPeriod,
X_MARKET_CYCLE_SHORT,
_sMethod,
_sPeriod //
);
if (!result)
{
return result;
}
//
result = sBarTracker.Init(
_inputs.symbol,
sCycle.cycle.period //
);
if (!result)
{
return result;
}
//
// Medium ...
result = mCycle.Init(
_inputs,
_hostPeriod,
X_MARKET_CYCLE_MEDIUM,
_mMethod,
_mPeriod //
);
if (!result)
{
return result;
}
//
result = mBarTracker.Init(
_inputs.symbol,
mCycle.cycle.period //
);
if (!result)
{
return result;
}
//
// Long ...
result = lCycle.Init(
_inputs,
_hostPeriod,
X_MARKET_CYCLE_LONG,
_lMethod,
_lPeriod //
);
if (!result)
{
return result;
}
//
result = lBarTracker.Init(
_inputs.symbol,
lCycle.cycle.period //
);
if (!result)
{
return result;
}
//
// Hind ...
result = hCycle.Init(
_inputs,
_hostPeriod,
X_MARKET_CYCLE_HIND,
_hMethod,
_hPeriod //
);
if (!result)
{
return result;
}
//
result = hBarTracker.Init(
_inputs.symbol,
hCycle.cycle.period //
);
if (!result)
{
return result;
}
//
_inputs.period = cCycle.GetPeriod();
//
this.inputs = _inputs;
result = inputs.IsValid();
//
return result;
}
//
// Getter(s) / Setter(s) ...
//
X121SetupInputs GetInputs()
{
return this.inputs;
}
//
bool SetInputs(
X121SetupInputs &_inputs // Cycles Configurations
)
{
//
bool result = Init(
_inputs,
_inputs.symbol,
_inputs.period //
);
//
return result;
}
//
string GetSymbol()
{
return cCycle.GetSymbol();
}
//
ENUM_TIMEFRAMES GetPeriod()
{
return cCycle.GetPeriod();
}
//
bool ForceState()
{
return forceState;
}
//
void ForceState(bool value)
{
forceState = value;
}
//
bool CanProcessBar(
ENUM_X_MARKET_CYCLES cycle = X_MARKET_CYCLE_UNKNOWN //
)
{
//
bool result = false;
//
switch (cycle)
{
//
case X_MARKET_CYCLE_SHORT:
//
result = sBarTracker.CanProcessBar();
break;
//
case X_MARKET_CYCLE_MEDIUM:
//
result = mBarTracker.CanProcessBar();
break;
//
case X_MARKET_CYCLE_LONG:
//
result = lBarTracker.CanProcessBar();
break;
//
case X_MARKET_CYCLE_HIND:
//
result = hBarTracker.CanProcessBar();
break;
//
default:
case X_MARKET_CYCLE_UNKNOWN:
//
result = cBarTracker.CanProcessBar();
break;
}
//
return result;
}
//
datetime GetNextSignalTime(
ENUM_X_MARKET_CYCLES cycle = X_MARKET_CYCLE_UNKNOWN //
)
{
//
datetime result = NULL;
//
switch (cycle)
{
//
case X_MARKET_CYCLE_SHORT:
result = sNextValidSignal;
break;
//
case X_MARKET_CYCLE_MEDIUM:
result = mNextValidSignal;
break;
//
case X_MARKET_CYCLE_LONG:
result = lNextValidSignal;
break;
//
case X_MARKET_CYCLE_HIND:
result = hNextValidSignal;
break;
//
default:
case X_MARKET_CYCLE_UNKNOWN:
result = cNextValidSignal;
break;
}
//
return result;
}
//
void WaitsUntilNextBar(
ENUM_X_MARKET_CYCLES cycle = X_MARKET_CYCLE_UNKNOWN //
)
{
//
switch (cycle)
{
//
case X_MARKET_CYCLE_SHORT:
//
FillNextBarTime(
sNextValidSignal,
sBarTracker //
);
sBarTracker.Waits();
break;
//
case X_MARKET_CYCLE_MEDIUM:
//
FillNextBarTime(
mNextValidSignal,
mBarTracker //
);
mBarTracker.Waits();
break;
//
case X_MARKET_CYCLE_LONG:
//
FillNextBarTime(
lNextValidSignal,
lBarTracker //
);
lBarTracker.Waits();
break;
//
case X_MARKET_CYCLE_HIND:
//
FillNextBarTime(
hNextValidSignal,
hBarTracker //
);
hBarTracker.Waits();
break;
//
default:
case X_MARKET_CYCLE_UNKNOWN:
//
FillNextBarTime(
cNextValidSignal,
cBarTracker //
);
cBarTracker.Waits();
break;
}
}
//
bool GetConditions(
X121SetupConditions &conditions, //
ENUM_X_MARKET_CYCLES cycle = X_MARKET_CYCLE_UNKNOWN, //
int barIndex = 0, //
int loopback = 5 //
)
{
//
bool result = false;
//
switch (cycle)
{
//
case X_MARKET_CYCLE_SHORT:
//
result = sCycle.GetConditions(
conditions,
barIndex,
loopback //
);
break;
//
case X_MARKET_CYCLE_MEDIUM:
//
result = mCycle.GetConditions(
conditions,
barIndex,
loopback //
);
break;
//
case X_MARKET_CYCLE_LONG:
//
result = lCycle.GetConditions(
conditions,
barIndex,
loopback //
);
break;
//
case X_MARKET_CYCLE_HIND:
//
result = hCycle.GetConditions(
conditions,
barIndex,
loopback //
);
break;
//
default:
case X_MARKET_CYCLE_UNKNOWN:
//
result = cCycle.GetConditions(
conditions,
barIndex,
loopback //
);
break;
}
//
return result;
}
//
XSCZones *GetZones(
ENUM_X_MARKET_CYCLES cycle = X_MARKET_CYCLE_UNKNOWN, //
int barIndex = 0, //
int numberOfZones = 10 //
)
{
//
XSCZonesInput zInputs;
zInputs.numberOfZones = numberOfZones;
//
int length = 0;
ENUM_TIMEFRAMES zPeriod = NULL;
switch (cycle)
{
//
case X_MARKET_CYCLE_SHORT:
//
zPeriod = sCycle.GetPeriod();
break;
//
case X_MARKET_CYCLE_MEDIUM:
//
zPeriod = mCycle.GetPeriod();
break;
//
case X_MARKET_CYCLE_LONG:
//
zPeriod = lCycle.GetPeriod();
break;
//
case X_MARKET_CYCLE_HIND:
//
zPeriod = hCycle.GetPeriod();
break;
//
default:
case X_MARKET_CYCLE_UNKNOWN:
//
zPeriod = cCycle.GetPeriod();
break;
}
//
ENUM_TIMEFRAMES cPeriod = GetPeriod();
length = (PeriodSeconds(zPeriod) / PeriodSeconds(cPeriod)) + 1;
//
zInputs.length = length;
XSCZones *result = new XSCZones(
GetSymbol(),
cPeriod //
);
if (!result.Init(zInputs))
{
return NULL;
}
//
return result;
}
//
bool ProcessMarket(
XSignal &signal,
X121SetupConditions &conditions,
int &pushers,
string &provider,
double &tp,
double &sl,
ENUM_X_MARKET_CYCLES cycle = X_MARKET_CYCLE_UNKNOWN,
bool allowSupports = false, // Allow Support Signal Generating ...
bool allowLong = false,
bool allowShort = false,
double volume = 0.01,
double slPoint = 100,
bool ignoreSL = false,
double tpPoint = 100,
bool ignoreTP = false,
int barIndex = 0,
int loopback = 5 //
)
{
//
bool result = false;
//
result = CanProcessBar(
cycle //
);
if (!result)
{
return result;
}
//
result = GetConditions(
conditions,
cycle, // Current Market ...
barIndex, // Bar Index ...
loopback // Loop Back ...
);
if (!result)
{
return result;
}
//
// Parse Conditions for Signal ...
result = signalGenerator.HasSignal(
conditions,
signal,
pushers,
provider,
tp,
sl,
allowSupports,
allowLong,
allowShort,
volume,
slPoint,
ignoreSL,
tpPoint,
ignoreTP //
);
//
if (result)
{
//
WaitsUntilNextBar(
cycle //
);
}
//
return result;
}
//
// Protected ...
protected:
//
// Private ...
private:
//
// Props ...
//
X121SetupInputs inputs; // Cycles Configurations
//
bool forceState; // Force State
//
// Bar Trackers ...
XBarTracker cBarTracker;
XBarTracker sBarTracker;
XBarTracker mBarTracker;
XBarTracker lBarTracker;
XBarTracker hBarTracker;
//
datetime cNextValidSignal;
datetime sNextValidSignal;
datetime mNextValidSignal;
datetime lNextValidSignal;
datetime hNextValidSignal;
//
void FillNextBarTime(
datetime &next,
XBarTracker &tracker //
)
{
//
next = iTime(
tracker.symbol,
tracker.period,
0) +
PeriodSeconds(tracker.period);
}
};
//
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,398 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCAccount
// Description: provides all Account 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 ...
//
//
// END Definitions ...
//
//
// START Import and Inclused requirements ...
//
//
// Includes ...
#include <Trade/AccountInfo.mqh>
#include "../Classes/x-saherelm.base.class.mq5"
//
// END Import and Inclused requirements ...
//
//
// START Overrides ...
//
//
// END Overrides ...
//
//
// a Class for Manage Account ...
class XSCAccount : public XSCBase
{
//
// Public ...
public:
//
// Constructor ...
void XSCAccount()
{
//
mAccountInfo = new CAccountInfo();
}
//
// Deconstructor ...
void ~XSCAccount()
{
}
//
// START Provided Functions ...
//
//
// User Account ...
long GetUserAccount()
{
return mAccountInfo.Login();
}
//
// Account Leverage ...
long GetLeverage()
{
return mAccountInfo.Leverage();
}
//
// Get Trade Expert State ...
bool CanExpertTrade()
{
return mAccountInfo.TradeExpert();
}
//
// User Account Trade Mopde (ENUM_ACCOUNT_TRADE_MODE) ...
// --------------------------
// ACCOUNT_TRADE_MODE_DEMO
// ACCOUNT_TRADE_MODE_CONTEST
// ACCOUNT_TRADE_MODE_REAL
ENUM_ACCOUNT_TRADE_MODE GetTradeMode()
{
return mAccountInfo.TradeMode();
}
//
// Get Account Balance ...
double GetBalance()
{
return mAccountInfo.Balance();
}
//
// Get the amount of give Credit ...
double GetCredit()
{
return mAccountInfo.Credit();
}
//
// Get the amount of current Profit on account ...
double GetProfit()
{
return mAccountInfo.Profit();
}
//
// Get the amount of current Equity on account ...
double GetEquity()
{
return mAccountInfo.Equity();
}
//
// Get the amount of reserved Margin ...
double GetMargin()
{
return mAccountInfo.Margin();
}
//
// Get the amount of free Margin ...
double GetFreeMargin()
{
return mAccountInfo.FreeMargin();
}
//
// Get the Level of Margin ...
double GetMarginLevel()
{
return mAccountInfo.MarginLevel();
}
//
// Get the Level Of Margin for a Deposit ...
double GetMarginCall()
{
return mAccountInfo.MarginCall();
}
//
// Get the Level of Margin for Stop out ...
double GetMarginStopOut()
{
return mAccountInfo.MarginStopOut();
}
//
// Get the Client Name ...
string GetName()
{
return mAccountInfo.Name();
}
//
// Get the Trade Server Name ...
string GetServerName()
{
return mAccountInfo.Server();
}
//
// Get deposit Currency Name ...
string GetCurrency()
{
return mAccountInfo.Currency();
}
//
// Get the Company Name that serves an Account ...
string GetCompany()
{
return mAccountInfo.Company();
}
//
// Calculate Profits for the current account based on passed parameters ...
double CalculateTradeProfit(
const string symbol, // trading symbol
ENUM_ORDER_TYPE type, // order type
double volume, // volume
double entry, // open price
double exit // close price
)
{
//
double result = mAccountInfo.OrderProfitCheck(
symbol,
type,
volume,
entry,
exit);
//
return result;
}
//
// Calculate amount of margin which required for trade operation ...
double CalculateMarging(
const string symbol, // trading symbol
ENUM_ORDER_TYPE type, // order type
double volume, // volume
double entry // open price
)
{
//
double result = mAccountInfo.MarginCheck(
symbol,
type,
volume,
entry);
//
return result;
}
//
// Calculate amount of free margin left after trade operation ...
double CalculateFreeMarging(
const string symbol, // trading symbol
ENUM_ORDER_TYPE type, // order type
double volume, // volume
double entry // open price
)
{
//
double result = mAccountInfo.FreeMarginCheck(
symbol,
type,
volume,
entry);
//
return result;
}
//
// Calculate the Maximum possible volume of trade operation ...
double CalculateMaxVolume(
const string symbol, // trading symbol
ENUM_ORDER_TYPE type, // order type
double entry, // open price
double percent = 100 // percent of available margin
)
{
//
double result = mAccountInfo.MaxLotCheck(
symbol,
type,
entry,
percent);
//
return result;
}
//
// Calculate Point Value for Given Symbol based on Account ...
double GetPointValue(
string symbol // trading symbol
)
{
//
double result = 0;
//
double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
//
double ticksPerPoint = tickSize / point;
//
result = tickValue / ticksPerPoint;
//
return result;
}
//
// Calculate Risk Amount based on account Currency by Providing:
// Points and Volume ...
double CalculateRiskAmount(
string symbol, // trading symbol
double points, // amount of Risk Points
double volume // position Volume
)
{
//
double result = 0;
//
double pointValue = GetPointValue(symbol);
//
result = pointValue * volume * points;
//
return result;
}
//
// Calculate Risk Points based on account Currency by Providing:
// Volume and Amount ...
double CalculateRiskPoints(
string symbol, // trading symbol
double volume, // position Volume
double amount // amount of Risk based on Account Currency
)
{
//
double result = 0;
//
double pointValue = GetPointValue(symbol);
//
result = amount / (pointValue * volume);
//
return result;
}
//
// Calculate Volume based on account Currency by Providing:
// Amount and Risk Points ...
double CalculateVolume(
string symbol, // trading symbol
double amount, // amount of Risk based on Account Currency
double points // amount of Risk Points
)
{
//
double result = 0;
//
points =
points <= 0
? 10
: points;
//
double pointValue = GetPointValue(symbol);
//
result = amount / (pointValue * points);
//
return result;
}
//
// END Provided Functions ...
//
//
// Protected ...
protected:
//
// Private ...
private:
//
// Account Info ...
CAccountInfo mAccountInfo;
};
//
// START Usefull Functions ...
//
//
// END Usefull Functions ...
//
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,148 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCBaseHelper
// Description: provides all Base 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
//
// Includes ...
#include "../Classes/x-saherelm.base.class.mq5"
//
// Definitions ...
//
// a Class for Handle base requirements ...
// for indicators ...
class XSCBaseHelper : public XSCBase
{
//
// Public ...
public:
//
// Constructor ...
void XSCBaseHelper(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period // Trading Time Frame
)
{
//
mSymbol = symbol;
mPeriod = period;
}
//
// Deconstructor ...
void ~XSCBaseHelper()
{
//
IndicatorRelease(mHandler);
}
//
// Setter(s) / Getter(s) ...
//
// Symbol ...
string GetSymbol()
{
return mSymbol;
}
//
// Period ...
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
//
// Retrieve Bars ...
int CountBars()
{
//
int result =
Bars(
mSymbol,
mPeriod
//
);
//
return result;
}
//
// Retrieve Indicator Calculated Bars ...
int CountCalculatedBars()
{
return BarsCalculated(mHandler);
}
//
// Generate Tag ...
virtual string GetTag()
{
//
string result = NULL;
//
result =
//
GetToken() +
"[" +
GetSymbol() + "|" +
ToString(GetPeriod()) +
"]"
//
;
//
return result;
}
//
// Functions ...
//
// Protected ...
protected:
//
// Props ...
//
// Symbol ...
string mSymbol;
//
// Period ...
ENUM_TIMEFRAMES mPeriod;
//
// Indicator Handler ...
int mHandler;
//
// Private ...
private:
//
};
//
// Tools ....
@@ -0,0 +1,373 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCHttp
// Description: provides all HTTP 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
//
// Definitions ...
//
enum X_HTTP_METHOD
{
X_HTTP_GET,
X_HTTP_POST
};
//
// Imports ...
//
// Includes ...
#include "../Classes/x-saherelm.base.class.mq5"
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// a Class for Manage Account ...
class XSCHttp : public XSCBase
{
//
// Public ...
public:
//
// Constructor ...
void XSCHttp()
{
XSCHttp("", 10000);
}
void XSCHttp(
string path, // Base Folder to Store Data
int timeout // base timeout for Requests
)
{
//
Path(path);
Timeout(timeout);
}
//
// Deconstructor ...
void ~XSCHttp()
{
}
//
// Properties Getter(s) / Setter(s) ...
//
// Path ...
void Path(string value)
{
//
mPath = value;
//
if (!IsValid(mPath))
{
mPath = GetTag();
}
}
string Path()
{
return mPath;
}
//
// Timeout ...
void Timeout(int value)
{
mTimeout = value;
}
//
int Timeout()
{
return mTimeout;
}
//
// Error ...
int Error()
{
return mError;
}
//
// Response ...
string Response()
{
return mResponse;
}
//
// Overrides ...
string GetTag() override
{
return GetSpecificToken(this);
}
//
// Tools ...
//
// Send Global Request ...
int SendRequest(
X_HTTP_METHOD method, // Httm Request Method
const string url, // Server Address
const string headers, // Headers providing
const char &payload[], // the Data which needs to Send
char &response[], // Response of request
string responseHeaders, // Response Headers
int timeout = 500 // Timeout for response default is 500
)
{
//
int result = -1;
//
string strMethod = ToString(method);
if (StringLen(strMethod) == 0)
{
return result;
}
//
// Reset State ...
ResetState();
//
result = WebRequest(
strMethod,
url,
headers,
timeout,
payload,
response,
responseHeaders);
//
if (result < 0)
{
mError = GetLastError();
}
else
{
mResponse = CharArrayToString(response);
}
//
return result;
}
//
// Get Request ...
int GetRequest(
const string url, // Server Address
const string headers, // Headers providing
const char &payload[], // the Data which needs to Send
char &response[], // Response of request
string responseHeaders, // Response Headers
int timeout = 500 // Timeout for response default is 500
)
{
//
int result = SendRequest(
X_HTTP_GET,
url,
headers,
payload,
response,
responseHeaders,
timeout);
//
return result;
}
//
// Post Request ...
int PostRequest(
const string url, // Server Address
const string headers, // Headers providing
const char &payload[], // the Data which needs to Send
char &response[], // Response of request
string responseHeaders, // Response Headers
int timeout = 500 // Timeout for response default is 500
)
{
//
int result = SendRequest(
X_HTTP_POST,
url,
headers,
payload,
response,
responseHeaders,
timeout);
//
return result;
}
//
// Handle Download Specific URL Content to Specific Path and File Name ...
bool Download(
string url, // the URL address which going to download
string fileName // Specify Destination file name to Store Response
)
{
//
bool result = false;
//
string filePath = GetFilePath(fileName);
string cookie = NULL;
string referer = NULL;
int timeout = Timeout();
//
char payload[];
string headers;
char response[];
string responseHeaders;
//
// Send Request ...
int requestResult = GetRequest(
url,
headers,
payload,
response,
responseHeaders,
timeout);
//
// Define File Handler ...
int mFileHandler = FileOpen(
filePath,
FILE_WRITE | FILE_BIN);
if (mFileHandler == INVALID_HANDLE)
{
//
mError = GetLastError();
return result;
}
//
// Write Response to File ...
uint writed = FileWriteArray(
mFileHandler,
response,
0,
ArraySize(response));
FileFlush(mFileHandler);
FileClose(mFileHandler);
//
result = writed > 0;
//
return result;
}
//
// END Provided Functions ...
//
//
// Protected ...
protected:
//
// Destintion Folder Path ...
string mPath;
//
// WEB Request Timeout Value ...
int mTimeout;
//
// WEB Request's Response ...
string mResponse;
//
// Error Value ...
int mError;
//
// Private ...
private:
//
// Reset Errors State ...
void ResetState()
{
//
// Reset Errors ...
mError = -1;
mResponse = "";
ResetLastError();
}
//
// Generate Full File Path ...
string GetFilePath(string fileName)
{
//
string result = "";
//
result =
//
Path() + "\\" + fileName
//
;
//
return result;
}
};
//
// Tools ...
//
// Convert enum to String ...
string ToString(X_HTTP_METHOD method)
{
//
string result = "";
//
switch (method)
{
//
case X_HTTP_GET:
result = "GET";
break;
//
case X_HTTP_POST:
result = "POST";
break;
}
//
return result;
}
//
Binary file not shown.
@@ -0,0 +1,106 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXMan
// Description: Market Analyzer ...
//
//
// 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 "../Classes/x-saherelm.base.class.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Definitions ...
//
// Class ...
class XSCXMan : public XSCBase
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXMan(
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period // Trading Timeframe
)
{
//
mSymbol = _symbol;
mPeriod = _period;
}
//
// Deconstructor ...
void ~XSCXMan() {}
//
// Override(s) ...
//
// Represent Basic Unique Tag ...
string GetTag() override
{
//
string result = NULL;
//
result = GetTypeName(this);
//
return result;
}
//
// Retrieve Class Token ...
string GetToken() override
{
//
string result = NULL;
//
result = GetSpecificToken(this);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
string mSymbol; // Trading Symbol
ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame
//
// Configurations ...
int _maxNumberOfHoldingItems;
//
// Private ...
private:
//
};
//
@@ -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;
}
};
@@ -0,0 +1,54 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCRange
// Description: provides all Range 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 "../Classes/x-saherelm.base.class.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
//
// Definitions ...
//
enum ENUM_XSCRANGE_CALCULATION_MODE {
//
XSCRANGE_CALCULATE_MANUALLY = 0,
XSCRANGE_CALCULATE_DAILY = 1,
XSCRANGE_CALCULATE_HALFDAY = 2,
XSCRANGE_CALCULATE_4H = 3,
};
//
struct XSCRangeInput
{
//
// Props ...
//
datetime startTime; // Range Start Time
datetime endTime; // Range End Time
//
int lifetime; // Range Live Time (Secconds)
//
};
@@ -0,0 +1,736 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCRange
// Description: provides all Range 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 "../Classes/x-saherelm.base.class.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
//
// Definitions ...
//
struct XSCCFInput
{
//
// Props ...
//
int length; // Minimum of Same Bars
//
color clrUpper; // Upper Color ...
color clrLower; // Lower Color ...
//
// Constructor ...
void XSCCFInput()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
length = 0;
//
clrUpper = CLR_NONE;
clrLower = CLR_NONE;
}
//
// Defualt Configs ...
void Default()
{
//
length = 4;
//
clrLower = clrAqua;
clrUpper = clrMagenta;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
length >= 2
//
;
//
return result;
}
};
//
// Class ...
class XSCCF : public XSCBase
{
//
// Public ...
public:
//
// Props ...
//
// Constructor ...
void XSCCF(
string symbol,
ENUM_TIMEFRAMES period //
) : XSCBase()
{
//
mSymbol = symbol;
mPeriod = period;
}
//
// Deconstructor ...
void ~XSCCF() {}
//
// Initialize ...
bool Init(XSCCFInput &inputs)
{
//
bool result = false;
//
result = inputs.IsValid();
if (!result)
{
return result;
}
//
mInputs = inputs;
//
// Find Bullish Bar ...
result = FindBullishBar(0);
if (!result)
{
return result;
}
//
// Find Bearish Bar ...
result = FindBearishBar(0);
if (!result)
{
return result;
}
//
return result;
}
//
// Getter(s) / Setter(s) ...
//
string GetSymbol()
{
return mSymbol;
}
//
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
//
XSCCFInput GetInputs()
{
return mInputs;
}
//
bool SetInputs(XSCCFInput &inputs)
{
return Init(inputs);
}
//
XOHCL GetBullishBar()
{
return bullishBar;
}
//
XOHCL GetBearishBar()
{
return bearishBar;
}
//
// Overrides ...
string GetTag() override
{
return "XCF";
}
//
// Tools ...
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
bullishBar.IsValid() &&
bearishBar.IsValid()
//
;
//
return result;
}
//
// Retrieve Title Prefix ...
string GetIdentifier()
{
//
string result = NULL;
//
if (!IsValid())
{
return result;
}
//
result = GetTag() + "_" +
mSymbol + "_" +
ToString(mPeriod) + "_" +
ToFormatString(bullishBar.time) + "_";
//
return result;
}
//
// Remove Draws ...
bool Remove(
long chartId = 0,
int subWindow = 0 //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
string prefix = GetIdentifier();
result = IsSpecifiedValid(prefix);
if (!result)
{
return result;
}
//
RemoveDraws(
prefix,
chartId,
subWindow //
);
//
return result;
}
//
bool Draw(
long chartId = 0,
string prefix = NULL,
int subWindow = 0,
string upperPrefix = "Upper",
string lowerPrefix = "Lower" //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
result = DrawBullishBar(
chartId,
prefix,
subWindow,
upperPrefix,
lowerPrefix //
);
if (!result)
{
return result;
}
//
result = DrawBearishBar(
chartId,
prefix,
subWindow,
upperPrefix,
lowerPrefix //
);
if (!result)
{
return result;
}
//
return result;
}
//
// Protected ...
protected:
//
// Tools ...
//
bool FindBullishBar(
int barIndex //
)
{
//
bool result = false;
//
int next = barIndex + 1;
//
int totalBars = iBars(
mSymbol,
mPeriod //
);
result = barIndex >= 0 && barIndex + 1 + mInputs.length < totalBars;
if (!result)
{
return result;
}
//
bool isNextValid = next >= 0 && next + 1 + mInputs.length < totalBars;
//
int bullBarIndex = barIndex + 1;
int start = bullBarIndex + 1;
int end = start + mInputs.length;
//
XOHCL startBar;
result = startBar.Init(
mSymbol,
mPeriod,
bullBarIndex //
);
if (!result)
{
return result;
}
//
result = startBar.IsBullish();
if (!result)
{
if (isNextValid)
{
return FindBullishBar(next);
}
else
{
return result;
}
}
//
// Loop Back to Find Bearish Bars ...
for (int i = start; i < end; i++)
{
//
XOHCL iBar;
result = iBar.Init(
mSymbol,
mPeriod,
i //
);
if (!result || !iBar.IsBearish())
{
//
if (isNextValid)
{
return FindBullishBar(next);
}
else
{
return result;
}
//
break;
}
}
//
if (result)
{
bullishBar = startBar;
}
//
return result;
}
//
bool FindBearishBar(
int barIndex //
)
{
//
bool result = false;
//
int next = barIndex + 1;
//
int totalBars = iBars(
mSymbol,
mPeriod //
);
result = barIndex >= 0 && barIndex + 1 + mInputs.length < totalBars;
if (!result)
{
return result;
}
//
bool isNextValid = next >= 0 && next + 1 + mInputs.length < totalBars;
//
int bearBarIndex = barIndex + 1;
int start = bearBarIndex + 1;
int end = start + mInputs.length;
//
XOHCL startBar;
result = startBar.Init(
mSymbol,
mPeriod,
bearBarIndex //
);
if (!result)
{
return result;
}
//
result = startBar.IsBearish();
if (!result)
{
if (isNextValid)
{
return FindBearishBar(next);
}
else
{
return result;
}
}
//
// Loop Back to Find Bearish Bars ...
for (int i = start; i < end; i++)
{
//
XOHCL iBar;
result = iBar.Init(
mSymbol,
mPeriod,
i //
);
if (!result || !iBar.IsBullish())
{
//
if (isNextValid)
{
return FindBearishBar(next);
}
else
{
return result;
}
//
break;
}
}
//
if (result)
{
bearishBar = startBar;
}
//
return result;
}
//
bool DrawBullishBar(
long chartId = 0,
string prefix = NULL,
int subWindow = 0,
string upperPrefix = "Upper",
string lowerPrefix = "Lower" //
)
{
//
bool result = false;
//
result = bullishBar.IsValid();
if (!result)
{
return result;
}
//
if (!IsSpecifiedValid(upperPrefix))
{
upperPrefix = "High";
}
//
if (!IsSpecifiedValid(lowerPrefix))
{
lowerPrefix = "Low";
}
//
datetime cTime = TimeCurrent();
//
string identifier = GetIdentifier();
//
// High Line ...
string bullishHighLineName =
(IsSpecifiedValid(prefix)
? prefix + "_"
: "") +
identifier + "_" +
"BULL_" +
upperPrefix;
//
result = DrawTrendLine(
chartId,
bullishHighLineName,
subWindow,
bullishBar.time,
bullishBar.high,
cTime,
bullishBar.high,
mInputs.clrUpper,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
//
// Low Line ...
string bullishLowLineName =
(IsSpecifiedValid(prefix)
? prefix + "_"
: "") +
identifier + "_" +
"BULL_" +
lowerPrefix;
//
result = DrawTrendLine(
chartId,
bullishLowLineName,
subWindow,
bullishBar.time,
bullishBar.low,
cTime,
bullishBar.low,
mInputs.clrLower,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
//
return result;
}
//
bool DrawBearishBar(
long chartId = 0,
string prefix = NULL,
int subWindow = 0,
string upperPrefix = "Upper",
string lowerPrefix = "Lower" //
)
{
//
bool result = false;
//
result = bearishBar.IsValid();
if (!result)
{
return result;
}
//
if (!IsSpecifiedValid(upperPrefix))
{
upperPrefix = "High";
}
//
if (!IsSpecifiedValid(lowerPrefix))
{
lowerPrefix = "Low";
}
//
datetime cTime = TimeCurrent();
//
string identifier = GetIdentifier();
//
// High Line ...
string bearishHighLineName =
(IsSpecifiedValid(prefix)
? prefix + "_"
: "") +
identifier + "_" +
"BEAR_" +
upperPrefix;
//
result = DrawTrendLine(
chartId,
bearishHighLineName,
subWindow,
bearishBar.time,
bearishBar.high,
cTime,
bearishBar.high,
mInputs.clrUpper,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
//
// Low Line ...
string bearishLowLineName =
(IsSpecifiedValid(prefix)
? prefix + "_"
: "") +
identifier + "_" +
"BEAR_" +
lowerPrefix;
//
result = DrawTrendLine(
chartId,
bearishLowLineName,
subWindow,
bearishBar.time,
bearishBar.low,
cTime,
bearishBar.low,
mInputs.clrLower,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
//
return result;
}
//
// Private ...
private:
//
// Props ...
string mSymbol; // Trading Symbol ...
ENUM_TIMEFRAMES mPeriod; // Trading Period ...
//
XOHCL bearishBar; // Bearish Order Block Bar
XOHCL bullishBar; // Bullish Order Block Bar
//
XSCCFInput mInputs; // Configs ...
};
//
@@ -0,0 +1,330 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCSupRes
// Description: provides all Support and Resistances 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 "../Classes/x-saherelm.base.class.mq5"
#include "../Helpers/x-saherelm.xpv.helper.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
//
// Definitions ...
struct XSCSupResInput
{
//
// Props ...
//
int numberOfSupports; // Number of Required Supports
int numberOfResistances; // Number of Required Resistances
//
int pivotsVerifications; // Pivots Verifications
//
double distance; // Distance between Pivots
//
double price; // Price for Support and Resistance Finding
//
color clrSupport;
color clrResistance;
//
// Constructor ...
void XSCSupResInput()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
numberOfSupports = 0;
numberOfResistances = 0;
//
price = 0;
distance = 0;
pivotsVerifications = 0;
//
clrSupport = CLR_NONE;
clrResistance = CLR_NONE;
}
//
// Defualt Configs ...
void Default()
{
//
numberOfSupports = 5;
numberOfResistances = 5;
//
price = 0;
distance = 10;
pivotsVerifications = 35;
//
clrSupport = clrAqua;
clrResistance = clrMagenta;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
price > 0 &&
distance >= 0 &&
numberOfSupports > 0 &&
numberOfResistances > 0 &&
pivotsVerifications > 2
//
;
//
return result;
}
};
//
// Class ...
//
class XSCSupRes : public XSCBase
{
//
// Public ...
public:
//
// Props ...
//
// Constructor ...
void XSCSupRes(
string symbol,
ENUM_TIMEFRAMES period //
) : XSCBase()
{
//
mSymbol = symbol;
mPeriod = period;
}
//
// Deconstructor ...
void ~XSCSupRes() {}
//
// Initializer ...
bool Init(XSCSupResInput &inputs)
{
//
bool result = false;
//
result = inputs.IsValid();
if (!result)
{
return result;
}
//
mInputs = inputs;
//
// Find Pivots ...
result = FindPivots();
if (!result)
{
return result;
}
//
return result;
}
//
// Getter(s) / Setter(s) ...
//
string GetSymbol()
{
return mSymbol;
}
//
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
//
XSCSupResInput GetInputs()
{
return mInputs;
}
//
bool SetInputs(XSCSupResInput &inputs)
{
return Init(inputs);
}
//
// Overrides ...
//
string GetTag() override
{
return "XSupRes";
}
//
// Tools ...
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
false
//
;
//
return result;
}
//
// Retrieve Title Prefix ...
string GetIdentifier()
{
//
string result = NULL;
//
if (!IsValid())
{
return result;
}
//
result = GetTag() + "_" +
mSymbol + "_" +
ToString(mPeriod) + "_";
//
return result;
}
//
// Protected ...
protected:
//
// Tools ...
//
// Private ...
private:
//
// Props ...
//
string mSymbol; // Trading Symbol ...
ENUM_TIMEFRAMES mPeriod; // Trading Period ...
//
XSCSupResInput mInputs; // Configs ...
//
double mSupports[];
double mResistances[];
//
// Tools ...
//
bool FindPivots(int barIndex = 0)
{
//
bool result = false;
//
int totalBars = iBars(
mSymbol,
mPeriod //
);
//
result = barIndex >= 0 && barIndex < totalBars - mInputs.pivotsVerifications;
if (!result) {
return result;
}
//
int next = barIndex + 1;
bool canNext = next >= 0 && next < totalBars - mInputs.pivotsVerifications;
//
XSCXPVHelper helper = new XSCXPVHelper();
XPVInputs pvInputs;
pvInputs.Default();
result = helper.Init(
mSymbol,
mPeriod,
pvInputs //
);
if (!result)
{
return result;
}
//
// TODO: Complete this ...
//
// Check States ...
//
return result;
}
};
//
@@ -0,0 +1,746 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCTrend
// Description: provides all Trend 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 "../Classes/x-saherelm.base.class.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
//
// All Required Inputs ...
struct XSCTrendInput
{
//
int numberOfShoulders; // Number of Shoulders
//
color clrUpper; // Upper Colors
color clrLower; // Lower Colors
color clrHighs; // Highs Colors
color clrLows; // Lows Colors
//
// Constructor ...
void XSCTrendInput()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
numberOfShoulders = 0;
//
clrUpper = CLR_NONE;
clrLower = CLR_NONE;
clrHighs = CLR_NONE;
clrLows = CLR_NONE;
}
//
// Defualt Configs ...
void Default()
{
//
numberOfShoulders = 7;
//
clrUpper = clrRed;
clrLower = clrGreen;
//
clrHighs = clrAqua;
clrLows = clrMagenta;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
numberOfShoulders >= 2
//
;
//
return result;
}
};
//
// Class Definitions ...
class XSCTrend : public XSCBase
{
//
// Public ...
public:
//
// Props ...
//
// Constructor ...
void XSCTrend(
string symbol,
ENUM_TIMEFRAMES period //
) : XSCBase()
{
//
mSymbol = symbol;
mPeriod = period;
}
//
// Deconstructor ...
void ~XSCTrend()
{
Remove();
}
//
// Initialize ...
bool Init(XSCTrendInput &inputs)
{
//
bool result = false;
//
result = inputs.IsValid();
if (!result)
{
return result;
}
//
mInputs = inputs;
//
result = zBar.Init(
mSymbol,
mPeriod,
0 //
);
//
int firstSwingLowIndex = FindSwing(
zBar.symbol,
zBar.period,
X_SWING_LOW,
mInputs.numberOfShoulders,
zBar.Index() + 1 //
);
result = firstSwingLowBar.Init(
zBar.symbol,
zBar.period,
firstSwingLowIndex //
);
if (!result)
{
return result;
}
//
int secondSwingLowIndex = FindSwing(
zBar.symbol,
zBar.period,
X_SWING_LOW,
mInputs.numberOfShoulders,
firstSwingLowIndex + 1 //
);
//
result = secondSwingLowBar.Init(
zBar.symbol,
zBar.period,
secondSwingLowIndex //
);
if (!result)
{
return result;
}
//
int firstSwingHighIndex = FindSwing(
zBar.symbol,
zBar.period,
X_SWING_HIGH,
mInputs.numberOfShoulders,
zBar.Index() + 1 //
);
result = firstSwingHighBar.Init(
zBar.symbol,
zBar.period,
firstSwingHighIndex //
);
if (!result)
{
return result;
}
//
int secondSwingHighIndex = FindSwing(
zBar.symbol,
zBar.period,
X_SWING_HIGH,
mInputs.numberOfShoulders,
firstSwingHighIndex + 1 //
);
result = secondSwingHighBar.Init(
zBar.symbol,
zBar.period,
secondSwingHighIndex //
);
if (!result)
{
return result;
}
//
return result;
}
//
// Getter(s) / Setter(s) ...
//
string GetSymbol()
{
return mSymbol;
}
//
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
//
XSCTrendInput GetInputs()
{
return mInputs;
}
//
bool SetInputs(XSCTrendInput &inputs)
{
return Init(inputs);
}
//
XOHCL GetBar()
{
return zBar;
}
//
XOHCL GetFirstSwingLowBar()
{
return firstSwingLowBar;
}
//
XOHCL GetSecondSwingLowBar()
{
return secondSwingLowBar;
}
//
XOHCL GetFirstSwingHighBar()
{
return firstSwingHighBar;
}
//
XOHCL GetSecondSwingHighBar()
{
return secondSwingHighBar;
}
//
// Overrides ...
//
string GetTag() override
{
return "XTREND";
}
//
// Tools ...
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
zBar.IsValid() &&
firstSwingLowBar.IsValid() &&
secondSwingLowBar.IsValid() &&
firstSwingHighBar.IsValid() &&
secondSwingHighBar.IsValid()
//
;
//
return result;
}
//
// Retrieve Title Prefix ...
string GetIdentifier()
{
//
string result = NULL;
//
if (!IsValid())
{
return result;
}
//
result = GetTag() + "_" +
mSymbol + "_" +
ToString(mPeriod) + "_" +
ToFormatString(zBar.time);
//
return result;
}
//
// Retrieve Chart Line Values ...
//
// Get Lows Line Price at Specific Time ...
double GetLows(datetime time = NULL)
{
//
double result = 0;
//
result = GetObjectPrice(
lowsName,
time //
);
//
return result;
}
//
// Get Highs Line Price at Specific Time ...
double GetHighs(datetime time = NULL)
{
//
double result = 0;
//
result = GetObjectPrice(
highsName,
time //
);
//
return result;
}
//
// Get Support Line Price at Specific Time ...
double GetSupport(datetime time = NULL)
{
//
double result = 0;
//
result = GetObjectPrice(
supportName,
time //
);
//
return result;
}
//
// Get Resistance Line Price at Specific Time ...
double GetResistance(datetime time = NULL)
{
//
double result = 0;
//
result = GetObjectPrice(
resistanceName,
time //
);
//
return result;
}
//
// Remove Draws ...
bool Remove(
long chartId = 0,
int subWindow = 0 //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
string prefix = GetIdentifier();
result = IsSpecifiedValid(prefix);
if (!result)
{
return result;
}
//
RemoveDraws(
prefix,
chartId,
subWindow //
);
//
return result;
}
//
// Draw Trend Object on Chart ...
bool Draw(
long chartId = 0,
string prefix = NULL,
int subWindow = 0,
string upperPrefix = "Upper",
string lowerPrefix = "Lower",
string highsPrefix = "Highs",
string lowsPrefix = "Lows" //
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
// Normalize Prefixes ...
//
if (!IsSpecifiedValid(upperPrefix))
{
upperPrefix = "Upper";
}
//
if (!IsSpecifiedValid(lowerPrefix))
{
lowerPrefix = "Lower";
}
//
if (!IsSpecifiedValid(highsPrefix))
{
highsPrefix = "Highs";
}
//
if (!IsSpecifiedValid(lowsPrefix))
{
lowsPrefix = "Lows";
}
//
string identifier = GetIdentifier();
result = IsSpecifiedValid(identifier);
if (!result)
{
return result;
}
//
double support = secondSwingLowBar.low;
datetime supportTime =
secondSwingLowBar.time > secondSwingHighBar.time
? secondSwingHighBar.time
: secondSwingLowBar.time;
supportName =
//
identifier +
(IsSpecifiedValid(prefix)
? "_" + prefix + "_"
: "") +
"_" + lowerPrefix + "_" +
""
//
;
//
double resistance = secondSwingHighBar.high;
datetime resistanceTime =
secondSwingLowBar.time > secondSwingHighBar.time
? secondSwingHighBar.time
: secondSwingLowBar.time;
resistanceName =
//
identifier +
(IsSpecifiedValid(prefix)
? "_" + prefix + "_"
: "") +
"_" + upperPrefix + "_" +
""
//
;
//
double newLow = firstSwingLowBar.low;
datetime newLowTime = firstSwingLowBar.time;
//
double oldLow = secondSwingLowBar.low;
datetime oldLowTime = secondSwingLowBar.time;
lowsName =
//
identifier +
(IsSpecifiedValid(prefix)
? "_" + prefix + "_"
: "") +
"_" + lowsPrefix + "_" +
""
//
;
//
double newHigh = firstSwingHighBar.high;
datetime newHighTime = firstSwingHighBar.time;
//
double oldHigh = secondSwingHighBar.high;
datetime oldHighTime = secondSwingHighBar.time;
highsName =
//
identifier +
(IsSpecifiedValid(prefix)
? "_" + prefix + "_"
: "") +
"_" + highsPrefix + "_" +
""
//
;
//
// Draw Support ...
result = DrawTrendLine(
chartId,
supportName,
subWindow,
supportTime,
support,
newLowTime,
support,
mInputs.clrLower,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
if (!result)
{
return result;
}
//
// Draw Resistance ...
result = DrawTrendLine(
chartId,
resistanceName,
subWindow,
resistanceTime,
resistance,
newHighTime,
resistance,
mInputs.clrUpper,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
if (!result)
{
return result;
}
//
// Draw Highs ...
result = DrawTrendLine(
chartId,
highsName,
subWindow,
oldHighTime,
oldHigh,
newHighTime,
newHigh,
mInputs.clrHighs,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
if (!result)
{
return result;
}
//
// Draw Lows ...
result = DrawTrendLine(
chartId,
lowsName,
subWindow,
oldLowTime,
oldLow,
newLowTime,
newLow,
mInputs.clrLows,
STYLE_SOLID,
2,
false,
false,
true // Ray Right ...
);
if (!result)
{
return result;
}
//
return result;
}
//
// Protected ...
protected:
//
// Tools ...
//
double GetObjectPrice(
string objName,
datetime objTime,
long chartId = 0,
int subWindow = 0 //
)
{
//
double result = 0;
//
if (!IsValid())
{
return result;
}
//
if (!IsSpecifiedValid(objName))
{
return result;
}
//
objTime = NormalizeTime(objTime);
//
string objectName = FindObjectName(
objName,
chartId,
subWindow //
);
//
result = ObjectGetValueByTime(
chartId,
objectName,
objTime //
);
//
return result;
}
//
// Private ...
private:
//
// Props ...
string mSymbol; // Trading Symbol ...
ENUM_TIMEFRAMES mPeriod; // Trading Period ...
//
XSCTrendInput mInputs; // Configs ...
//
XOHCL zBar;
XOHCL firstSwingLowBar;
XOHCL secondSwingLowBar;
XOHCL firstSwingHighBar;
XOHCL secondSwingHighBar;
//
// Object Names ...
string lowsName;
string highsName;
string supportName;
string resistanceName;
};
//
@@ -0,0 +1,805 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XSCZone
// Description: provides all Zone 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 <Arrays/ArrayObj.mqh>
#include <ChartObjects/ChartObjectsShapes.mqh>
#include "../Classes/x-saherelm.base.class.mq5"
#include "../Libraries/x-saherelm.draw.lib.mq5"
#include <ChartObjects/ChartObjectsTxtControls.mqh>
//
// Definitions ...
#define defZoneBGColor CLR_NONE // clrLightGray
#define defZoneLBLColor clrWhite
//
// All Required Inputs ...
struct XSCZonesInput
{
//
int length; // Calculation Length
int numberOfZones; // Number of Zones
//
double levels[]; // Levels Percentage
color colors[]; // level Colors
//
// Constructor ...
void XSCZonesInput()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
length = 0;
numberOfZones = 0;
//
Clean(levels);
Clean(colors);
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
length >= 5 &&
numberOfZones >= 2
//
;
//
return result;
}
//
// Add Specified Level/Color ...
void AddLevelColor(
double level,
color clr //
)
{
//
Add(
level,
levels);
//
Add(
clr,
colors //
);
}
//
// Retrieve Sort Indexed Levels Color ...
void RetrieveSortedLevels(
double &_levels[],
color &_colors[] //
)
{
//
Clean(_levels);
Clean(_colors);
//
int levelsCount = ArraySize(levels);
int colorsCount = ArraySize(colors);
//
bool hasChild = IsValidSize(levelsCount) &&
IsValidSize(colorsCount);
if (!hasChild)
{
return;
}
//
// Create Temp Levels ...
double tmpLevels[];
Copy(
levels,
tmpLevels //
);
ArraySort(tmpLevels);
ArrayReverse(tmpLevels);
//
// Size of Looping ...
int minSize = MathMin(levelsCount, colorsCount);
//
for (int i = 0; i < minSize; i++)
{
//
double iLevel = tmpLevels[i];
//
int iLevelIDX = FindIndex(
iLevel,
levels //
);
if (!IsValidIndex(iLevelIDX))
{
continue;
}
//
Add(
levels[iLevelIDX],
_levels //
);
//
Add(
colors[iLevelIDX],
_colors //
);
}
}
};
//
// Class ...
//
// Specific Zone ...
class XSCZone : public CObject
{
//
// Public ...
public:
//
// Props ...
double high;
double low;
int ticks;
double percent;
//
// Compare Two Zone With Each Other ...
virtual int Compare(
const CObject *node,
const int mode = 0 //
) const
{
//
const XSCZone *other = (XSCZone *)node;
//
return other.ticks - ticks;
}
//
// Create Object ...
//
// Protected ...
protected:
//
// Private ...
private:
};
//
// Zones ...
//
class XSCZones : public XSCBase
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCZones(
string symbol,
ENUM_TIMEFRAMES period //
) : XSCBase()
{
//
this.mSymbol = symbol;
this.mPeriod = period;
}
//
void ~XSCZones()
{
//
mZones.Clear();
mChartObjects.Clear();
}
//
// Initialize Zones by Providing required
// Input Variables ...
bool Init(
XSCZonesInput &inputs // Inputs ...
)
{
//
bool result = false;
//
// Validate Inputs ...
result = inputs.IsValid();
if (!result)
{
return result;
}
//
// Set Inputs ...
mInputs = inputs;
//
// Do Calculatins ...
Calculate();
//
return result;
}
//
XSCZonesInput GetInputs()
{
return mInputs;
}
//
bool SetInputs(XSCZonesInput &inputs)
{
return Init(inputs);
}
//
// Overrides ...
//
string GetTag() override
{
return "XZONE";
}
//
// Retrieve Title Prefix ...
string GetIdentifier()
{
//
string result = NULL;
//
if (!IsValid())
{
return result;
}
//
result = GetTag() + "_" +
mSymbol + "_" +
ToString(mPeriod) +
ToFormatString(mStartTime) + "_" +
ToFormatString(mEndTime);
//
return result;
}
//
bool IsValid()
{
//
bool result = false;
//
result =
//
mZones.Total() > 0
//
;
//
return result;
}
//
// Add Specified Level/Color ...
void AddLevelColor(
double level,
color clr //
)
{
//
mInputs.AddLevelColor(
level,
clr //
);
}
//
void Calculate()
{
//
// Prevent Double Calculating ...
int bars = iBars(
mSymbol,
mPeriod //
);
if (mCalculatedBars == bars)
{
return;
}
//
mCalculatedBars = bars;
//
// Calculate Start and End Time ...
//
mStartTime = iTime(
mSymbol,
mPeriod,
mInputs.length + 1 //
);
//
mEndTime = iTime(
mSymbol,
mPeriod,
0 //
);
//
// Retrieve Ticks between Times ...
Clean(mTicks);
CopyTicksRange(
mSymbol,
mTicks,
COPY_TICKS_ALL,
mStartTime * 1000,
mEndTime * 1000 //
);
//
// Retrieve Highs ...
Clean(mHighs);
CopyHigh(
mSymbol,
mPeriod,
mStartTime,
mEndTime,
mHighs //
);
//
// Find Highest Value in Range ...
int highIDX = ArrayMaximum(mHighs);
mRangeHigh = mHighs[highIDX];
//
// Retrieve Lows ...
Clean(mLows);
CopyLow(
mSymbol,
mPeriod,
mStartTime,
mEndTime,
mLows //
);
//
// Find Lowest Value in Range ...
int lowIDX = ArrayMinimum(mLows);
mRangeLow = mLows[lowIDX];
//
datetime mTimes[];
CopyTime(
mSymbol,
mPeriod,
mStartTime,
mEndTime,
mTimes //
);
mRangeHighTime = mTimes[highIDX];
mRangeLowTime = mTimes[lowIDX];
//
double mRangeSize = GetRange();
//
// Prepare Zones Array ...
mZones.Clear();
//
// Create Zones ...
for (int i = 0; i < mInputs.numberOfZones; i++)
{
//
// Instance a New Zone ...
XSCZone *iZone = new XSCZone();
//
// Calculate Each Zones High / Low based on Range ...
double iH = mRangeHigh - mRangeSize * i / mInputs.numberOfZones;
double iL = mRangeHigh - mRangeSize * (i + 1) / mInputs.numberOfZones;
//
// Set Zone High Low Properties ...
iZone.low = iL;
iZone.high = iH;
//
// Add Zone to Zone Array Objects ...
mZones.Add(iZone);
}
//
// Calculate Each Zone Ticks ...
int mTicksCount = CountTicks();
for (int i = 0; i < mTicksCount; i++)
{
//
// Retrieve i Index Tick Object ...
MqlTick iTick = mTicks[i];
//
// Loop Through Zones ...
for (int j = 0; j < mZones.Total(); j++)
{
//
// Retrieve j Index Zone Object ...
XSCZone *jZone = mZones.At(j);
//
bool isInRange = IsTickInZoneRange(
iTick,
jZone //
);
if (isInRange)
{
//
jZone.ticks++;
break;
}
}
}
//
// Calculating Zone Percents ...
for (int i = 0; i < mZones.Total(); i++)
{
//
XSCZone *iZone = mZones.At(i);
//
double percent = CalculateZoneTickPercent(iZone);
iZone.percent = percent;
}
//
mZones.Sort();
}
//
int CountZones()
{
return mZones.Total();
}
//
XSCZone *GetZone(int index)
{
return mZones.At(index);
}
//
double CalculateZoneTickPercent(
XSCZone *zone,
int normalizationDigits = 2 //
)
{
//
double result = 0;
//
if (normalizationDigits < 2 || normalizationDigits > 5)
{
normalizationDigits = 2;
}
//
int ticksCount = CountTicks();
if (ticksCount <= 0)
{
return result;
}
//
result = (double)zone.ticks / ticksCount * 100;
result = NormalizeDouble(result, normalizationDigits);
//
return result;
}
//
bool Draw(
long chartId = 0,
string prefix = "XSCZone",
int subWindow = 0,
bool redraw = false //
)
{
//
bool result = false;
//
if (redraw)
{
mChartObjects.Clear();
}
//
if (StringLen(prefix) <= 0)
{
prefix = "XSCZone";
}
//
int zonesCount = mZones.Total();
result = IsValidSize(zonesCount);
if (!result)
{
return result;
}
//
mZones.Sort();
//
int ticksCount = CountTicks();
result = IsValidSize(ticksCount);
if (!result)
{
return result;
}
//
double levels[];
color colors[];
mInputs.RetrieveSortedLevels(
levels,
colors //
);
int levelsCount = ArraySize(levels);
int colorsCount = ArraySize(colors);
bool canSetLevels = IsValidSize(levelsCount) &&
IsValidSize(colorsCount) &&
levelsCount == colorsCount;
//
// Loop Through Zones ...
for (int i = 0; i < zonesCount; i++)
{
//
XSCZone *iZone = mZones.At(i);
//
// Generate Chart Object Names ...
string iRectName = prefix + ToString(i);
string iLabelName = iRectName + "_lbl";
//
// Creating Rectangles ...
CChartObjectRectangle *iRect = new CChartObjectRectangle();
result = iRect.Create(
chartId,
iRectName,
subWindow,
mStartTime,
iZone.high,
mEndTime,
iZone.low //
);
if (!result)
{
break;
}
//
// Set Default Rectangle Color ...
// iRect.Color(defZoneBGColor);
iRect.Fill(true);
//
// Create Label ...
CChartObjectLabel *iLabel = new CChartObjectLabel();
result = iLabel.Create(
chartId,
iLabelName,
subWindow,
mStartTime,
iZone.high //
);
if (!result)
{
break;
}
//
iLabel.Color(defZoneLBLColor);
//
iLabel.Description(ToString(iZone.percent) + "%");
//
// Set Levels and Colors if Provided ...
if (canSetLevels)
{
//
color iRectColor = defZoneBGColor;
for (int z = 0; z < levelsCount; z++)
{
//
double zLevel = levels[z];
color zColor = colors[z];
//
if (iZone.ticks >= ticksCount * zLevel)
{
//
iRectColor = zColor;
break;
}
}
//
iRect.Color(iRectColor);
}
//
mChartObjects.Add(iRect);
mChartObjects.Add(iLabel);
}
//
return result;
}
//
bool Remove(
long chartId = 0,
string prefix = "XSCZone",
int subWindow = 0,
bool redraw = false //
)
{
//
bool result = false;
//
mChartObjects.Clear();
//
result =
//
true
//
;
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
datetime mStartTime;
datetime mEndTime;
//
MqlTick mTicks[];
double mHighs[];
double mLows[];
double mRangeHigh;
datetime mRangeHighTime;
double mRangeLow;
datetime mRangeLowTime;
//
CArrayObj mZones;
CArrayObj mChartObjects;
//
// Tools ...
//
int CountTicks()
{
return ArraySize(mTicks);
}
//
double GetRange()
{
return mRangeHigh - mRangeLow;
}
//
// Check a Tick is in a Zone rage or not ...
bool IsTickInZoneRange(
MqlTick &tick, // Tick For Checking
XSCZone *zone // Zone For Checking
)
{
//
bool result = false;
//
result =
//
tick.bid >= zone.low &&
tick.bid <= zone.high
//
;
//
return result;
}
//
// Private ...
private:
//
// Props ...
//
string mSymbol; // Analyzing Symbol
ENUM_TIMEFRAMES mPeriod; // Analyzing Period
//
XSCZonesInput mInputs; // Configurations
//
int mCalculatedBars; // Calculated Bars ...
};
Binary file not shown.
@@ -0,0 +1,763 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCBaseStrategy
// Description: provides all based classes for use ...
//
//
// 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.tools.lib.mq5"
#include "../Classes/x-saherelm.xtrade.class.mq5"
#include "../Classes/x-saherelm.xalert.class.mq5"
//
// Definitions ...
//
enum ENUM_X_SIGNALLING_DIRECTION
{
X_SIGNALLING_NONE = 0,
X_SIGNALLING_BOTH_DIRECTIONS = 1,
X_SIGNALLING_TREND_DIRECTION = 2,
X_SIGNALIING_TREND_REVERSAL_DIRECTION = 3
};
//
class XSCBaseStrategy : public XSCBaseAlert
{
//
// Public ...
public:
//
// Constructors ...
void XSCBaseStrategy(
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _ignoreSignalExecution = false, // Ignore Signal Execution
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _ignoreTP = false, // TP set to 0
bool _ignoreSL = false, // SL set to 0
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
)
{
//
// Fill Properties ...
mR2R = _r2r;
mVolume = _volume;
mSymbol = _symbol;
mPeriod = _period;
mTPPoint = _tpPoint;
mSLPoint = _slPoint;
mIgnoreTP = _ignoreTP;
mIgnoreSL = _ignoreSL;
mSlippage = _slippage;
mAllowLong = _allowLong;
mAllowShort = _allowShort;
mMagicNumber = _magicNumber;
mUseTPSLAsPoint = _useTPSLAsPoint;
mMaxAllowedLongs = _maxAllowedLongs;
mMaxAllowedShorts = _maxAllowedShorts;
mForceMaxTPSLAsPoint = _forceMaxTPSLAsPoint;
mIgnoreSignalExecution = _ignoreSignalExecution;
//
mForceDisabled = false;
//
// Initial Trader Class Instance ...
trader = new XSCTrade(
mSlippage,
mMagicNumber //
);
//
// Initial Time Tracker ...
barTracker.Init(
mSymbol,
mPeriod //
);
//
SetAlertPrefix(GetTag());
}
//
// Deconstructor ...
void ~XSCBaseStrategy()
{
//
delete trader;
//
Reset();
}
//
// Getter and Setter (s) ...
//
int Slippage()
{
return mSlippage;
}
//
long MagicNumber()
{
return mMagicNumber;
}
//
string Symbol()
{
return mSymbol;
}
//
ENUM_TIMEFRAMES Period()
{
return mPeriod;
}
//
bool IsDisabled()
{
return mForceDisabled;
}
//
void Disable()
{
mForceDisabled = true;
}
//
void Enable()
{
mForceDisabled = false;
}
//
double Volume()
{
return mVolume;
}
//
void Volume(double value)
{
//
if (value < 0.01)
{
value = 0.01;
}
//
mVolume = value;
}
//
double R2R()
{
return mR2R;
}
//
bool AllowLong()
{
return mAllowLong;
}
//
void AllowLong(bool value)
{
mAllowLong = value;
}
//
bool AllowShort()
{
return mAllowShort;
}
//
void AllowShort(bool value)
{
mAllowShort = value;
}
//
int MaxAllowedLongs()
{
return mMaxAllowedLongs;
}
//
void MaxAllowedLongs(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMaxAllowedLongs = value;
}
//
int MaxAllowedShorts()
{
return mMaxAllowedShorts;
}
//
void MaxAllowedShorts(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mMaxAllowedShorts = value;
}
//
int RequiredPivots()
{
return mRequiredPivots;
}
//
void RequiredPivots(int value)
{
//
if (value < 3)
{
value = 3;
}
//
mRequiredPivots = value;
}
//
int RequiredShoulders()
{
return mRequiredShoulders;
}
//
void RequiredShoulders(int value)
{
//
if (value < 5)
{
value = 5;
}
//
mRequiredShoulders = value;
}
//
bool UseTPSLAsPoint()
{
return mUseTPSLAsPoint;
}
//
void UseTPSLAsPoint(bool value)
{
mUseTPSLAsPoint = value;
}
//
bool ForceMaxTPSLAsPoint()
{
return mForceMaxTPSLAsPoint;
}
//
void ForceMaxTPSLAsPoint(bool value)
{
mForceMaxTPSLAsPoint = value;
}
//
double TPPoint()
{
return mTPPoint;
}
//
void TPPoint(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mTPPoint = value;
}
//
double SLPoint()
{
return mSLPoint;
}
//
void SLPoint(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mSLPoint = value;
}
//
bool IgnoreTP()
{
return mIgnoreTP;
}
//
void IgnoreTP(bool value)
{
mIgnoreTP = value;
}
//
bool IgnoreSL()
{
return mIgnoreSL;
}
//
void IgnoreSL(bool value)
{
mIgnoreSL = value;
}
//
bool IgnoreSignalExecution()
{
return mIgnoreSignalExecution;
}
//
void IgnoreSignalExecution(bool value)
{
mIgnoreSignalExecution = value;
}
//
// On Signal Handlers ...
void AddSignalEventHandler(TOnSignal handler)
{
//
Add(
handler,
mOnSignalEventHandlers //
);
}
//
// Virtual Methods ...
//
// Tag ...
virtual string GetTag()
{
return "XBaseStrategy";
}
//
// Check Conditions for Signal ...
// this must be Override based on each Strategy ...
virtual bool HasSignal(
XSignal &signal //
)
{
return false;
}
//
// Check Conditions For Signal and Execute Signal ...
virtual void HandleTick()
{
//
if (IsDisabled())
{
return;
}
//
if (!AllowLong() && !AllowShort())
{
return;
}
//
if (!barTracker.CanProcessBar())
{
return;
}
//
MqlTick cTick;
bool hasTick = GetTick(
mSymbol,
cTick //
);
bool isSameAsLast = cTick.time == lastTick.time;
if (isSameAsLast)
{
return;
}
//
lastTick = cTick;
//
XSignal signal;
bool hasSignal = HasSignal(signal);
if (!hasSignal)
{
return;
}
//
barTracker.Waits();
//
Execute(signal);
}
//
// Handle Signal Execution ...
virtual bool Execute(XSignal &signal)
{
//
bool result = false;
//
result = !IsDisabled();
if (!result)
{
return result;
}
//
result = signal.IsValid();
if (!result)
{
return result;
}
//
bool isLong = IsLong(signal.type);
//
result =
//
isLong
? AllowLong()
: AllowShort()
//
;
if (!result)
{
return result;
}
//
// Check Max Allowed Trades Limitation ...
if (
(isLong && MaxAllowedLongs() > 0) ||
(!isLong && MaxAllowedShorts() > 0))
{
//
// Here We Have to Count Positions ...
//
// Get and Count Positions ...
XPosition positions[];
int positionsCount = trader.GetPositions(
positions //
);
//
// Get and Count Lng and Short Positions ...
XPosition longs[];
XPosition shorts[];
ExtractPositions(
positions,
longs,
shorts //
);
int longsCount = ArraySize(longs);
int shortsCount = ArraySize(shorts);
//
result =
//
isLong
? longsCount < MaxAllowedLongs()
: shortsCount < MaxAllowedShorts()
//
;
if (!result)
{
return result;
}
}
//
// Check TP and SL ...
double points = GetPoints(signal.symbol);
if (mUseTPSLAsPoint)
{
//
double sl = 0;
double tp = 0;
bool isCalculated = !(mSLPoint > 0 || mTPPoint > 0)
? false
: CalculateTPSLByPoint(
sl,
tp,
signal.type,
signal.entry,
points,
mR2R,
mSLPoint,
mTPPoint //
);
if (isCalculated)
{
//
signal.sl = sl;
signal.tp = tp;
}
}
else if (mForceMaxTPSLAsPoint)
{
//
if (mSLPoint > 0)
{
//
double risk = signal.GetRisk();
double riskPoints = risk / points;
//
if (riskPoints > mSLPoint)
{
//
signal.sl =
isLong
? signal.entry - (mSLPoint * points)
: signal.entry + (mSLPoint * points);
}
}
//
if (mTPPoint > 0)
{
//
double reward = signal.GetReward();
double rewardPoints = reward / points;
//
if (rewardPoints > mTPPoint)
{
//
signal.tp =
isLong
? signal.entry + (mTPPoint * points)
: signal.entry - (mTPPoint * points);
}
}
}
//
if (mIgnoreTP)
{
signal.tp = 0;
}
//
if (mIgnoreSL)
{
signal.sl = 0;
}
//
// Notify Signal Event Handler(s) ...
NotifyOnSignalEventHandlers(signal);
//
// Check Signal Execution Enabled or not ...
result = !mIgnoreSignalExecution;
if (!result)
{
return result;
}
//
ENUM_X_SIGNAL_EXECUTION_RESULT state;
result = trader.ExecuteSignal(
signal,
state //
);
if (result)
{
//
string message = "Execute " + (isLong ? "Long" : "Short") + " " + signal.symbol + "/" + ToString(signal.period) + " ...";
Alert(message);
//
OnSignalExecuted(signal);
}
else
{
OnSignalExecutionFailed(signal, state);
}
//
return result;
}
//
// Calls When a Signal Executed Successfully ...
virtual void OnSignalExecuted(XSignal &signal)
{
}
//
// Calls When a Signal Execution Failed ...
virtual void OnSignalExecutionFailed(
XSignal &signal,
ENUM_X_SIGNAL_EXECUTION_RESULT result //
)
{
}
//
// Protected ...
protected:
//
int mSlippage; // Trader Slippage
long mMagicNumber; // Trader Magic Number
bool mForceDisabled; // Force Disabled
bool mAllowLong; // Allow Long Signals
bool mAllowShort; // Allow Short Signals
int mMaxAllowedLongs; // Max Allowed Longs
int mMaxAllowedShorts; // Max Allowed Shorts
//
bool mUseTPSLAsPoint; // Converts TP and SL by Provided Points
bool mForceMaxTPSLAsPoint; // Force Max TP and SL by Provided Points
double mTPPoint; // TP As Point
double mSLPoint; // SL As Point
bool mIgnoreTP; // TP set to 0
bool mIgnoreSL; // SL set to 0
bool mIgnoreSignalExecution; // Ignore Signal Execution
//
string mSymbol; // Trading Symbol ...
ENUM_TIMEFRAMES mPeriod; // Trading TimeFrame ...
//
double mR2R; // Risk/Rewar Ratio ...
double mVolume; // Static Volume Per Trades ...
//
XBarTracker barTracker; // Strategy Time Tracker ...
//
// Trend Detecting ...
int mRequiredPivots; // Required Pivots For Trend Detecting ...
int mRequiredShoulders; // Required Pivots Shoulders ...
//
XSCTrade *trader;
//
MqlTick lastTick;
//
void Reset()
{
barTracker.Clean();
}
//
// Notified Signal Event Handler(s) ...
void NotifyOnSignalEventHandlers(XSignal &signal)
{
//
if (!signal.IsValid())
{
return;
}
//
int count = ArraySize(mOnSignalEventHandlers);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
mOnSignalEventHandlers[i](signal);
}
}
//
// Private ...
private:
//
// Props ...
//
// On Signal Recieved Event Handler(s) ...
TOnSignal mOnSignalEventHandlers[];
};
//
Binary file not shown.
File diff suppressed because it is too large Load Diff
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,504 @@
///////////////////////////////////////////////////////
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------
// Name: XMGTD
// Description: Mega Trend ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XMGTD Indicator"
#property strict
//
#define ShortName "XMGTD"
//
// Imports ...
#include "../Libraries/x-saherelm.common.lib.mq5"
//
// Inputs ...
//
input group "Market";
input int length = 14; // Length
input double coeff = 2.0; // Coefficient
input double multiplier = 3.0; // Multiplier
input ENUM_APPLIED_PRICE appliedTo = PRICE_CLOSE; // Applied To
//
input group "Presentation";
input bool show = true; // Show
input bool showSTR = false; // Show STR
input bool showHTD = false; // Show HTR
input bool showATSL = false; // Show ATSL
//
// Buffers ...
//
#property indicator_chart_window
//
#property indicator_buffers 13
#property indicator_plots 6
//
#define mainBufferIndex 0
double mainBuffer[];
//
#define mainBufferColorIndex 1
double mainBufferColor[];
//
#define hideColorIDX 0
#define bullColorIDX 1
#define bearColorIDX 2
//
#property indicator_label1 "XMGTD"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 CLR_NONE, clrGreen, clrDarkRed
#property indicator_style1 STYLE_DOT
#property indicator_width1 1
//
#define atslBufferIndex 2
#define atslBufferPlotIndex 1
double atslBuffer[];
//
#define atslBufferColorIndex 3
double atslBufferColor[];
//
#property indicator_label2 "XATSL"
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_color2 CLR_NONE, clrGreen, clrDarkRed
#property indicator_style2 STYLE_DOT
#property indicator_width2 1
//
#define htdBufferIndex 4
#define htdBufferPlotIndex 2
double htdBuffer[];
//
#define htdBufferColorIndex 5
double htdBufferColor[];
//
#property indicator_label3 "XHTD"
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_color3 CLR_NONE, clrGreen, clrDarkRed
#property indicator_style3 STYLE_DOT
#property indicator_width3 1
//
#define hlBufferIndex 6
double hlBuffer[];
//
#define wmaBufferIndex 7
double wmaBuffer[];
//
#define tmpBufferIndex 8
double tmpBuffer[];
//
#define diffBufferIndex 9
double diffBuffer[];
//
#define upBufferIndex 10
double upBuffer[];
//
#define downBufferIndex 11
double downBuffer[];
//
#define directionBufferIndex 12
double directionBuffer[];
//
// Variables ...
//
int maPeriod;
double kpi;
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
maPeriod = int(length < 1 ? 1 : length);
double n1 = 2.0 * double(maPeriod - 1);
kpi = 2.0 / (n1 + 1);
//
// Define Index Buffers ...
DefineBuffers();
//
// Set Indicator ShortName ...
SetIndicatorName();
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
}
//
// Calculating what we want ...
int OnCalculate(
const int rates_total, // Total Bars on Chart ...
const int prev_calculated, // Total Calculated Bars on Charts ...
const datetime &time[], // History of Open Time ...
const double &open[], // History of Open Price ...
const double &high[], // History of High Price ...
const double &low[], // History of Low Price ...
const double &close[], // History of Close Price ...
const long &tick_volume[], // History of Tick Volumes on Bar ...
const long &volume[], // History of Trade Volumes ...
const int &spread[] // History of Spread Price ...
)
{
//
ArraySetAsSeries(high, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(close, true);
//
if (rates_total < maPeriod)
{
return 0;
}
//
int limit = rates_total - prev_calculated;
if (limit > 1)
{
//
limit = rates_total - 2;
//
ArrayInitialize(atslBuffer, EMPTY_VALUE);
ArrayInitialize(hlBuffer, 0);
ArrayInitialize(diffBuffer, 0);
ArrayInitialize(wmaBuffer, 0);
ArrayInitialize(tmpBuffer, 0);
}
//
for (int i = limit; i >= 0 && !IsStopped(); i--)
{
//
hlBuffer[i] = high[i] - low[i];
//
double href = 0;
double lref = 0;
//
double sma = MAOnArray(hlBuffer, 0, maPeriod, 0, MODE_SMA, i);
double hiLo = fmin(hlBuffer[i], sma);
//
href = (low[i] <= high[i + 1] ? high[i] - close[i + 1] : (hlBuffer[i] - close[i + 1] + high[i + 1]) / 2);
lref = (high[i] >= low[i + 1] ? close[i + 1] - low[i] : (close[i + 1] - low[i + 1] + hlBuffer[i]) / 2);
//
diffBuffer[i] = fmax(hiLo, fmax(href, lref));
}
//
for (int i = limit; i >= 0 && !IsStopped(); i--)
{
//
if (i == rates_total - 2)
{
wmaBuffer[i] = MAOnArray(diffBuffer, 0, maPeriod, 0, MODE_EMA, i);
}
else
{
wmaBuffer[i] = (diffBuffer[i] - wmaBuffer[i + 1]) * kpi + wmaBuffer[i + 1];
}
}
//
for (int i = limit; i >= 0 && !IsStopped(); i--)
{
//
double loss = wmaBuffer[i] * coeff;
if (close[i] > tmpBuffer[i + 1] && close[i + 1] > tmpBuffer[i + 1])
{
//
tmpBuffer[i] = fmax(tmpBuffer[i + 1], close[i] - loss);
//
atslBuffer[i] = tmpBuffer[i];
}
else
{
//
if (close[i] < tmpBuffer[i + 1] && close[i + 1] < tmpBuffer[i + 1])
{
//
tmpBuffer[i] = fmin(tmpBuffer[i + 1], close[i] + loss);
//
atslBuffer[i] = tmpBuffer[i];
}
else
{
//
if (close[i] > tmpBuffer[i + 1])
{
//
tmpBuffer[i] = close[i] - loss;
//
atslBuffer[i] = tmpBuffer[i];
}
else
{
//
tmpBuffer[i] = close[i] + loss;
//
atslBuffer[i] = tmpBuffer[i];
}
}
}
//
// Define Color Buffer ...
double clrValue = !showATSL
? hideColorIDX
: atslBuffer[i] > close[i]
? bearColorIDX
: bullColorIDX;
atslBufferColor[i] = clrValue;
}
//
return rates_total;
}
//
// Custom Functions ...
//
// Validate Input Args for Initialization ...
bool ValidateInputs()
{
//
bool result = false;
//
result = length >= 2 &&
coeff > 0;
//
return result;
}
//
// Set Indicator Short Name and also we can define Buffers Labels ...
void SetIndicatorName()
{
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
}
//
// Define Indexes and Styles ...
//
void DefineBuffers()
{
//
// Main ...
ENUM_DRAW_TYPE mainDrawType = show ? DRAW_COLOR_LINE : DRAW_NONE;
//
ArraySetAsSeries(mainBuffer, true);
ArraySetAsSeries(mainBufferColor, true);
PlotIndexSetInteger(mainBufferIndex, PLOT_SHOW_DATA, show);
SetIndexBuffer(mainBufferIndex, mainBuffer, INDICATOR_DATA);
PlotIndexSetInteger(mainBufferIndex, PLOT_DRAW_TYPE, mainDrawType);
SetIndexBuffer(mainBufferColorIndex, mainBufferColor, INDICATOR_COLOR_INDEX);
//
// XATSL ...
ENUM_DRAW_TYPE atslDrawType = showATSL ? DRAW_COLOR_LINE : DRAW_NONE;
//
ArraySetAsSeries(atslBuffer, true);
ArraySetAsSeries(atslBufferColor, true);
SetIndexBuffer(atslBufferIndex, atslBuffer, INDICATOR_DATA);
SetIndexBuffer(atslBufferColorIndex, atslBufferColor, INDICATOR_COLOR_INDEX);
PlotIndexSetInteger(atslBufferPlotIndex, PLOT_SHOW_DATA, showATSL);
PlotIndexSetInteger(atslBufferPlotIndex, PLOT_DRAW_TYPE, atslDrawType);
//
// XHTD ...
ENUM_DRAW_TYPE htdDrawType = showHTD ? DRAW_COLOR_LINE : DRAW_NONE;
//
SetIndexBuffer(htdBufferIndex, htdBuffer, INDICATOR_DATA);
SetIndexBuffer(htdBufferColorIndex, htdBufferColor, INDICATOR_COLOR_INDEX);
PlotIndexSetInteger(htdBufferPlotIndex, PLOT_SHOW_DATA, showHTD);
PlotIndexSetInteger(htdBufferPlotIndex, PLOT_DRAW_TYPE, htdDrawType);
//
ArraySetAsSeries(hlBuffer, true);
SetIndexBuffer(hlBufferIndex, hlBuffer, INDICATOR_CALCULATIONS);
//
ArraySetAsSeries(wmaBuffer, true);
SetIndexBuffer(wmaBufferIndex, wmaBuffer, INDICATOR_CALCULATIONS);
//
ArraySetAsSeries(tmpBuffer, true);
SetIndexBuffer(tmpBufferIndex, tmpBuffer, INDICATOR_CALCULATIONS);
//
ArraySetAsSeries(diffBuffer, true);
SetIndexBuffer(diffBufferIndex, diffBuffer, INDICATOR_CALCULATIONS);
//
SetIndexBuffer(upBufferIndex, upBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(downBufferIndex, downBuffer, INDICATOR_CALCULATIONS);
SetIndexBuffer(directionBufferIndex, directionBuffer, INDICATOR_CALCULATIONS);
}
//
// Hull Handler ...
double workHull[][2];
double iHull(
double price,
double period,
int r,
int bars,
int instanceNo = 0 //
)
{
//
if (ArrayRange(workHull, 0) != bars)
{
ArrayResize(workHull, bars);
}
//
int HmaPeriod = (int)MathMax(period, 2);
int HalfPeriod = (int)MathFloor(HmaPeriod / 2);
int HullPeriod = (int)MathFloor(MathSqrt(HmaPeriod));
double hma, hmw, weight;
instanceNo *= 2;
//
workHull[r][instanceNo] = price;
//
hmw = HalfPeriod;
hma = hmw * price;
for (int k = 1; k < HalfPeriod && (r - k) >= 0; k++)
{
//
weight = HalfPeriod - k;
hmw += weight;
hma += weight * workHull[r - k][instanceNo];
}
workHull[r][instanceNo + 1] = 2.0 * hma / hmw;
//
hmw = HmaPeriod;
hma = hmw * price;
for (int k = 1; k < period && (r - k) >= 0; k++)
{
//
weight = HmaPeriod - k;
hmw += weight;
hma += weight * workHull[r - k][instanceNo];
}
workHull[r][instanceNo + 1] -= hma / hmw;
//
hmw = HullPeriod;
hma = hmw * workHull[r][instanceNo + 1];
for (int k = 1; k < HullPeriod && (r - k) >= 0; k++)
{
//
weight = HullPeriod - k;
hmw += weight;
hma += weight * workHull[r - k][1 + instanceNo];
}
//
return (hma / hmw);
}
//
double getPrice(ENUM_APPLIED_PRICE price, const double &open[], const double &close[], const double &high[], const double &low[], int i, int bars)
{
switch (price)
{
case PRICE_CLOSE:
return (close[i]);
case PRICE_OPEN:
return (open[i]);
case PRICE_HIGH:
return (high[i]);
case PRICE_LOW:
return (low[i]);
case PRICE_MEDIAN:
return ((high[i] + low[i]) / 2.0);
case PRICE_TYPICAL:
return ((high[i] + low[i] + close[i]) / 3.0);
case PRICE_WEIGHTED:
return ((high[i] + low[i] + close[i] + close[i]) / 4.0);
// case PRICE_AVERAGE: return((high[i]+low[i]+close[i]+open[i])/4.0);
}
return (0);
}
//
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,444 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXEMRNGStrategy
// Description: provides all based classes for use ...
//
//
// 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 "../Helpers/x-saherelm.xtm.helper.mq5"
#include "../Helpers/x-saherelm.xstr.helper.mq5"
#include "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XEMRNGStartegyToken = "XEMRNG";
//
class XSCXEMRNGStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXEMRNGStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_useTPSLAsPoint,
_forceMaxTPSLAsPoint,
_tpPoint,
_slPoint,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
ConfigureRequirements();
//
SetAlertPrefix(GetTag());
}
//
// Deconstructor ...
void ~XSCXEMRNGStrategy()
{
delete mTMHelper;
delete mSTRHelper;
}
//
// Getter / Setter (s) ...
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XEMRNGStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
int start = 0;
int count = 5;
//
double tms[];
ArraySetAsSeries(tms, true);
mTMHelper.CopyMain(
start,
count,
tms //
);
//
XSTRConditions strConditions;
result = mSTRHelper.GetConditions(
strConditions,
start,
count //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!result)
{
return result;
}
//
double hh5 = cBar.FindHighest(
5,
MODE_HIGH //
);
double ll5 = cBar.FindLowest(
5,
MODE_LOW //
);
//
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
bool hasLong = false;
bool hasShort = false;
//
XOHCL tmpHSW[];
XOHCL tmpLSW[];
//
bool useHammer = true;
bool useMorningStar = false;
bool useBullishEngulfing = true;
bool useBullishMaurubozu = true;
//
bool useShootingStar = true;
bool useEveningStar = false;
bool useBearishEngulfing = true;
bool useBearishMaurubozu = true;
//
// Long ...
//
bool isHammer = !useHammer
? false
: cBar.IsHammer();
bool isMorningStar = !useMorningStar
? false
: cBar.IsMorningStar();
bool isBullishMarubozu = !useBullishEngulfing
? false
: cBar.IsBullishMarubozu();
bool isBullishEngulfing = !useBullishMaurubozu
? false
: cBar.IsBullishEngulfing();
//
bool isBullishTrend = cBar.HasBullishTrend(
tmpHSW,
tmpLSW,
true //
);
//
// Find Swing Low Above of EMA ...
// Find Swing High Above of EMA ...
// Fins Swing Low Below of EMA ...
// Detect Bullish Pattern ...
hasLong =
//
cBar.IsBullish()
//
&&
//
isBullishTrend
//
&&
//
cBar.close > tms[1]
//
&&
//
ll5 < tms[1]
//
&&
//
strConditions.isTrendSwitchedToBullish
//
&&
//
(
//
isHammer
//
||
//
isMorningStar
//
||
//
isBullishMarubozu
//
||
//
isBullishEngulfing
//
)
//
;
if (hasLong)
{
//
type = POSITION_TYPE_BUY;
//
sl = tmpLSW[ArraySize(tmpLSW) - 1].low;
}
//
// Short ...
bool isShootingStar = !useShootingStar
? false
: cBar.IsShootingStar();
bool isEveningStar = !useEveningStar
? false
: cBar.IsEveningStar();
bool isBearishEngulfing = !useBearishEngulfing
? false
: cBar.IsBearishEngulfing();
bool isBearishMaurubozu = !useBearishMaurubozu
? false
: cBar.IsBearishMarubozu();
//
bool isBearishTrend = cBar.HasBearishTrend(
tmpHSW,
tmpLSW,
true //
);
//
hasShort =
//
cBar.IsBearish()
//
&&
//
isBearishTrend
//
&&
//
cBar.close < tms[1]
//
&&
//
hh5 > tms[1]
//
&&
//
strConditions.isTrendSwitchedToBearish
//
&&
//
(
//
isShootingStar
//
||
//
isEveningStar
//
||
//
isBearishEngulfing
//
||
//
isBearishMaurubozu
//
)
//
;
if (hasShort)
{
//
type = POSITION_TYPE_SELL;
//
sl = tmpHSW[ArraySize(tmpHSW) - 1].high;
}
//
result = hasLong || hasShort;
if (!result)
{
return result;
}
//
entry = GetEntry(mSymbol, type);
CalculateTPSLByPrice(
sl,
tp,
type,
entry,
r2r //
);
//
result = signal.Prepare(
mSymbol,
GetTag(),
mPeriod,
type,
mode,
entry,
mVolume,
sl,
tp //
);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
XTMInputs mTMInputs; // Tren Magic Inputs ...
XSCXTMHelper *mTMHelper; // Trend Magic Helper Class ...
//
XSTRInputs mSTRInputs; // Super Trend Inputs ...
XSCXSTRHelper *mSTRHelper; // Super Trend Helper Class ...
//
// Private ...
private:
//
//
// Set Default TM Inputs ...
void ConfigureRequirements()
{
//
mTMInputs.maShift = 0;
mTMInputs.maPeriod = 100;
mTMInputs.maMethod = MODE_EMA;
mTMInputs.maAppliedTo = PRICE_CLOSE;
//
mTMInputs.showLine = true;
//
mTMHelper = new XSCXTMHelper();
//
mTMHelper.Init(
mSymbol,
mPeriod,
mTMInputs //
);
//
mSTRInputs.length = 14;
mSTRInputs.multiplier = 3.5;
mSTRInputs.appliedTo = PRICE_CLOSE;
//
mSTRInputs.showTrends = true;
mSTRInputs.fillTrends = false;
//
mSTRHelper = new XSCXSTRHelper();
mSTRHelper.Init(
mSymbol,
mPeriod,
mSTRInputs //
);
}
};
//
@@ -0,0 +1,823 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXOBVGStrategy
// Description: provides all based classes for use ...
//
//
// 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 "../Helpers/x-saherelm.xosc.helper.mq5"
#include "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XOBVGStartegyToken = "XOBVG";
//
class XSCXOBVGStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXOBVGStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
ENUM_TIMEFRAMES _analyzingPeriod, // Analyzing Period
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_useTPSLAsPoint,
_forceMaxTPSLAsPoint,
_tpPoint,
_slPoint,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
mAnalyzingPeriod = _analyzingPeriod;
//
SetAlertPrefix(GetTag());
//
PrepareRequirements();
//
fvgUpper = 0;
fvgLower = 0;
isFVGTouched = false;
//
oBar.Clean();
oBullishOrderBlock.Clean();
oBearishOrderBlock.Clean();
}
//
// Deconstructor ...
void ~XSCXOBVGStrategy()
{
delete oscHelper;
}
//
// Getter / Setter (s) ...
//
ENUM_TIMEFRAMES AnalyzingPeriod()
{
return mAnalyzingPeriod;
}
//
void AnalyzingPeriod(ENUM_TIMEFRAMES value)
{
mAnalyzingPeriod = value;
}
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XOBVGStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
bool hasLong = false;
bool hasShort = false;
//
// For Trend ...
XOHCL tmpHSW[];
XOHCL tmpLSW[];
//
// For Verifications ...
//
bool useHammer = true;
bool useMorningStar = false;
bool useBullishEngulfing = true;
bool useBullishMaurubozu = true;
//
bool useShootingStar = true;
bool useEveningStar = false;
bool useBearishEngulfing = true;
bool useBearishMaurubozu = true;
//
// Bar On Trading Period ...
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!result)
{
return result;
}
//
// 3 Bar LL and HH ...
double ll3 = cBar.FindLowest(
3,
MODE_LOW //
);
double hh3 = cBar.FindHighest(
3,
MODE_HIGH //
);
//
double atr = oscHelper.GetATR(1);
//
// Check OB Finder Bar ...
result = oBar.IsValid();
if (!result)
{
//
// Init OB Finder Bar ...
result = oBar.Init(
mSymbol,
mAnalyzingPeriod,
1 //
);
if (!result)
{
return result;
}
}
//
bool hasBullishOrderBlock = oBullishOrderBlock.IsValid();
bool hasBearishOrderBlock = oBearishOrderBlock.IsValid();
//
// Here we Have to Check Order Block Age ...
//
if (hasBullishOrderBlock)
{
//
int age = oBullishOrderBlock.Index();
result = age <= 26;
if (!result)
{
//
oBar.Clean();
oBullishOrderBlock.Clean();
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
RemoveDraws();
//
return result;
}
}
//
if (hasBearishOrderBlock)
{
//
int age = oBearishOrderBlock.Index();
result = age <= 26;
if (!result)
{
//
oBar.Clean();
oBearishOrderBlock.Clean();
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
RemoveDraws();
//
return result;
}
}
//
hasBullishOrderBlock = oBullishOrderBlock.IsValid();
hasBearishOrderBlock = oBearishOrderBlock.IsValid();
result =
//
hasBullishOrderBlock
//
||
//
hasBearishOrderBlock
//
;
if (!result)
{
//
// Detect Order Blocks ...
hasBullishOrderBlock = oBar.HasBullishOrderBlock(oBullishOrderBlock);
hasBearishOrderBlock = oBar.HasBearishOrderBlock(oBearishOrderBlock);
//
// Check OB Detected ...
result =
//
hasBullishOrderBlock
//
||
//
hasBearishOrderBlock
//
;
if (!result)
{
//
oBar.Clean();
oBullishOrderBlock.Clean();
oBearishOrderBlock.Clean();
//
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
return result;
}
}
//
// Long ...
if (hasBullishOrderBlock)
{
//
DrawBullishOrderBlock(
oBullishOrderBlock,
ChartID() //
);
//
// Detect an FVG Inside Order Block in Trading Period ...
result = FindBullishFVGInsideOrderBlock();
if (!result)
{
//
oBar.Clean();
oBullishOrderBlock.Clean();
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
RemoveDraws();
//
return result;
}
//
// Now We Have to Waits Until Price reached the FVG ...
if (!isFVGTouched)
{
//
isFVGTouched = ll3 < fvgUpper;
fvgTouchDate = TimeCurrent();
}
//
result = isFVGTouched;
if (!result)
{
return result;
}
//
// Now we Have to Wait for Pressure ...
//
bool isHammer = !useHammer
? false
: cBar.IsHammer();
bool isMorningStar = !useMorningStar
? false
: cBar.IsMorningStar();
bool isBullishMarubozu = !useBullishEngulfing
? false
: cBar.IsBullishMarubozu();
bool isBullishEngulfing = !useBullishMaurubozu
? false
: cBar.IsBullishEngulfing();
//
bool isBullishTrend = oBar.HasBullishTrend(
tmpHSW,
tmpLSW,
false //
);
//
hasLong =
//
true // isBullishTrend
//
&&
//
(
//
isHammer
//
||
//
isMorningStar
//
||
//
isBullishMarubozu
//
||
//
isBullishEngulfing
//
)
//
;
result = hasLong;
if (!result)
{
//
// Check FVG Touch Date ...
int cTimeSec = (int)TimeCurrent();
int tTimeSec = (int)fvgTouchDate;
int periodSec = PeriodSeconds(mPeriod);
int touchAge = (cTimeSec - tTimeSec) / periodSec;
if (touchAge >= 10)
{
//
oBar.Clean();
oBullishOrderBlock.Clean();
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
RemoveDraws();
}
//
return result;
}
//
type = POSITION_TYPE_BUY;
sl = cBar.low - atr;
}
//
// Short ...
if (hasBearishOrderBlock)
{
//
DrawBearishOrderBlock(
oBearishOrderBlock,
ChartID() //
);
//
// Detect an FVG Inside Order Block in Trading Period ...
result = FindBearishFVGInsideOrderBlock();
if (!result)
{
//
oBar.Clean();
oBearishOrderBlock.Clean();
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
RemoveDraws();
//
return result;
}
//
// Now We Have to Waits Until Price reached the FVG ...
if (!isFVGTouched)
{
//
isFVGTouched = hh3 > fvgLower;
fvgTouchDate = TimeCurrent();
}
//
result = isFVGTouched;
if (!result)
{
return result;
}
//
// Now we Have to Wait for Pressure ...
//
// Short ...
bool isShootingStar = !useShootingStar
? false
: cBar.IsShootingStar();
bool isEveningStar = !useEveningStar
? false
: cBar.IsEveningStar();
bool isBearishEngulfing = !useBearishEngulfing
? false
: cBar.IsBearishEngulfing();
bool isBearishMaurubozu = !useBearishMaurubozu
? false
: cBar.IsBearishMarubozu();
//
bool isBearishTrend = oBar.HasBearishTrend(
tmpHSW,
tmpLSW,
false //
);
//
hasShort =
//
true // isBearishTrend
//
&&
//
(
//
isShootingStar
//
||
//
isEveningStar
//
||
//
isBearishEngulfing
//
||
//
isBearishMaurubozu
//
)
//
;
result = hasShort;
if (!result)
{
//
// Check FVG Touch Date ...
int cTimeSec = (int)TimeCurrent();
int tTimeSec = (int)fvgTouchDate;
int periodSec = PeriodSeconds(mPeriod);
int touchAge = (cTimeSec - tTimeSec) / periodSec;
if (touchAge >= 10)
{
//
oBar.Clean();
oBearishOrderBlock.Clean();
fvgUpper = 0;
fvgLower = 0;
fvgTouchDate = NULL;
isFVGTouched = false;
//
RemoveDraws();
}
//
return result;
}
//
type = POSITION_TYPE_SELL;
sl = cBar.high + atr;
}
//
result = hasLong || hasShort;
if (!result)
{
return result;
}
//
entry = GetEntry(mSymbol, type);
CalculateTPSLByPrice(
sl,
tp,
type,
entry,
r2r //
);
//
result = signal.Prepare(
mSymbol,
GetTag(),
mPeriod,
type,
mode,
entry,
mVolume,
sl,
tp //
);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
ENUM_TIMEFRAMES mAnalyzingPeriod; // Analyzing Period
//
XOSCInputs oscInputs;
XSCXOSCHelper *oscHelper;
//
// Private ...
private:
//
// Props ...
//
XOHCL oBar;
XOHCL oBullishOrderBlock;
XOHCL oBearishOrderBlock;
//
double fvgUpper;
double fvgLower;
bool isFVGTouched;
datetime fvgTouchDate;
//
void PrepareRequirements()
{
//
oscInputs.Default();
oscHelper = new XSCXOSCHelper();
oscHelper.Init(
mSymbol,
mPeriod,
oscInputs //
);
}
//
bool FindBullishFVGInsideOrderBlock()
{
//
bool result = false;
//
result = oBullishOrderBlock.IsValid();
if (!result)
{
return result;
}
//
int totalBars = iBars(
mSymbol,
mPeriod //
);
int maxAllowed = totalBars / 10;
//
for (int i = 0; i < maxAllowed; i++)
{
//
XOHCL iBar;
result = iBar.Init(
mSymbol,
mPeriod,
i //
);
if (!result)
{
break;
}
//
result = iBar.HasBullishFVG(
fvgUpper,
fvgLower //
);
if (!result)
{
continue;
}
//
// Check FVG has Correlation by OB ...
result =
//
// Full Inside ...
(fvgUpper <= oBullishOrderBlock.high &&
fvgLower >= oBullishOrderBlock.low)
//
||
//
(fvgUpper > oBullishOrderBlock.high &&
fvgLower >= oBullishOrderBlock.low &&
fvgLower <= oBullishOrderBlock.high)
//
||
//
(fvgUpper > oBullishOrderBlock.low &&
fvgUpper <= oBullishOrderBlock.high &&
fvgLower < oBullishOrderBlock.low)
//
;
if (result)
{
//
DrawBullishFVG(
iBar,
fvgUpper,
fvgLower,
ChartID() //
);
//
break;
}
}
//
return result;
}
//
bool FindBearishFVGInsideOrderBlock()
{
//
bool result = false;
//
result = oBearishOrderBlock.IsValid();
if (!result)
{
return result;
}
//
int totalBars = iBars(
mSymbol,
mPeriod //
);
int maxAllowed = totalBars / 10;
//
for (int i = 0; i < maxAllowed; i++)
{
//
XOHCL iBar;
result = iBar.Init(
mSymbol,
mPeriod,
i //
);
if (!result)
{
break;
}
//
result = iBar.HasBearishFVG(
fvgUpper,
fvgLower //
);
if (!result)
{
continue;
}
//
// Check FVG has Correlation by OB ...
result =
//
// Full Inside ...
(fvgUpper <= oBearishOrderBlock.high &&
fvgLower >= oBearishOrderBlock.low)
//
||
//
(fvgUpper > oBearishOrderBlock.high &&
fvgLower >= oBearishOrderBlock.low &&
fvgLower <= oBearishOrderBlock.high)
//
||
//
(fvgUpper > oBearishOrderBlock.low &&
fvgUpper <= oBearishOrderBlock.high &&
fvgLower < oBearishOrderBlock.low)
//
;
if (result)
{
//
DrawBearishFVG(
iBar,
fvgUpper,
fvgLower,
ChartID() //
);
//
break;
}
}
//
return result;
}
};
//
@@ -0,0 +1,742 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXPVFMCStrategy
// Description: provides all based classes for use ...
//
//
// 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 "../Helpers/x-saherelm.xhk.helper.mq5"
#include "../Helpers/x-saherelm.xmc.helper.mq5"
#include "../Helpers/x-saherelm.xtd.helper.mq5"
#include "../Helpers/x-saherelm.xpv.helper.mq5"
#include "../Helpers/x-saherelm.xvlm.helper.mq5"
#include "../Helpers/x-saherelm.xosc.helper.mq5"
#include "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XPVFMCStartegyToken = "XPVFMC";
//
class XSCXPVFMCStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXPVFMCStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_useTPSLAsPoint,
_forceMaxTPSLAsPoint,
_tpPoint,
_slPoint,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
SetAlertPrefix(GetTag());
//
PrepareRequirements();
}
//
// Deconstructor ...
void ~XSCXPVFMCStrategy()
{
//
delete mcHelper;
delete pvHelper;
delete tdHelper;
delete hkHelper;
delete oscHelper;
delete vlmHelper;
}
//
// Getter / Setter (s) ...
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XPVFMCStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
bool hasLong = false;
bool hasShort = false;
//
// XMC ...
XMCConditions mcConditions;
result = mcHelper.GetConditions(mcConditions);
if (!result)
{
return result;
}
//
// XPV ...
XPVConditions pvConditions;
result = pvHelper.GetConditions(pvConditions);
if (!result)
{
return result;
}
//
// XTD ...
XTDConditions tdConditions;
result = tdHelper.GetConditions(tdConditions);
if (!result)
{
return result;
}
//
// XHK ...
XHKConditions hkConditions;
result = hkHelper.GetConditions(hkConditions);
if (!result)
{
return result;
}
//
// XVLM ...
XVLMConditions vlmConditions;
result = vlmHelper.GetConditions(vlmConditions);
//
double atr = oscHelper.GetATR(1);
//
double rsis[];
ArraySetAsSeries(rsis, true);
oscHelper.CopyRSI(
0,
3,
rsis //
);
//
double points = GetPoints(mSymbol);
//
int zIndex = 0;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
// For Trend ...
XOHCL tmpHSW[];
XOHCL tmpLSW[];
//
// For Verifications ...
//
// Bar On Trading Period ...
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
cIndex //
);
if (!result)
{
return result;
}
// //
// // Find Lowest Low and Highest High ...
// double hh3 = cBar.FindHighest(
// 3,
// MODE_HIGH //
// );
// double ll3 = cBar.FindLowest(
// 3,
// MODE_LOW //
// );
//
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
bool hasBullishPattern = HasBullishPattern(cBar);
bool isBullishTrend = cBar.HasBullishTrend(
tmpHSW,
tmpLSW,
true //
);
//
bool hasBearishPattern = HasBearishPattern(cBar);
//
bool isBearishTrend = cBar.HasBearishTrend(
tmpHSW,
tmpLSW,
false //
);
//
// Check Support Exists or Find ...
bool hasSupport = support.IsValid();
if (!hasSupport)
{
//
hasSupport =
//
cBar.HasSupport(support)
//
&&
//
MathAbs(pvConditions.fib3s[cIndex] - support.high) <= 10 * points
//
;
}
//
// Check Resistance Exists or Find ...
bool hasResistance = resistance.IsValid();
if (!hasResistance)
{
//
hasResistance =
//
cBar.HasResistance(resistance)
//
&&
//
MathAbs(pvConditions.fib3s[cIndex] - resistance.low) <= 10 * points
//
;
}
//
if (hasSupport)
{
//
DrawSupport(
support,
ChartID() //
);
//
supportTime = cBar.time;
//
// Check Price is Around Support ...
double priceDiff = MathMin(
MathAbs(cBar.low - support.high),
MathAbs(cBar.high - support.high)) /
points;
result =
//
priceDiff <= 50
//
;
if (!result)
{
//
CheckSupportValidation();
return result;
}
//
if (result && !isSupportTested)
{
isSupportTested = true;
}
//
// Long ...
hasLong =
//
(
//
isBullishTrend
//
||
//
hasBullishPattern
//
)
//
&&
//
(
//
(tdConditions.isSwitchedToBullish &&
hkConditions.isSMHKBullish)
//
||
//
(hkConditions.isSMHKSwitchedToBullish &&
tdConditions.isBullish)
//
||
//
(mcConditions.isFastCrossedOverSlow &&
mcConditions.isSlowOverVerifier)
//
)
//
;
//
if (hasLong)
{
//
type = POSITION_TYPE_BUY;
XOHCL swingLow;
bool hasSwing = cBar.FindLastSwingLow(swingLow);
if (!hasSwing)
{
sl = support.high - (50 * points);
}
else
{
//
DrawSwingLow(swingLow, ChartID());
sl = swingLow.low - atr;
RemoveSwingLow(swingLow);
swingLow.Clean();
}
}
}
// //
// if (hasResistance)
// {
// //
// DrawResistance(
// support,
// ChartID() //
// );
// //
// supportTime = cBar.time;
// //
// // Check Price is Around Support ...
// double priceDiff = MathMin(
// MathAbs(cBar.low - support.high),
// MathAbs(cBar.high - support.high)) /
// points;
// result =
// //
// priceDiff <= 50
// //
// ;
// if (!result)
// {
// //
// CheckResistanceValidation();
// return result;
// }
// //
// if (result && !isResistanceTested)
// {
// isResistanceTested = true;
// }
// }
//
result = hasLong || hasShort;
if (!result)
{
//
CheckSupportValidation();
return result;
}
//
if (hasSupport)
{
//
isSupportTested = false;
supportTime = NULL;
RemoveSupport(support);
support.Clean();
}
//
if (hasResistance)
{
//
isResistanceTested = false;
resistanceTime = NULL;
RemoveResistance(resistance);
resistance.Clean();
}
//
entry = GetEntry(mSymbol, type);
CalculateTPSLByPrice(
sl,
tp,
type,
entry,
r2r //
);
//
result = signal.Prepare(
mSymbol,
GetTag(),
mPeriod,
type,
mode,
entry,
mVolume,
sl,
tp //
);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
XOHCL support;
XOHCL resistance;
//
// XMC ...
XMCInputs mcInputs;
XSCXMCHelper *mcHelper;
//
XTDInputs tdInputs;
XSCXTDHelper *tdHelper;
//
// XPV ...
XPVInputs pvInputs;
XSCXPVHelper *pvHelper;
//
// XOSC ...
XOSCInputs oscInputs;
XSCXOSCHelper *oscHelper;
//
// XVLM ...
XVLMInputs vlmInputs;
XSCXVLMHelper *vlmHelper;
//
// XHK ...
XHKInputs hkInputs;
XSCXHKHelper *hkHelper;
//
// Private ...
private:
//
// Props ...
//
void PrepareRequirements()
{
//
support.Clean();
supportTime = NULL;
isSupportTested = false;
//
resistance.Clean();
resistanceTime = NULL;
isResistanceTested = false;
//
// Prepare XTD ...
tdInputs.Default();
//
tdHelper = new XSCXTDHelper();
tdHelper.Init(
mSymbol,
mPeriod,
tdInputs //
);
//
// Preparing XHK ...
hkInputs.Default();
hkInputs.smoothingLength = 14;
//
hkInputs.drawHikenAshi = false;
hkInputs.drawSmoothedHikenAshi = true;
//
hkHelper = new XSCXHKHelper();
hkHelper.Init(
mSymbol,
mPeriod,
hkInputs //
);
//
// Preparing XMC ...
mcInputs.Default();
//
mcInputs.showSar = false;
mcInputs.showFastMa = true;
mcInputs.showSlowMa = true;
mcInputs.showVerifierMa = true;
//
mcHelper = new XSCXMCHelper();
mcHelper.Init(
mSymbol,
mPeriod,
mcInputs //
);
//
// Preparing XPV ...
pvInputs.Default();
//
pvInputs.showPeaksAndVales = true;
pvInputs.showLevels = false;
pvInputs.showConsolidations = false;
pvInputs.showFibo1Levels = false;
pvInputs.showFibo2Levels = false;
pvInputs.showFibo3Levels = true;
pvInputs.showFibo4Levels = false;
pvInputs.showFibo5Levels = false;
//
pvHelper = new XSCXPVHelper();
pvHelper.Init(
mSymbol,
mPeriod,
pvInputs //
);
//
// Preparing XOSC ...
oscInputs.Default();
oscHelper = new XSCXOSCHelper();
oscHelper.Init(
mSymbol,
mPeriod,
oscInputs //
);
//
// Preparing XVLM ...
vlmInputs.Default();
vlmHelper = new XSCXVLMHelper();
vlmHelper.Init(
mSymbol,
mPeriod,
vlmInputs //
);
}
//
bool isSupportTested;
datetime supportTime;
void CheckSupportValidation()
{
//
if (!isSupportTested)
{
//
if (support.IsValid() && IsValid(supportTime))
{
//
int age = (int)(((int)(TimeToSeconds(TimeCurrent()) - TimeToSeconds(supportTime))) / PeriodSeconds(mPeriod));
if (age >= 50)
{
//
isSupportTested = false;
supportTime = NULL;
RemoveSupport(support);
support.Clean();
}
}
return;
}
//
XOHCL cBar;
bool isInited = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!isInited)
{
return;
}
//
double points = GetPoints(mSymbol);
//
// Find Price Distance ...
double highDiff = MathAbs(cBar.high - support.high);
double lowDiff = MathAbs(cBar.low - support.high);
//
bool isBreaked = MathMax(highDiff, lowDiff) >= 100 * points;
if (!isBreaked)
{
return;
}
//
isSupportTested = false;
RemoveSupport(support);
supportTime = NULL;
support.Clean();
}
//
bool isResistanceTested;
datetime resistanceTime;
void CheckResistanceValidation()
{
//
if (!isResistanceTested)
{
//
if (resistance.IsValid() && IsValid(resistanceTime))
{
//
int age = (int)(((int)(TimeToSeconds(TimeCurrent()) - TimeToSeconds(resistanceTime))) / PeriodSeconds(mPeriod));
if (age >= 50)
{
//
isResistanceTested = false;
resistanceTime = NULL;
RemoveResistance(resistance);
resistance.Clean();
}
}
return;
}
//
XOHCL cBar;
bool isInited = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!isInited)
{
return;
}
//
double points = GetPoints(mSymbol);
//
// Find Price Distance ...
double highDiff = MathAbs(cBar.high - resistance.low);
double lowDiff = MathAbs(cBar.low - resistance.low);
//
bool isBreaked = MathMax(highDiff, lowDiff) >= 100 * points;
if (!isBreaked)
{
return;
}
//
isResistanceTested = false;
RemoveResistance(resistance);
resistanceTime = NULL;
resistance.Clean();
}
};
//
@@ -0,0 +1,723 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXSRBRStrategy
// Description: provides all based classes for use ...
//
//
// 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 "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XSRBRStartegyToken = "XSRBR";
//
class XSCXSRBRStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXSRBRStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
ENUM_TIMEFRAMES _analyzingPeriod, // Analyzing Timeframe
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0,
ENUM_X_SIGNALLING_DIRECTION _signallingDirection = X_SIGNALLING_TREND_DIRECTION // Signalling in Which Direction
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_useTPSLAsPoint,
_forceMaxTPSLAsPoint,
_tpPoint,
_slPoint,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
mAnalyzingPeriod = _analyzingPeriod;
mSignallingDirection = _signallingDirection;
//
SetAlertPrefix(GetTag());
}
//
// Getter / Setter (s) ...
//
ENUM_X_SIGNALLING_DIRECTION SignallingDirection()
{
return mSignallingDirection;
}
//
void SignallingDirection(ENUM_X_SIGNALLING_DIRECTION value)
{
mSignallingDirection = value;
}
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XSRBRStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
double _threshold = 5;
double threshold = GetPoints(mSymbol) * _threshold;
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
// Check Signalling Direction ...
result = mSignallingDirection != X_SIGNALLING_NONE;
if (!result)
{
return result;
}
//
// Check Conditions Exists ...
result = HasRequirements();
if (!result)
{
//
// Prepare Conditions ...
result = PrepareRequirements();
if (!result)
{
return result;
}
}
//
// Implement Signalling Conditions ...
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
1 //
);
//
// Check Analyzing Period Contains a Trend or not ...
//
// Detecting Trend ...
bool isInBullishTrend = false;
bool isInBearishTrend = false;
//
// Verify Pressure for Signals ...
bool verifyPressure = true;
bool checkTrensByMethod2 = false;
//
bool checkHammer = false;
bool checkMorningStar = false;
bool checkBullishEngulfing = true;
//
bool checkShootingStar = false;
bool checkEveningStar = false;
bool checkBearishEngulfing = true;
//
isInBullishTrend = bar.HasBullishTrend(
highSwingBars,
lowSwingBars,
checkTrensByMethod2 //
);
if (!isInBullishTrend)
{
//
isInBearishTrend = bar.HasBearishTrend(
highSwingBars,
lowSwingBars,
checkTrensByMethod2 //
);
}
//
// Only Looks For Signals if aTrend Detected ...
result = isInBullishTrend || isInBearishTrend;
if (!result)
{
//
ResetRequirements();
return result;
}
//
if (isInBullishTrend)
{
//
DrawBullishTrend(
cBar,
highSwingBars,
lowSwingBars,
ChartID(),
true,
true //
);
}
else
{
//
DrawBearishTrend(
cBar,
highSwingBars,
lowSwingBars,
ChartID(),
true,
true //
);
}
//
// Here We have to Decide Trend or Reversal Act ...
//
// Check Trend Direction Signal ...
if (mSignallingDirection == X_SIGNALLING_BOTH_DIRECTIONS ||
mSignallingDirection == X_SIGNALLING_TREND_DIRECTION)
{
//
if (isInBullishTrend)
{
//
// Find Long Signals ...
// since we are in Bullish Trend and
// we must do Trend Trading ...
//
// In Trend Trading we must Waits for :
// - Support Rejection;
//
// Support Rejecting Hppens when Price Go Down of Support area and
// Go Up or
// Price Recive a Candlestic Pattern ...
//
// this Moving Up Make us Ready for Reciving a
// Candlestick Pattern which Prove us Buyers Pressure ...
// - Hammer;
// - Morning Star;
// - Bullish Engulfing;
//
XOHCL tmpSWH[];
XOHCL tmpSWL[];
//
bool isSupportRejected = IsSupportRejected(support, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
bool isResistanceBreaked = IsResistanceBreaked(resistance, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
//
bool isBullishTrend = cBar.HasBullishTrend(
tmpSWH,
tmpSWL,
true //
);
//
result =
//
isBullishTrend
//
&&
//
(
//
isSupportRejected
//
||
//
isResistanceBreaked
//
)
//
;
//
if (result)
{
//
type = POSITION_TYPE_BUY;
//
if (isSupportRejected)
{
//
sl = support.low - threshold;
RemoveSupport(support);
support.Clean();
}
//
if (isResistanceBreaked)
{
//
sl = resistance.low - threshold;
RemoveResistance(resistance);
resistance.Clean();
}
//
RemoveDraws(XTLSBullishTrendToken);
RemoveDraws(XTLSBearishTrendToken);
}
}
else if (isInBearishTrend)
{
//
// Find Short Signals ...
// since we are in Bearish Trend and
// we must do Trend Trading ...
//
XOHCL tmpSWH[];
XOHCL tmpSWL[];
//
bool isSupportBreaked = IsSupportBreaked(support, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
bool isResistanceRejected = IsResistanceRejected(resistance, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
//
bool isBearishTrend = cBar.HasBearishTrend(
tmpSWH,
tmpSWL,
true //
);
//
result =
//
isBearishTrend
//
&&
//
(
//
isSupportBreaked
//
||
//
isResistanceRejected
//
)
//
;
//
if (result)
{
//
type = POSITION_TYPE_SELL;
//
if (isSupportBreaked)
{
//
sl = support.high + threshold;
RemoveSupport(support);
support.Clean();
}
//
if (isResistanceRejected)
{
//
sl = resistance.high + threshold;
RemoveResistance(resistance);
resistance.Clean();
}
//
RemoveDraws(XTLSBullishTrendToken);
RemoveDraws(XTLSBearishTrendToken);
}
}
}
else
{
result = false;
}
//
// Check Trend Reversal Direction Signal ...
if (!result &&
(mSignallingDirection == X_SIGNALLING_BOTH_DIRECTIONS ||
mSignallingDirection == X_SIGNALIING_TREND_REVERSAL_DIRECTION))
{
//
if (isInBullishTrend)
{
//
// Find Short Signals ...
// since we are in Bullish Trend and
// we must do Trend Reversal Trading ...
//
XOHCL tmpSWH[];
XOHCL tmpSWL[];
//
bool isSupportBreaked = IsSupportBreaked(support, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
bool isResistanceRejected = IsResistanceRejected(resistance, verifyPressure, checkShootingStar, checkEveningStar, checkBearishEngulfing);
//
bool isBearishTrend = cBar.HasBearishTrend(
tmpSWH,
tmpSWL,
true //
);
//
result =
//
true // isBearishTrend
//
&&
//
(
//
isSupportBreaked
//
||
//
isResistanceRejected
//
)
//
;
//
if (result)
{
//
type = POSITION_TYPE_SELL;
//
if (isSupportBreaked)
{
//
sl = support.high + threshold;
RemoveSupport(support);
support.Clean();
}
//
if (isResistanceRejected)
{
//
sl = resistance.high + threshold;
RemoveResistance(resistance);
resistance.Clean();
}
//
RemoveDraws(XTLSBullishTrendToken);
RemoveDraws(XTLSBearishTrendToken);
}
}
else if (isInBearishTrend)
{
//
// Find Long Signals ...
// since we are in Bearish Trend and
// we must do Trend Reversal Trading ...
//
XOHCL tmpSWH[];
XOHCL tmpSWL[];
//
bool isSupportRejected = IsSupportRejected(support, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
bool isResistanceBreaked = IsResistanceBreaked(resistance, verifyPressure, checkHammer, checkMorningStar, checkBullishEngulfing);
//
bool isBullishTrend = cBar.HasBullishTrend(
tmpSWH,
tmpSWL,
true //
);
//
result =
//
true // isBullishTrend
//
&&
//
(
//
isSupportRejected
//
||
//
isResistanceBreaked
//
)
//
;
//
if (result)
{
//
type = POSITION_TYPE_BUY;
//
if (isSupportRejected)
{
//
sl = support.low - threshold;
RemoveSupport(support);
support.Clean();
}
//
if (isResistanceBreaked)
{
//
sl = resistance.low - threshold;
RemoveResistance(resistance);
resistance.Clean();
}
//
RemoveDraws(XTLSBullishTrendToken);
RemoveDraws(XTLSBearishTrendToken);
}
}
}
//
// Make Sure Signal Exists ...
if (!result)
{
//
RemoveDraws(XTLSBullishTrendToken);
RemoveDraws(XTLSBearishTrendToken);
//
ResetRequirements();
return result;
}
//
entry = GetEntry(mSymbol, type);
CalculateTPSLByPrice(
sl,
tp,
type,
entry,
r2r //
);
//
result = signal.Prepare(
mSymbol,
GetTag(),
mPeriod,
type,
mode,
entry,
mVolume,
sl,
tp //
);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
ENUM_TIMEFRAMES mAnalyzingPeriod; // Analyzing Period
ENUM_X_SIGNALLING_DIRECTION mSignallingDirection; // Signalling Direction
//
XOHCL bar;
//
// Pivots ...
XOHCL support;
XOHCL resistance;
//
XOHCL lowSwingBars[];
XOHCL highSwingBars[];
//
// Private ...
private:
//
//
// Check Requirements Exists or not ...
bool HasRequirements()
{
//
bool result = false;
//
result =
//
bar.IsValid() &&
support.IsValid() &&
resistance.IsValid()
//
;
//
return result;
}
//
// Prepare Requirements ...
bool PrepareRequirements()
{
//
bool result = false;
//
if (support.IsValid())
{
RemoveSupport(support);
}
//
// Finding Analyzing Bar ...
result = bar.Init(
mSymbol,
mAnalyzingPeriod,
1 //
);
if (!result)
{
return result;
}
//
// Find Support Bar based on Analyzing Bar ...
result = bar.HasSupport(
support //
);
if (!result)
{
return result;
}
//
DrawSupport(support, ChartID(), 5);
//
if (resistance.IsValid())
{
RemoveResistance(resistance);
}
//
// Find Resistance Bar based on Analyzing Bar ...
result = bar.HasResistance(
resistance //
);
//
DrawResistance(resistance, ChartID(), 5);
//
return result;
}
//
// Reset Reqirements ...
void ResetRequirements()
{
//
if (IsSupportBreaked(support, false))
{
//
RemoveSupport(support);
support.Clean();
}
//
if (IsResistanceBreaked(resistance, false))
{
//
RemoveResistance(resistance);
resistance.Clean();
}
}
};
//
@@ -0,0 +1,446 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXEMRNGStrategy
// Description: provides all based classes for use ...
//
//
// 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
//
// TODO: Complete this ...
//
/// Imports ...
#include "../Helpers/x-saherelm.xtm.helper.mq5"
#include "../Helpers/x-saherelm.xstr.helper.mq5"
#include "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XEMRNGStartegyToken = "XEMRNG";
//
class XSCXEMRNGStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXEMRNGStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_useTPSLAsPoint,
_forceMaxTPSLAsPoint,
_tpPoint,
_slPoint,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
ConfigureRequirements();
//
SetAlertPrefix(GetTag());
}
//
// Deconstructor ...
void ~XSCXEMRNGStrategy()
{
delete mTMHelper;
}
//
// Getter / Setter (s) ...
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XEMRNGStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
int start = 0;
int count = 5;
//
double tms[];
ArraySetAsSeries(tms, true);
mTMHelper.CopyMain(
start,
count,
tms //
);
//
XSTRConditions strConditions;
result = mSTRHelper.GetConditions(
strConditions,
start,
count //
);
if (!result)
{
return result;
}
//
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!result)
{
return result;
}
//
double hh5 = cBar.FindHighest(
5,
MODE_HIGH //
);
double ll5 = cBar.FindLowest(
5,
MODE_LOW //
);
//
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
bool hasLong = false;
bool hasShort = false;
//
XOHCL tmpHSW[];
XOHCL tmpLSW[];
//
bool useHammer = true;
bool useMorningStar = false;
bool useBullishEngulfing = true;
bool useBullishMaurubozu = true;
//
bool useShootingStar = true;
bool useEveningStar = false;
bool useBearishEngulfing = true;
bool useBearishMaurubozu = true;
//
// Long ...
//
bool isHammer = !useHammer
? false
: cBar.IsHammer();
bool isMorningStar = !useMorningStar
? false
: cBar.IsMorningStar();
bool isBullishMarubozu = !useBullishEngulfing
? false
: cBar.IsBullishMarubozu();
bool isBullishEngulfing = !useBullishMaurubozu
? false
: cBar.IsBullishEngulfing();
//
bool isBullishTrend = cBar.HasBullishTrend(
tmpHSW,
tmpLSW,
true //
);
//
// Find Swing Low Above of EMA ...
// Find Swing High Above of EMA ...
// Fins Swing Low Below of EMA ...
// Detect Bullish Pattern ...
hasLong =
//
cBar.IsBullish()
//
&&
//
isBullishTrend
//
&&
//
cBar.close > tms[1]
//
&&
//
ll5 < tms[1]
//
&&
//
strConditions.isTrendSwitchedToBullish
//
&&
//
(
//
isHammer
//
||
//
isMorningStar
//
||
//
isBullishMarubozu
//
||
//
isBullishEngulfing
//
)
//
;
if (hasLong)
{
//
type = POSITION_TYPE_BUY;
//
sl = tmpLSW[ArraySize(tmpLSW) - 1].low;
}
//
// Short ...
bool isShootingStar = !useShootingStar
? false
: cBar.IsShootingStar();
bool isEveningStar = !useEveningStar
? false
: cBar.IsEveningStar();
bool isBearishEngulfing = !useBearishEngulfing
? false
: cBar.IsBearishEngulfing();
bool isBearishMaurubozu = !useBearishMaurubozu
? false
: cBar.IsBearishMarubozu();
//
bool isBearishTrend = cBar.HasBearishTrend(
tmpHSW,
tmpLSW,
true //
);
//
hasShort =
//
cBar.IsBearish()
//
&&
//
isBearishTrend
//
&&
//
cBar.close < tms[1]
//
&&
//
hh5 > tms[1]
//
&&
//
strConditions.isTrendSwitchedToBearish
//
&&
//
(
//
isShootingStar
//
||
//
isEveningStar
//
||
//
isBearishEngulfing
//
||
//
isBearishMaurubozu
//
)
//
;
if (hasShort)
{
//
type = POSITION_TYPE_SELL;
//
sl = tmpHSW[ArraySize(tmpHSW) - 1].high;
}
//
result = hasLong || hasShort;
if (!result)
{
return result;
}
//
entry = GetEntry(mSymbol, type);
CalculateTPSLByPrice(
sl,
tp,
type,
entry,
r2r //
);
//
result = signal.Prepare(
mSymbol,
GetTag(),
mPeriod,
type,
mode,
entry,
mVolume,
sl,
tp //
);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
XTMInputs mTMInputs; // Tren Magic Inputs ...
XSCXTMHelper *mTMHelper; // Trend Magic Helper Class ...
//
XSTRInputs mSTRInputs; // Super Trend Inputs ...
XSCXSTRHelper *mSTRHelper; // Super Trend Helper Class ...
//
// Private ...
private:
//
//
// Set Default TM Inputs ...
void ConfigureRequirements()
{
//
mTMInputs.maShift = 0;
mTMInputs.maPeriod = 100;
mTMInputs.maMethod = MODE_EMA;
mTMInputs.maAppliedTo = PRICE_CLOSE;
//
mTMInputs.showLine = true;
//
mTMHelper = new XSCXTMHelper();
//
mTMHelper.Init(
mSymbol,
mPeriod,
mTMInputs //
);
//
mSTRInputs.length = 14;
mSTRInputs.multiplier = 3.5;
mSTRInputs.appliedTo = PRICE_CLOSE;
//
mSTRInputs.showTrends = true;
mSTRInputs.fillTrends = false;
//
mSTRHelper = new XSCXSTRHelper();
mSTRHelper.Init(
mSymbol,
mPeriod,
mSTRInputs //
);
}
};
//
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,384 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center XNNTest MQL5 Expert Advisor
// -------------------------------------------------
// Name: XNNTest
// Description: an Exper Advisor which used RSI and MA
// to Analyse Market ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XNNTest"
#property strict
//
// Imports ...
#include "../Classes/x-saherelm.xtrade.class.mq5"
//
#define ShortName "XNNTest"
//
// Inputs ...
input group "Weights";
input double w0 = 0.5;
input double w1 = 0.5;
input double w2 = 0.5;
input double w3 = 0.5;
input double w4 = 0.5;
input double w5 = 0.5;
input double w6 = 0.5;
input double w7 = 0.5;
input double w8 = 0.5;
input double w9 = 0.5;
//
input double eaVolume = 0.01;
//
// Variables ...
int barsTotal;
//
string eaSymbol;
ENUM_TIMEFRAMES eaPeriod;
//
// This is our Data Provider ...
int rsiHandler = INVALID_HANDLE;
double rsi[];
//
double nnInputs[]; // Storing Inputs
double nnWeights[]; // Storing Weights;
//
double nnOutput; // Output Neuron Value
//
XSCTrade *mTrader;
//
// Initialization ...
int OnInit()
{
//
if (!InitialEA())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// De Initialize XSampleEA Providers ...
IndicatorRelease(rsiHandler);
ArrayFree(rsi);
ArrayFree(nnInputs);
ArrayFree(nnWeights);
}
//
// On Tick Handler ...
void OnTick()
{
//
XPosition positions[];
//
XPosition longs[];
int longsCount = 0;
//
XPosition shorts[];
int shortsCount = 0;
//
int positionsCount = mTrader.GetPositions(
positions //
);
if (IsValidSize(positionsCount))
{
//
ExtractPositions(
positions,
longs,
shorts //
);
//
longsCount = ArraySize(longs);
shortsCount = ArraySize(shorts);
}
//
if (longsCount == 0 && shortsCount == 0)
{
//
double longEntry = GetEntry(eaSymbol, POSITION_TYPE_BUY);
mTrader.Buy(
eaSymbol,
eaPeriod,
eaVolume,
longEntry //
);
//
double shortEntry = GetEntry(eaSymbol, POSITION_TYPE_SELL);
mTrader.Sell(
eaSymbol,
eaPeriod,
eaVolume,
shortEntry //
);
}
//
return;
// int rsiCopiedData = CopyBuffer(
// rsiHandler,
// 0, // Line Index
// 1, // BarIndex
// 10, // Count
// rsi // Buffer
// );
// if (rsiCopiedData < 0)
// {
// //
// // Ignore Moving Forward when there isn't any Copied Data ...
// return;
// }
// //
// // Normalize Input Data ...
// double lower = 0;
// double upper = 1;
// //
// double max = rsi[ArrayMaximum(rsi)];
// double min = rsi[ArrayMinimum(rsi)];
// //
// ArrayFree(nnInputs);
// ArrayResize(nnInputs, 10);
// //
// for (int i = 0; i < ArraySize(rsi); i++)
// {
// nnInputs[i] = ((rsi[i] - min) * (upper - lower) / (max - min)) + lower;
// }
// //
// // Calculating Output ...
// nnOutput = CalculateNeuron(
// nnInputs,
// nnWeights //
// );
// //
// // Now we Can Use NN Output for Placing Trades ...
// //
// bool canBuy = nnOutput < 0.5;
// bool canSell = nnOutput >= 0.5;
// //
// XPosition positions[];
// XPosition longs[];
// XPosition shorts[];
// int positionsCount = mTrader.GetPositions(
// positions //
// );
// if (IsValidSize(positionsCount))
// {
// //
// ExtractPositions(
// positions,
// longs,
// shorts //
// );
// //
// if (canBuy)
// {
// //
// mTrader.Close(shorts, "Opposit");
// //
// if (ArraySize(longs) > 0)
// {
// return;
// }
// }
// else if (canSell)
// {
// //
// mTrader.Close(longs, "Opposit");
// //
// if (ArraySize(shorts) > 0)
// {
// return;
// }
// }
// }
// //
// double mEntry =
// canBuy
// ? GetEntry(eaSymbol, POSITION_TYPE_BUY)
// : GetEntry(eaSymbol, POSITION_TYPE_SELL);
// //
// if (canBuy)
// {
// //
// mTrader.Buy(
// eaSymbol,
// eaPeriod,
// eaVolume,
// mEntry //
// );
// }
// else if (canSell)
// {
// //
// mTrader.Sell(
// eaSymbol,
// eaPeriod,
// eaVolume,
// mEntry //
// );
// }
}
//
// Custom Functions ...
//
bool InitialEA()
{
//
bool result = false;
//
eaSymbol = _Symbol;
eaPeriod = _Period;
//
// Initialize RSI Handler ...
rsiHandler = iRSI(
eaSymbol,
eaPeriod,
14,
PRICE_CLOSE //
);
result = rsiHandler != INVALID_HANDLE;
if (!result)
{
return result;
}
//
mTrader = new XSCTrade(
1,
78692110 //
);
//
ArraySetAsSeries(rsi, true);
//
ArrayResize(nnWeights, 10);
//
// Filling Weights Buffer ...
nnWeights[0] = w0;
nnWeights[1] = w1;
nnWeights[2] = w2;
nnWeights[3] = w3;
nnWeights[4] = w4;
nnWeights[5] = w5;
nnWeights[6] = w6;
nnWeights[7] = w7;
nnWeights[8] = w8;
nnWeights[9] = w9;
//
result = true;
//
return result;
}
//
// Activation Function ...
double Activate(double neuron)
{
//
double result = 0;
//
result = 1 / (1 + exp(-neuron));
//
return result;
}
//
// Calculating Neuron ...
// NET Inputs ...
double CalculateNeuron(
double &x[], // Inputs
double &w[] // Weights
)
{
//
double result = 0;
//
double netInput = 0;
for (int i = 0; i < ArraySize(x); i++)
{
//
netInput += x[i] * w[i];
}
//
// Change The Shape of Sigmoid Graph for Smoothing ...
netInput *= 0.4;
//
// Calculate Activated Result ...
result = Activate(netInput);
//
return result;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,678 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// ----------------------------------------------
// Name: XADXTD
// Description: provides Indicator implementation
// 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 "../Classes/x-saherelm.base.class.mq5"
//
// Indicator Buffers ...
enum ENUM_XADXTD_BUFFERS
{
XADXTD_STRENGTH_LINE = 0, // Strenght Buffer ...
XADXTD_BULL_LINE = 1, // Bull Buffer ...
XADXTD_BEAR_LINE = 2, // Bear Buffer ...
};
//
string GetTitle(ENUM_XADXTD_BUFFERS bufferLine)
{
//
string result = NULL;
//
switch (bufferLine)
{
//
case XADXTD_STRENGTH_LINE:
result = "XStrength";
break;
//
case XADXTD_BULL_LINE:
result = "XBull";
break;
//
case XADXTD_BEAR_LINE:
result = "XBear";
break;
}
//
return result;
}
//
// XADXTD Indicator Inputs ...
struct XADXTDInputs
{
//
// Props ...
string version;
//
// Market ...
//
int length; // Length
//
// Constructor ...
XADXTDInputs()
{
Clean();
}
//
// Tools ...
//
// Initial Inputs ...
bool Init(
int _length = 21 // Length
)
{
//
bool result = false;
//
this.length = _length;
//
result = IsValid();
//
return result;
}
//
// Cleanup ...
void Clean()
{
//
length = 0;
}
//
// Default ...
void Default()
{
//
length = 21;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
length > 0
//
;
//
return result;
}
//
// Retrieve Max Length ...
int Max()
{
//
int result = 0;
//
int values[1] = {
length //
};
//
result = GetMax(values);
//
return result;
}
};
//
// Define Conditions ...
struct XADXTDConditions
{
//
// Common ...
string symbol;
ENUM_TIMEFRAMES period;
datetime time;
//
// Buffers ...
double strength[];
double bullp[];
double bearp[];
//
// Conditions ...
//
bool isStrong;
bool isBullish;
bool isBearish;
bool isSwitchedToBullish;
bool isSwitchedToBearish;
bool isStrongSwitchedToBullish;
bool isStrongSwitchedToBearish;
//
void Clean()
{
//
Clean(strength);
Clean(bullp);
Clean(bearp);
//
ArraySetAsSeries(strength, true);
ArraySetAsSeries(bullp, true);
ArraySetAsSeries(bearp, true);
//
isStrong = false;
isBullish = false;
isBearish = false;
isSwitchedToBullish = false;
isSwitchedToBearish = false;
isStrongSwitchedToBullish = false;
isStrongSwitchedToBearish = false;
}
//
void GenerateScore(
double &bullishScore,
double &bearishScore //
)
{
//
bullishScore = 0;
bearishScore = 0;
//
if (isBullish)
{
//
bullishScore++;
if (isStrong)
{
bullishScore++;
}
}
if (isBearish)
{
bearishScore++;
if (isStrong)
{
bearishScore++;
}
}
if (isSwitchedToBullish)
{
bullishScore++;
if (isStrong)
{
bullishScore++;
}
}
if (isSwitchedToBearish)
{
bearishScore++;
if (isStrong)
{
bearishScore++;
}
}
if (isStrongSwitchedToBullish)
{
bullishScore++;
}
if (isStrongSwitchedToBearish)
{
bearishScore++;
}
}
//
string GenerateSummary(
bool onlyCommons = false,
bool onlyConditions = false,
bool includeScores = true,
bool ignoreFalseConditions = true,
string separator = "\n" //
)
{
//
string result = NULL;
//
double bullishScore = 0;
double bearishScore = 0;
GenerateScore(
bullishScore,
bearishScore //
);
//
string scoresStr =
//
"Scores: " + separator +
"---------------" + separator +
"Bullish: " + ToString(bullishScore) + separator +
"Bearish: " + ToString(bearishScore) + separator +
""
//
;
//
string commonStr = GenerateSpecifiedCommonSummary(
this,
separator,
includeScores //
);
//
string conditionsStr =
//
ToString("isStrong", isStrong, ignoreFalseConditions, separator) +
ToString("isBullish", isBullish, ignoreFalseConditions, separator) +
ToString("isBearish", isBearish, ignoreFalseConditions, separator) +
ToString("isSwitchedToBullish", isSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isSwitchedToBearish", isSwitchedToBearish, ignoreFalseConditions, separator) +
ToString("isStrongSwitchedToBullish", isStrongSwitchedToBullish, ignoreFalseConditions, separator) +
ToString("isStrongSwitchedToBearish", isStrongSwitchedToBearish, ignoreFalseConditions, separator) +
""
//
;
//
result =
//
"[" + GetTag() + "]" + separator +
(onlyConditions
? ""
: commonStr) +
(!includeScores
? ""
: scoresStr) +
" " + separator +
(onlyCommons
? ""
: conditionsStr) +
""
//
;
//
return result;
}
//
string GetTag()
{
return "XADXTD";
}
};
//
// Indicator Class ...
class XSCXADXTDHelper : public XSCBase
{
//
// Public ...
public:
//
// Props ...
//
// Constructor(s) ...
void XSCXADXTDHelper(
string symbol, // Trading Symbol
ENUM_TIMEFRAMES period // Trading TimeFrame
)
{
//
mSymbol = symbol;
mPeriod = period;
}
//
// Deconstructor ...
void ~XSCXADXTDHelper() {}
//
// Initialize Indicator ...
bool Init(
XADXTDInputs &inputs // Indicator Properties
)
{
//
bool result = false;
//
result = inputs.IsValid();
if (!result)
{
return result;
}
//
// Set Inputs ...
this.mInputs = inputs;
//
// Validate Indicator State ...
result = this.IsValid();
if (!result)
{
return result;
}
//
result = DefineBuffers();
if (!result)
{
return result;
}
//
handler = iADX(
mSymbol,
mPeriod,
mInputs.length //
);
result = handler != INVALID_HANDLE;
//
return result;
}
//
XADXTDInputs GetInputs()
{
return mInputs;
}
//
bool SetInputs(
XADXTDInputs &inputs // Indicator Properties
)
{
return Init(inputs);
}
//
// Get Tag ...
string GetTag()
{
//
string result = NULL;
//
result = GetToken();
//
return result;
}
//
// Get Token ...
string GetToken()
{
//
string result = NULL;
//
result = GetSpecificToken(this);
//
return result;
}
//
string GetSymbol()
{
return mSymbol;
}
//
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
mInputs.IsValid() &&
IsSpecifiedValid(mPeriod) &&
IsSpecifiedValid(mSymbol)
//
;
//
return result;
}
//
// De Initialize Class ...
void DeInit(int reason)
{
//
IndicatorRelease(handler);
}
//
// Tools ...
int CopyData(
ENUM_XADXTD_BUFFERS line,
double &dest[],
int start = 0,
int count = 1 //
)
{
//
int result = 0;
//
int mLine = -1;
switch (line)
{
//
case XADXTD_STRENGTH_LINE:
mLine = MAIN_LINE;
break;
//
case XADXTD_BULL_LINE:
mLine = PLUSDI_LINE;
break;
//
case XADXTD_BEAR_LINE:
mLine = MINUSDI_LINE;
break;
}
//
if (mLine == -1 || handler == INVALID_HANDLE)
{
return result;
}
//
result = CopyBuffer(
handler,
mLine,
start,
count,
dest //
);
//
return result;
}
//
bool GetConditions(
XADXTDConditions &conditions, //
int barIndex = 0, //
int loopback = 3 //
)
{
//
bool result = true;
//
if (loopback < 3)
{
loopback = 3;
}
//
conditions.Clean();
//
conditions.symbol = mSymbol;
conditions.period = mPeriod;
conditions.time = TimeCurrent();
//
int zIndex = barIndex;
int cIndex = zIndex + 1;
int pIndex = cIndex + 1;
int ppIndex = pIndex + 1;
//
CopyData(
XADXTD_STRENGTH_LINE,
conditions.strength,
zIndex,
loopback //
);
CopyData(
XADXTD_BULL_LINE,
conditions.bullp,
zIndex,
loopback //
);
CopyData(
XADXTD_BEAR_LINE,
conditions.bearp,
zIndex,
loopback //
);
//
// Calculate Conditions ...
//
bool isStrong = conditions.strength[cIndex] >= 20;
//
bool isBullish = conditions.bullp[cIndex] > conditions.bearp[cIndex];
bool isBearish = conditions.bearp[cIndex] > conditions.bullp[cIndex];
//
bool isBullishPrev = conditions.bullp[pIndex] > conditions.bearp[pIndex];
bool isBearishPrev = conditions.bearp[pIndex] > conditions.bullp[pIndex];
//
bool isSwitchedToBullish = isBullish &&
!isBullishPrev;
bool isSwitchedToBearish = isBearish &&
!isBearishPrev;
//
bool isStrongSwitchedToBullish = isStrong &&
isSwitchedToBullish;
bool isStrongSwitchedToBearish = isStrong &&
isSwitchedToBearish;
//
conditions.isStrong = isStrong;
conditions.isBullish = isBullish;
conditions.isBearish = isBearish;
conditions.isSwitchedToBullish = isSwitchedToBullish;
conditions.isSwitchedToBearish = isSwitchedToBearish;
conditions.isStrongSwitchedToBullish = isStrongSwitchedToBullish;
conditions.isStrongSwitchedToBearish = isStrongSwitchedToBearish;
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
int handler;
//
// Tools ...
bool DefineBuffers()
{
//
bool result = false;
//
result = true;
//
return result;
}
//
// Private ...
private:
//
// Props ...
//
string mSymbol; // Symbol
ENUM_TIMEFRAMES mPeriod; // TimeFrame
//
XADXTDInputs mInputs; // Properties
};
//
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,766 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXOBVGStrategy
// Description: provides all based classes for use ...
//
//
// 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 "../Helpers/x-saherelm.xtm.helper.mq5"
#include "../Helpers/x-saherelm.xstr.helper.mq5"
#include "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XOBVGStartegyToken = "XOBVG";
//
class XSCXOBVGStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXOBVGStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
ENUM_TIMEFRAMES _hindPeriod, // Hind Period
ENUM_TIMEFRAMES _mediestPeriod, // Mediest Period
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points
bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points
double _tpPoint = 0, // TP As Point
double _slPoint = 0, // SL As Point
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_useTPSLAsPoint,
_forceMaxTPSLAsPoint,
_tpPoint,
_slPoint,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
mHindPeriod = _hindPeriod;
mMediestPeriod = _mediestPeriod;
//
SetAlertPrefix(GetTag());
//
hindBar.Clean();
hindBullishOrderBlock.Clean();
hindBearishOrderBlock.Clean();
//
medBar.Clean();
medBullishOrderBlock.Clean();
medBearishOrderBlock.Clean();
}
//
// Deconstructor ...
void ~XSCXOBVGStrategy()
{
}
//
// Getter / Setter (s) ...
//
ENUM_TIMEFRAMES HindPeriod()
{
return mHindPeriod;
}
//
void HindPeriod(ENUM_TIMEFRAMES value)
{
mHindPeriod = value;
}
//
ENUM_TIMEFRAMES MediestPeriod()
{
return mMediestPeriod;
}
//
void MediestPeriod(ENUM_TIMEFRAMES value)
{
mMediestPeriod = value;
}
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XOBVGStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
bool hasLong = false;
bool hasShort = false;
//
XOHCL tmpHSW[];
XOHCL tmpLSW[];
//
bool useHammer = true;
bool useMorningStar = false;
bool useBullishEngulfing = true;
bool useBullishMaurubozu = true;
//
bool useShootingStar = true;
bool useEveningStar = false;
bool useBearishEngulfing = true;
bool useBearishMaurubozu = true;
//
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!result)
{
return result;
}
//
double ll3 = cBar.FindLowest(
3,
MODE_LOW //
);
double hh3 = cBar.FindHighest(
3,
MODE_HIGH //
);
//
result = hindBar.IsValid();
if (!result)
{
//
result = hindBar.Init(
mSymbol,
mHindPeriod,
1 //
);
if (!result)
{
return result;
}
}
//
bool hasBullishOrderBlock = hindBullishOrderBlock.IsValid();
bool hasBearishOrderBlock = hindBearishOrderBlock.IsValid();
result =
//
hasBullishOrderBlock
//
||
//
hasBearishOrderBlock
//
;
if (!result)
{
//
hasBullishOrderBlock = hindBar.HasBullishOrderBlock(hindBullishOrderBlock);
hasBearishOrderBlock = hindBar.HasBearishOrderBlock(hindBearishOrderBlock);
//
result =
//
hasBullishOrderBlock
//
||
//
hasBearishOrderBlock
//
;
if (!result)
{
//
hindBar.Clean();
return result;
}
}
//
if (hasBullishOrderBlock)
{
//
DrawBullishOrderBlock(
hindBullishOrderBlock,
ChartID() //
);
//
// Try to Detect and Order Block Inside this ...
// in Mediest ...
result = medBar.IsValid();
if (!result)
{
//
result = medBar.Init(
mSymbol,
mMediestPeriod,
1 //
);
if (!result)
{
//
medBar.Clean();
return result;
}
}
//
result = medBar.HasBullishOrderBlock(medBullishOrderBlock);
if (!result)
{
//
medBar.Clean();
return result;
}
//
DrawBullishOrderBlock(
medBullishOrderBlock,
ChartID() //
);
//
// Check Order Block Is Inside HINDOB ...
result =
//
(medBullishOrderBlock.low >= hindBullishOrderBlock.low &&
medBullishOrderBlock.low <= hindBullishOrderBlock.high)
//
||
//
(medBullishOrderBlock.high <= hindBullishOrderBlock.high &&
medBullishOrderBlock.high >= hindBullishOrderBlock.low)
//
;
//
if (result)
{
//
// Check Price ...
result =
//
ll3 < medBullishOrderBlock.high &&
ll3 > hindBullishOrderBlock.low
//
;
if (!result)
{
//
hindBar.Clean();
hindBullishOrderBlock.Clean();
hindBearishOrderBlock.Clean();
//
medBar.Clean();
medBullishOrderBlock.Clean();
medBearishOrderBlock.Clean();
//
fvgUpper = 0;
fvgLower = 0;
//
RemoveDraws();
//
return result;
}
//
hasLong = result;
}
else
{
//
// Detect and FVG Inside ...
result = medBar.HasBullishFVG(
fvgUpper,
fvgLower //
);
if (!result)
{
//
hindBar.Clean();
hindBullishOrderBlock.Clean();
hindBearishOrderBlock.Clean();
//
medBar.Clean();
medBullishOrderBlock.Clean();
medBearishOrderBlock.Clean();
//
fvgUpper = 0;
fvgLower = 0;
//
RemoveDraws();
//
return result;
}
//
DrawBullishFVG(
medBar,
fvgUpper,
fvgLower,
ChartID() //
);
//
result =
//
(fvgLower >= hindBullishOrderBlock.low &&
fvgLower <= hindBullishOrderBlock.high)
//
||
//
(fvgUpper <= hindBullishOrderBlock.high &&
fvgUpper >= hindBullishOrderBlock.low)
//
;
//
// Check Price ...
result =
//
ll3 < fvgUpper &&
ll3 > hindBullishOrderBlock.low
//
;
if (!result)
{
//
hindBar.Clean();
hindBullishOrderBlock.Clean();
hindBearishOrderBlock.Clean();
//
medBar.Clean();
medBullishOrderBlock.Clean();
medBearishOrderBlock.Clean();
//
fvgUpper = 0;
fvgLower = 0;
//
RemoveDraws();
//
return result;
}
//
hasLong = result;
}
}
//
if (hasBearishOrderBlock)
{
//
DrawBearishOrderBlock(
hindBearishOrderBlock,
ChartID() //
);
//
// Try to Detect and Order Block Inside this ...
// in Mediest ...
result = medBar.IsValid();
if (!result)
{
//
result = medBar.Init(
mSymbol,
mMediestPeriod,
1 //
);
if (!result)
{
//
medBar.Clean();
return result;
}
}
//
result = medBar.HasBearishOrderBlock(medBearishOrderBlock);
if (!result)
{
//
medBar.Clean();
return result;
}
//
DrawBearishOrderBlock(
medBearishOrderBlock,
ChartID() //
);
//
// Check Order Block Is Inside HINDOB ...
result =
//
(medBullishOrderBlock.low >= hindBearishOrderBlock.low &&
medBearishOrderBlock.low <= hindBearishOrderBlock.high)
//
||
//
(medBearishOrderBlock.high <= hindBearishOrderBlock.high &&
medBearishOrderBlock.high >= hindBearishOrderBlock.low)
//
;
if (!result)
{
//
// Detect and FVG Inside ...
result = medBar.HasBearishFVG(
fvgUpper,
fvgLower //
);
if (!result)
{
//
hindBar.Clean();
hindBullishOrderBlock.Clean();
hindBearishOrderBlock.Clean();
//
medBar.Clean();
medBullishOrderBlock.Clean();
medBearishOrderBlock.Clean();
//
fvgUpper = 0;
fvgLower = 0;
//
RemoveDraws();
//
return result;
}
//
DrawBearishFVG(
medBar,
fvgUpper,
fvgLower,
ChartID() //
);
//
result =
//
(fvgLower >= hindBearishOrderBlock.low &&
fvgLower <= hindBearishOrderBlock.high)
//
||
//
(fvgUpper <= hindBearishOrderBlock.high &&
fvgUpper >= hindBearishOrderBlock.low)
//
;
if (!result)
{
//
hindBar.Clean();
hindBullishOrderBlock.Clean();
hindBearishOrderBlock.Clean();
//
medBar.Clean();
medBullishOrderBlock.Clean();
medBearishOrderBlock.Clean();
//
fvgUpper = 0;
fvgLower = 0;
//
RemoveDraws();
//
return result;
}
}
}
//
result = hasLong || hasShort;
if (!result)
{
return result;
}
//
if (hasLong)
{
//
// Long ...
//
bool isHammer = !useHammer
? false
: cBar.IsHammer();
bool isMorningStar = !useMorningStar
? false
: cBar.IsMorningStar();
bool isBullishMarubozu = !useBullishEngulfing
? false
: cBar.IsBullishMarubozu();
bool isBullishEngulfing = !useBullishMaurubozu
? false
: cBar.IsBullishEngulfing();
//
bool isBullishTrend = cBar.HasBullishTrend(
tmpHSW,
tmpLSW,
true //
);
//
// Find Swing Low Above of EMA ...
// Find Swing High Above of EMA ...
// Fins Swing Low Below of EMA ...
// Detect Bullish Pattern ...
hasLong =
//
true
//
&&
//
(
//
isHammer
//
||
//
isMorningStar
//
||
//
isBullishMarubozu
//
||
//
isBullishEngulfing
//
)
//
;
if (hasLong)
{
//
type = POSITION_TYPE_BUY;
//
// sl = tmpLSW[ArraySize(tmpLSW) - 1].low;
}
}
//
if (hasShort)
{
//
// Short ...
bool isShootingStar = !useShootingStar
? false
: cBar.IsShootingStar();
bool isEveningStar = !useEveningStar
? false
: cBar.IsEveningStar();
bool isBearishEngulfing = !useBearishEngulfing
? false
: cBar.IsBearishEngulfing();
bool isBearishMaurubozu = !useBearishMaurubozu
? false
: cBar.IsBearishMarubozu();
//
bool isBearishTrend = cBar.HasBearishTrend(
tmpHSW,
tmpLSW,
true //
);
//
hasShort =
//
false
//
&&
//
(
//
isShootingStar
//
||
//
isEveningStar
//
||
//
isBearishEngulfing
//
||
//
isBearishMaurubozu
//
)
//
;
if (hasShort)
{
//
type = POSITION_TYPE_SELL;
//
// sl = tmpHSW[ArraySize(tmpHSW) - 1].high;
}
}
//
result = hasLong || hasShort;
if (!result)
{
return result;
}
//
entry = GetEntry(mSymbol, type);
CalculateTPSLByPrice(
sl,
tp,
type,
entry,
r2r //
);
//
result = signal.Prepare(
mSymbol,
GetTag(),
mPeriod,
type,
mode,
entry,
mVolume,
sl,
tp //
);
//
return result;
}
//
// Protected ...
protected:
//
// Props ...
//
ENUM_TIMEFRAMES mHindPeriod; // Hind Period
ENUM_TIMEFRAMES mMediestPeriod; // Mediest Period
//
// Private ...
private:
//
// Props ...
//
XOHCL hindBar;
XOHCL hindBullishOrderBlock;
XOHCL hindBearishOrderBlock;
//
XOHCL medBar;
XOHCL medBullishOrderBlock;
XOHCL medBearishOrderBlock;
//
double fvgUpper;
double fvgLower;
};
//
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,792 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XSCXSRBRStrategy
// Description: provides all based classes for use ...
//
//
// 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 "../Classes/x-saherelm.xstrategy.class.mq5"
//
string XSRBRStartegyToken = "XSRBR";
//
class XSCXSRBRStrategy : public XSCBaseStrategy
{
//
// Public ...
public:
//
// Constructor(s) ...
void XSCXSRBRStrategy(
//
// Base ...
string _symbol, // Trading Symbol
ENUM_TIMEFRAMES _period, // Trading TimeFrame
double _volume, // Voluem
double _r2r, // Risk/Reward Ratio
int _slippage, // Trader Slippage
long _magicNumber, // Trader Magic Number
bool _allowLong = true,
bool _allowShort = true,
int _maxAllowedLongs = 0,
int _maxAllowedShorts = 0 //
) : XSCBaseStrategy(_symbol,
_period,
_volume,
_r2r,
_slippage,
_magicNumber,
_allowLong,
_allowShort,
_maxAllowedLongs,
_maxAllowedShorts //
)
{
//
mThreshold = 5;
mVerificationsStep = 21;
mConditionsValidationAge = 20;
//
SetAlertPrefix(XSRBRStartegyToken);
}
//
// Getter / Setter (s) ...
//
double Treshold()
{
return mThreshold;
}
//
void Treshold(double value)
{
//
if (value < 0)
{
value = 0;
}
//
mThreshold = value;
}
//
int VerificationsStep()
{
return mVerificationsStep;
}
//
void VerificationsStep(int value)
{
//
if (value < 5)
{
value = 5;
}
//
mVerificationsStep = value;
}
//
int ConditionsValidationAge()
{
return mConditionsValidationAge;
}
//
void ConditionsValidationAge(int value)
{
//
if (value < 0)
{
value = 0;
}
//
mConditionsValidationAge = value;
}
//
bool DarwSupportAndResistances()
{
return mDarwSupportAndResistances;
}
//
void DarwSupportAndResistances(bool value)
{
//
mDarwSupportAndResistances = value;
//
if (!value)
{
//
supportPivot.Remove();
resistancePivot.Remove();
}
}
//
// Overrides ...
//
// Customize Strategy Identifier ...
string GetTag() override
{
return XSRBRStartegyToken;
}
//
// Check Conditions For Signal ...
bool HasSignal(
XSignal &signal //
) override
{
//
bool result = false;
//
// Try to Detect Trend ...
result = trendDetector.HasTrend();
if (!result)
{
//
result = trendDetector.FindTrend(
mSymbol,
mPeriod //
);
//
if (!result ||
(!trendDetector.isUpTrend && !trendDetector.isDownTrend))
{
//
trendDetector.Clean();
return result;
}
}
//
// Check Resistance Exists or not ...
// if Not, Try to Find One ...
if (!resistancePivot.isResistance)
{
//
result = resistancePivot.FindLastResistance(
mSymbol,
mPeriod //
);
//
if (!result)
{
//
resistancePivot.Clean();
return result;
}
else
{
//
if (DarwSupportAndResistances())
{
resistancePivot.Draw(ChartID());
}
}
}
//
// Check Support Exists or not ...
// if Not, try to Find One ...
if (!supportPivot.isSupport)
{
//
result = supportPivot.FindLastSupport(
mSymbol,
mPeriod //
);
//
if (!result)
{
//
supportPivot.Clean();
return result;
}
else
{
//
if (DarwSupportAndResistances())
{
supportPivot.Draw(ChartID());
}
}
}
//
// Retrieve Bar 1 ...
XOHCL cBar;
result = cBar.Init(
mSymbol,
mPeriod,
1 //
);
if (!result)
{
//
CheckConditionLife();
return result;
}
//
signal.Clean();
//
double sl = 0;
double tp = 0;
double risk = 0;
double entry = 0;
double reward = 0;
double r2r = R2R();
ENUM_POSITION_TYPE type;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
//
bool isSupportBreaked = supportPivot.IsBreaked();
bool isSupportRejected = supportPivot.IsRejected();
//
bool isResistancetBreaked = resistancePivot.IsBreaked();
bool isResistancetRejected = resistancePivot.IsRejected();
//
bool isBarBullishPattern =
//
cBar.IsBullish() &&
cBar.HasStrongBody() &&
(cBar.IsHammer() ||
cBar.IsBullishEngulf())
//
;
//
bool isBarBearishPattern =
//
cBar.IsBearish() &&
cBar.HasStrongBody() &&
(cBar.IsShootingStar() ||
cBar.IsBearishEngulf())
//
;
//
// Up Trend ...
if (trendDetector.isUpTrend)
{
//
// During Up Trend ...
// Supports Must Rejected ...
// Resistance Must Breaked ...
//
// Check Trend Trading ...
// Check Based Support ...
bool hasSupportLong =
//
isSupportRejected &&
isBarBullishPattern
//
;
//
// Check Trend Trading ...
// Check Based On Resistance ...
bool hasResistanceLong =
//
isResistancetBreaked &&
isBarBullishPattern
//
;
//
// Check Trend Reversal Trading ...
// Check Based Support ...
bool hasSupportShort =
//
isSupportBreaked &&
isBarBearishPattern
//
;
//
// Check Trend Reversal Trading ...
// Check Based On Resistance ...
bool hasResistanceShort =
//
isResistancetRejected &&
isBarBearishPattern
//
;
//
// Check Trend Trading ...
bool hasLong =
//
hasSupportLong ||
hasResistanceLong
//
;
//
// Check Trend Reversal Trading ...
bool hasShort =
//
hasSupportShort ||
hasResistanceShort
//
;
//
// Filling Signal ...
if (hasLong)
{
//
type = POSITION_TYPE_BUY;
entry = GetEntry(
_Symbol,
type //
);
//
if (hasSupportLong)
{
//
sl = supportPivot.price;
if (supportPivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
sl -= threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
else if (hasResistanceLong)
{
//
sl = resistancePivot.price;
if (resistancePivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
sl -= threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
//
result = signal.Prepare(
_Symbol,
"XSUPRES",
_Period,
type,
mode,
entry,
mVolume,
sl,
tp //
);
}
else if (hasShort)
{
//
type = POSITION_TYPE_SELL;
entry = GetEntry(
_Symbol,
type //
);
//
if (hasSupportShort)
{
//
sl = supportPivot.price;
if (supportPivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
sl += threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
else if (hasResistanceShort)
{
//
sl = resistancePivot.price;
if (resistancePivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
sl += threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
//
result = signal.Prepare(
_Symbol,
"XSUPRES",
_Period,
type,
mode,
entry,
mVolume,
sl,
tp //
);
}
else
{
result = false;
}
}
//
// Down Trend ...
else if (trendDetector.isDownTrend)
{
//
// During Down Trend ...
// Supports Must Breaked ...
// Resistance Must Rejected ...
//
// Check Trend Reversal Trading ...
// Check Based Support ...
bool hasSupportLong =
//
isSupportRejected &&
isBarBullishPattern
//
;
//
// Check Trend Reversal Trading ...
// Check Based On Resistance ...
bool hasResistanceLong =
//
isResistancetBreaked &&
isBarBullishPattern
//
;
//
// Check Trend Trading ...
// Check Based Support ...
bool hasSupportShort =
//
isSupportBreaked &&
isBarBearishPattern
//
;
//
// Check Trend Trading ...
// Check Based On Resistance ...
bool hasResistanceShort =
//
isResistancetRejected &&
isBarBearishPattern
//
;
//
// Check Trend Reversal Trading ...
bool hasLong =
//
hasSupportLong ||
hasResistanceLong
//
;
//
// Check Trend Trading ...
bool hasShort =
//
hasSupportShort ||
hasResistanceShort
//
;
//
// Filling Signal ...
if (hasLong)
{
//
type = POSITION_TYPE_BUY;
entry = GetEntry(
_Symbol,
type //
);
//
if (hasSupportLong)
{
//
sl = supportPivot.price;
if (supportPivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
sl -= threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
else if (hasResistanceLong)
{
//
sl = resistancePivot.price;
if (resistancePivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
sl -= threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
//
result = signal.Prepare(
_Symbol,
"XSUPRES",
_Period,
type,
mode,
entry,
mVolume,
sl,
tp //
);
}
else if (hasShort)
{
//
type = POSITION_TYPE_SELL;
entry = GetEntry(
_Symbol,
type //
);
//
if (hasSupportShort)
{
//
sl = supportPivot.price;
if (supportPivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * supportPivot._threshold;
sl += threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
else if (hasResistanceShort)
{
//
sl = resistancePivot.price;
if (resistancePivot._threshold > 0)
{
//
double threshold = GetPoints(_Symbol) * resistancePivot._threshold;
sl += threshold;
}
//
CalculateTPSLBtPrice(
sl,
tp,
type,
entry,
r2r //
);
}
//
result = signal.Prepare(
_Symbol,
"XSUPRES",
_Period,
type,
mode,
entry,
mVolume,
sl,
tp //
);
}
else
{
result = false;
}
}
//
if (!result)
{
CheckConditionLife();
}
//
return result;
}
//
// Notify Signal Execution ...
void OnSignalExecuted(XSignal &signal) override
{
ResetConditions();
}
//
// Protected ...
protected:
//
// Pivots Detecting ...
double mThreshold; // Pivots Edge's Threshold ...
int mVerificationsStep; // Pivots Verification Steps ...
int mConditionsValidationAge; // How Many Bars a Support or Resistance is Valid ...
//
XPivot supportPivot;
XPivot resistancePivot;
//
bool mDarwSupportAndResistances; // Draw Last Found Support and Resistance
//
// Private ...
private:
//
// Check Conditions Time Life ...
void CheckConditionLife()
{
//
datetime cTime = TimeCurrent();
datetime lTime =
//
supportPivot.time < resistancePivot.time
? supportPivot.time
: resistancePivot.time
//
;
//
bool canReset =
//
(
//
(((int)cTime - (int)lTime) / PeriodSeconds(mPeriod)) > mConditionsValidationAge
//
)
//
;
if (canReset)
{
ResetConditions();
}
}
//
// Reset Conditions ...
void ResetConditions()
{
//
trendDetector.Clean();
//
supportPivot.Remove();
supportPivot.Clean();
//
resistancePivot.Remove();
resistancePivot.Clean();
}
};
//
@@ -0,0 +1,619 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center XSAMPLE MQL5 Expert Advisor
// -------------------------------------------------
// Name: XSAMPLE
// Description: an Exper Advisor which used RSI and MA
// to Analyse Market ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XSAMPLE"
#property strict
//
#include "../Libraries/x-saherelm.draw.lib.mq5"
#include "../Classes/x-saherelm.xalert.class.mq5"
#include "../Classes/x-saherelm.xtrade.class.mq5"
#include "../Libraries/x-saherelm.common.lib.mq5"
//
#define ShortName "XSAMPLE"
//
int pivotLifeTime = 20;
int pivotBreakoutsLifeTime = 10;
ENUM_TIMEFRAMES destPEriod = PERIOD_H4;
//
int xAge = 0;
//
double lastHH = 0;
double lastUpper = 0;
double lastDestHH = 0;
//
double lastLL = 0;
double lastLower = 0;
double lastDestLL = 0;
//
datetime lastTime = NULL;
datetime lastDestTime = NULL;
//
XSCAlert *mAlert;
XSCTrade *mTrader;
//
XBarTracker xBarTracker;
XMarketCycle xDestCycle;
//
// Initialization ...
int OnInit()
{
//
drawPrefix = ShortName;
//
if (!InitialEA())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// De Initialize XSampleEA Providers ...
}
//
// On Tick Handler ...
void OnTick()
{
//
if (!xBarTracker.IsNewBar())
{
return;
}
//
xDestCycle.Update(0);
//
Analyze();
//
ManxAge();
}
//
//
//
bool InitialEA()
{
//
bool result = false;
//
mAlert = new XSCAlert();
mAlert.SetLogAlerts(true);
mAlert.SetPrefix(ShortName);
mAlert.SetEnableAlerts(true);
mAlert.SetPushAlerts(false);
mAlert.SetMailAlerts(false);
mAlert.SetTerminalAlerts(false);
//
mTrader = new XSCTrade(
10,
78692110,
0,
0,
0 //
);
//
result = xBarTracker.Init(
_Symbol,
_Period //
);
if (!result)
{
return result;
}
//
result = xDestCycle.Init(
_Symbol,
_Period,
X_MARKET_CYCLE_MEDIUM,
X_PERIOD_MANUALLY,
destPEriod,
"DEST" //
);
if (!result)
{
return result;
}
//
result = true;
//
return result;
}
//
void Analyze()
{
//
XOHCL cBar;
cBar.Init(
_Symbol,
_Period,
1 //
);
//
if (IsLookingForBoundary())
{
FindBoundary();
return;
}
//
double longSLPrice = 0;
double shortSLPrice = 0;
// //
// xAge = 0;
// if (IsValid(lastTime))
// {
// //
// xAge = iBarShift(
// _Symbol,
// _Period,
// lastTime //
// );
// }
// //
// if (xAge > pivotBreakoutsLifeTime)
// {
// //
// lastHH = cBar.FindHighest(
// xAge - 1,
// MODE_HIGH //
// );
// //
// lastLL = cBar.FindLowest(
// xAge - 1,
// MODE_LOW //
// );
// //
// DrawPivot(lastLL, clrAqua, "PVB_L_", true);
// DrawPivot(lastHH, clrMagenta, "PVB_H_", true);
// }
//
// Detect Breakouts for Long ...
// - Upper Must Breaked as Resistance ...
// - Lower Must Rejects as Support ...
// //
// bool isSupRejected = cBar.IsSupportRejected(lastLower);
// bool isResBreaked = cBar.IsResistanceBreaked(lastUpper);
// bool isLastLLRejectedAsSupport = cBar.IsSupportRejected(lastDestLL);
// bool isLastHHBreakedAsResistance = cBar.IsResistanceBreaked(lastDestHH);
// //
// bool hasLong =
// //
// cBar.HasStrongBody() &&
// (
// //
// (isLastLLRejectedAsSupport
// //
// ||
// //
// isLastHHBreakedAsResistance)
// //
// ||
// //
// (cBar.GetMid() > MathMax(lastLower, lastUpper) &&
// (isResBreaked
// //
// ||
// //
// isSupRejected))
// //
// )
// //
// ;
// //
// if (hasLong)
// {
// //
// longSLPrice = isResBreaked
// ? lastUpper
// : isLastHHBreakedAsResistance
// ? lastDestHH
// : isSupRejected
// ? lastLower
// : lastDestLL;
// }
//
// Detect Breakouts for Long ...
// - Upper Must Rejects as Resistance ...
// - Lower Must Breaked as Support ...
// //
// bool isResRejected = cBar.IsResistanceRejected(lastUpper);
// bool isSupBreaked = cBar.IsSupportBreaked(lastLower);
// bool isLastLLBreadedAsSupport = cBar.IsSupportBreaked(lastDestLL);
// bool isLastHHRejectedAsResistance = cBar.IsResistanceRejected(lastDestHH);
// //
// bool hasShort =
// //
// cBar.HasStrongBody() &&
// (
// //
// (isLastLLBreadedAsSupport
// //
// ||
// //
// isLastHHRejectedAsResistance)
// //
// ||
// //
// (cBar.GetMid() < MathMin(lastLower, lastUpper) &&
// (isSupBreaked
// //
// ||
// //
// isResRejected))
// //
// )
// //
// ;
// //
// if (hasShort)
// {
// //
// shortSLPrice = isSupBreaked
// ? lastLower
// : isLastLLBreadedAsSupport
// ? lastDestLL
// : isResRejected
// ? lastUpper
// : lastDestHH;
// }
//
//
bool hasLong = false;
bool hasShort = false;
//
bool hasSignal = hasLong || hasShort;
if (hasSignal)
{
//
double slPrice =
hasLong
? longSLPrice
: shortSLPrice;
// double slPrice =
// hasLong
// ? shortSLPrice
// : longSLPrice;
//
ENUM_POSITION_TYPE mType =
hasLong
? POSITION_TYPE_BUY
: POSITION_TYPE_SELL
//
;
// ENUM_POSITION_TYPE mType =
// hasLong
// ? POSITION_TYPE_BUY
// : POSITION_TYPE_SELL
// //
// ;
//
double mEntry = GetEntry(
_Symbol,
mType //
);
//
double priceToRisk = PointToPrice(30, _Symbol);
double priceToReward = PointToPrice(30, _Symbol);
//
double mSL = 0;
double mTP = 0;
CalculateTPSL(
mSL,
mTP,
mType,
mEntry,
1,
slPrice,
0,
priceToRisk,
priceToReward //
);
//
// Ignore Zero TP SL ...
if (mTP > 0 && mSL > 0)
{
//
XSignal signal;
bool isPrepared = signal.Prepare(
_Symbol,
"X92",
_Period,
mType,
X_ORDER_MODE_MARKET,
mEntry,
0.01,
mSL,
mTP //
);
//
if (isPrepared)
{
//
ENUM_X_SIGNAL_EXECUTION_RESULT state;
bool isExecuted = mTrader.ExecuteSignal(
signal,
state //
);
}
}
}
//
bool resetLast =
xAge > pivotLifeTime || hasSignal;
//
if (resetLast)
{
//
lastUpper = 0;
lastLower = 0;
//
RemoveDraws();
}
}
//
void ManxAge()
{
//
return;
double profit = mTrader.Profit();
if (profit > 50 || profit < -100)
{
//
string comment = "EQM Hedge: " + ToString(profit);
//
int numberOfClosed = mTrader.Close(comment);
if (numberOfClosed > 0)
{
mAlert.Alert(comment);
}
}
}
//
bool IsLookingForBoundary()
{
//
bool result = lastUpper == 0 && lastLower == 0;
return result;
}
//
void FindBoundary()
{
//
int zIndex = 0;
int cIndex = 1;
int pIndex = 2;
int ppIndex = 3;
//
// Detect Inside Bar ...
XOHCL cBar;
cBar.Init(
_Symbol,
_Period,
1 //
);
//
XOHCL cDestBar = xDestCycle.GetBar(1);
//
if (cDestBar.time != lastDestTime) {
//
lastDestLL = cDestBar.low;
lastDestHH = cDestBar.high;
//
lastDestTime = cDestBar.time;
//
DrawPivot(lastUpper, clrOrangeRed, "Pvt_");
DrawPivot(lastLower, clrLimeGreen, "Pvt_");
}
//
// if (cDestBar.IsInsideBar())
// {
// //
// lastUpper = cDestBar.high;
// lastLower = cDestBar.low;
// //
// lastTime = TimeCurrent();
// //
// DrawPivot(lastUpper, clrOrangeRed, "Pvt_");
// DrawPivot(lastLower, clrLimeGreen, "Pvt_");
// }
// //
// if (lastUpper != cDestBar.high && lastLower != cDestBar.low)
// {
// //
// lastDestHH = cDestBar.high;
// lastDestLL = cDestBar.low;
// //
// DrawPivot(lastDestLL, clrYellow, "LDST_LL_", true);
// DrawPivot(lastDestHH, clrYellow, "LDST_HH_", true);
// //
// lastDestTime = TimeCurrent();
// }
//
DrawFibo();
}
//
void DrawPivot(
double price,
color clr,
string prefix,
bool forceRemove = false //
)
{
//
long chartID = ChartID();
datetime time1 = iTime(
_Symbol,
_Period,
2 //
);
datetime time = iTime(
_Symbol,
_Period,
0 //
);
//
string pPrefix = prefix + "P_" +
ToString(price);
//
if (IsDrawExists(prefix) && forceRemove)
{
RemoveDraws(prefix);
}
//
if (IsDrawExists(pPrefix))
{
return;
}
//
DrawTrendLine(
chartID,
pPrefix,
0,
time1,
price,
time,
price,
clr,
STYLE_SOLID,
2,
false,
false,
true //
);
}
//
void DrawFibo()
{
//
if (!IsValid(lastDestTime) || lastDestHH == 0 || lastDestLL == 0)
{
return;
}
//
string name = "LDST_FIb";
//
datetime time1 = TimeCurrent();
datetime time0 = lastDestTime;
//
RemoveDraw(name);
//
DrawFibonacci(
ChartID(),
name,
0,
time0,
lastDestHH,
time1,
lastDestLL,
clrAquamarine,
STYLE_DOT //
);
}
//
@@ -0,0 +1,387 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center XTest MQL5 Expert Advisor
// -------------------------------------------------
// Name: XTestPivotsEA
// Description: an Exper Advisor which used XTestSetup
// to Analyse Market ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XTestPivotsEA"
#property strict
//
#define ShortName "XTestPivotsEA"
//
// Imports ...
#include "../Helpers/x-saherelm.xct.helper.mq5"
#include "../Helpers/x-saherelm.xcc.helper.mq5"
#include "../Strategies/x-saherelm.xsrbr.strategy.mq5"
//
// Inputs ...
long mMagicNumber = 78692110; // Magic Number
int mSlippage = 10; // Slippgae
//
double eaVolume = 0.01;
double eaAllowLong = true;
double eaAllowShort = true;
//
// Variables ...
XSCXCTHelper *mCTHelper;
XSCXCCHelper *mCCHelper;
//
XSCBaseStrategy *strategies[];
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
if (!InitialEA())
{
return INIT_FAILED;
}
//
// EventSetTimer(1);
// EventSetMillisecondTimer(100);
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// De Initialize XSampleEA Providers ...
delete mCTHelper;
delete mCCHelper;
//
// EventKillTimer();
//
Clean(strategies);
}
//
// On Tick Handler ...
void OnTick()
{
HandleStrategiesOnTick();
}
//
// On Timer ...
void OnTimer()
{
//
// HandleStrategiesOnTick();
}
//
// Custom Functions ...
//
// Validate Inputs ...
bool ValidateInputs()
{
//
bool result = false;
//
result = true;
//
return result;
}
//
// Initialize all Requirements ...
bool InitialEA()
{
//
bool result = false;
//
// Bar Timer ...
XCTInputs ctInputs;
ctInputs.Default();
mCTHelper = new XSCXCTHelper();
result = mCTHelper.Init(
_Symbol,
_Period,
ctInputs //
);
if (!result)
{
return result;
}
//
// Bar Styles ...
XCCInputs ccInputs;
ccInputs.Default();
mCCHelper = new XSCXCCHelper();
result = mCCHelper.Init(
_Symbol,
_Period,
ccInputs //
);
if (!result)
{
return result;
}
//
XSymbolParser symbolParser;
//
bool drawAreas = false;
//
// EURUSD ...
string eurusdSymbol = "EURUSDb"; // symbolParser.GetEURUSDSymbol();
if (IsValid(eurusdSymbol))
{
//
// MAGIC NUMBER ...
long magicNumber = mMagicNumber + 1;
// //
// // Register XSRBR on EURUSD in M5 ...
// XSCXSRBRStrategy *eurusdM5SRBRStrategy;
// eurusdM5SRBRStrategy = new XSCXSRBRStrategy(
// eurusdSymbol,
// PERIOD_M5,
// eaVolume,
// 1.5, // R2R ...
// mSlippage,
// magicNumber,
// eaAllowLong,
// eaAllowShort,
// 0, // Max Longs
// 0 // Max Shorts
// );
// eurusdM5SRBRStrategy.SetAlertLogAlerts(true);
// eurusdM5SRBRStrategy.SetAlertEnableAlerts(true);
// eurusdM5SRBRStrategy.DarwSupportAndResistances(drawAreas);
// RegisterStrategy(eurusdM5SRBRStrategy);
// //
// // Register XSRBR on EURUSD in M10 ...
// XSCXSRBRStrategy *eurusdM10SRBRStrategy;
// eurusdM10SRBRStrategy = new XSCXSRBRStrategy(
// eurusdSymbol,
// PERIOD_M10,
// eaVolume,
// 1.5, // R2R ...
// mSlippage,
// magicNumber,
// eaAllowLong,
// eaAllowShort,
// 0, // Max Longs
// 0 // Max Shorts
// );
// eurusdM10SRBRStrategy.SetAlertLogAlerts(true);
// eurusdM10SRBRStrategy.SetAlertEnableAlerts(true);
// eurusdM10SRBRStrategy.DarwSupportAndResistances(drawAreas);
// RegisterStrategy(eurusdM10SRBRStrategy);
}
// //
// // XAUUSD ...
// string xauusdSymbol = "XAUUSDb";
// if (IsValid(xauusdSymbol))
// {
// //
// // MAGIC NUMBER ...
// long magicNumber = mMagicNumber + 2;
// //
// // Register XSRBR on XAUUSD in M5 ...
// XSCXSRBRStrategy *xauusdM5SRBRStrategy;
// xauusdM5SRBRStrategy = new XSCXSRBRStrategy(
// xauusdSymbol,
// PERIOD_M15,
// eaVolume,
// 1.5, // R2R ...
// mSlippage,
// magicNumber,
// eaAllowLong,
// eaAllowShort,
// 0, // Max Longs
// 0 // Max Shorts
// );
// xauusdM5SRBRStrategy.SetAlertLogAlerts(true);
// xauusdM5SRBRStrategy.SetAlertEnableAlerts(true);
// xauusdM5SRBRStrategy.DarwSupportAndResistances(drawAreas);
// RegisterStrategy(xauusdM5SRBRStrategy);
// }
//
// GBPUSD ...
string gbpusdSymbol = "GBPUSDb";
if (IsValid(gbpusdSymbol))
{
//
// MAGIC NUMBER ...
long magicNumber = mMagicNumber + 3;
// //
// // Register XSRBR on XAUUSD in M5 ...
// XSCXSRBRStrategy *gbpusdM15SRBRStrategy;
// gbpusdM15SRBRStrategy = new XSCXSRBRStrategy(
// gbpusdSymbol,
// PERIOD_M15,
// eaVolume,
// 1.5, // R2R ...
// mSlippage,
// magicNumber,
// eaAllowLong,
// eaAllowShort,
// 0, // Max Longs
// 0 // Max Shorts
// );
// gbpusdM15SRBRStrategy.SetAlertLogAlerts(true);
// gbpusdM15SRBRStrategy.SetAlertEnableAlerts(true);
// gbpusdM15SRBRStrategy.DarwSupportAndResistances(drawAreas);
// RegisterStrategy(gbpusdM15SRBRStrategy);
//
// Register XSRBR on XAUUSD in M5 ...
// XSCXSRBRStrategy *gbpusdM30SRBRStrategy;
// gbpusdM30SRBRStrategy = new XSCXSRBRStrategy(
// gbpusdSymbol,
// PERIOD_M30,
// eaVolume,
// 1.5, // R2R ...
// mSlippage,
// magicNumber,
// eaAllowLong,
// eaAllowShort,
// 0, // Max Longs
// 0 // Max Shorts
// );
// gbpusdM30SRBRStrategy.SetAlertLogAlerts(true);
// gbpusdM30SRBRStrategy.SetAlertEnableAlerts(true);
// gbpusdM30SRBRStrategy.DarwSupportAndResistances(drawAreas);
// RegisterStrategy(gbpusdM30SRBRStrategy);
}
//
// USDJPY ...
string usdjpySymbol = "USDJPYb";
if (IsValid(usdjpySymbol))
{
//
// MAGIC NUMBER ...
long magicNumber = mMagicNumber + 3;
// //
// // Register XSRBR on XAUUSD in M5 ...
// XSCXSRBRStrategy *usdjpyM5SRBRStrategy;
// usdjpyM5SRBRStrategy = new XSCXSRBRStrategy(
// usdjpySymbol,
// PERIOD_M5,
// eaVolume,
// 1.5, // R2R ...
// mSlippage,
// magicNumber,
// eaAllowLong,
// eaAllowShort,
// 0, // Max Longs
// 0 // Max Shorts
// );
// usdjpyM5SRBRStrategy.SetAlertLogAlerts(true);
// usdjpyM5SRBRStrategy.SetAlertEnableAlerts(true);
// usdjpyM5SRBRStrategy.DarwSupportAndResistances(drawAreas);
// RegisterStrategy(usdjpyM5SRBRStrategy);
}
//
return result;
}
//
// Register Strategy ...
void RegisterStrategy(XSCBaseStrategy *strategy)
{
//
if (strategy == NULL)
{
return;
}
//
ArrayResize(
strategies,
ArraySize(strategies) + 1 //
);
//
strategies[ArraySize(strategies) - 1] = strategy;
}
//
// Call All Registered Strategis Tick Handler Functions ...
void HandleStrategiesOnTick()
{
//
int count = ArraySize(strategies);
if (!IsValidSize(count))
{
return;
}
//
for (int i = 0; i < count; i++)
{
//
// Call Tick Handler Function ...
strategies[i].HandleTick();
}
}
//
// Custom Testing Functions ...
//
@@ -0,0 +1,263 @@
///////////////////////////////////////////////////////
//
// SaherElm IT Center XZoneTest MQL5 Expert Advisor
// -------------------------------------------------
// Name: XZoneTest
// Description: an Exper Advisor which used RSI and MA
// to Analyse Market ...
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////x
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XZoneTest"
#property strict
//
#include "../Classes/x-saherelm.xczone.class.mq5"
//
#define ShortName "XZoneTest"
//
// Inputs ...
input int zoneRange = 21;
input ENUM_TIMEFRAMES zonePeriod = PERIOD_M1;
//
// Variables ...
int barsTotal;
//
// Initialization ...
int OnInit()
{
//
if (!InitialEA())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Init Succeed ...
return INIT_SUCCEEDED;
}
//
// DeInitialization ...
void OnDeinit(const int reason)
{
//
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
// REASON_REMOVE 1 Program removed from a chart
// REASON_RECOMPILE 2 Program recompiled
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
// REASON_CHARTCLOSE 4 Chart closed
// REASON_PARAMETERS 5 Inputs changed by a user
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
// REASON_TEMPLATE 7 Another chart template applied
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
// REASON_CLOSE 9 Terminal closed
//
// De Initialize XSampleEA Providers ...
}
//
// On Tick Handler ...
void OnTick()
{
//
int bars = iBars(
_Symbol,
zonePeriod //
);
if (barsTotal == bars)
{
return;
}
//
barsTotal = bars;
//
datetime startTime = iTime(
_Symbol,
zonePeriod,
zoneRange + 1 //
);
datetime endTime = iTime(
_Symbol,
zonePeriod,
1 //
);
//
MqlTick ticks[];
CopyTicksRange(
_Symbol,
ticks,
COPY_TICKS_ALL,
startTime * 1000,
endTime * 1000 //
);
//
double highs[];
CopyHigh(
_Symbol,
zonePeriod,
startTime,
endTime,
highs //
);
double iHigh = highs[ArrayMaximum(highs)];
//
double lows[];
CopyLow(
_Symbol,
zonePeriod,
startTime,
endTime,
lows //
);
double iLow = lows[ArrayMinimum(lows)];
//
double iSize = iHigh - iLow;
//
CArrayObj zones;
int zCount = 10;
for (int i = 0; i < zCount; i++)
{
//
double iH = iHigh - iSize * i / zCount;
double iL = iHigh - iSize * (i + 1) / zCount;
//
XSCZone *iZone = new XSCZone();
iZone.high = iH;
iZone.low = iL;
//
zones.Add(iZone);
}
//
// Fill Ticks ...
for (int i = 0; i < ArraySize(ticks); i++)
{
//
MqlTick iTick = ticks[i];
//
for (int j = 0; j < zones.Total(); j++)
{
//
XSCZone *jZone = zones.At(j);
//
bool isInRange = iTick.bid >= jZone.low && iTick.bid <= jZone.high;
if (isInRange)
{
//
jZone.ticks++;
break;
}
}
}
//
// Sorting Zones ...
zones.Sort();
//
CArrayObj mChartObjects;
for (int i = 0; i < zones.Total(); i++)
{
//
XSCZone *iZone = zones.At(i);
//
string iZoneName = "Zone " + IntegerToString(i);
//
// Create Zone Rectangle ...
CChartObjectRectangle *iRect = new CChartObjectRectangle();
iRect.Create(
0,
iZoneName,
0,
startTime,
iZone.high,
endTime,
iZone.low //
);
iRect.Fill(true);
//
// Create Zone Label ...
CChartObjectLabel *iLabel = new CChartObjectLabel();
iLabel.Create(
0,
iZoneName + "_lbl",
0,
startTime,
iZone.high //
);
iLabel.Color(clrWhite);
//
// Calculate TickPercent ...
double iZoneTickPercent = (double)iZone.ticks / ArraySize(ticks) * 100;
iZoneTickPercent = NormalizeDouble(iZoneTickPercent, 2);
string iZoneTickPercentStr = (string)iZoneTickPercent + "%";
//
iLabel.Description(iZoneTickPercentStr);
//
if (iZone.ticks > ArraySize(ticks) * 0.15)
{
iRect.Color(clrOrangeRed);
}
else if (iZone.ticks > ArraySize(ticks) * 0.10)
{
iRect.Color(clrOrange);
}
else
{
iRect.Color(clrLightGray);
}
//
// mChartObjects.Add(iRect);
// mChartObjects.Add(iLabel);
}
}
//
//
//
bool InitialEA()
{
//
bool result = false;
//
result = true;
//
return result;
}
//
@@ -0,0 +1,202 @@
//
// Filter Long Conditions ...
bool FilterLongConditions(
X121SetupConditions &conditions, // Conditions
int pusher, // Pushers
string provider // Provider
)
{
//
bool result = false;
//
// Generating Conditions Score ...
double bullishScore = 0;
double bearishScore = 0;
conditions.GenerateScore(
bullishScore,
bearishScore //
);
//
bool isGBPUSD = symbolParser.IsGBPUSD(conditions.symbol);
//
bool isM5Period = conditions.period == PERIOD_M5;
bool isM15Period = conditions.period == PERIOD_M15;
bool isH1Period = conditions.period == PERIOD_H1;
bool isH4Period = conditions.period == PERIOD_H4;
//
// Set Default Result to True ...
result = true;
//
// Global Conditions ...
result =
//
result &&
//
!(
//
(
//
// XICH ...
conditions.ichConditions.isClosedUnderKijunSen &&
conditions.ichConditions.isTenkanSenOverKijunSen
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isTenkanSenUnderKijunSen
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isSenkouSpanAOverB &&
!conditions.ichConditions.isSenkouSpanAOverLast
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isSenkouSpanAUnderB &&
conditions.ichConditions.isSenkouSpanAUnderLast
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isSenkouSpanAOverB &&
!conditions.ichConditions.isSenkouSpanAOverLast &&
conditions.ichConditions.isTenkanSenCrossedOverKijunSen &&
//
// XVLM ...
conditions.vlmConditions.isVolumeUnderLast
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isClosedOverKijunSen &&
conditions.ichConditions.isTenkanSenOverKijunSen &&
conditions.ichConditions.isSenkouSpanAUnderB
//
)
//
||
//
(
//
// XPV ...
!conditions.pvConditions.isSCBullish &&
!conditions.pvConditions.isSCHHBullish &&
!conditions.pvConditions.isSCLLBullish &&
!conditions.pvConditions.isMCBullish &&
!conditions.pvConditions.isMCHHBullish &&
!conditions.pvConditions.isMCLLBullish &&
!conditions.pvConditions.isLCBullish &&
!conditions.pvConditions.isLCHHBullish &&
!conditions.pvConditions.isLCLLBullish &&
!conditions.pvConditions.isHCBullish &&
!conditions.pvConditions.isHCHHBullish &&
!conditions.pvConditions.isHCLLBullish &&
//
// XICH ...
conditions.ichConditions.isClosedOverKijunSen &&
(conditions.ichConditions.isTenkanSenOverKijunSen ||
conditions.ichConditions.isTenkanSenCrossedOverKijunSen)
//
)
//
||
//
(
//
(
//
// XPV ...
conditions.pvConditions.isNewPeak &&
conditions.pvConditions.isNewPeakOverLast &&
conditions.pvConditions.isFiboIncreased &&
conditions.pvConditions.isCloseOverFib1 &&
conditions.pvConditions.isCloseOverFib2 &&
conditions.pvConditions.isCloseOverFib3 &&
conditions.pvConditions.isCloseOverFib4 &&
conditions.pvConditions.isCloseOverFib5
//
)
//
&&
//
(
//
// XSCORES ...
bearishScore < 5 &&
bullishScore > bearishScore * 10
//
)
//
&&
//
(
//
(
//
// XPV ...
conditions.pvConditions.isSCBullish &&
conditions.pvConditions.isSCHHBullish &&
conditions.pvConditions.isSCLLBullish &&
conditions.pvConditions.isMCBullish &&
conditions.pvConditions.isMCHHBullish &&
conditions.pvConditions.isMCLLBullish &&
conditions.pvConditions.isLCBullish &&
conditions.pvConditions.isLCHHBullish &&
conditions.pvConditions.isLCLLBullish &&
conditions.pvConditions.isHCBullish &&
conditions.pvConditions.isHCHHBullish &&
conditions.pvConditions.isHCLLBullish
//
)
//
)
//
)
//
)
//
;
//
// Apply Filter ...
// Based On Symbol and Period ...
// if necessary ...
if (isGBPUSD)
{
//
// MEDIUM ...
if (isH1Period)
{
}
}
//
return result;
}
@@ -0,0 +1,222 @@
//
// Filter Short Conditions ...
bool FilterShortConditions(
X121SetupConditions &conditions, // Conditions
int pusher, // Pushers
string provider // Provider
)
{
//
bool result = false;
//
// Generating Conditions Score ...
double bullishScore = 0;
double bearishScore = 0;
conditions.GenerateScore(
bullishScore,
bearishScore //
);
//
bool isGBPUSD = symbolParser.IsGBPUSD(conditions.symbol);
//
bool isM5Period = conditions.period == PERIOD_M5;
bool isM15Period = conditions.period == PERIOD_M15;
bool isH1Period = conditions.period == PERIOD_H1;
bool isH4Period = conditions.period == PERIOD_H4;
//
// Set Default Result to True ...
result = true;
//
// Global Conditions ...
result =
//
result &&
//
!(
//
(
//
// XICH ...
conditions.ichConditions.isClosedOverKijunSen &&
conditions.ichConditions.isTenkanSenUnderKijunSen
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isTenkanSenOverKijunSen
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isSenkouSpanAUnderB &&
!conditions.ichConditions.isSenkouSpanAUnderLast
//
)
//
||
//
(
//
// XPV ...
conditions.pvConditions.isNewVale &&
conditions.pvConditions.isNewValeUnderLast &&
conditions.pvConditions.isFiboDecreased &&
conditions.pvConditions.isSCBearish &&
!conditions.pvConditions.isMCBearish &&
//
// XICH ...
conditions.ichConditions.isClosedOverKijunSen &&
//
// XHK ...
conditions.hkConditions.isHKSwitchedToBearish &&
conditions.hkConditions.isSMHKSwitchedToBearish
)
//
||
//
(
//
// XPV ...
conditions.pvConditions.isNewVale &&
conditions.pvConditions.isNewValeUnderLast &&
conditions.pvConditions.isFiboDecreased &&
!conditions.pvConditions.isSCBearish &&
!conditions.pvConditions.isSCHHBearish &&
//
// XVLM ...
conditions.vlmConditions.isVolumeBearish &&
!conditions.vlmConditions.isVolumeOverLast
//
)
//
||
//
(
//
(
//
// XPV ...
conditions.pvConditions.isNewVale &&
conditions.pvConditions.isNewValeUnderLast &&
conditions.pvConditions.isFiboDecreased &&
conditions.pvConditions.isCloseUnderFib1 &&
conditions.pvConditions.isCloseUnderFib2 &&
conditions.pvConditions.isCloseUnderFib3 &&
conditions.pvConditions.isCloseUnderFib4 &&
conditions.pvConditions.isCloseUnderFib5
//
)
//
&&
//
(
//
(
//
(
//
// XVLM ...
conditions.vlmConditions.isVolumeBearish &&
conditions.vlmConditions.isVolumeOverLast
//
)
//
&&
//
(
//
(
//
conditions.pvConditions.isSCBearish &&
conditions.pvConditions.isSCHHBearish &&
conditions.pvConditions.isSCLLBearish &&
conditions.pvConditions.isMCBearish &&
conditions.pvConditions.isMCHHBearish &&
conditions.pvConditions.isMCLLBearish &&
conditions.pvConditions.isLCBearish &&
conditions.pvConditions.isLCHHBearish &&
conditions.pvConditions.isLCLLBearish &&
conditions.pvConditions.isHCBearish &&
conditions.pvConditions.isHCHHBearish &&
conditions.pvConditions.isHCLLBearish &&
//
// XICH ...
conditions.ichConditions.isClosedUnderKijunSen &&
conditions.ichConditions.isTenkanSenUnderKijunSen &&
conditions.ichConditions.isSenkouSpanAUnderB &&
conditions.ichConditions.isSenkouSpanAUnderLast &&
conditions.ichConditions.isFutureSenkouSpanAUnderB &&
conditions.ichConditions.isFutureSenkouSpanAUnderLast &&
conditions.ichConditions.isSenkouSpanACrossedUnderLast
//
)
//
||
//
(
//
// XICH ...
conditions.ichConditions.isSenkouSpanACrossedUnderB
//
)
//
)
//
)
//
||
//
(
//
// XRL ...
conditions.rlConditions.isFastBearish &&
conditions.rlConditions.isSlowBearish &&
conditions.rlConditions.isFastOverSlow &&
conditions.rlConditions.isVerifierBearish
//
)
//
)
//
&&
//
// XSCORES ...
bullishScore < 5 &&
bearishScore > bullishScore * 10
//
)
//
)
//
;
//
// Apply Filter ...
// Based On Symbol and Period ...
// if necessary ...
if (isGBPUSD)
{
//
// MEDIUM ...
if (isH1Period)
{
}
}
//
return result;
}
@@ -0,0 +1,194 @@
//+------------------------------------------------------------------+
//| Custom.mqh |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Indicator.mqh"
//+------------------------------------------------------------------+
//| Class CiCustom. |
//| Purpose: Class of custom indicators. |
//| Derives from class CIndicator. |
//+------------------------------------------------------------------+
class CiCustom : public CIndicator
{
protected:
int m_num_params; // number of creation parameters
MqlParam m_params[]; // creation parameters
public:
CiCustom(void);
~CiCustom(void);
//--- methods of access to protected data
bool NumBuffers(const int buffers);
int NumParams(void) const { return(m_num_params); }
ENUM_DATATYPE ParamType(const int ind) const;
long ParamLong(const int ind) const;
double ParamDouble(const int ind) const;
string ParamString(const int ind) const;
//--- method of identifying
virtual int Type(void) const { return(IND_CUSTOM); }
protected:
//--- methods of tuning
virtual bool Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[]);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CiCustom::CiCustom(void) : m_num_params(0)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CiCustom::~CiCustom(void)
{
}
//+------------------------------------------------------------------+
//| Set number of buffers of indicator |
//+------------------------------------------------------------------+
bool CiCustom::NumBuffers(const int buffers)
{
bool result=true;
//---
if(m_buffers_total==0)
{
m_buffers_total=buffers;
return(true);
}
if(m_buffers_total!=buffers)
{
Shutdown();
result=CreateBuffers(m_symbol,m_period,buffers);
if(result)
{
//--- create buffers
for(int i=0;i<m_buffers_total;i++)
((CIndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));
}
}
//---
return(result);
}
//+------------------------------------------------------------------+
//| Get type of specified parameter of creation |
//+------------------------------------------------------------------+
ENUM_DATATYPE CiCustom::ParamType(const int ind) const
{
if(ind>=m_num_params)
return(WRONG_VALUE);
//---
return(m_params[ind].type);
}
//+------------------------------------------------------------------+
//| Get specified parameter of creatiob as a long value |
//+------------------------------------------------------------------+
long CiCustom::ParamLong(const int ind) const
{
if(ind>=m_num_params)
return(0);
switch(m_params[ind].type)
{
case TYPE_DOUBLE:
case TYPE_FLOAT:
case TYPE_STRING:
return(0);
}
//---
return(m_params[ind].integer_value);
}
//+------------------------------------------------------------------+
//| Get specified parameter of creation as a double value |
//+------------------------------------------------------------------+
double CiCustom::ParamDouble(const int ind) const
{
if(ind>=m_num_params)
return(EMPTY_VALUE);
switch(m_params[ind].type)
{
case TYPE_DOUBLE:
case TYPE_FLOAT:
break;
default:
return(EMPTY_VALUE);
}
//---
return(m_params[ind].double_value);
}
//+------------------------------------------------------------------+
//| Get specified parameter of creation as a string value |
//+------------------------------------------------------------------+
string CiCustom::ParamString(const int ind) const
{
if(ind>=m_num_params || m_params[ind].type!=TYPE_STRING)
return("");
//---
return(m_params[ind].string_value);
}
//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters |
//+------------------------------------------------------------------+
bool CiCustom::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[])
{
int i;
//--- tune
if(m_buffers_total==0)
m_buffers_total=256;
if(CreateBuffers(symbol,period,m_buffers_total))
{
//--- string of status of drawing
m_name ="Custom "+params[0].string_value;
m_status="("+symbol+","+PeriodDescription();
for(i=1;i<num_params;i++)
{
switch(params[i].type)
{
case TYPE_BOOL:
m_status=m_status+","+((params[i].integer_value)?"true":"false");
break;
case TYPE_CHAR:
case TYPE_UCHAR:
case TYPE_SHORT:
case TYPE_USHORT:
case TYPE_INT:
case TYPE_UINT:
case TYPE_LONG:
case TYPE_ULONG:
m_status=m_status+","+IntegerToString(params[i].integer_value);
break;
case TYPE_COLOR:
m_status=m_status+","+ColorToString((color)params[i].integer_value);
break;
case TYPE_DATETIME:
m_status=m_status+","+TimeToString(params[i].integer_value);
break;
case TYPE_FLOAT:
case TYPE_DOUBLE:
m_status=m_status+","+DoubleToString(params[i].double_value);
break;
case TYPE_STRING:
m_status=m_status+",'"+params[i].string_value+"'";
break;
}
}
m_status=m_status+") H="+IntegerToString(m_handle);
//--- save settings
ArrayResize(m_params,num_params);
for(i=0;i<num_params;i++)
{
m_params[i].type =params[i].type;
m_params[i].integer_value=params[i].integer_value;
m_params[i].double_value =params[i].double_value;
m_params[i].string_value =params[i].string_value;
}
m_num_params=num_params;
//--- create buffers
for(i=0;i<m_buffers_total;i++)
((CIndicatorBuffer*)At(i)).Name("LINE "+IntegerToString(i));
//--- ok
return(true);
}
//--- error
return(false);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,136 @@
//+------------------------------------------------------------------+
//| Trend.mqh |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Indicator.mqh"
//+------------------------------------------------------------------+
//| Class CiADX. |
//| Purpose: Class of the "Average Directional Index" indicator. |
//| Derives from class CIndicator. |
//+------------------------------------------------------------------+
class CiADX : public CIndicator
{
protected:
int m_ma_period;
public:
CiADX(void);
~CiADX(void);
//--- methods of access to protected data
int MaPeriod(void) const { return (m_ma_period); }
//--- method of creation
bool Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
//--- methods of access to indicator data
double Main(const int index) const;
double Plus(const int index) const;
double Minus(const int index) const;
//--- method of identifying
virtual int Type(void) const { return (IND_ADX); }
protected:
//--- methods of tuning
virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CiADX::CiADX(void) : m_ma_period(-1)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CiADX::~CiADX(void)
{
}
//+------------------------------------------------------------------+
//| Create the "Average Directional Index" indicator |
//+------------------------------------------------------------------+
bool CiADX::Create(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period)
{
//--- check history
if (!SetSymbolPeriod(symbol, period))
return (false);
//--- create
m_handle = iADX(symbol, period, ma_period);
//--- check result
if (m_handle == INVALID_HANDLE)
return (false);
//--- indicator successfully created
if (!Initialize(symbol, period, ma_period))
{
//--- initialization failed
IndicatorRelease(m_handle);
m_handle = INVALID_HANDLE;
return (false);
}
//--- ok
return (true);
}
//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters |
//+------------------------------------------------------------------+
bool CiADX::Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[])
{
return (Initialize(symbol, period, (int)params[0].integer_value));
}
//+------------------------------------------------------------------+
//| Initialize indicator with the special parameters |
//+------------------------------------------------------------------+
bool CiADX::Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int ma_period)
{
if (CreateBuffers(symbol, period, 3))
{
//--- string of status of drawing
m_name = "ADX";
m_status = "(" + symbol + "," + PeriodDescription() + "," + IntegerToString(ma_period) + ") H=" + IntegerToString(m_handle);
//--- save settings
m_ma_period = ma_period;
//--- create buffers
((CIndicatorBuffer *)At(0)).Name("MAIN_LINE");
((CIndicatorBuffer *)At(1)).Name("PLUS_LINE");
((CIndicatorBuffer *)At(2)).Name("MINUS_LINE");
//--- ok
return (true);
}
//--- error
return (false);
}
//+------------------------------------------------------------------+
//| Access to Main buffer of "Average Directional Index" |
//+------------------------------------------------------------------+
double CiADX::Main(const int index) const
{
CIndicatorBuffer *buffer = At(0);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
//+------------------------------------------------------------------+
//| Access to Plus buffer of "Average Directional Index" |
//+------------------------------------------------------------------+
double CiADX::Plus(const int index) const
{
CIndicatorBuffer *buffer = At(1);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
//+------------------------------------------------------------------+
//| Access to Minus buffer of "Average Directional Index" |
//+------------------------------------------------------------------+
double CiADX::Minus(const int index) const
{
CIndicatorBuffer *buffer = At(2);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
@@ -0,0 +1,175 @@
//+------------------------------------------------------------------+
//| Class CiIchimoku. |
//| Purpose: Class of the "Ichimoku Kinko Hyo" indicator. |
//| Derives from class CIndicator. |
//+------------------------------------------------------------------+
class CiIchimoku : public CIndicator
{
protected:
int m_tenkan_sen;
int m_kijun_sen;
int m_senkou_span_b;
public:
CiIchimoku(void);
~CiIchimoku(void);
//--- methods of access to protected data
int TenkanSenPeriod(void) const { return (m_tenkan_sen); }
int KijunSenPeriod(void) const { return (m_kijun_sen); }
int SenkouSpanBPeriod(void) const { return (m_senkou_span_b); }
//--- method of creation
bool Create(const string symbol, const ENUM_TIMEFRAMES period,
const int tenkan_sen, const int kijun_sen, const int senkou_span_b);
//--- methods of access to indicator data
double TenkanSen(const int index) const;
double KijunSen(const int index) const;
double SenkouSpanA(const int index) const;
double SenkouSpanB(const int index) const;
double ChinkouSpan(const int index) const;
//--- method of identifying
virtual int Type(void) const { return (IND_ICHIMOKU); }
protected:
//--- methods of tuning
virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
bool Initialize(const string symbol, const ENUM_TIMEFRAMES period,
const int tenkan_sen, const int kijun_sen, const int senkou_span_b);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CiIchimoku::CiIchimoku(void) : m_tenkan_sen(-1),
m_kijun_sen(-1),
m_senkou_span_b(-1)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CiIchimoku::~CiIchimoku(void)
{
}
//+------------------------------------------------------------------+
//| Create indicator "Ichimoku Kinko Hyo" |
//+------------------------------------------------------------------+
bool CiIchimoku::Create(const string symbol, const ENUM_TIMEFRAMES period,
const int tenkan_sen, const int kijun_sen, const int senkou_span_b)
{
//--- check history
if (!SetSymbolPeriod(symbol, period))
return (false);
//--- create
m_handle = iIchimoku(symbol, period, tenkan_sen, kijun_sen, senkou_span_b);
//--- check result
if (m_handle == INVALID_HANDLE)
return (false);
//--- indicator successfully created
if (!Initialize(symbol, period, tenkan_sen, kijun_sen, senkou_span_b))
{
//--- initialization failed
IndicatorRelease(m_handle);
m_handle = INVALID_HANDLE;
return (false);
}
//--- ok
return (true);
}
//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters |
//+------------------------------------------------------------------+
bool CiIchimoku::Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[])
{
return (Initialize(symbol, period, (int)params[0].integer_value, (int)params[1].integer_value, (int)params[2].integer_value));
}
//+------------------------------------------------------------------+
//| Initialize indicator with the special parameters |
//+------------------------------------------------------------------+
bool CiIchimoku::Initialize(const string symbol, const ENUM_TIMEFRAMES period,
const int tenkan_sen, const int kijun_sen, const int senkou_span_b)
{
if (CreateBuffers(symbol, period, 5))
{
//--- string of status of drawing
m_name = "Ichimoku";
m_status = "(" + symbol + "," + PeriodDescription() + "," +
IntegerToString(tenkan_sen) + "," + IntegerToString(kijun_sen) + "," +
IntegerToString(senkou_span_b) + ") H=" + IntegerToString(m_handle);
//--- save settings
m_tenkan_sen = tenkan_sen;
m_kijun_sen = kijun_sen;
m_senkou_span_b = senkou_span_b;
//--- create buffers
((CIndicatorBuffer *)At(0)).Name("TENKANSEN_LINE");
((CIndicatorBuffer *)At(1)).Name("KIJUNSEN_LINE");
((CIndicatorBuffer *)At(2)).Name("SENKOUSPANA_LINE");
((CIndicatorBuffer *)At(2)).Offset(kijun_sen);
((CIndicatorBuffer *)At(3)).Name("SENKOUSPANB_LINE");
((CIndicatorBuffer *)At(3)).Offset(kijun_sen);
((CIndicatorBuffer *)At(4)).Name("CHIKOUSPAN_LINE");
((CIndicatorBuffer *)At(4)).Offset(-kijun_sen);
//--- ok
return (true);
}
//--- error
return (false);
}
//+------------------------------------------------------------------+
//| Access to TenkanSen buffer of "Ichimoku Kinko Hyo" |
//+------------------------------------------------------------------+
double CiIchimoku::TenkanSen(const int index) const
{
CIndicatorBuffer *buffer = At(0);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
//+------------------------------------------------------------------+
//| Access to KijunSen buffer of "Ichimoku Kinko Hyo" |
//+------------------------------------------------------------------+
double CiIchimoku::KijunSen(const int index) const
{
CIndicatorBuffer *buffer = At(1);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
//+------------------------------------------------------------------+
//| Access to SenkouSpanA buffer of "Ichimoku Kinko Hyo" |
//+------------------------------------------------------------------+
double CiIchimoku::SenkouSpanA(const int index) const
{
CIndicatorBuffer *buffer = At(2);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
//+------------------------------------------------------------------+
//| Access to SenkouSpanB buffer of "Ichimoku Kinko Hyo" |
//+------------------------------------------------------------------+
double CiIchimoku::SenkouSpanB(const int index) const
{
CIndicatorBuffer *buffer = At(3);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
//+------------------------------------------------------------------+
//| Access to ChikouSpan buffer of "Ichimoku Kinko Hyo" |
//+------------------------------------------------------------------+
double CiIchimoku::ChinkouSpan(const int index) const
{
CIndicatorBuffer *buffer = At(4);
//--- check
if (buffer == NULL)
return (EMPTY_VALUE);
//---
return (buffer.At(index));
}
@@ -0,0 +1,115 @@
//+------------------------------------------------------------------+
//| DCC_Piercing.mq5 |
//| Rajesh Nait, Copyright 2023 |
//| https://www.mql5.com/en/users/rajeshnait/seller |
//+------------------------------------------------------------------+
#property copyright "Rajesh Nait, Copyright 2023"
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot Bullish Marubozu
#property indicator_label1 "+DCCP"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrSnow
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot Bearish Marubozu
#property indicator_label2 "-DCCP"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrSnow
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input group "Bearish"
input uchar InpBullishDCCPCode = 217; // BullishDCCP: code for style DRAW_ARROW (font Wingdings)
input int InpBullishDCCPShift = 10; // BullishDCCP: vertical shift of arrows in pixels
input group "Bullish"
input uchar InpBearishDCCPCode = 218; // BearishDCCP: code for style DRAW_ARROW (font Wingdings)
input int InpBearishDCCPShift =10; // BearishDCCP: vertical shift of arrows in pixels
//--- indicator buffers
double BullishDCCPBuffer[];
double BearishDCCPBuffer[];
int min_rates_total;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
min_rates_total=2;
//--- indicator buffers mapping
SetIndexBuffer(0,BullishDCCPBuffer,INDICATOR_DATA);
SetIndexBuffer(1,BearishDCCPBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
PlotIndexSetInteger(0,PLOT_ARROW,InpBullishDCCPCode);
PlotIndexSetInteger(1,PLOT_ARROW,InpBearishDCCPCode);
ArraySetAsSeries(BullishDCCPBuffer,true);
ArraySetAsSeries(BearishDCCPBuffer,true);
//--- set the vertical shift of arrows in pixels
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,InpBullishDCCPShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-InpBearishDCCPShift);
//--- set as an empty value 0.0
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//---
if(rates_total<min_rates_total)
return(0);
int limit;
if(prev_calculated>rates_total || prev_calculated<=0) {
limit=rates_total-min_rates_total;
} else {
limit=rates_total-prev_calculated;
}
ArraySetAsSeries(open,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
//---
for(int i=limit; i>=0 && !IsStopped(); i--) {
BullishDCCPBuffer[i]=0.0;
BearishDCCPBuffer[i]=0.0;
BearishDCCPBuffer[0]=0.0;
if(open[i]>close[i] && open[i+1]<close[i+1] && open[i]>close[i+1])
BearishDCCPBuffer[i]=high[i];
BullishDCCPBuffer[0]=0.0;
if(open[i]<close[i] && open[i+1]>close[i+1] && open[i]<close[i+1])
BullishDCCPBuffer[i]=low[i];
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,99 @@
//+------------------------------------------------------------------+
//| Dominant.mq5 |
//| Copyright 2024, Rajesh Kumar Nait |
//| https://www.mql5.com/en/users/rajeshnait/seller |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Rajesh Kumar Nait"
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 0
string prefix="c_";
input int total = 1000; // Number of Bars
input color clr = clrSnow; // Adjust color as required
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectsDeleteAll(0,prefix);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//---
ArraySetAsSeries(open,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
ArraySetAsSeries(time,true);
if(rates_total<total) {
Print("Required Bars not available");
return(rates_total);
}
for(int i=1; i<total; i++) {
//bullish
if(open[i]<close[i] && open[i+1]<close[i+1] && open[i]>=close[i+1] && low[i]<close[i+1] && high[i+1]>open[i])
crearFlecha(prefix+"Bull_Dominanat"+IntegerToString(i),time[i],low[i+1],clr,225,ANCHOR_TOP);
if(open[i]>close[i] && open[i+1]>close[i+1] && open[i]<=close[i+1] && high[i]>close[i+1] && low[i+1]<open[i])
crearFlecha(prefix+"Bear_Dominanat"+IntegerToString(i),time[i],high[i+1],clr,226,ANCHOR_BOTTOM);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| CREATE ARROWS
//+------------------------------------------------------------------+
bool crearFlecha(string nameAux, datetime timeAux, double priceAux, color clrAux, int code, ENUM_ARROW_ANCHOR anchorAux) {
const long chart_ID=0; // chart's ID
const string name=nameAux; // arrow name
const int sub_window=0; // subwindow index
datetime time=timeAux; // anchor point time
double price=priceAux; // anchor point price
const int arrow_code=code; // arrow code
const ENUM_ARROW_ANCHOR anchor=anchorAux; // anchor point position
const color clr_=clrAux; // arrow color
const ENUM_LINE_STYLE style=STYLE_SOLID; // border line style
const int width=1; // arrow size
const bool back=true; // in the background
const bool selection=false; // highlight to move
const bool hidden=true; // hidden in the object list
const long z_order=0; // priority for mouse click
ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price);
ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code);
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchorAux);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr_);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
return(true);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,105 @@
//+------------------------------------------------------------------+
//| Fair_Value_Gap.mq5 |
//| Copyright 2024, Rajesh Kumar Nait |
//| https://www.mql5.com/en/users/rajeshnait/seller |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Rajesh Kumar Nait"
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameters
input color InpColorToUP = clrLime; // Color of the gap up
input color InpColorToDN = clrDeepPink; // Color of the gap down
input int maxbars = 300;// how many bars to Look back
string prefix;
double price;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
prefix=MQLInfoString(MQL_PROGRAM_NAME)+"_";
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectsDeleteAll(0,prefix);
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//---
if(rates_total<4) return 0;
price = close[0];
ArraySetAsSeries(open,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
ArraySetAsSeries(time,true);
int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-5;
}
for(int i=maxbars; i>=0 && !IsStopped(); i--) {
if(low[i]-high[i+2]>=Point()) {
double up=fmin(high[i],low[i]);
double dn=fmax(high[i+2],low[i+2]);
DrawArea(i,up,dn,time,InpColorToUP,1);
}
if(low[i+2]-high[i]>=Point()) {
double up=fmin(high[i+2],low[i+2]);
double dn=fmax(high[i],low[i]);
DrawArea(i,up,dn,time,InpColorToDN,0);
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DrawArea(const int index, const double price_up,const double price_dn,const datetime &time[],const color color_area,const char dir) {
string name=prefix+(dir>0 ? "up_" : "dn_")+TimeToString(time[index]);
if(ObjectFind(0,name)<0 )
ObjectCreate(0,name,OBJ_RECTANGLE,0,0,0,0);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
ObjectSetInteger(0,name,OBJPROP_FILL,true);
ObjectSetInteger(0,name,OBJPROP_BACK,true);
ObjectSetString(0,name,OBJPROP_TOOLTIP,"\n");
//---
ObjectSetInteger(0,name,OBJPROP_COLOR,color_area);
ObjectSetInteger(0,name,OBJPROP_TIME,0,time[index+2]);
ObjectSetInteger(0,name,OBJPROP_TIME,1,time[index]);
ObjectSetDouble(0,name,OBJPROP_PRICE,0,price_up);
ObjectSetDouble(0,name,OBJPROP_PRICE,1,price_dn);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,111 @@
//+------------------------------------------------------------------+
//| Geometric Moving Average.mq5 |
//| Copyright 2024, Rosh Jardine |
//| https://www.mql5.com/en/users/roshjardine |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Lyn Astara"
#property link "https://www.mql5.com/en/users/roshjardine"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot GeoMALine
#property indicator_label1 "GeoMALine"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
input int InputGeoMAPeriod = 7;
input int InputGeoMAShift = 0;
input ENUM_APPLIED_PRICE InputAppliedPriceEnum = PRICE_CLOSE;
//--- indicator buffers
double GeoMALineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,GeoMALineBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
/*** setting values of the indicator that won't be visible on a chart ***/
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InputGeoMAPeriod);
//--- line shifts when drawing
PlotIndexSetInteger(0,PLOT_SHIFT,InputGeoMAShift);
string short_name = "GeoMA-"+EnumToString(InputAppliedPriceEnum)+"("+IntegerToString(InputGeoMAPeriod)+")";
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
/*const double x = double(1)/double(4);
double t = MathPow(90,x);
Print("t=",DoubleToString(t,4));*/
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
double p_t = 0.0; double p_0 = 0.0; static const double x = double(1)/double(InputGeoMAPeriod);
if (rates_total<=0) { return(0); }
if (prev_calculated<=0)
{
p_t = GET_APPLIED_PRICE(open[0],low[0],high[0],close[0]);
GeoMALineBuffer[0] = EMPTY_VALUE;
for (int i=1; i<InputGeoMAPeriod; i++)
{
p_t *= GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]);
}
GeoMALineBuffer[InputGeoMAPeriod-1] = MathPow(p_t,x);
for (int i=InputGeoMAPeriod; i<rates_total; i++)
{
p_0 = p_t/GET_APPLIED_PRICE(open[i-InputGeoMAPeriod],low[i-InputGeoMAPeriod],high[i-InputGeoMAPeriod],close[i-InputGeoMAPeriod]);
p_t = p_0*GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]);
GeoMALineBuffer[i] = MathPow(p_t,x);
}
return(rates_total);
}
for (int i=prev_calculated; i<=rates_total-1; i++)
{
p_0 = p_t/GET_APPLIED_PRICE(open[i-InputGeoMAPeriod],low[i-InputGeoMAPeriod],high[i-InputGeoMAPeriod],close[i-InputGeoMAPeriod]);
p_t = p_0*GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]);
GeoMALineBuffer[i] = MathPow(p_t,x);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
double GET_APPLIED_PRICE(const double ParamOpenPriceDouble,const double ParamLowPriceDouble,
const double ParamHighPriceDouble,const double ParamClosePriceDouble)
{
//+----------------------------------------------------------------------------------------------------------------------------------------+
/*** close price as the default ***/
double PriceResultDouble = ParamClosePriceDouble;
int AppliedPriceInt = int(InputAppliedPriceEnum);
//+----------------------------------------------------------------------------------------------------------------------------------------+
switch(AppliedPriceInt)
{
case 1 : PriceResultDouble = ParamOpenPriceDouble; break;
case 2 : PriceResultDouble = ParamLowPriceDouble; break;
case 3 : PriceResultDouble = ParamHighPriceDouble; break;
case 4 : PriceResultDouble = ParamClosePriceDouble; break;
/*** Median price ***/
case 5 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble)/2; break;
/*** Typical price ***/
case 6 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble)/3; break;
/*** Weighted price ***/
default : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble + ParamClosePriceDouble)/4; break;
}
return(PriceResultDouble);
}
@@ -0,0 +1,110 @@
//+------------------------------------------------------------------+
//| Harmonic Moving Average.mq5 |
//| Copyright 2024, Rosh Jardine |
//| https://www.mql5.com/en/users/roshjardine |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Rosh Jardine"
#property link "https://www.mql5.com/en/users/roshjardine"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot HMALine
#property indicator_label1 "HMALine"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
input int InputHMAPeriod = 7;
input int InputHMAShift = 0;
input ENUM_APPLIED_PRICE InputAppliedPriceEnum = PRICE_CLOSE;
//--- indicator buffers
double HMALineBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,HMALineBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
/*** setting values of the indicator that won't be visible on a chart ***/
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InputHMAShift);
//--- line shifts when drawing
PlotIndexSetInteger(0,PLOT_SHIFT,InputHMAShift);
string short_name = "HMA-"+EnumToString(InputAppliedPriceEnum)+"("+IntegerToString(InputHMAPeriod)+")";
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if (rates_total<=0) { return(0); }
if (prev_calculated<=0)
{
double rsd = 0.0;
for (int i=0; i<InputHMAPeriod; i++)
{
rsd += double(1/GET_APPLIED_PRICE(open[i],low[i],high[i],close[i]));
HMALineBuffer[i] = 0.0;
}
HMALineBuffer[InputHMAPeriod-1] = InputHMAPeriod/rsd;
for (int i=InputHMAPeriod; i<rates_total; i++)
{
double lrs = InputHMAPeriod/HMALineBuffer[i-1];
double vlfr = 1/GET_APPLIED_PRICE(open[i-InputHMAPeriod],low[i-InputHMAPeriod],high[i-InputHMAPeriod],close[i-InputHMAPeriod]);
HMALineBuffer[i] = InputHMAPeriod/(lrs-vlfr+(1/GET_APPLIED_PRICE(open[i],low[i],high[i],close[i])));
}
return(rates_total);
}
else
{
for (int i=prev_calculated; i<=rates_total-1; i++)
{
double lrs = double(InputHMAPeriod)/HMALineBuffer[i-1];
double vlfr = 1/GET_APPLIED_PRICE(open[i-InputHMAPeriod],low[i-InputHMAPeriod],high[i-InputHMAPeriod],close[i-InputHMAPeriod]);
HMALineBuffer[i] = InputHMAPeriod/(lrs-vlfr+(1/GET_APPLIED_PRICE(open[i],low[i],high[i],close[i])));
}
return(rates_total);
}
}
//+------------------------------------------------------------------+
double GET_APPLIED_PRICE(const double ParamOpenPriceDouble,const double ParamLowPriceDouble,
const double ParamHighPriceDouble,const double ParamClosePriceDouble)
{
//+----------------------------------------------------------------------------------------------------------------------------------------+
/*** close price as the default ***/
double PriceResultDouble = ParamClosePriceDouble;
int AppliedPriceInt = int(InputAppliedPriceEnum);
//+----------------------------------------------------------------------------------------------------------------------------------------+
switch(AppliedPriceInt)
{
case 1 : PriceResultDouble = ParamOpenPriceDouble; break;
case 2 : PriceResultDouble = ParamLowPriceDouble; break;
case 3 : PriceResultDouble = ParamHighPriceDouble; break;
case 4 : PriceResultDouble = ParamClosePriceDouble; break;
/*** Median price ***/
case 5 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble)/2; break;
/*** Typical price ***/
case 6 : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble)/3; break;
/*** Weighted price ***/
default : PriceResultDouble = (ParamHighPriceDouble + ParamLowPriceDouble + ParamClosePriceDouble + ParamClosePriceDouble)/4; break;
}
return(PriceResultDouble);
}
@@ -0,0 +1,96 @@
//+------------------------------------------------------------------+
//| Marubozu.mq5 |
//| Rajesh Nait, Copyright 2023 |
//| https://www.mql5.com/en/users/rajeshnait/seller |
//+------------------------------------------------------------------+
#property copyright "Rajesh Nait, Copyright 2023"
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot Bullish Marubozu
#property indicator_label1 "+M"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrLimeGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot Bearish Marubozu
#property indicator_label2 "-M"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrDeepPink
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input group "Bullish Marubozu"
sinput uchar InpBullishMarubozuCode = 167; // Bullish Marubozu: code for style DRAW_ARROW (font Wingdings)
sinput int InpBullishMarubozuShift = 10; // Bullish Marubozu: vertical shift of arrows in pixels
input group "Bearish Marubozu"
sinput uchar InpBearishMarubozuCode = 167; // Bearish Marubozu: code for style DRAW_ARROW (font Wingdings)
sinput int InpBearishMarubozuShift = 10; // Bearish Marubozu: vertical shift of arrows in pixels
//--- indicator buffers
double BullishMarubozuBuffer[];
double BearishMarubozuBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
//--- indicator buffers mapping
SetIndexBuffer(0,BullishMarubozuBuffer,INDICATOR_DATA);
SetIndexBuffer(1,BearishMarubozuBuffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,InpBullishMarubozuCode);
PlotIndexSetInteger(1,PLOT_ARROW,InpBearishMarubozuCode);
//--- set the vertical shift of arrows in pixels
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,InpBullishMarubozuShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-InpBearishMarubozuShift);
//--- set as an empty value 0.0
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//---
if(rates_total<3)
return(0);
//---
int limit=prev_calculated-1;
if(prev_calculated==0) {
limit=1;
BullishMarubozuBuffer[0]=0.0;
BearishMarubozuBuffer[0]=0.0;
}
for(int i=limit; i<rates_total; i++) {
BullishMarubozuBuffer[i]=0.0;
BearishMarubozuBuffer[i]=0.0;
if(i>0) {
if(open[i]==high[i] && close[i]==low[i]) {
BearishMarubozuBuffer[i]=high[i];
}
if(close[i]==high[i] && open[i]==low[i]) {
BullishMarubozuBuffer[i]=low[i];
}
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,133 @@
//+------------------------------------------------------------------+
//| MinChangeSignal.mq5 |
//| Copyright 2013, Rone. |
//| rone.sergey@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Rone."
#property link "rone.sergey@gmail.com"
#property version "1.00"
#property description "The signal is formed if the changes sum calculated on the last bar "
#property description "is less, than the smallest of sums calculated on the specified number of previous bars."
//---
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
//--- plot CurrentChange
#property indicator_label1 "Current Change Sum"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- plot MinChange
#property indicator_label2 "Min Change Sum"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2
//--- plot Signal
#property indicator_label3 "Signal"
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrLime
#property indicator_style3 STYLE_SOLID
#property indicator_width3 3
//--- input parameters
input int InpChangesPeriod = 4; // Changes Period
input int InpCheckPeriod = 10; // Check Period
input bool InpAbsChange = false; // Abs Change
//--- indicator buffers
double CurrentSumBuffer[];
double MinSumBuffer[];
double SignalBuffer[];
//---
int changes_period;
int check_period;
int min_required_bars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//---
if ( InpChangesPeriod < 1 || InpCheckPeriod < 2 ) {
changes_period = 3;
check_period = 10;
printf("Incorrect input value InpChangesPeriod = %d or/and InpCheckPeriod =%d. "
"Indicator will use values %d and %d respectively.", InpChangesPeriod, InpCheckPeriod,
changes_period, check_period);
} else {
changes_period = InpChangesPeriod;
check_period = InpCheckPeriod;
}
min_required_bars = changes_period + check_period + 1;
//--- indicator buffers mapping
SetIndexBuffer(0, CurrentSumBuffer, INDICATOR_DATA);
SetIndexBuffer(1, MinSumBuffer, INDICATOR_DATA);
SetIndexBuffer(2, SignalBuffer, INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(2, PLOT_ARROW, 159);
//---
for ( int plot = 0; plot < 3; plot++ ) {
PlotIndexSetInteger(plot, PLOT_DRAW_BEGIN, min_required_bars - 1);
PlotIndexSetInteger(plot, PLOT_SHIFT, 0);
PlotIndexSetDouble(plot, PLOT_EMPTY_VALUE, EMPTY_VALUE);
}
//---
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
IndicatorSetString(INDICATOR_SHORTNAME, "Min Price Change ("+(string)changes_period
+", "+(string)check_period+")");
//---
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
//---
int change_start_bar, check_start_bar, signal_start_bar;
//---
if ( rates_total < min_required_bars ) {
Print("Not enough bars for calculations.");
return(0);
}
//---
if ( prev_calculated > rates_total || prev_calculated <= 0 ) {
change_start_bar = changes_period;
check_start_bar = change_start_bar + check_period;
signal_start_bar = check_start_bar + 1;
} else {
change_start_bar = prev_calculated - 1;
check_start_bar = change_start_bar;
signal_start_bar = change_start_bar;
}
//---
for ( int bar = change_start_bar; bar < rates_total; bar++ ) {
double sum = 0.0;
for ( int shift = bar - changes_period + 1; shift <= bar; shift++ ) {
if ( InpAbsChange ) {
sum += MathAbs(price[shift] - price[shift-1]);
} else {
sum += price[shift] - price[shift-1];
}
}
CurrentSumBuffer[bar] = MathAbs(sum);
}
for ( int bar = check_start_bar; bar < rates_total; bar++ ) {
MinSumBuffer[bar] = CurrentSumBuffer[ArrayMinimum(CurrentSumBuffer,
bar-check_period, check_period)];
}
for ( int bar = signal_start_bar; bar < rates_total; bar++ ) {
SignalBuffer[bar] = EMPTY_VALUE;
if ( CurrentSumBuffer[bar] < MinSumBuffer[bar]
&& CurrentSumBuffer[bar-1] >= MinSumBuffer[bar-1] )
{
SignalBuffer[bar] = MinSumBuffer[bar];
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,208 @@
//+------------------------------------------------------------------+
//| Round price DOC.mq5 |
//+------------------------------------------------------------------+
#property copyright "mladen"
#property link "mladenfx@gmail.com"
#property version "1.00"
//
//
//
//
//
#property indicator_chart_window
#property indicator_buffers 7
#property indicator_plots 7
#property indicator_type1 DRAW_LINE
#property indicator_color1 Gold
#property indicator_type2 DRAW_LINE
#property indicator_color2 DeepSkyBlue
#property indicator_type3 DRAW_LINE
#property indicator_color3 DeepSkyBlue
#property indicator_type4 DRAW_LINE
#property indicator_color4 DeepSkyBlue
#property indicator_type5 DRAW_LINE
#property indicator_color5 PaleVioletRed
#property indicator_type6 DRAW_LINE
#property indicator_color6 PaleVioletRed
#property indicator_type7 DRAW_LINE
#property indicator_color7 PaleVioletRed
//
//
//
//
//
input int T3Period = 89; // T3 Calculation period
input double T3Hot = 0.7; // T3 hot value
input bool T3Original = false; // T3 original Tillson calculation?
input ENUM_APPLIED_PRICE T3Price = PRICE_CLOSE; // T3 price to use
input int Delta1 = 89; // Distance in points for first band
input int Delta2 = 144; // Distance in points for second band
input int Delta3 = 233; // Distance in points for third band
//
//
//
//
//
//
double t3[];
double t3Up1[];
double t3Up2[];
double t3Up3[];
double t3Dn1[];
double t3Dn2[];
double t3Dn3[];
double c1,c2,c3,c4,t3Alpha;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
int OnInit()
{
SetIndexBuffer( 0,t3 ,INDICATOR_DATA);
SetIndexBuffer( 1,t3Up1,INDICATOR_DATA);
SetIndexBuffer( 2,t3Up2,INDICATOR_DATA);
SetIndexBuffer( 3,t3Up3,INDICATOR_DATA);
SetIndexBuffer( 4,t3Dn1,INDICATOR_DATA);
SetIndexBuffer( 5,t3Dn2,INDICATOR_DATA);
SetIndexBuffer( 6,t3Dn3,INDICATOR_DATA);
PlotIndexSetString(0,PLOT_LABEL,"T3");
for (int i=1; i<4; i++)
{
PlotIndexSetString(i ,PLOT_LABEL,"T3 upper band "+(string)i);
PlotIndexSetString(i+3,PLOT_LABEL,"T3 lower band "+(string)i);
}
//
//
//
//
//
double a = MathMax(MathMin(T3Hot,1),0.0001);;
c1 = -a*a*a;
c2 = 3*(a*a+a*a*a);
c3 = -3*(2*a*a+a+a*a*a);
c4 = 1+3*a+a*a*a+3*a*a;
double t3period = T3Period;
if (!T3Original) t3period = 1.0 + (t3period-1.0)/2.0;
t3Alpha = 2.0/(1.0 + t3period);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
int OnCalculate(const int rates_total,const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[])
{
//
//
//
//
//
for (int i=(int)MathMax(prev_calculated-1,0); i<rates_total; i++)
{
double price;
switch (T3Price)
{
case PRICE_CLOSE : price = Close[i]; break;
case PRICE_OPEN : price = Open[i]; break;
case PRICE_HIGH : price = High[i]; break;
case PRICE_LOW : price = Low[i]; break;
case PRICE_MEDIAN : price = (High[i]+Low[i])/2.0; break;
case PRICE_TYPICAL : price = (High[i]+Low[i]+Close[i])/3.0; break;
case PRICE_WEIGHTED : price = (High[i]+Low[i]+Close[i]+Close[i])/4.0; break;
default : price = 0;
}
t3[i] = calcT3(price,i,rates_total);
t3Up1[i] = t3[i]+Delta1*_Point;
t3Up2[i] = t3[i]+Delta2*_Point;
t3Up3[i] = t3[i]+Delta3*_Point;
t3Dn1[i] = t3[i]-Delta1*_Point;
t3Dn2[i] = t3[i]-Delta2*_Point;
t3Dn3[i] = t3[i]-Delta3*_Point;
}
//
//
//
//
//
return(rates_total);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
double t3Values[][6];
double calcT3(double price, int r, int bars, int s=0)
{
if (ArrayRange(t3Values,0)!=bars) ArrayResize(t3Values,bars);
//
//
//
//
//
//
if (r < 2)
{
t3Values[r][s+0] = price;
t3Values[r][s+1] = price;
t3Values[r][s+2] = price;
t3Values[r][s+3] = price;
t3Values[r][s+4] = price;
t3Values[r][s+5] = price;
}
else
{
t3Values[r][s+0] = t3Values[r-1][s+0]+t3Alpha*(price -t3Values[r-1][s+0]);
t3Values[r][s+1] = t3Values[r-1][s+1]+t3Alpha*(t3Values[r][s+0]-t3Values[r-1][s+1]);
t3Values[r][s+2] = t3Values[r-1][s+2]+t3Alpha*(t3Values[r][s+1]-t3Values[r-1][s+2]);
t3Values[r][s+3] = t3Values[r-1][s+3]+t3Alpha*(t3Values[r][s+2]-t3Values[r-1][s+3]);
t3Values[r][s+4] = t3Values[r-1][s+4]+t3Alpha*(t3Values[r][s+3]-t3Values[r-1][s+4]);
t3Values[r][s+5] = t3Values[r-1][s+5]+t3Alpha*(t3Values[r][s+4]-t3Values[r-1][s+5]);
}
return(c1*t3Values[r][s+5] + c2*t3Values[r][s+4] + c3*t3Values[r][s+3] + c4*t3Values[r][s+2]);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,451 @@
//+------------------------------------------------------------------+
//| Strong_Levels_V0.mq5 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.pipcrop.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.pipcrop.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
#property version "1.00"
#property description "Rule 1(bull candle on sup. level): if close - low > Jump Factor"
#property description "Rule 2(bull candle on res. level): if close - low > Jump Factor & (close-low)/(high-low)>ratio"
#include <..\include\Math\Alglib\dataanalysis.mqh>
CKMeans *Cclustering;
enum filterrules {
rule1, // Rule 1
rule12, // Rule 1+2
rule2 // Rule 2
};
input filterrules myfilters = 1; // Rule(s) for data gather
input int LNo = 15; // Number of Levels to extract
input ENUM_TIMEFRAMES tf0 = PERIOD_M1; // Analysing TF
input double Jumpmulti = 100.0; // Min. Jump after touch (Percent of ATR)
input double ratio = 0.6667; // Ratio
input int ATRPer = 55; // ATR Period
input color ResColor = clrPink; // Resistance color for Panel
input color SupColor = clrPowderBlue; // Support color for Panel
input color BGColor = C'23,27,38'; // Back-ground
input color ResColor0 = clrRed; // Resistance Levels color
input color SupColor0 = clrBlue; // Support Levels color
input int LevelsInt = 2; // Levels Width
int ATRHndler, size0, xini=5, yini=20, maxbar, minbar=10, Ysize = 30, dyy=5, xdis = 0, lastbars = 0, LastLNo=0, minLN=3;
int sup_xyz[], res_xyz[];
long NextChart;
string ToolName = "SH_Levels_", OBJName;
double atr[], Jmulti;
CMatrixDouble res_mat, sup_mat, supclusters, resclusters;
bool startCluster = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
ObjectsDeleteAll(0, ToolName);
Jmulti = Jumpmulti/100.0;
ATRHndler = iATR(Symbol(), tf0, ATRPer);
SetScreen();
maxbar = 100000;
OBJName = ToolName + "Analyse"; xdis = xini;
ObjectCreate(0, OBJName, OBJ_BUTTON, 0, 0, 0);
OBJSet(OBJName, "Analyse Sup./Res.", xini, yini, 180, 2*Ysize+dyy,12, C'240,240,240', clrNONE, clrBlack, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
OBJName = ToolName + " Loadbar"; xdis+= (int)ObjectGetInteger(ChartID(), ToolName + "Analyse", OBJPROP_XSIZE) + dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "0.0 %", xdis, yini, 50, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
OBJName = ToolName + "clusterLoadbar"; xdis = xini+(int)ObjectGetInteger(ChartID(), ToolName + "Analyse", OBJPROP_XSIZE) + dyy; yini += Ysize + dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "0.0 %", xdis, yini, 50, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
OBJName = ToolName + " LN"; yini+=Ysize+dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "Level No.", xini, yini, 80, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
OBJName = ToolName + " LN.e"; xdis=xini+80+dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, IntegerToString(LNo), xdis, yini, 100-dyy, Ysize, 10, BGColor, clrGold, clrGold, ALIGN_RIGHT, CORNER_LEFT_UPPER, false);
LastLNo = LNo;
OBJName = ToolName + " bars"; xdis=xini; yini+=Ysize+dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "Bar count", xdis, yini, 80, Ysize, 10, clrGold, clrGold, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
OBJName = ToolName + " bars.e"; xdis+=80+dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, IntegerToString(maxbar), xdis, yini, 100-dyy, Ysize, 10, BGColor, clrGold, clrGold, ALIGN_RIGHT, CORNER_LEFT_UPPER, false);
lastbars = maxbar;
OBJName = ToolName + " TotalRes"; yini+=Ysize+3*dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "Res. Count: ", xini, yini, 180, Ysize, 12, ResColor, ResColor, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
OBJName = ToolName + " TotalSup"; yini+=Ysize+dyy;
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "Sup. Count: ", xini, yini, 180, Ysize, 12, SupColor, SupColor, BGColor, ALIGN_LEFT, CORNER_LEFT_UPPER, true);
EventSetMillisecondTimer(5);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if (reason==1 || reason==4)
{
ObjectsDeleteAll(0, ToolName);
EventKillTimer();
}
}
//+------------------------------------------------------------------+
void Analyse()
{
// Reset Graphics
OBJName = ToolName + "Zone_";
ObjectsDeleteAll(ChartID(), OBJName); ChartRedraw();
OBJName = ToolName + " Loadbar";
ObjectSetString(0, OBJName, OBJPROP_TEXT, "0.0 %");
ObjectSetInteger(0, OBJName, OBJPROP_XSIZE, 50);
OBJName = ToolName + "clusterLoadbar";
ObjectSetInteger(0, OBJName, OBJPROP_XSIZE, 50);
ObjectSetString(0, OBJName, OBJPROP_TEXT, "0.0 %");
Ysize = 30;
// Set data limits from screen
int bars = lastbars, ctype[];
double low[], high[], close[], open[], total[];
ArrayResize(ctype, bars); ArrayInitialize(ctype, 0);
int resi = (int) (bars / 1000.0)-1;
if (resi<=0) resi=2;
// Copy bars data
if (CopyBuffer(ATRHndler, 0, 0, bars, atr)<=0) return;
if (CopyLow(Symbol(), tf0, 0, bars, low)<=0) return;
if (CopyHigh(Symbol(), tf0, 0, bars, high)<=0) return;
if (CopyClose(Symbol(), tf0, 0, bars, close)<=0) return;
if (CopyOpen(Symbol(), tf0, 0, bars, open)<=0) return;
bars = (int) MathMin(ArraySize(open), MathMin((double) bars, ArraySize(close)));
// Fill candle type (Bull? Bear?)
for (int i=bars-ATRPer-1; i>=0; i--)
{
Print(i," ",ArraySize(close));
if (close[i]>open[i]) ctype[i] = +1;
else if (close[i]<open[i]) ctype[i] = -1;
}
// Fill S/R matrixes base on selected time-frame candels OHLC data
// Implementing Jump rules and candle type limits
sup_mat.Resize(0, 0); supclusters.Resize(0, 0);
res_mat.Resize(0, 0); resclusters.Resize(0,0);
for (int i=bars-ATRPer-1; i>=0; i--)
{
if (myfilters<=1 && ctype[i]==+1 && close[i]-low[i]>=atr[i]*Jmulti) Addsup(low[i]);
if (myfilters>=1 && ctype[i]==-1 && close[i]-low[i]>=atr[i]*Jmulti && (close[i]-low[i])/(high[i]-low[i])>=ratio) Addsup(low[i]);
if (myfilters<=1 && ctype[i]==-1 && high[i]-close[i]>=atr[i]*Jmulti) Addres(high[i]);
if (myfilters>=1 && ctype[i]==+1 && high[i]-close[i]>=atr[i]*Jmulti && (high[i]-close[i])/(high[i]-low[i])>=ratio) Addres(high[i]);
if (MathMod((double) i, resi) == 0)
{
ObjectSetString(0, ToolName + " Loadbar", OBJPROP_TEXT, DoubleToString(100*(double) (bars-ATRPer-1-i)/(bars-ATRPer-1),1) + " %");
ObjectSetInteger(0, ToolName + " Loadbar", OBJPROP_XSIZE, 50 + (int) (300 * ((double) (bars-ATRPer-i+1)/(bars-ATRPer-1))));
ObjectSetString(0, ToolName + " TotalRes", OBJPROP_TEXT, "Res. Count: " + IntegerToString(res_mat.Rows()));
ObjectSetString(0, ToolName + " TotalSup", OBJPROP_TEXT, "Sup. Count: " + IntegerToString(sup_mat.Rows()));
ChartRedraw();
}
}
startCluster = true;
OBJName = ToolName + "clusterLoadbar";
ObjectSetInteger(0, OBJName, OBJPROP_XSIZE, 350);
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation...");
int supinfo, resinfo, Restarts=5;
Cclustering.KMeansGenerate(sup_mat, sup_mat.Rows(), sup_mat.Cols(), LastLNo, Restarts, supinfo, supclusters, sup_xyz);
Cclustering.KMeansGenerate(res_mat, res_mat.Rows(), res_mat.Cols(), LastLNo, Restarts, resinfo, resclusters, res_xyz);
startCluster = false;
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Cluster Calculation done!");
double LevelRes[], LevelSup[], LevelTotal[];
ArrayResize(LevelRes, LastLNo); ArrayResize(LevelSup, LastLNo); ArrayResize(LevelTotal, LastLNo);
OBJName = ToolName + "clusterLoadbar";
int stat_x = (int) ObjectGetInteger(ChartID(), OBJName, OBJPROP_XDISTANCE);
OBJName = ToolName + " Loadbar";;
stat_x += (int) ObjectGetInteger(ChartID(), OBJName, OBJPROP_XSIZE) + dyy;
OBJName = ToolName + "Analyse";
int stat_y = (int) ObjectGetInteger(ChartID(), OBJName, OBJPROP_YDISTANCE);
// Closters Graphical
OBJName = ToolName + "Zone_Res_Header";
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, "Res. Levels", stat_x, stat_y, 135, Ysize, 12, ResColor, ResColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
OBJName = ToolName + "Zone_Sup_Header";
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0); stat_x+=135+dyy;
OBJSet(OBJName, "Sup. Levels", stat_x, stat_y, 135, Ysize, 12, SupColor, SupColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
stat_y+=Ysize+dyy;
Ysize/=2;
for (int i=0; i<LastLNo; i++)
{
stat_x -=135+dyy;
OBJName = ToolName + "Zone_Res_" + IntegerToString(i);
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, DoubleToString(resclusters.Get(0, i), Digits()), stat_x, stat_y, 135, Ysize, 12, ResColor, ResColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
stat_x +=135+dyy;
OBJName = ToolName + "Zone_Sup_" + IntegerToString(i);
ObjectCreate(0, OBJName, OBJ_EDIT, 0, 0, 0);
OBJSet(OBJName, DoubleToString(supclusters.Get(0, i), Digits()), stat_x, stat_y, 135, Ysize, 12, SupColor, SupColor, BGColor, ALIGN_CENTER, CORNER_LEFT_UPPER, true);
stat_y+=Ysize+dyy;
}
NextChart = ChartOpen(Symbol(), Period());
datetime future = TimeCurrent()+ PeriodSeconds(PERIOD_MN1) * 100;
double price;
for (int i=0; i<LastLNo; i++)
{
price = NormalizeDouble(resclusters.Get(0, i), Digits());
OBJName = ToolName + "Zone_Res_" + IntegerToString(i+LastLNo+1);
ObjectCreate(NextChart, OBJName, OBJ_HLINE, 0, 0, 0);
TrendSet(OBJName, 0, NextChart, price, price, ResColor0, LevelsInt, STYLE_SOLID, true);
price = NormalizeDouble(supclusters.Get(0, i), Digits());
OBJName = ToolName + "Zone_Sup_" + IntegerToString(i+LastLNo+1);
ObjectCreate(NextChart, OBJName, OBJ_HLINE, 0, 0, 0);
TrendSet(OBJName, 0, NextChart, price, price, SupColor0, LevelsInt, STYLE_SOLID, true);
}
ChartRedraw(NextChart);
delete Cclustering;
ArrayFree(sup_xyz); ArrayFree(res_xyz);
ArrayFree(atr);
Ysize = 30;
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
if (startCluster)
{
OBJName = ToolName + "clusterLoadbar";
if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation")
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation.");
else if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation.")
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation..");
else if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation..")
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation...");
else if (ObjectGetString(0, OBJName, OBJPROP_TEXT)=="Wait for Cluster Calculation..")
ObjectSetString(0, OBJName, OBJPROP_TEXT, "Wait for Cluster Calculation");
ChartRedraw();
}
}
//+------------------------------------------------------------------+
void MeanNormalization(matrix &mat)
{
vector v = {};
for(ulong i=0; i<mat.Cols(); i++)
{
v = mat.Col(i);
MeanNormalization(v);
mat.Col(v, i);
}
}
//+------------------------------------------------------------------+
void MeanNormalization(vector &v)
{
double mean = v.Mean(),
max = v.Max(),
min = v.Min();
for(ulong i=0; i<v.Size(); i++)
v[i] = (v[i] - mean) / (max - min);
}
//+------------------------------------------------------------------+
void Addsup(double price)
{
int msize = sup_mat.Rows();
sup_mat.Resize(msize+1, 1);
sup_mat.Set(msize, 0, price);
}
//+------------------------------------------------------------------+
void Addres(double price)
{
int msize = res_mat.Rows();
res_mat.Resize(msize+1, 1);
res_mat.Set(msize, 0, price);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if (id == CHARTEVENT_OBJECT_CLICK && sparam==ToolName + "Analyse")
{
Sleep(100);
ObjectSetInteger(ChartID(), sparam, OBJPROP_STATE, false);
ChartRedraw();
Analyse();
}
if (id == CHARTEVENT_OBJECT_ENDEDIT && sparam==ToolName + " bars.e")
{
OBJName = sparam;
int bar = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
if (bar<0) bar=iBars(Symbol(), tf0)+1;
if (bar<minbar)
{
MessageBox("Min. bar to analyse is " + IntegerToString(minbar) + "!", "Min. bar limit", 0);
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(minbar));
}
else if (bar>iBars(Symbol(), tf0))
{
MessageBox("Max. bar to analyse is " + IntegerToString(iBars(Symbol(), tf0)) + "!","Max. bar limit", 0);
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(iBars(Symbol(), tf0)));
}
else if (bar>900000)
{
int mes = MessageBox(IntegerToString(bar) + " bars to analyse is so much and will take time more than 1 minute! Are you sure?", "Max. bar warning", 1);
if (mes==2) ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(lastbars));
}
lastbars = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
}
if (id == CHARTEVENT_OBJECT_ENDEDIT && sparam==ToolName + " LN.e")
{
OBJName = sparam;
int bar = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
if (bar<0) bar=LNo;
if (bar<minLN)
{
MessageBox("Min. Level No. to analyse is " + IntegerToString(minLN) + "!", "Min. Level No. limit", 0);
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(minLN));
}
else if (bar>500)
{
MessageBox("Max. Level No. to analyse is 500" + "!","Max. bar limit", 0);
ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(500));
}
else if (bar>100)
{
int mes = MessageBox(IntegerToString(bar) + " Level No. analyse is so much and will take time more than 1 minute! Are you sure?", "Max. Level No. warning", 1);
if (mes==2) ObjectSetString(0, OBJName, OBJPROP_TEXT, IntegerToString(LastLNo));
}
LastLNo = (int) StringToInteger(ObjectGetString(ChartID(), OBJName, OBJPROP_TEXT));
}
ChartRedraw();
}
//+------------------------------------------------------------------+
void SetScreen()
{
ChartSetInteger(ChartID(), CHART_FOREGROUND, false);
ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, BGColor);
ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, BGColor);
ChartSetInteger(0, CHART_COLOR_CHART_LINE, BGColor);
ChartSetInteger(0, CHART_COLOR_CHART_DOWN, BGColor);
ChartSetInteger(0, CHART_COLOR_CHART_UP, BGColor);
ChartSetInteger(0, CHART_COLOR_ASK, BGColor);
ChartSetInteger(0, CHART_COLOR_BID, BGColor);
ChartSetInteger(0, CHART_COLOR_GRID, BGColor);
ChartSetInteger(0, CHART_COLOR_BACKGROUND, BGColor);
ChartSetInteger(0, CHART_COLOR_FOREGROUND, BGColor);
}
//+------------------------------------------------------------------+
void OBJSet(string OBJNameSet, string txt, int XDis, int YDis, int XSize, int YSize, int FSize, color Fill, color Border, color TColor, ENUM_ALIGN_MODE myAlign, ENUM_BASE_CORNER mycorner, bool myread)
{
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_CORNER, mycorner);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_XDISTANCE, XDis);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_YDISTANCE, YDis);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_XSIZE, XSize);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_YSIZE, YSize);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_FONTSIZE, FSize);
ObjectSetString(ChartID(), OBJNameSet, OBJPROP_TEXT,txt);
ObjectSetString(ChartID(), OBJNameSet, OBJPROP_FONT,"Calibri");
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_BGCOLOR, Fill);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_BORDER_COLOR, Border);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_COLOR, TColor);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_ALIGN, myAlign);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_BACK, false);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_ZORDER,5);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_HIDDEN, true);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_READONLY, myread);
ObjectSetInteger(ChartID(), OBJNameSet, OBJPROP_SELECTABLE, false);
}
//+------------------------------------------------------------------+
void TrendSet(string TrendName, datetime time0, datetime time1, double price1, double price2, color Tcolor, int Twidth, ENUM_LINE_STYLE Tstyle, int b)
{
ObjectSetInteger(NextChart, TrendName, OBJPROP_TIME, 0, time0);
ObjectSetInteger(NextChart, TrendName, OBJPROP_TIME, 1, time1);
ObjectSetInteger(NextChart, TrendName, OBJPROP_COLOR, Tcolor);
ObjectSetInteger(NextChart, TrendName, OBJPROP_RAY, false);
ObjectSetInteger(NextChart, TrendName, OBJPROP_WIDTH, Twidth);
ObjectSetInteger(NextChart, TrendName, OBJPROP_STYLE, Tstyle);
ObjectSetInteger(NextChart, TrendName, OBJPROP_BACK, true);
ObjectSetInteger(NextChart, TrendName, OBJPROP_SELECTABLE, false);
ObjectSetInteger(NextChart, TrendName, OBJPROP_TIMEFRAMES, b?OBJ_ALL_PERIODS:OBJ_NO_PERIODS);
ObjectSetDouble(NextChart, TrendName, OBJPROP_PRICE, 0, price1);
ObjectSetDouble(NextChart, TrendName, OBJPROP_PRICE, 1, price2);
}
@@ -0,0 +1,204 @@
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
#property link "www.forex-tsd.com"
//------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
#property indicator_label1 "Super trend hull"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrLimeGreen,clrPaleVioletRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//
//
//
//
//
enum enPrices
{
pr_close, // Close
pr_open, // Open
pr_high, // High
pr_low, // Low
pr_median, // Median
pr_typical, // Typical
pr_weighted, // Weighted
pr_average // Average (high+low+oprn+close)/4
};
input int hullPeriod = 12; // Hull period
input enPrices Price = pr_median; // Price
input int atrPeriod = 12; // ATR period
input double atrMultiplier = 0.66; // ATR multiplier
double st[];
double colorBuffer[];
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
int OnInit()
{
SetIndexBuffer(0,st,INDICATOR_DATA);
SetIndexBuffer(1,colorBuffer,INDICATOR_COLOR_INDEX);
return(0);
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
double Up[];
double Dn[];
double Direction[];
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& time[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
if (ArraySize(Direction)!=rates_total)
{
ArrayResize(Up,rates_total);
ArrayResize(Dn,rates_total);
ArrayResize(Direction,rates_total);
}
//
//
//
//
//
for (int i=(int)MathMax(prev_calculated-1,1); i<rates_total; i++)
{
double atr = 0;
for (int k=0;k<atrPeriod && (i-k-1)>=0; k++)
atr += MathMax(high[i-k],close[i-k-1])-MathMin(low[i-k],close[i-k-1]);
atr /= atrPeriod;
//
//
//
//
//
double cprice = close[i];
double mprice = iHull(getPrice(Price,open,close,high,low,i,rates_total),hullPeriod,i,rates_total);
Up[i] = mprice+atrMultiplier*atr;
Dn[i] = mprice-atrMultiplier*atr;
//
//
//
//
//
colorBuffer[i] = colorBuffer[i-1];
Direction[i] = Direction[i-1];
if (cprice > Up[i-1]) Direction[i] = 1;
if (cprice < Dn[i-1]) Direction[i] = -1;
if (Direction[i] > 0)
{ Dn[i] = MathMax(Dn[i],Dn[i-1]); st[i] = Dn[i]; }
else { Up[i] = MathMin(Up[i],Up[i-1]); st[i] = Up[i]; }
if (Direction[i]== 1) colorBuffer[i] = 0;
if (Direction[i]==-1) colorBuffer[i] = 1;
}
return(rates_total);
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
double workHull[][2];
double iHull(double price, double period, int r, int bars, int instanceNo=0)
{
if (ArrayRange(workHull,0)!= bars) ArrayResize(workHull,bars);
//
//
//
//
//
int HmaPeriod = (int)MathMax(period,2);
int HalfPeriod = (int)MathFloor(HmaPeriod/2);
int HullPeriod = (int)MathFloor(MathSqrt(HmaPeriod));
double hma,hmw,weight; instanceNo *= 2;
workHull[r][instanceNo] = price;
//
//
//
//
//
hmw = HalfPeriod; hma = hmw*price;
for(int k=1; k<HalfPeriod && (r-k)>=0; k++)
{
weight = HalfPeriod-k;
hmw += weight;
hma += weight*workHull[r-k][instanceNo];
}
workHull[r][instanceNo+1] = 2.0*hma/hmw;
hmw = HmaPeriod; hma = hmw*price;
for(int k=1; k<period && (r-k)>=0; k++)
{
weight = HmaPeriod-k;
hmw += weight;
hma += weight*workHull[r-k][instanceNo];
}
workHull[r][instanceNo+1] -= hma/hmw;
//
//
//
//
//
hmw = HullPeriod; hma = hmw*workHull[r][instanceNo+1];
for(int k=1; k<HullPeriod && (r-k)>=0; k++)
{
weight = HullPeriod-k;
hmw += weight;
hma += weight*workHull[r-k][1+instanceNo];
}
return(hma/hmw);
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
@@ -0,0 +1,192 @@
//+------------------------------------------------------------------+
//| SuperTrend.mq5 |
//| Copyright 2011, FxGeek |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, FxGeek"
#property link " http://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 9
#property indicator_plots 2
#property indicator_label1 "Filling"
#property indicator_type1 DRAW_FILLING
#property indicator_color1 clrBisque, clrPaleGreen
#property indicator_label2 "SuperTrend"
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_color2 clrGreen, clrRed
input int Periode=10;
input double Multiplier=3;
input bool Show_Filling=true; // Show as DRAW_FILLING
double Filled_a[];
double Filled_b[];
double SuperTrend[];
double ColorBuffer[];
double Atr[];
double Up[];
double Down[];
double Middle[];
double trend[];
int atrHandle;
int changeOfTrend;
int flag;
int flagh;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Filled_a,INDICATOR_DATA);
SetIndexBuffer(1,Filled_b,INDICATOR_DATA);
SetIndexBuffer(2,SuperTrend,INDICATOR_DATA);
SetIndexBuffer(3,ColorBuffer,INDICATOR_COLOR_INDEX);
SetIndexBuffer(4,Atr,INDICATOR_CALCULATIONS);
SetIndexBuffer(5,Up,INDICATOR_CALCULATIONS);
SetIndexBuffer(6,Down,INDICATOR_CALCULATIONS);
SetIndexBuffer(7,Middle,INDICATOR_CALCULATIONS);
SetIndexBuffer(8,trend,INDICATOR_CALCULATIONS);
atrHandle=iATR(_Symbol,_Period,Periode);
//---
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
if(IsStopped()) return(0); //Checking for stop flag
if(CopyBuffer(atrHandle,0,0,to_copy,Atr)<=0)
{
Print("Getting Atr is failed! Error",GetLastError());
return(0);
}
int first;
if(prev_calculated>rates_total || prev_calculated<=0) // checking for the first start of calculation of an indicator
{
first=Periode; // starting index for calculation of all bars
}
else
{
first=prev_calculated-1; // starting number for calculation of new bars
}
for(int i=first; i<rates_total && !IsStopped(); i++)
{
Middle[i]=(high[i]+low[i])/2;
Up[i] = Middle[i] +(Multiplier*Atr[i]);
Down[i]= Middle[i] -(Multiplier*Atr[i]);
if(close[i]>Up[i-1])
{
trend[i]=1;
if(trend[i-1]==-1) changeOfTrend=1;
}
else if(close[i]<Down[i-1])
{
trend[i]=-1;
if(trend[i-1]==1) changeOfTrend=1;
}
else if(trend[i-1]==1)
{
trend[i]=1;
changeOfTrend=0;
}
else if(trend[i-1]==-1)
{
trend[i]=-1;
changeOfTrend=0;
}
if(trend[i]<0 && trend[i-1]>0)
{
flag=1;
}
else
{
flag=0;
}
if(trend[i]>0 && trend[i-1]<0)
{
flagh=1;
}
else
{
flagh=0;
}
if(trend[i]>0 && Down[i]<Down[i-1])
Down[i]=Down[i-1];
if(trend[i]<0 && Up[i]>Up[i-1])
Up[i]=Up[i-1];
if(flag==1)
Up[i]=Middle[i]+(Multiplier*Atr[i]);
if(flagh==1)
Down[i]=Middle[i]-(Multiplier*Atr[i]);
//-- Draw the indicator
if(trend[i]==1)
{
SuperTrend[i]=Down[i];
if(changeOfTrend==1)
{
SuperTrend[i-1]=SuperTrend[i-2];
changeOfTrend=0;
}
ColorBuffer[i]=0.0;
}
else if(trend[i]==-1)
{
SuperTrend[i]=Up[i];
if(changeOfTrend==1)
{
SuperTrend[i-1]= SuperTrend[i-2];
changeOfTrend = 0;
}
ColorBuffer[i]=1.0;
}
if(Show_Filling)
{
Filled_a[i]= SuperTrend[i];
Filled_b[i]= close[i];
}else{
Filled_a[i]= EMPTY_VALUE;
Filled_b[i]= EMPTY_VALUE;
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,117 @@
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
#property link "www.forex-tsd.com"
//------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
#property indicator_label1 "Swing line"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrLimeGreen,clrPaleVioletRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
//
//
//
//
//
double swli[];
double colorBuffer[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
int OnInit()
{
SetIndexBuffer(0,swli,INDICATOR_DATA);
SetIndexBuffer(1,colorBuffer,INDICATOR_COLOR_INDEX);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
double work[][5];
#define hHi 0
#define hLo 1
#define lHi 2
#define lLo 3
#define trend 4
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& time[],
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
//
//
//
//
//
if (ArrayRange(work,0)!=rates_total) ArrayResize(work,rates_total);
for (int i=(int)MathMax(prev_calculated-1,0); i<rates_total; i++)
{
if (i==0)
{
work[i][hHi] = high[i]; work[i][hLo] = low[i];
work[i][lHi] = high[i]; work[i][lLo] = low[i];
work[i][trend] = -1;
continue;
}
//
//
//
//
//
work[i][trend] = work[i-1][trend];
work[i][hHi] = work[i-1][hHi]; work[i][hLo] = work[i-1][hLo];
work[i][lHi] = work[i-1][lHi]; work[i][lLo] = work[i-1][lLo];
if (work[i-1][trend] == 1)
{
work[i][hHi] = MathMax(work[i-1][hHi],high[i]);
work[i][hLo] = MathMax(work[i-1][hLo],low[i]);
if (high[i]<work[i][hLo]) { work[i][trend] = -1; work[i][lHi] = high[i]; work[i][lLo] = low[i]; }
}
if (work[i-1][trend] == -1)
{
work[i][lHi] = MathMin(work[i-1][lHi],high[i]);
work[i][lLo] = MathMin(work[i-1][lLo],low[i]);
if (low[i]>work[i][lHi]) { work[i][trend] = 1; work[i][hHi] = high[i]; work[i][hLo] = low[i]; }
}
if (work[i][trend]==1)
swli[i] = work[i][hLo];
else swli[i] = work[i][lHi];
colorBuffer[i] = colorBuffer[i-1];
if (work[i][trend]== 1) colorBuffer[i]= 0;
if (work[i][trend]==-1) colorBuffer[i]= 1;
}
return(rates_total);
}
Binary file not shown.
@@ -0,0 +1,97 @@
//+------------------------------------------------------------------+
//| Swings.mq5 |
//| Rajesh Nait, Copyright 2023 |
//| https://www.mql5.com/en/users/rajeshnait/seller |
//+------------------------------------------------------------------+
#property copyright "Rajesh Nait, Copyright 2023"
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot Bullish Marubozu
#property indicator_label1 "+S"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrSnow
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot Bearish Marubozu
#property indicator_label2 "-S"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrSnow
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input group "Swing Low"
uchar InpSwingLowCode = 110; // Swing Low: code for style DRAW_ARROW (font Wingdings)
int InpSwingLowShift = 10; // Swing Low: vertical shift of arrows in pixels
input group "Swing High"
uchar InpSwingHighCode = 110; // SwingHigh: code for style DRAW_ARROW (font Wingdings)
int InpSwingHighShift =10; // SwingHigh: vertical shift of arrows in pixels
//--- indicator buffers
double SwingLowBuffer[];
double SwingHighBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
//--- indicator buffers mapping
SetIndexBuffer(0,SwingLowBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SwingHighBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,InpSwingLowCode);
PlotIndexSetInteger(1,PLOT_ARROW,InpSwingHighCode);
//--- set the vertical shift of arrows in pixels
PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,InpSwingLowShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-InpSwingHighShift);
//--- set as an empty value 0.0
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//---
if(rates_total<3)
return(0);
//---
int limit=prev_calculated-1;
if(prev_calculated==0)
limit=2;
for(int i=limit; i<rates_total-2; i++) {
SwingLowBuffer[i]=0.0;
SwingHighBuffer[i]=0.0;
if(i>0) {
SwingHighBuffer[0]=EMPTY_VALUE;
if(high[i+2]<high[i+1] && high[i+1]<high[i])
if(high[i]>high[i-1] && high[i-1]>high[i-2])
SwingHighBuffer[i]=high[i];
SwingLowBuffer[0]=EMPTY_VALUE;
if(low[i+2]>low[i+1] && low[i+1]>low[i])
if(low[i]<low[i-1] && low[i-1]<low[i-2])
SwingLowBuffer[i]=low[i];
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,289 @@
//---------------------------------------------------------------------------------------------------------------------
#define MName "Time Segmented Volume (TSV)"
#define MVersion "1.01"
#define MBuild "2023-03-27 21:02 WET"
#define MCopyright "Copyright \x00A9 2023, Fernando M. I. Carreiro, All rights reserved"
#define MProfile "https://www.mql5.com/en/users/FMIC"
//---------------------------------------------------------------------------------------------------------------------
#property strict
#property version MVersion
#property description MName
#property description "MetaTrader Indicator (Build "MBuild")"
#property copyright MCopyright
#property link MProfile
//---------------------------------------------------------------------------------------------------------------------
//--- Setup
#property indicator_separate_window
// Define number of buffers and plots
#define MPlots 3
#define MBuffers 7
#ifdef __MQL4__
#property indicator_buffers ( MPlots + 1 )
#else
#property indicator_buffers MBuffers
#property indicator_plots MPlots
#endif
// Define plot colours and respective indices
#define MClrCandleNone C'239,166,117'
#define MClrCandleUp C'38,166,154'
#define MClrCandleDown C'239,83,80'
// Display properties for plots
#ifdef __MQL4__
// Summation plots
#property indicator_label1 "Summation (positive)"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
#property indicator_color1 MClrCandleUp
#property indicator_label2 "Summation (negative)"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_style2 STYLE_SOLID
#property indicator_width2 3
#property indicator_color2 MClrCandleDown
// Simple averaging plot
#property indicator_label3 "Averaging (simple)"
#property indicator_type3 DRAW_LINE
#property indicator_style3 STYLE_SOLID
#property indicator_width3 2
#property indicator_color3 MClrCandleNone
// Exponential averaging plot
#property indicator_label4 "Averaging (exponential)"
#property indicator_type4 DRAW_LINE
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
#property indicator_color4 MClrCandleNone
#else
// Define colour index for plots
#define MIdxCandleNone 0.0
#define MIdxCandleUp 1.0
#define MIdxCandleDown 2.0
// Summation plot
#property indicator_label1 "Summation"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 5
#property indicator_color1 MClrCandleNone, MClrCandleUp, MClrCandleDown
// Simple averaging plot
#property indicator_label2 "Averaging (simple)"
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2
#property indicator_color2 MClrCandleNone
// Exponential averaging plot
#property indicator_label3 "Averaging (exponential)"
#property indicator_type3 DRAW_LINE
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
#property indicator_color3 MClrCandleNone
#endif
//--- Enumarations
// Volume weight enumaraton
enum EVolumeWeight
{
EVW_None = 0, // No volume weighting
EVW_TickVolume, // Tick volume
#ifndef __MQL4__
EVW_RealVolume, // Real volume
#endif
EVW_PriceRange // True price range (pseudo volume)
};
//--- Parameter settings
input uint i_nSummationPeriod = 13, // Summation period
i_nAveragingPeriod = 7; // Averaging period
input ENUM_APPLIED_PRICE i_ePriceApplied = PRICE_CLOSE; // Applied price
input EVolumeWeight i_eVolumeWeight = EVW_TickVolume; // Applied volume
//--- Macro definitions
// Define OnCalculate loop sequencing macros
#define MOnCalcPrevTest ( prev_calculated < 1 || prev_calculated > rates_total )
#ifdef __MQL4__ // for MQL4 (as series)
#define MOnCalcNext( _index ) ( _index-- )
#define MOnCalcBack( _index, _offset ) ( _index + _offset )
#define MOnCalcCheck( _index ) ( _index >= 0 )
#define MOnCalcValid( _index ) ( _index < rates_total )
#define MOnCalcStart \
( rates_total - ( MOnCalcPrevTest ? 1 : prev_calculated ) )
#else // for MQL5 (as non-series)
#define MOnCalcNext( _index ) ( _index++ )
#define MOnCalcBack( _index, _offset ) ( _index - _offset )
#define MOnCalcCheck( _index ) ( _index < rates_total )
#define MOnCalcValid( _index ) ( _index >= 0 )
#define MOnCalcStart \
( MOnCalcPrevTest ? 0 : prev_calculated - 1 )
#endif
// Define applied price macro
#define MSetAppliedPrice( _type, _where, _index ) { switch( _type ) { \
case PRICE_WEIGHTED: _where = ( high[ _index ] + low[ _index ] + close[ _index ] \
+ close[ _index ] ) * 0.25; break; \
case PRICE_TYPICAL: _where = ( high[ _index ] + low[ _index ] + close[ _index ] ) / 3.0; break; \
case PRICE_MEDIAN: _where = ( high[ _index ] + low[ _index ] ) * 0.5; break; \
case PRICE_HIGH: _where = high[ _index ]; break; \
case PRICE_LOW: _where = low[ _index ]; break; \
case PRICE_OPEN: _where = open[ _index ]; break; \
case PRICE_CLOSE: \
default: _where = close[ _index ]; }; }
// Define macro for invalid parameter values
#define MCheckParameter( _condition, _text ) if( _condition ) \
{ Print( "Error: Invalid ", _text ); return INIT_PARAMETERS_INCORRECT; }
//--- Global variable declarations
// Indicator buffers
double g_adbPriceApplied[], // Buffer for applied price
g_adbVolumePriceDelta[], // Buffer for volume weight price delta change
g_adbSummation[], // Buffer for summation of volume weighte price change
g_adbSummationSimple[], // Buffer for summation of summation for simple averaging
g_adbAveragingSimple[], // Buffer for simple averaging
g_adbAveragingExponential[]; // Buffer for exponential averaging
#ifdef __MQL4__
double g_adbSummationPositive[], // Buffer for positive summation of volume weighte price change
g_adbSummationNegative[]; // Buffer for negative summation of volume weighte price change
#else
double g_adbSummationColour[]; // Buffer for summation colourisation
#endif
// Miscellaneous global variables
double g_dbEmaWeight; // Weight to be used for exponential moving averages
//--- Event handling functions
// Initialisation event handler
int OnInit(void) {
// Validate input parameters
MCheckParameter( i_nSummationPeriod < 1, "summation period" );
MCheckParameter( i_nAveragingPeriod < 1 ||
i_nAveragingPeriod > i_nSummationPeriod, "averaging period" );
// Calculate parameter variables
g_dbEmaWeight = 2.0 / ( i_nAveragingPeriod + 1.0 );
// Set number of significant digits (precision)
IndicatorSetInteger( INDICATOR_DIGITS, _Digits );
// Set buffers
int iBuffer = 0;
#ifdef __MQL4__
IndicatorBuffers( MBuffers + 1 ); // Set total number of buffers (MQL4 Only)
SetIndexBuffer( iBuffer++, g_adbSummationPositive, INDICATOR_DATA );
SetIndexBuffer( iBuffer++, g_adbSummationNegative, INDICATOR_DATA );
#else
SetIndexBuffer( iBuffer++, g_adbSummation, INDICATOR_DATA );
SetIndexBuffer( iBuffer++, g_adbSummationColour, INDICATOR_COLOR_INDEX );
#endif
SetIndexBuffer( iBuffer++, g_adbAveragingSimple, INDICATOR_DATA );
SetIndexBuffer( iBuffer++, g_adbAveragingExponential, INDICATOR_DATA );
SetIndexBuffer( iBuffer++, g_adbPriceApplied, INDICATOR_CALCULATIONS );
SetIndexBuffer( iBuffer++, g_adbVolumePriceDelta, INDICATOR_CALCULATIONS );
SetIndexBuffer( iBuffer++, g_adbSummationSimple, INDICATOR_CALCULATIONS );
#ifdef __MQL4__
SetIndexBuffer( iBuffer++, g_adbSummation, INDICATOR_CALCULATIONS );
#endif
// Set indicator name
IndicatorSetString( INDICATOR_SHORTNAME, StringFormat(
MName " ( %d, %d )", i_nSummationPeriod, i_nAveragingPeriod ) );
return INIT_SUCCEEDED; // Successful initialisation of indicator
};
// Calculation event handler
int
OnCalculate(
const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]
)
{
// Main loop — fill in the arrays with data values
for( int iCur = MOnCalcStart,
iPrev = MOnCalcBack( iCur, 1 ),
iSumPrev = MOnCalcBack( iCur, (int) i_nSummationPeriod ),
iAvgPrev = MOnCalcBack( iCur, (int) i_nAveragingPeriod );
!IsStopped() && MOnCalcCheck( iCur );
MOnCalcNext( iCur ), MOnCalcNext( iPrev ), MOnCalcNext( iSumPrev ), MOnCalcNext( iAvgPrev ) )
{
// Calculate volume to apply
double dbVolume = 1.0;
switch( i_eVolumeWeight ) {
#ifndef __MQL4__
case EVW_RealVolume: dbVolume = (double) volume[ iCur ]; break;
#endif
case EVW_TickVolume: dbVolume = (double) tick_volume[ iCur ]; break;
case EVW_PriceRange: if( MOnCalcValid( iPrev ) ) {
double dbClosePrev = close[ iPrev ];
dbVolume = fmax( high[ iCur ], dbClosePrev )
- fmin( low[ iCur ], dbClosePrev );
} else dbVolume = high[ iCur ] - low[ iCur ];
};
// Calculate price to apply
double dbPriceCur;
MSetAppliedPrice( i_ePriceApplied, dbPriceCur, iCur );
// Calculate volume weighted price delta and sum
double dbPricePrev = MOnCalcValid( iPrev ) ? g_adbPriceApplied [ iPrev ] : open[ iCur ],
dbPriceDelta = dbPriceCur - dbPricePrev,
dbVolumePriceDelta = dbPriceDelta * dbVolume,
dbSummation = dbVolumePriceDelta
+ ( MOnCalcValid( iPrev ) ? g_adbSummation[ iPrev ] : 0.0 )
- ( MOnCalcValid( iSumPrev ) ? g_adbVolumePriceDelta[ iSumPrev ] : 0.0 );
// Define colourasation
#ifdef __MQL4__
double dbSummationPositive = dbSummation > 0.0 ? dbSummation : 0.0,
dbSummationNegative = dbSummation < 0.0 ? dbSummation : 0.0;
#else
double dbSummationColour = dbSummation > 0.0 ? MIdxCandleUp
: ( dbSummation < 0.0 ? MIdxCandleDown
: MIdxCandleNone );
#endif
// Calculate simple summation and averaging
double dbSumSimpleCur = dbSummation
+ ( MOnCalcValid( iPrev ) ? g_adbSummationSimple[ iPrev ] : 0.0 )
- ( MOnCalcValid( iAvgPrev ) ? g_adbSummation[ iAvgPrev ] : 0.0 ),
dbAverageSimpleCur = dbSumSimpleCur / i_nAveragingPeriod;
// Calculate exponential averaging
double dbAverageExponentialPrev = MOnCalcValid( iPrev ) ? g_adbAveragingExponential[ iPrev ] : dbSummation,
dbAverageExponentialCur = dbAverageExponentialPrev
+ ( dbSummation - dbAverageExponentialPrev )
* g_dbEmaWeight;
// Set buffer values
g_adbPriceApplied[ iCur ] = dbPriceCur;
g_adbVolumePriceDelta[ iCur ] = dbVolumePriceDelta;
g_adbSummation[ iCur ] = dbSummation;
g_adbSummationSimple[ iCur ] = dbSumSimpleCur;
g_adbAveragingSimple[ iCur ] = dbAverageSimpleCur;
g_adbAveragingExponential[ iCur ] = dbAverageExponentialCur;
#ifdef __MQL4__
g_adbSummationPositive[ iCur ] = dbSummationPositive;
g_adbSummationNegative[ iCur ] = dbSummationNegative;
#else
g_adbSummationColour[ iCur ] = dbSummationColour;
#endif
};
return rates_total; // Return value for prev_calculated of next call
};
//---------------------------------------------------------------------------------------------------------------------
@@ -0,0 +1,114 @@
//+------------------------------------------------------------------+
//| Timeframe Confluence Detector.mq5 |
//| |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "phade"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 3
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBurlyWood
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrGray
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrDarkGray
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
#define offset 60
input ENUM_TIMEFRAMES timeframe_a = PERIOD_CURRENT; //Current period
input ENUM_TIMEFRAMES timeframe_b = PERIOD_H2; // 1st timeframe deviation to current period
input ENUM_TIMEFRAMES timeframe_c = PERIOD_H1; // 2nd timeframe deviation to current period
int bars;
double buf_a[];
double buf_b[];
double buf_c[];
double deviator_a[], deviator_b[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
IndicatorRelease(0);
SetIndexBuffer(0, buf_a, INDICATOR_DATA);
SetIndexBuffer(1, deviator_a, INDICATOR_DATA);
SetIndexBuffer(2, deviator_b, INDICATOR_DATA);
SetIndexBuffer(3, buf_b, INDICATOR_CALCULATIONS);
SetIndexBuffer(4, buf_c, INDICATOR_CALCULATIONS);
ArraySetAsSeries(buf_a,true);
ArraySetAsSeries(buf_b,true);
ArraySetAsSeries(buf_c,true);
ArraySetAsSeries(deviator_a,true);
ArraySetAsSeries(deviator_b,true);
PlotIndexSetString(0, PLOT_LABEL, TimeframeToString(timeframe_a));
PlotIndexSetString(1, PLOT_LABEL, "Deviation from " + TimeframeToString(timeframe_b) + " to " + TimeframeToString(timeframe_a));
PlotIndexSetString(2, PLOT_LABEL, "Deviation from " + TimeframeToString(timeframe_c) + " to " + TimeframeToString(timeframe_a));
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
CopySeries(Symbol(), timeframe_a, 0, rates_total, COPY_RATES_CLOSE, buf_a);
CopySeries(Symbol(), timeframe_b, 0, rates_total, COPY_RATES_CLOSE, buf_b);
CopySeries(Symbol(), timeframe_c, 0, rates_total, COPY_RATES_CLOSE, buf_c);
for(int i = rates_total - 1; i>=0; i--){
deviator_a[i] = MathAbs(buf_b[i] - buf_a[i]) + buf_b[i] - offset*_Point;
deviator_b[i] = MathAbs(buf_c[i] - buf_a[i]) + buf_c[i] - (offset*2)*_Point;
}
return(rates_total);
}
string TimeframeToString(const ENUM_TIMEFRAMES timeframe)
{
string result;
switch (timeframe){
case PERIOD_M1: result = "M1"; break;
case PERIOD_M5: result = "M5"; break;
case PERIOD_M15: result = "M15"; break;
case PERIOD_M30: result = "M30"; break;
case PERIOD_H1: result = "H1"; break;
case PERIOD_H2: result = "H2"; break;
case PERIOD_H4: result = "H4"; break;
case PERIOD_D1: result = "D1"; break;
case PERIOD_W1: result = "W1"; break;
case PERIOD_MN1: result = "MN1"; break;
default: result = ""; break;
}
return result;
}
@@ -0,0 +1,114 @@
//+------------------------------------------------------------------+
//| TrendLinearReg.mq5 |
//| Copyright 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1 LimeGreen
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
extern int barsToCount=34; // Bars to calculate
double buffer0[];
double buffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,buffer0);
SetIndexBuffer(1,buffer1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
double b, c, sumy, sumx, sumxy, sumx2;
double prev;
double current;
if(rates_total <= barsToCount)
return rates_total;
int start = prev_calculated;
if(prev_calculated < barsToCount)
start = barsToCount;
for(int index = start; index < rates_total; index++)
{
sumy=0.0;
sumx=0.0;
sumxy=0.0;
sumx2=0.0;
for(int i=0; i < barsToCount ; i++)
{
sumy+=close[index-i];
sumxy+=close[index-i]*(1+i);
sumx+=(1+i);
sumx2+=(1+i)*(1+i);
}
c=sumx2*barsToCount-sumx*sumx;
if(c==0)
c=0.1;
b=(sumxy*barsToCount-sumx*sumy)/c;
current=-1000*b;
prev=current;
if(buffer1[index-1] !=EMPTY_VALUE)
prev=buffer1[index-1];
else
if(buffer0[index-1] !=EMPTY_VALUE)
prev=buffer0[index-1];
if(current>=prev)
{
buffer0[index]= current;
buffer1[index]= EMPTY_VALUE;
}
else
if(current<prev)
{
buffer1[index]= current;
buffer0[index]= EMPTY_VALUE;
}
/*
*/
}
return(rates_total);
}
//+------------------------------------------------------------------+
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,67 @@
//+------------------------------------------------------------------+
//| YMA.mq5 |
//| Yuriy Tokman |
//| http://ytg.com.ua |
//+------------------------------------------------------------------+
#property copyright "Yuriy Tokman"
#property link "http://ytg.com.ua"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_width1 2
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDarkViolet
//--- input parameters
input int YMA_Period=21; // Period
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0,Buffer);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,YMA_Period);
string short_name="YMA";
IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(YMA_Period)+")");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//----
int i,limit;
//--- check for rates
if(rates_total<YMA_Period) return(0);
//--- preliminary calculations
if(prev_calculated==0)limit=YMA_Period;
else limit=prev_calculated-1;
//--- the main loop of calculations
for(i=limit;i<rates_total && !IsStopped();i++)
{
double res =0;
for(int j=i;j>i-YMA_Period && j>0;j--)
{
res += (close[j]+open[j]+high[j]+low[j])/4;
}
Buffer[i]=res/YMA_Period;
}
//----
return(rates_total);
}
//+------------------------------------------------------------------+
@@ -0,0 +1,644 @@
//
// Check Bar has Strong Body or Not ...
bool HasStrongBody()
{
//
bool result = false;
//
if (!IsValid())
{
return result;
}
//
double body = GetBody();
double shadow = GetShadows();
//
result = body > shadow * 1.5;
//
return result;
}
//
// Bar Must Open Below Prce
// and Close Above it ...
bool IsBreakUp(
double price // a Price to Check Breake
)
{
//
bool result = false;
//
result = HasStrongBody();
if (!result || price <= 0)
{
return result;
}
//
// Select required Prices ...
//
result =
//
close > price &&
open < price;
//
return result;
}
//
// Bar Must Open Above Prce
// and Close Below it ...
bool IsBreakDown(
double price // a Price to Check Breake
)
{
//
bool result = false;
//
result = HasStrongBody();
if (!result || price <= 0)
{
return result;
}
//
// Select required Prices ...
//
result =
//
open > price &&
close < price;
//
return result;
}
//
bool IsBreakOut(
double price, // a Price to Check Breake
bool useHighLow = true // if true using High and Low price for Breakeouts, if not use Open Close
)
{
//
bool result = false;
//
result = HasStrongBody();
if (!result || price <= 0)
{
return result;
}
//
// Select required Prices ...
//
double selectedUp =
useHighLow
? high
: GetUp();
double selectedDown =
useHighLow
? low
: GetDown();
//
result =
//
selectedUp > price &&
selectedDown < price;
//
return result;
}
//
// Check a Support Line Rejected or not ...
bool IsSupportRejected(
double price // Support Price
)
{
//
bool result = false;
//
// this is zBar ...
// so we are try to Recieve CBar ...
XOHCL cBar;
result = this.GetPreviousBar(cBar);
if (!result)
{
return result;
}
//
// Now we are going to Recieve PBar ...
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
// We Have this (0) Bar, cBar (1) and pBar (2) ...
//
// pBar Down Shadow must break Price Line ...
// cBar and zBar Close must be Above Price Line ...
// also zBar Open must be Above Price Line ...
result =
//
pBar.high > price &&
pBar.low < price &&
cBar.close > price &&
this.close > price &&
this.open > price
//
;
//
return result;
}
//
// Check a Support Line Breaked or not ...
bool IsSupportBreaked(
double price // Support Price
)
{
//
bool result = false;
//
// this is zBar ...
// so we are try to Recieve CBar ...
XOHCL cBar;
result = this.GetPreviousBar(cBar);
if (!result)
{
return result;
}
//
// Now we are going to Recieve PBar ...
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
// We Have this (0) Bar, cBar (1) and pBar (2) ...
//
// pBar Down Shadow must break Price Line ...
// cBar and zBar Close must be Below Price Line ...
// also zBar Open must be Below Price Line ...
result =
//
pBar.high > price &&
pBar.low < price &&
cBar.close < price &&
this.close < price &&
this.open < price
//
;
//
return result;
}
//
// Check a Resistance Line Rejected or not ...
bool IsResistanceRejected(
double price // Resistance Price
)
{
//
bool result = false;
//
// this is zBar ...
// so we are try to Recieve CBar ...
XOHCL cBar;
result = this.GetPreviousBar(cBar);
if (!result)
{
return result;
}
//
// Now we are going to Recieve PBar ...
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
// We Have this (0) Bar, cBar (1) and pBar (2) ...
//
// pBar Up Shadow must break Price Line ...
// cBar and zBar Close must be Under Price Line ...
// also zBar Open must be Under Price Line ...
result =
//
pBar.high > price &&
pBar.low < price &&
cBar.close < price &&
this.close < price &&
this.open < price
//
;
//
return result;
}
//
// Check a Resistance Line Breaked or not ...
bool IsResistanceBreaked(
double price // Support Price
)
{
//
bool result = false;
//
// this is zBar ...
// so we are try to Recieve CBar ...
XOHCL cBar;
result = this.GetPreviousBar(cBar);
if (!result)
{
return result;
}
//
// Now we are going to Recieve PBar ...
XOHCL pBar;
result = cBar.GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
// We Have this (0) Bar, cBar (1) and pBar (2) ...
//
// pBar Up Shadow must break Price Line ...
// cBar and zBar Close must be Over Price Line ...
// also zBar Open must be Pver Price Line ...
result =
//
pBar.low < price &&
pBar.high > price &&
cBar.close > price &&
this.close > price &&
this.open > price
//
;
//
return result;
}
//
// Check Bar is Inside Previus Bar ...
bool IsInsideBar(
double threshold = 5 // Points Distance between Up and Down
)
{
//
bool result = false;
//
if (threshold < 0)
{
threshold = 0;
}
//
XOHCL pBar;
result = GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
double offset = PointToPrice(threshold, this.symbol);
//
result =
//
pBar.high > this.high &&
pBar.low < this.low &&
MathAbs(pBar.low - this.low) > offset &&
MathAbs(pBar.high - this.high) > offset
//
;
//
return result;
}
//
// Check Bar has Strongest Body in a Range ...
bool HasStrongestBody(
int mLoopback = 3 // loopback candles to compare it ...
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
double body = GetBody();
XOHCL prev = this;
for (int i = 0; i < mLoopback; i++)
{
//
bool isValid = prev.GetPreviousBar(prev);
if (!isValid)
{
//
result = false;
break;
}
//
result =
//
result &&
body > prev.GetBody()
//
;
if (!result)
{
break;
}
}
//
return result;
}
//
// Check Bar has Weakest Body in a Range ...
bool HasWeakestBody(
int mLoopback = 3 // loopback candles to compare it ...
)
{
//
bool result = false;
//
result = IsValid();
if (!result)
{
return result;
}
//
double body = GetBody();
XOHCL prev = this;
for (int i = 0; i < mLoopback; i++)
{
//
bool isValid = prev.GetPreviousBar(prev);
if (!isValid)
{
//
result = false;
break;
}
//
result =
//
result &&
body < prev.GetBody()
//
;
if (!result)
{
break;
}
}
//
return result;
}
//
// Determines Swings based On this Bar ...
// Calculates Based on atleast 3 Bars Prev ...
ENUM_X_SWING_TYPE GetSwingType()
{
//
ENUM_X_SWING_TYPE result = X_NO_SWING;
//
// Find Current Index of Bar ...
int barIndex = Index();
if (barIndex <= -1)
{
return result;
}
//
// First we have to Retrieve atleast 3 Bars before this bar ...
XOHCL bars[];
int barsCount = GetBars(
bars,
symbol,
period,
barIndex + 1,
3
//
);
if (barsCount < 3)
{
return result;
}
//
// Check Swing Start Candle has Strong Body ...
bool isStrongBodyCandle = bars[2].HasStrongBody();
if (!isStrongBodyCandle)
{
return result;
}
//
// Check Swing Low Conditions ...
bool isSwingLowOrderBlock =
bars[2].low < bars[1].low &&
bars[1].low < bars[0].low &&
bars[2].low < bars[0].low;
if (isSwingLowOrderBlock)
{
result = X_SWING_LOW;
}
//
// Check Swing High Conditions ...
bool isSwingHighOrderBlock =
bars[2].high > bars[1].high &&
bars[1].high > bars[0].high &&
bars[2].high > bars[0].high;
if (isSwingHighOrderBlock)
{
result = X_SWING_HIGH;
}
//
return result;
}
//
// Check Bar Is Hammer Pattern ...
bool IsHammer()
{
//
bool result = false;
//
double fib382 = GetFibonacciLevel(
high,
low,
0.382,
-1 //
);
//
result = GetDown() > fib382;
//
return result;
}
//
// Check Bar Is Shooting Star Pattern ...
bool IsShootingStar()
{
//
bool result = false;
//
double fib382 = GetFibonacciLevel(
high,
low,
0.382,
1 //
);
//
result = GetUp() < fib382;
//
return result;
}
//
// Check Bar Bullish Engulfing Pattern ...
bool IsBullishEngulf()
{
//
bool result = false;
//
// Current Bar Must be Bullish ...
result = IsBullish();
if (!result)
{
return result;
}
//
// Retrieve Previous Bar ...
XOHCL pBar;
result = GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
result =
//
pBar.IsBearish() &&
open < pBar.close && close > pBar.open &&
high >= pBar.high && low <= pBar.low
//
;
//
return result;
}
//
// Check Bar Bearish Engulfing Pattern ...
bool IsBearishEngulf()
{
//
bool result = false;
//
// Current Bar Must be Bearish ...
result = IsBearish();
if (!result)
{
return result;
}
//
// Retrieve Previous Bar ...
XOHCL pBar;
result = GetPreviousBar(pBar);
if (!result)
{
return result;
}
//
result =
//
pBar.IsBullish() &&
open > pBar.close && close < pBar.open &&
high >= pBar.high && low <= pBar.low
//
;
//
return result;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,562 @@
//
// Detect Trends ...
struct XTrendDetector
{
//
string symbol;
ENUM_TIMEFRAMES period;
//
double higherHighs[];
datetime higherHighTimes[];
//
double higherLows[];
datetime higherLowTimes[];
//
double lowerHighs[];
datetime lowerHighTimes[];
//
double lowerLows[];
datetime lowerLowTimes[];
//
bool isFirstLow;
//
bool isUpTrend;
bool isDownTrend;
//
int _numberOfPivots;
int _pivotShoulders;
//
// Constructor ...
XTrendDetector()
{
Clean();
}
//
bool FindTrend(
string _symbol,
ENUM_TIMEFRAMES _period,
int barIndex = 0,
int _requiredPivots = 3,
int _requiredShoulders = 3 //
)
{
//
bool result = false;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
if (_requiredPivots < 3)
{
_requiredPivots = 3;
}
//
if (_requiredShoulders < 3)
{
_requiredShoulders = 3;
}
//
result =
//
IsValid(_symbol) &&
IsValid(_period)
//
;
if (!result)
{
return result;
}
//
// Find Swing Lows and Swing Highs ...
//
int hhIndexes[];
datetime hhTimes[];
double hhs[];
//
int llIndexes[];
datetime llTimes[];
double lls[];
//
bool isEnough = false;
//
double lastHH = 0;
int lastHHIndex = barIndex;
datetime lastHHTime = NULL;
//
double lastLL = 0;
int lastLLIndex = barIndex;
datetime lastLLTime = NULL;
//
// Calculate First ...
lastHHIndex = FindSwing(
_symbol,
_period,
X_SWING_HIGH,
_requiredShoulders,
lastHHIndex + 1 //
);
if (lastHHIndex >= 0)
{
//
XOHCL lastBar;
bool isInited = lastBar.Init(
_symbol,
_period,
lastHHIndex //
);
if (isInited)
{
//
lastHH = lastBar.high;
lastHHTime = lastBar.time;
}
}
//
lastLLIndex = FindSwing(
_symbol,
_period,
X_SWING_LOW,
_requiredShoulders,
lastLLIndex + 1 //
);
if (lastLLIndex >= 0)
{
//
XOHCL lastBar;
bool isInited = lastBar.Init(
_symbol,
_period,
lastLLIndex //
);
if (isInited)
{
//
lastHH = lastBar.high;
lastHHTime = lastBar.time;
}
}
//
result =
//
lastLLIndex >= 0 &&
lastHHIndex >= 0
//
;
if (!result)
{
return result;
}
//
bool isFirstLow =
//
lastLLIndex < lastHHIndex
//
;
//
//
while (!isEnough)
{
//
int hhSize = ArraySize(hhs);
if (hhSize < _requiredPivots)
{
//
}
//
int llSize = ArraySize(lls);
if (llSize < _requiredPivots * 2)
{
}
//
}
// while (!isEnough)
// {
// //
// int hhSize = ArraySize(hhs);
// if (hhSize < _requiredPivots * 2)
// {
// //
// lastHHIndex = FindSwing(
// _symbol,
// _period,
// X_SWING_HIGH,
// _requiredShoulders,
// lastHHIndex + 1 //
// );
// if (lastHHIndex >= 0)
// {
// //
// XOHCL hBar;
// bool isInited = hBar.Init(
// _symbol,
// _period,
// lastHHIndex //
// );
// if (isInited)
// {
// //
// Add(
// hBar.high,
// hhs //
// );
// //
// Add(
// hBar.time,
// hhTimes //
// );
// //
// Add(
// lastHHIndex,
// hhIndexes //
// );
// }
// }
// }
// //
// int llSize = ArraySize(lls);
// if (llSize < _requiredPivots * 2)
// {
// //
// lastLLIndex = FindSwing(
// _symbol,
// _period,
// X_SWING_LOW,
// _requiredShoulders,
// lastLLIndex + 1 //
// );
// if (lastLLIndex >= 0)
// {
// //
// XOHCL lBar;
// bool isInited = lBar.Init(
// _symbol,
// _period,
// lastLLIndex //
// );
// if (isInited)
// {
// //
// Add(
// lBar.low,
// lls //
// );
// //
// Add(
// lBar.time,
// llTimes //
// );
// //
// Add(
// lastHHIndex,
// llIndexes //
// );
// }
// }
// }
// //
// hhSize = ArraySize(hhs);
// llSize = ArraySize(lls);
// isEnough =
// //
// hhSize == _requiredPivots * 2 &&
// llSize == _requiredPivots * 2
// //
// ;
// }
// //
// ArrayReverse(hhs);
// ArrayReverse(hhTimes);
// ArrayReverse(hhIndexes);
// //
// ArrayReverse(lls);
// ArrayReverse(llTimes);
// ArrayReverse(llIndexes);
//
// Draws ...
for (int i = 0; i < ArraySize(hhs); i++)
{
//
DrawArrow(
ChartID(),
"XTRND_HH" + ToString(i),
0,
hhTimes[i],
hhs[i],
234,
ANCHOR_BOTTOM,
clrMagenta,
STYLE_SOLID,
3 //
);
//
DrawArrow(
ChartID(),
"XTRND_LL" + ToString(i),
0,
llTimes[i],
lls[i],
233,
ANCHOR_TOP,
clrAqua,
STYLE_SOLID,
3 //
);
}
// //
// // Here We Try to Detect Trands ...
// int idxHH = 0;
// int idxLL = 0;
// isEnough = false;
// isFirstLow = llTimes[0] > hhTimes[0];
// while(!isEnough) {
// //
// datetime firstTime = NULL;
// if (isFirstLow) {
// //
// firstTime = llTimes[0];
// //
// // Looking for a High ...
// //
// if (hhs[hhIdx] > lls[llIdx]) {
// }
// } else {
// //
// firstTime = hhTimes[0];
// //
// // Looking for a Low ...
// }
// }
//
isUpTrend =
//
isFirstLow
?
//
lls[0] > lls[1] &&
lls[1] > lls[2] &&
//
hhs[0] > hhs[1] &&
hhs[1] > hhs[2]
//
:
//
hhs[0] > hhs[1] &&
hhs[1] > hhs[2] &&
//
lls[0] > lls[1] &&
lls[1] > lls[2]
//
;
isDownTrend =
//
isFirstLow
?
//
lls[0] < lls[1] &&
lls[1] < lls[2] &&
//
hhs[0] < hhs[1] &&
hhs[1] < hhs[2]
//
:
//
hhs[0] < hhs[1] &&
hhs[1] < hhs[2] &&
//
lls[0] < lls[1] &&
lls[1] < lls[2]
//
;
for (int i = 1; i < _requiredPivots; i++)
{
//
// Lows ...
//
// Lower Lows ...
if (lls[i - 1] < lls[i])
{
//
Add(
lls[i - 1],
lowerLows //
);
//
Add(
llTimes[i - 1],
lowerLowTimes //
);
}
else
//
// Higher Lows ...
if (lls[i - 1] > lls[i])
{
//
Add(
lls[i - 1],
higherLows //
);
//
Add(
llTimes[i - 1],
higherLowTimes //
);
}
//
// Highs ...
//
// Higher Highs ...
if (hhs[i - 1] > hhs[i])
{
//
Add(
hhs[i - 1],
higherHighs //
);
//
Add(
hhTimes[i - 1],
higherHighTimes //
);
}
else
//
// Lower Highs ...
if (hhs[i - 1] < hhs[i])
{
//
Add(
hhs[i - 1],
lowerHighs //
);
//
Add(
hhTimes[i - 1],
lowerHighTimes //
);
}
}
//
// Remove Draws ...
RemoveDraws("XTRND");
//
symbol = _symbol;
period = _period;
_numberOfPivots = _requiredPivots;
_pivotShoulders = _requiredShoulders;
//
result = IsValid();
//
return result;
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
symbol = NULL;
period = NULL;
//
_numberOfPivots = 0;
_pivotShoulders = 0;
//
Clean(higherHighs);
Clean(higherHighTimes);
//
Clean(higherLows);
Clean(higherLowTimes);
//
Clean(lowerHighs);
Clean(lowerHighTimes);
//
Clean(lowerLows);
Clean(lowerLowTimes);
}
//
// Validate ...
bool IsValid()
{
//
bool result = false;
//
result =
//
IsValid(symbol) &&
IsValid(period)
//
;
//
return result;
}
};

Some files were not shown because too many files have changed in this diff Show More