Files
MQL4Data/Bkp/Used/14020425/21-00/Libraries/x-saherelm.lib.mq4
T
2024-01-25 04:05:58 +03:30

1502 lines
24 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL4 Global Library
// ---------------------------------------------
// saherelm useful tools and definitions ...
//
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
#property library
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://www.saherelm.ir"
#property version "1.00"
#property strict
//
// Includes Logger library ...
#include "../Libraries/x-saherelm.log.lib.mq4"
//
// Includes Drawing library ...
#include "../Libraries/x-saherelm.draw.lib.mq4"
//
struct XOHCL {
double high;
double open;
double close;
double low;
};
//
static datetime lastBarTime;
//
// START Functions ...
//
//
// Determines current working is New Bar or not ...
bool IsNewBar() {
//
// Reading Last Bar Date ...
datetime curbar = (datetime)SeriesInfoInteger(
_Symbol,
_Period,
SERIES_LASTBAR_DATE
);
//
if(lastBarTime != curbar) {
//
lastBarTime = curbar;
return true;
}
//
return false;
}
//
// Determines we are in new Day or not ...
bool IsNewDay() {
//
bool result = false;
//
// Reading Last Bar Date ...
datetime curbar = (datetime)SeriesInfoInteger(
_Symbol,
_Period,
SERIES_LASTBAR_DATE
);
//
if (lastBarTime == 0) {
lastBarTime = curbar;
}
//
if (curbar == lastBarTime) {
return result;
}
//
// Retrieve Day and Month and Year for Last Bar Time ...
int lastBarDay = TimeDay(lastBarTime);
int lastBarMonth = TimeMonth(lastBarTime);
int lastBarYear = TimeYear(lastBarTime);
//
// Retrieve Day and Month and Year for Current Bar Time ...
int curBarDay = TimeDay(curbar);
int curBarMonth = TimeMonth(curbar);
int curBarYear = TimeYear(curbar);
//
result = curBarDay > lastBarDay
|| curBarMonth > lastBarMonth
|| curBarYear > lastBarYear;
//
return result;
}
//
// Retrieve RMA on Specific Candle ...
double GetRMA(
int bar_index,
int length
) {
//
double shortSMA = iMA(_Symbol, _Period, length, 0, MODE_SMA, PRICE_CLOSE, bar_index);
double mediumSMA = iMA(_Symbol, _Period, length * 2, 0, MODE_SMA, PRICE_CLOSE, bar_index);
double longSMA = iMA(_Symbol, _Period, length * 3, 0, MODE_SMA, PRICE_CLOSE, bar_index);
//
double result = longSMA - mediumSMA + shortSMA;
//
return result;
}
//
double GetMA(
const int bar_index,
const int maLength,
const int maShift,
const ENUM_MA_METHOD maMethod,
const ENUM_APPLIED_PRICE appliedPrice
) {
//
double result = iMA(
_Symbol,
_Period,
maLength,
maShift,
maMethod,
appliedPrice,
bar_index
);
//
return result;
}
//
// Retrieve True Range ...
double GetTR(
const int bar_index
) {
//
double result = 0;
//
double high = iHigh(
_Symbol,
_Period,
bar_index
);
//
double low = iLow(
_Symbol,
_Period,
bar_index
);
//
double prevClose = iClose(
_Symbol,
_Period,
bar_index + 1
);
//
double highLowDif = high - low;
double hpCDif = MathAbs(high - prevClose);
double lpCDiff = MathAbs(low - prevClose);
//
result = MathMax(highLowDif, hpCDif);
result = MathMax(result, lpCDiff);
//
return result;
}
//
// Calculate True Range Simple Moving Average ...
double GetMarketTRSMA(
const int bar_index,
const int marketLen
) {
//
double result = 0;
//
// Create Barket Length Trs ...
double trs[];
ArrayResize(
trs,
marketLen
);
int index = 0;
double trSum = 0;
for (int i = bar_index; i < bar_index + marketLen; i++) {
//
double tr = GetTR(i);
trs[index] = tr;
//
trSum += tr;
//
index++;
}
//
result = trSum / marketLen;
//
return result;
}
//
// Retrieve Commodity Channel ...
double GetMarketCCI(
const int bar_index,
const int marketLen,
const ENUM_APPLIED_PRICE appliedPrice = PRICE_CLOSE
) {
//
double result = 0;
//
result = iCCI(
_Symbol,
_Period,
marketLen,
appliedPrice,
bar_index
);
//
return result;
}
//
// this function check crossing up two Buffers ...
bool IsCrossedOver(
double &arr1[],
double &arr2[],
int index1,
int index2 = -1
) {
//
// Normalize Index 2 Value ...
if (index2 < 0) {
index2 = index1 + 1;
}
//
bool result = (arr1[index1] > arr2[index1]) && !(arr1[index2] > arr2[index2]);
//
return result;
}
//
// this function check crossing down two Buffers ...
bool IsCrossedUnder(
double &arr1[],
double &arr2[],
int index1,
int index2 = -1
) {
//
// Normalize Index 2 Value ...
if (index2 < 0) {
index2 = index1 + 1;
}
//
bool result = (arr1[index1] < arr2[index1]) && !(arr1[index2] < arr2[index2]);
//
return result;
}
//
// Convert points to Actual Point ...
double PointsToDouble(int points) {
//
double result = points * _Point;
return result;
}
//
// Converts Pips to Points ...
int PipsToPoints(int pips) {
//
int result = pips * ((_Digits == 3 || _Digits == 5) ? 10 : 1);
return result;
}
//
// Converts Pips to Double ...
double PipsToDouble(int pips) {
//
double result = PointsToDouble(PipsToPoints(pips));
return result;
}
//
// Converts Double Value to Pips ...
int PriceToPips(double value) {
//
if (value <= 0) {
return 0;
}
//
double pipValue = _Point * MathPow(10, _Digits);
int result = (int)(value / pipValue);
//
return result;
}
//
// Converts Pips to Double ...
double PipsToPrice(int pips) {
//
if (pips <= 0) {
return 0;
}
//
double pipValue = _Point * MathPow(10, _Digits);
double result = pipValue * pips;
//
return result;
}
//
// Generate ATR StopLoss Value ...
double CalculateATRSL(
int period,
double multiplier
) {
//
if (period <= 0 || multiplier <= 0) {
return 0;
}
//
double atrValue = iATR(
_Symbol,
_Period,
period,
0
);
//
double result = atrValue * multiplier;
//
return result;
}
//
// Detect Candle Type ...
// Bullish => means close > open ...
bool IsBullishCandle(
const int bar_index
) {
//
// Temp Result ...
bool result = false;
//
if (bar_index < 0) {
return result;
}
//
double open = iOpen(
_Symbol,
_Period,
bar_index
);
//
double close = iClose(
_Symbol,
_Period,
bar_index
);
//
result = IsBullishCandle(
open,
close
);
//
return result;
}
bool IsBullishCandle(
const double open,
const double close
) {
//
// Temp Result ...
bool result = false;
//
result = open < close;
//
return result;
}
//
// Detect Candle Type ...
// Bearish => means close < open ...
bool IsBearishCandle(
const int bar_index
) {
//
// Temp Result ...
bool result = false;
//
if (bar_index < 0) {
return result;
}
//
double open = iOpen(
_Symbol,
_Period,
bar_index
);
//
double close = iClose(
_Symbol,
_Period,
bar_index
);
//
result = IsBearishCandle(
open,
close
);
//
return result;
}
bool IsBearishCandle(
const double open,
const double close
) {
//
// Temp Result ...
bool result = false;
//
result = open > close;
//
return result;
}
//
// Retrieve a Candle Info ...
XOHCL GetCandleModel(
const int bar_index
) {
//
XOHCL result = {};
//
double high = iHigh(
_Symbol,
_Period,
bar_index
);
result.high = high;
//
double open = iOpen(
_Symbol,
_Period,
bar_index
);
result.open = open;
//
double close = iClose(
_Symbol,
_Period,
bar_index
);
result.close = close;
//
double low = iLow(
_Symbol,
_Period,
bar_index
);
result.low = low;
//
return result;
}
//
// Detect Market Has Sharp Bullish or not ...
bool IsSharpBullishDetected(
const int bar_index, // Bar Index ...
const int marketLen, // Market Length ...
//
const double shpDetectMultipliers // Sharp Detect Multiplier
) {
//
bool result = false;
//
double open = iOpen(
_Symbol,
_Period,
bar_index
);
//
double close = iClose(
_Symbol,
_Period,
bar_index
);
//
double high = iHigh(
_Symbol,
_Period,
bar_index
);
//
double low = iLow(
_Symbol,
_Period,
bar_index
);
//
double minValue = 0;
double maxValue = 0;
int positionedLength = bar_index + marketLen;
//
for (int i = bar_index; i < positionedLength; i++) {
//
double cHigh = iHigh(
_Symbol,
_Period,
i
);
//
double cLow = iLow(
_Symbol,
_Period,
i
);
//
minValue += MathMin(cLow, cHigh);
maxValue += MathMax(cLow, cHigh);
}
//
double minAvg = minValue / positionedLength;
double maxAvg = maxValue / positionedLength;
//
double shpValue = shpDetectMultipliers * _Point;
//
result = (low - minAvg) > shpValue;
//
int index = bar_index;
while (
index < positionedLength
|| !result
) {
//
low = iLow(
_Symbol,
_Period,
index
);
//
result = result
|| (low - minAvg) > shpValue;
//
index++;
};
//
return result;
}
//
// Detect Market Has Sharp Bullish or not ...
bool IsSharpBearishDetected(
const int bar_index, // Bar Index ...
const int marketLen, // Market Length ...
//
const double shpDetectMultipliers // Sharp Detect Multiplier
) {
//
bool result = false;
//
double open = iOpen(
_Symbol,
_Period,
bar_index
);
//
double close = iClose(
_Symbol,
_Period,
bar_index
);
//
double high = iHigh(
_Symbol,
_Period,
bar_index
);
//
double low = iLow(
_Symbol,
_Period,
bar_index
);
//
double minValue = 0;
double maxValue = 0;
int positionedLength = bar_index + marketLen;
//
for (int i = bar_index; i < positionedLength; i++) {
//
double cHigh = iHigh(
_Symbol,
_Period,
i
);
//
double cLow = iLow(
_Symbol,
_Period,
i
);
//
minValue += MathMin(cLow, cHigh);
maxValue += MathMax(cLow, cHigh);
}
//
double minAvg = minValue / positionedLength;
double maxAvg = maxValue / positionedLength;
//
double shpValue = shpDetectMultipliers * _Point;
//
result = (high - maxAvg) > shpValue;
//
int index = bar_index;
while (
index < positionedLength
|| !result
) {
//
high = iHigh(
_Symbol,
_Period,
index
);
//
result = result
|| (high - maxAvg) > shpValue;
//
index++;
};
//
return result;
}
//
// Retrieve Highest High Value based on Given Market ...
double GetMarketHighestHigh(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iHighest(
_Symbol,
_Period,
MODE_HIGH,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iHigh(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Highest Low Value based on Given Market ...
double GetMarketHighestLow(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iHighest(
_Symbol,
_Period,
MODE_LOW,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iLow(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Highest Open Value based on Given Market ...
double GetMarketHighestOpen(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iHighest(
_Symbol,
_Period,
MODE_OPEN,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iOpen(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Highest Close Value based on Given Market ...
double GetMarketHighestClose(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iHighest(
_Symbol,
_Period,
MODE_CLOSE,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iClose(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Lowest Low Value based on Given Market ...
double GetMarketLowestLow(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iLowest(
_Symbol,
_Period,
MODE_LOW,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iLow(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Lowest High Value based on Given Market ...
double GetMarketLowestHigh(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iLowest(
_Symbol,
_Period,
MODE_HIGH,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iHigh(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Lowest Open Value based on Given Market ...
double GetMarketLowestOpen(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iLowest(
_Symbol,
_Period,
MODE_OPEN,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iOpen(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Retrieve Lowest Close Value based on Given Market ...
double GetMarketLowestClose(
//
const int bar_index, // Bar Index ...
const int marketLen // Market Length ...
) {
//
// Empty Result ...
double result = 0.0;
//
// Retrieve Desired Bar Index ...
int foundedBarIndex = iLowest(
_Symbol,
_Period,
MODE_CLOSE,
marketLen,
bar_index
);
//
// Retrieve Price ...
result = iClose(
_Symbol,
_Period,
foundedBarIndex
);
//
return result;
}
//
// Find last Candle which it's Low Price is
// less than given price ...
double GetLowLessCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iLow(
_Symbol,
_Period,
index
);
//
while (result >= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetLowLessCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iLow(
_Symbol,
_Period,
result
);
//
while (cP >= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's Low Price is
// great than given price ...
double GetLowGreatCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iLow(
_Symbol,
_Period,
index
);
//
while (result >= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetLowGreatCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iLow(
_Symbol,
_Period,
result
);
//
while (cP >= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's High Price is
// less than given price ...
double GetHighLessCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iHigh(
_Symbol,
_Period,
index
);
//
while (result >= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetHighLessCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iHigh(
_Symbol,
_Period,
result
);
//
while (cP >= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's High Price is
// great than given price ...
double GetHighGreatCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iHigh(
_Symbol,
_Period,
index
);
//
while (result <= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetHighGreatCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iHigh(
_Symbol,
_Period,
result
);
//
while (cP <= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's Open Price is
// less than given price ...
double GetOpenLessCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iOpen(
_Symbol,
_Period,
index
);
//
while (result >= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetOpenLessCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iOpen(
_Symbol,
_Period,
result
);
//
while (cP >= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's Open Price is
// less than given price ...
double GetOpenGreatCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iOpen(
_Symbol,
_Period,
index
);
//
while (result <= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetOpenGreatCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iOpen(
_Symbol,
_Period,
result
);
//
while (cP <= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's Close Price is
// less than given price ...
double GetCloseLessCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iClose(
_Symbol,
_Period,
index
);
//
while (result >= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetCloseLessCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iClose(
_Symbol,
_Period,
result
);
//
while (cP >= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Find last Candle which it's Close Price is
// great than given price ...
double GetCloseGreatCandlePrice(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int index = bar_index + 1;
double result = iClose(
_Symbol,
_Period,
index
);
//
while (result <= price) {
//
index++;
//
result = iLow(
_Symbol,
_Period,
index
);
}
//
return result;
}
int GetCloseGreatCandleIndex(
//
const int bar_index, // Bar Index ...
const double price // Position Open Price ...
) {
//
int result = bar_index + 1;
double cP = iClose(
_Symbol,
_Period,
result
);
//
while (cP <= price) {
//
result++;
//
cP = iLow(
_Symbol,
_Period,
result
);
}
//
return result;
}
//
// Get Slope of a Line by it's two Point ...
double GetSlope(
double x1,
double y1,
double x2,
double y2
) {
//
double result = (y2 - y1)/(x2 - x1);
return result;
}
//
// END Functions ...
//