Initial Commit ...
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Alert Library
|
||||
// --------------------------------------
|
||||
// Name: XAlert
|
||||
// Description: provides Alerts abilities ...
|
||||
//
|
||||
//
|
||||
// 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 Inputs ...
|
||||
//
|
||||
input group "Alerts";
|
||||
input bool enableAlerts = true; // Enable Alerts
|
||||
input bool logAlerts = true; // Log Alerts
|
||||
input bool terminalAlerts = true; // Terminal Alerts
|
||||
input bool mailAlerts = true; // Mail Alerts
|
||||
input bool pushAlerts = true; // Push Alerts
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
#include "x-saherelm.log.lib.mq5";
|
||||
|
||||
//
|
||||
// START Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
string alertPrefix = "X-Alert";
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Provided Functions ...
|
||||
//
|
||||
//
|
||||
// Initial Library if required ...
|
||||
bool OnInInitAlertLibrary()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// DeInitial Library if required ...
|
||||
void OnDeinitAlertLibrary()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// Attach Alert Prefix to Message ...
|
||||
string PrepareAlertMessage(string message)
|
||||
{
|
||||
//
|
||||
StringConcatenate(message, alertPrefix, " > ", message);
|
||||
|
||||
//
|
||||
return message;
|
||||
}
|
||||
|
||||
//
|
||||
// Logging an Alert ...
|
||||
void LogAlert(string message)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!enableAlerts || !logAlerts)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
LogMessage(alertPrefix, message);
|
||||
}
|
||||
|
||||
//
|
||||
// Terminal Alert ...
|
||||
void TerminalAlert(string message)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!enableAlerts || !terminalAlerts)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare Message ...
|
||||
message = PrepareAlertMessage(message);
|
||||
|
||||
// Send Terminal Alert ...
|
||||
Alert(message);
|
||||
}
|
||||
|
||||
//
|
||||
// Mail Alert ...
|
||||
void MailAlert(string message)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!enableAlerts || !mailAlerts)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Send Mail Alert ...
|
||||
SendMail(alertPrefix, message);
|
||||
}
|
||||
|
||||
//
|
||||
// Send Push Notification ...
|
||||
void PushAlert(string message)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!enableAlerts || !pushAlerts)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare Message ...
|
||||
message = PrepareAlertMessage(message);
|
||||
|
||||
//
|
||||
// Send Push Notification Alert ...
|
||||
SendNotification(message);
|
||||
}
|
||||
|
||||
//
|
||||
// Alert Sending ...
|
||||
void SendAlert(string message)
|
||||
{
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!enableAlerts)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Log ...
|
||||
if (logAlerts)
|
||||
{
|
||||
LogAlert(message);
|
||||
}
|
||||
|
||||
//
|
||||
// Terminal ...
|
||||
if (terminalAlerts)
|
||||
{
|
||||
TerminalAlert(message);
|
||||
}
|
||||
|
||||
//
|
||||
// Mail ...
|
||||
if (mailAlerts)
|
||||
{
|
||||
MailAlert(message);
|
||||
}
|
||||
|
||||
//
|
||||
// Push ...
|
||||
if (pushAlerts)
|
||||
{
|
||||
PushAlert(message);
|
||||
}
|
||||
}
|
||||
void SendAlert(
|
||||
XSignal &signal, // the Signal Object which requred to Alert
|
||||
bool asExecuted = true // determines Alert Signal as Executed Signal or not
|
||||
)
|
||||
{
|
||||
//
|
||||
// Prepare Message ...
|
||||
string message = asExecuted ? ExecutedSignalToString(signal) : SignalToString(signal);
|
||||
|
||||
//
|
||||
// Do Alerting ...
|
||||
SendAlert(message);
|
||||
}
|
||||
//
|
||||
// END Provided Functions ...
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,177 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Http Library
|
||||
// ------------------------------------------
|
||||
// Name: XHttp
|
||||
// Description: provide http communication
|
||||
// abilities ...
|
||||
//
|
||||
//
|
||||
// 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 Model Definition ...
|
||||
//
|
||||
enum X_HTTP_METHOD
|
||||
{
|
||||
X_HTTP_GET,
|
||||
X_HTTP_POST
|
||||
};
|
||||
//
|
||||
// END Model Definition ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Provided Functions ...
|
||||
//
|
||||
//
|
||||
// Initial Library if required ...
|
||||
bool OnInInitHttpLibrary()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// DeInitial Library if required ...
|
||||
void OnDeinitHttpLibrary()
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
||||
//
|
||||
result = WebRequest(
|
||||
strMethod,
|
||||
url,
|
||||
headers,
|
||||
timeout,
|
||||
payload,
|
||||
response,
|
||||
responseHeaders
|
||||
);
|
||||
|
||||
//
|
||||
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;
|
||||
}
|
||||
//
|
||||
// END Provided Functions ...
|
||||
//
|
||||
@@ -0,0 +1,161 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Logger Library
|
||||
// ---------------------------------------
|
||||
// Name: XLogger
|
||||
// Description: provides Logging abilities ...
|
||||
//
|
||||
//
|
||||
// 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 Inputs ...
|
||||
//
|
||||
input group "Logging";
|
||||
input bool enableLogging = true; // Enable Logging
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// Including Models ...
|
||||
#include "x-saherelm.models.lib.mq5"
|
||||
|
||||
//
|
||||
// START Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
string logTag = "X-Logger"; // LogTag
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Provided Functions ...
|
||||
//
|
||||
//
|
||||
// Logging a Message ...
|
||||
void LogMessage(string message)
|
||||
{
|
||||
//
|
||||
if (!enableLogging)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
Print(logTag, " > ", message);
|
||||
}
|
||||
void LogMessage(string tag, string message)
|
||||
{
|
||||
//
|
||||
if (!enableLogging)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
Print(tag, " > ", message);
|
||||
}
|
||||
|
||||
//
|
||||
// Logging an Array ...
|
||||
void LogArray(int &array[])
|
||||
{
|
||||
//
|
||||
if (!enableLogging)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
Print(logTag, ">");
|
||||
ArrayPrint(array);
|
||||
}
|
||||
void LogArray(double &array[])
|
||||
{
|
||||
//
|
||||
if (!enableLogging)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
Print(logTag, ">");
|
||||
ArrayPrint(array);
|
||||
}
|
||||
void LogArray(string &array[])
|
||||
{
|
||||
//
|
||||
if (!enableLogging)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
Print(logTag, ">");
|
||||
ArrayPrint(array);
|
||||
}
|
||||
|
||||
//
|
||||
// Convert a Signal to String Message ...
|
||||
string SignalToString(XSignal &signal)
|
||||
{
|
||||
//
|
||||
string result = "";
|
||||
|
||||
//
|
||||
result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Convert an Executed Signal to String Message ...
|
||||
string ExecutedSignalToString(XSignal &signal)
|
||||
{
|
||||
//
|
||||
string result = "";
|
||||
|
||||
//
|
||||
result += (signal.type == X_SIGNAL_LONG ? "Buy" : "Sell") + " Signal Executed provided on (" + signal.symbol + " _ " + EnumToString(_Period) + ") by this comment: " + signal.comment;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Logging Signal ...
|
||||
void LogSignal(XSignal &signal)
|
||||
{
|
||||
//
|
||||
string message = SignalToString(signal);
|
||||
|
||||
//
|
||||
LogMessage(message);
|
||||
}
|
||||
|
||||
//
|
||||
// Log Signal Execution ...
|
||||
void LogExecutedSignal(XSignal &signal)
|
||||
{
|
||||
//
|
||||
string message = ExecutedSignalToString(signal);
|
||||
|
||||
//
|
||||
LogMessage(message);
|
||||
}
|
||||
//
|
||||
// END Provided Functions ...
|
||||
//
|
||||
@@ -0,0 +1,187 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Models Library
|
||||
// ---------------------------------------
|
||||
// Name: XModels
|
||||
// Description: provides all required models ...
|
||||
//
|
||||
//
|
||||
// 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 Inputs ...
|
||||
//
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Provided Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Model Definitions ...
|
||||
//
|
||||
//
|
||||
// OHCL Candel Model ...
|
||||
enum ENUM_X_PRICE
|
||||
{
|
||||
X_PRICE_HIGH,
|
||||
X_PRICE_OPEN,
|
||||
X_PRICE_CLOSE,
|
||||
X_PRICE_LOW
|
||||
};
|
||||
|
||||
//
|
||||
// Describe an Specific Candle ...
|
||||
struct XOHCL
|
||||
{
|
||||
double high;
|
||||
double open;
|
||||
double close;
|
||||
double low;
|
||||
};
|
||||
|
||||
//
|
||||
// Swing Types Enum ...
|
||||
enum ENUM_X_SWING_TYPE
|
||||
{
|
||||
X_NO_SWING = 0,
|
||||
X_SWING_HIGH = 1,
|
||||
X_SWING_LOW = -1,
|
||||
};
|
||||
|
||||
//
|
||||
// XTrader Execution Signal Result ...
|
||||
enum ENUM_EXECUTION_SIGNAL_RESULT
|
||||
{
|
||||
//
|
||||
X_INVALID_SIGNAL_ERROR,
|
||||
X_XTRADER_NOT_ENOUGH_BALANCE_ERROR,
|
||||
X_XTRADER_NOT_ENOUGH_MARIGIN_ERROR,
|
||||
X_XTRADER_MAX_ALLOWED_TRADE_KIND_REACHED_ERROR,
|
||||
X_XTRADER_MAX_ALLOWED_SUPPORT_KIND_REACHED_ERROR,
|
||||
//
|
||||
X_TRADER_SUPPORT_DISTANCE_NOT_HAPPENS_ERROR,
|
||||
//
|
||||
X_UNKNOWN_ERROR,
|
||||
X_SUCCEED_EXECUTION
|
||||
};
|
||||
|
||||
//
|
||||
// Signal Types ...
|
||||
enum ENUM_X_SIGNAL_TYPE
|
||||
{
|
||||
X_SIGNAL_LONG,
|
||||
X_SIGNAL_SHORT,
|
||||
X_SIGNAL_UNKNOWN,
|
||||
};
|
||||
|
||||
//
|
||||
// Represent a Signal issued for Trade or Support a Trade ...
|
||||
enum ENUM_X_SIGNAL_KIND
|
||||
{
|
||||
X_KIND_TRADE,
|
||||
X_KIND_SUPPORT
|
||||
};
|
||||
|
||||
//
|
||||
// Signal Structure ...
|
||||
struct XSignal
|
||||
{
|
||||
//
|
||||
// Identifier ...
|
||||
ulong id;
|
||||
|
||||
//
|
||||
// Which Symbol used for Signal ...
|
||||
string symbol;
|
||||
|
||||
//
|
||||
// Which Type of operations ...
|
||||
ENUM_X_SIGNAL_TYPE type;
|
||||
|
||||
//
|
||||
// Signal Kind ...
|
||||
ENUM_X_SIGNAL_KIND kind;
|
||||
|
||||
//
|
||||
// Parent Ticket ...
|
||||
ulong parent;
|
||||
|
||||
//
|
||||
// Magic Number ...
|
||||
ulong magicNumber;
|
||||
|
||||
//
|
||||
// Ticket ...
|
||||
ulong ticket;
|
||||
|
||||
//
|
||||
// Entry/Open Price ...
|
||||
double entry;
|
||||
|
||||
//
|
||||
// TP ...
|
||||
double tp;
|
||||
|
||||
//
|
||||
// SL ...
|
||||
double sl;
|
||||
|
||||
//
|
||||
// Make Risk Free Trade on this Value if provided ...
|
||||
double riskFree;
|
||||
|
||||
//
|
||||
// a Multiplier for determines how much trade volume exit on risk free time ...
|
||||
double riskFreeRate;
|
||||
|
||||
//
|
||||
// Trade Profit ...
|
||||
double profit;
|
||||
|
||||
//
|
||||
// Time of Operation ...
|
||||
datetime time;
|
||||
|
||||
//
|
||||
// Volume ...
|
||||
double volume;
|
||||
|
||||
//
|
||||
// Comment ...
|
||||
string comment;
|
||||
};
|
||||
|
||||
//
|
||||
// TP/SL Struct ...
|
||||
struct XTPSL
|
||||
{
|
||||
ENUM_X_SIGNAL_TYPE type;
|
||||
double tp;
|
||||
double sl;
|
||||
double entry;
|
||||
double r2r;
|
||||
};
|
||||
//
|
||||
// END Provided Functions ...
|
||||
//
|
||||
@@ -0,0 +1,258 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 NN Class Library
|
||||
// ----------------------------------------
|
||||
// Name: XNNClass
|
||||
// Description: provides all classes for implementing
|
||||
// Neural Network ...
|
||||
//
|
||||
//
|
||||
// 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 Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
class XCNNBase
|
||||
{
|
||||
//
|
||||
// Public Definitions ...
|
||||
public:
|
||||
//
|
||||
// Constructor ...
|
||||
void XCNNBase(
|
||||
int nodes = 10, // Number of Input Nodes
|
||||
double starterWeight = 0.5, // start weight for each input
|
||||
double coEfficient = 0.1, // COEfficient Multiplier
|
||||
double upperRange = 1, // Upper Normal Range Value
|
||||
double lowerRange = -1, // Lower Normal Range Value
|
||||
double learningRates = 0.1 // Back Propagation Learning Rate
|
||||
) {
|
||||
//
|
||||
mNodes = nodes;
|
||||
mUpperRange = upperRange;
|
||||
mLowerRange = lowerRange;
|
||||
mCoEfficient = coEfficient;
|
||||
mLearningRates = learningRates;
|
||||
mStarterWeight = starterWeight;
|
||||
|
||||
//
|
||||
ReConstructWeights();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
void ~XCNNBase() {}
|
||||
|
||||
//
|
||||
// Protected Definitions ...
|
||||
void NormalizeInputs(double &inputs[], double &result[])
|
||||
{
|
||||
//
|
||||
ArrayFree(result);
|
||||
ArrayResize(result, 1);
|
||||
|
||||
//
|
||||
// Validate inputs ...
|
||||
if (ArraySize(inputs) != mNodes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare Result ...
|
||||
ArrayResize(result, mNodes);
|
||||
|
||||
//
|
||||
// Calculating min and max range value ...
|
||||
double minRangeValue = inputs[ArrayMinimum(inputs)];
|
||||
double maxRangeValue = inputs[ArrayMaximum(inputs)];
|
||||
|
||||
//
|
||||
// Loop through Inputs nd Normalize them ...
|
||||
for (int i = 0; i < mNodes; i++)
|
||||
{
|
||||
//
|
||||
double normalValue = (((inputs[i] - minRangeValue) * (mUpperRange - mLowerRange)) / (maxRangeValue - minRangeValue)) + mLowerRange;
|
||||
result[i] = normalValue;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Hyperbolic Tangent Activation Function ...
|
||||
double TanHActivationFunction(double weightedInputs)
|
||||
{
|
||||
//
|
||||
double result = (exp(weightedInputs) - exp(-weightedInputs)) / (exp(weightedInputs) + exp(-weightedInputs));
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Weighted Inputs ...
|
||||
double CalculateWeightedInputs(
|
||||
double &inputs[],
|
||||
bool applyCOEfficient = true)
|
||||
{
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
// Validate Inputs ...
|
||||
if (ArraySize(inputs) != mNodes)
|
||||
{
|
||||
//
|
||||
result = -1;
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < mNodes; i++)
|
||||
{
|
||||
result += inputs[i] * mWeights[i];
|
||||
}
|
||||
|
||||
//
|
||||
// Multiply if required ...
|
||||
if (applyCOEfficient)
|
||||
{
|
||||
result *= mCoEfficient;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Hidden Layers ...
|
||||
virtual double CalculateHiddenLayer(double &inputs[])
|
||||
{
|
||||
//
|
||||
// this is Default Activation Function which used ...
|
||||
// you can override this by writing your own ...
|
||||
double totalWeightedInputs = CalculateWeightedInputs(inputs);
|
||||
double result = TanHActivationFunction(totalWeightedInputs);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate Output Layers ...
|
||||
double CalculateOutputLayer(double &inputs[])
|
||||
{
|
||||
//
|
||||
double result = -1;
|
||||
|
||||
//
|
||||
// Validate Inputs ...
|
||||
if (ArraySize(inputs) != mNodes) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double normalizedInputs[];
|
||||
NormalizeInputs(inputs, normalizedInputs);
|
||||
if (ArraySize(normalizedInputs) != mNodes) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double hiddenLayerResult = CalculateHiddenLayer(normalizedInputs);
|
||||
|
||||
//
|
||||
result = 1 * hiddenLayerResult;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Basck Propaggation Learning ...
|
||||
void BackPropagation(
|
||||
double &inputs[],
|
||||
double &outputs,
|
||||
double targetOutput
|
||||
) {
|
||||
//
|
||||
// Validate Inputs ...
|
||||
if (ArraySize(inputs) != mNodes) {
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double normalizedInputs[];
|
||||
NormalizeInputs(inputs, normalizedInputs);
|
||||
if (ArraySize(normalizedInputs) != mNodes) {
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
double error = targetOutput - outputs;
|
||||
double derivative = 1 - MathPow(outputs, 2);
|
||||
|
||||
//
|
||||
for (int i = 0; i < mNodes; i++) {
|
||||
//
|
||||
double gradient = error * derivative * inputs[i];
|
||||
mWeights[i] = mLearningRates * gradient;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
//
|
||||
// Private Definitions ...
|
||||
private:
|
||||
//
|
||||
// Number of Input Nodes ...
|
||||
int mNodes;
|
||||
|
||||
//
|
||||
// Specify Upper range of Normal Values ...
|
||||
double mUpperRange;
|
||||
|
||||
//
|
||||
// Specify Lower range of Normal Values ...
|
||||
double mLowerRange;
|
||||
|
||||
//
|
||||
// Starter Weight for each input node ...
|
||||
double mStarterWeight;
|
||||
|
||||
//
|
||||
// double Input Node Weights ...
|
||||
double mWeights[];
|
||||
|
||||
//
|
||||
// CoEfficient is a multiplyer for weighted inputs ...
|
||||
double mCoEfficient;
|
||||
|
||||
//
|
||||
// Back Propagation Learning Rates ...
|
||||
double mLearningRates;
|
||||
|
||||
//
|
||||
// ReConstruct Weights ...
|
||||
void ReConstructWeights() {
|
||||
//
|
||||
ArrayFree(mWeights);
|
||||
ArrayResize(mWeights, mNodes);
|
||||
|
||||
//
|
||||
for (int i = 0; i< mNodes; i++) {
|
||||
mWeights[i] = mStarterWeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// END Global Definitions: Variables, Properties and etc ...
|
||||
//
|
||||
@@ -0,0 +1,925 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 XCHLH Oscillator Helper for Signal Providers
|
||||
// --------------------------------------------------------------------------
|
||||
//
|
||||
// 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 "..\Libraries\x-saherelm.log.lib.mq5"
|
||||
#include "..\Libraries\x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// START Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XCHLH Hot States ...
|
||||
enum ENUM_X_XCHLH_HOT_STATES
|
||||
{
|
||||
X_XCHLH_HOT_HH = 1,
|
||||
X_XCHLH_NEUTURAL = 0,
|
||||
X_XCHLH_HOT_LL = -1,
|
||||
};
|
||||
|
||||
//
|
||||
// XCHLH Signal Calculation Types ...
|
||||
enum ENUM_X_XCHLH_SIGNAL_TYPES
|
||||
{
|
||||
X_XCHLH_AVG_SIGNAL,
|
||||
X_XCHLH_DELTA_SIGNAL,
|
||||
};
|
||||
|
||||
//
|
||||
// XCHLH Buffer Lines ...
|
||||
enum ENUM_X_XCHLH_BUFFER_LINES
|
||||
{
|
||||
X_XCHLH_LC_HH_LINE = 0,
|
||||
X_XCHLH_LC_LL_LINE = 1,
|
||||
X_XCHLH_MC_HH_LINE = 2,
|
||||
X_XCHLH_MC_LL_LINE = 3,
|
||||
X_XCHLH_SC_HH_LINE = 4,
|
||||
X_XCHLH_SC_LL_LINE = 5,
|
||||
X_XCHLH_SIGNAL_T_LINE = 6,
|
||||
X_XCHLH_SIGNAL_B_LINE = 7,
|
||||
X_XCHLH_HOT_STATE_LINE = 8,
|
||||
};
|
||||
|
||||
//
|
||||
// END Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
input group "XCHLH Oscillator";
|
||||
|
||||
//
|
||||
// Signal Calculations ...
|
||||
input group "XCHLH Signal Calculations";
|
||||
input ENUM_X_XCHLH_SIGNAL_TYPES xCHLHSignalType = X_XCHLH_AVG_SIGNAL; // Signal Method
|
||||
|
||||
//
|
||||
// Common ...
|
||||
input group "XCHLH Hot Areas";
|
||||
input bool xCHLHDrawHotAreas = false; // Draw Hot Areas Symbol
|
||||
input uchar xCHLHHotHHArrowCode = 234; // Hot HH Arrow Code
|
||||
input color xCHLHHotHHArrowColor = clrAqua; // Hot HH Arrow Color
|
||||
input uchar xCHLHHotLLArrowCode = 233; // Hot LL Arrow Code
|
||||
input color xCHLHHotLLArrowColor = clrFuchsia; // Hot LL Arrow Color
|
||||
|
||||
//
|
||||
// LC Inputs ...
|
||||
input group "XCHLH Long Cycle";
|
||||
input group "XCHLH LC Market";
|
||||
input int xCHLHLcLength = 288; // Length
|
||||
input double xCHLHLcThresholdInPips = 0.3; // Threshold In Pips
|
||||
input ENUM_SERIESMODE xCHLHLcHHMode = MODE_HIGH; // Highest High Calculation Method
|
||||
input ENUM_SERIESMODE xCHLHLcLLMode = MODE_LOW; // Lowest Low Calculation Method
|
||||
input group "XCHLH LC Style";
|
||||
input int xCHLHLcDrawWidth = 1; // Draw Width
|
||||
input ENUM_DRAW_TYPE xCHLHLcDrawType = DRAW_LINE; // Draw Type
|
||||
input ENUM_LINE_STYLE xCHLHLcDrawStyle = STYLE_DOT; // Draw Style
|
||||
input color xCHLHLcHHColor = clrAqua; // Highest High Color
|
||||
input color xCHLHLcLLColor = clrFuchsia; // Lowest Low Color
|
||||
input group "XCHLH LC Drawings";
|
||||
input bool xCHLHLcDrawHH = true; // Draw Highest High
|
||||
input bool xCHLHLcDrawLL = true; // Draw Lowest Low
|
||||
|
||||
//
|
||||
// MC Inputs ...
|
||||
input group "XCHLH Medium Cycle";
|
||||
input group "XCHLH MC Market";
|
||||
input int xCHLHMcLength = 72; // Length
|
||||
input double xCHLHMcThresholdInPips = 0.3; // Threshold In Pips
|
||||
input ENUM_SERIESMODE xCHLHMcHHMode = MODE_HIGH; // Highest High Calculation Method
|
||||
input ENUM_SERIESMODE xCHLHMcLLMode = MODE_LOW; // Lowest Low Calculation Method
|
||||
input group "XCHLH MC Style";
|
||||
input int xCHLHMcDrawWidth = 1; // Draw Width
|
||||
input ENUM_DRAW_TYPE xCHLHMcDrawType = DRAW_LINE; // Draw Type
|
||||
input ENUM_LINE_STYLE xCHLHMcDrawStyle = STYLE_DOT; // Draw Style
|
||||
input color xCHLHMcHHColor = clrLime; // Highest High Color
|
||||
input color xCHLHMcLLColor = clrRed; // Lowest Low Color
|
||||
input group "XCHLH MC Drawings";
|
||||
input bool xCHLHMcDrawHH = true; // Draw Highest High
|
||||
input bool xCHLHMcDrawLL = true; // Draw Lowest Low
|
||||
|
||||
//
|
||||
// SC Inputs ...
|
||||
input group "XCHLH Short Cycle";
|
||||
input group "XCHLH SC Market";
|
||||
input int xCHLHScLength = 7; // Length
|
||||
input double xCHLHScThresholdInPips = 0.3; // Threshold In Pips
|
||||
input ENUM_SERIESMODE xCHLHScHHMode = MODE_HIGH; // Highest High Calculation Method
|
||||
input ENUM_SERIESMODE xCHLHScLLMode = MODE_LOW; // Lowest Low Calculation Method
|
||||
input group "XCHLH SC Style";
|
||||
input int xCHLHScDrawWidth = 1; // Draw Width
|
||||
input ENUM_DRAW_TYPE xCHLHScDrawType = DRAW_LINE; // Draw Type
|
||||
input ENUM_LINE_STYLE xCHLHScDrawStyle = STYLE_DOT; // Draw Style
|
||||
input color xCHLHScHHColor = clrLightBlue; // Highest High Color
|
||||
input color xCHLHScLLColor = clrLightSalmon; // Lowest Low Color
|
||||
input group "XCHLH SC Drawings";
|
||||
input bool xCHLHScDrawHH = true; // Draw Highest High
|
||||
input bool xCHLHScDrawLL = true; // Draw Lowest Low
|
||||
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Definitions ...
|
||||
//
|
||||
|
||||
int xCHLHHandler = INVALID_HANDLE;
|
||||
double xCHLHLcHHBuffer[];
|
||||
double xCHLHLcLLBuffer[];
|
||||
double xCHLHMcHHBuffer[];
|
||||
double xCHLHMcLLBuffer[];
|
||||
double xCHLHScHHBuffer[];
|
||||
double xCHLHScLLBuffer[];
|
||||
double xCHLHSignalTBuffer[];
|
||||
double xCHLHSignalBBuffer[];
|
||||
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Handler Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Init Oscillators ...
|
||||
bool XCHLHInitHandlers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Initialize Indicator/Oscillator Handlers ...
|
||||
ResetLastError();
|
||||
|
||||
//
|
||||
// XCHLH Handler ...
|
||||
ArraySetAsSeries(xCHLHLcHHBuffer, true);
|
||||
ArraySetAsSeries(xCHLHLcLLBuffer, true);
|
||||
ArraySetAsSeries(xCHLHMcHHBuffer, true);
|
||||
ArraySetAsSeries(xCHLHMcLLBuffer, true);
|
||||
ArraySetAsSeries(xCHLHScHHBuffer, true);
|
||||
ArraySetAsSeries(xCHLHScLLBuffer, true);
|
||||
ArraySetAsSeries(xCHLHSignalTBuffer, true);
|
||||
ArraySetAsSeries(xCHLHSignalBBuffer, true);
|
||||
xCHLHHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.xchlh.oscillator",
|
||||
//
|
||||
// Inputs ...
|
||||
//
|
||||
// Signal Calculations ...
|
||||
"",
|
||||
xCHLHSignalType,
|
||||
//
|
||||
// Commons ...
|
||||
"",
|
||||
xCHLHDrawHotAreas,
|
||||
xCHLHHotHHArrowCode,
|
||||
xCHLHHotHHArrowColor,
|
||||
xCHLHHotLLArrowCode,
|
||||
xCHLHHotLLArrowColor,
|
||||
//
|
||||
// LC ...
|
||||
"",
|
||||
"",
|
||||
xCHLHLcLength,
|
||||
xCHLHLcThresholdInPips,
|
||||
xCHLHLcHHMode,
|
||||
xCHLHLcLLMode,
|
||||
"",
|
||||
xCHLHLcDrawWidth,
|
||||
xCHLHLcDrawType,
|
||||
xCHLHLcDrawStyle,
|
||||
xCHLHLcHHColor,
|
||||
xCHLHLcLLColor,
|
||||
"",
|
||||
xCHLHLcDrawHH,
|
||||
xCHLHLcDrawLL,
|
||||
//
|
||||
// MC ...
|
||||
"",
|
||||
"",
|
||||
xCHLHMcLength,
|
||||
xCHLHMcThresholdInPips,
|
||||
xCHLHMcHHMode,
|
||||
xCHLHMcLLMode,
|
||||
"",
|
||||
xCHLHMcDrawWidth,
|
||||
xCHLHMcDrawType,
|
||||
xCHLHMcDrawStyle,
|
||||
xCHLHMcHHColor,
|
||||
xCHLHMcLLColor,
|
||||
"",
|
||||
xCHLHMcDrawHH,
|
||||
xCHLHMcDrawLL,
|
||||
//
|
||||
// SC ...
|
||||
"",
|
||||
"",
|
||||
xCHLHScLength,
|
||||
xCHLHScThresholdInPips,
|
||||
xCHLHScHHMode,
|
||||
xCHLHScLLMode,
|
||||
"",
|
||||
xCHLHScDrawWidth,
|
||||
xCHLHScDrawType,
|
||||
xCHLHScDrawStyle,
|
||||
xCHLHScHHColor,
|
||||
xCHLHScLLColor,
|
||||
"",
|
||||
xCHLHScDrawHH,
|
||||
xCHLHScDrawLL);
|
||||
if (xCHLHHandler == INVALID_HANDLE)
|
||||
{
|
||||
//
|
||||
LogMessage("failed to Initialize XCHLH Indicator: " + (string)GetLastError());
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Release Oscillators ...
|
||||
void XCHLHReleaseHandlers()
|
||||
{
|
||||
IndicatorRelease(xCHLHHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle Reading Buffers ...
|
||||
void XCHLHReadBuffers(
|
||||
int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
// XCHLH LC HH Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_LC_HH_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHLcHHBuffer);
|
||||
|
||||
//
|
||||
// XCHLH LC LL Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_LC_LL_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHLcLLBuffer);
|
||||
|
||||
//
|
||||
// XCHLH MC HH Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_MC_HH_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHMcHHBuffer);
|
||||
|
||||
//
|
||||
// XCHLH MC LL Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_MC_LL_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHMcLLBuffer);
|
||||
|
||||
//
|
||||
// XCHLH SC HH Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_SC_HH_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHScHHBuffer);
|
||||
|
||||
//
|
||||
// XCHLH SC LL Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_SC_LL_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHScLLBuffer);
|
||||
|
||||
//
|
||||
// XCHLH Signal T Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_SIGNAL_T_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHSignalTBuffer);
|
||||
|
||||
//
|
||||
// XCHLH Signal B Buffer ...
|
||||
CopyBuffer(
|
||||
xCHLHHandler,
|
||||
X_XCHLH_SIGNAL_B_LINE,
|
||||
0,
|
||||
xCHLHItemsPerTick,
|
||||
xCHLHSignalBBuffer);
|
||||
}
|
||||
|
||||
//
|
||||
// END Handler Funcions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XCHLH Long Conditions ...
|
||||
bool XCHLHHasLongConditions(
|
||||
int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isSignalBCrossedOverLCLL = XCHLHIsSignalBCrossedOverLCLL(1);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isSignalBCrossedOverLCLL
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XCHLH Close Long Conditions ...
|
||||
bool XCHLHHasLongCloseConditions(
|
||||
int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
) {
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isSignalBCrossedOverSignalT = XCHLHIsSignalBCrossedOverSignalT(1);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isSignalBCrossedOverSignalT
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XCHLH Short Conditions ...
|
||||
bool XCHLHHasShortConditions(
|
||||
int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isSignalBCrossedUnderSignalT = XCHLHIsSignalBCrossedUnderSignalT(1);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isSignalBCrossedUnderSignalT
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XCHLH Close Short Conditions ...
|
||||
bool XCHLHHasShortCloseConditions(
|
||||
int xCHLHItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isSignalBCrossedUnderLCLL = XCHLHIsSignalBCrossedUnderLCLL(1);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isSignalBCrossedUnderLCLL
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START XCHLH Custom Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Check Signal B Crossed Over LC LL ...
|
||||
bool XCHLHIsSignalBCrossedOverLCLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossOver(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHLcLLBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Over LC LL ...
|
||||
bool XCHLHIsSignalBOverLCLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsOver(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHLcLLBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Crossed Under LC LL ...
|
||||
bool XCHLHIsSignalBCrossedUnderLCLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossUnder(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHLcLLBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Under LC LL ...
|
||||
bool XCHLHIsSignalBUnderLCLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsUnder(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHLcLLBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Crossed Over Signal T ...
|
||||
bool XCHLHIsSignalBCrossedOverSignalT(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossOver(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHSignalTBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Over Signal T ...
|
||||
bool XCHLHIsSignalBOverSignalT(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsOver(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHSignalTBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Crossed Under Signal T ...
|
||||
bool XCHLHIsSignalBCrossedUnderSignalT(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossUnder(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHSignalTBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal B Under Signal T ...
|
||||
bool XCHLHIsSignalBUnderSignalT(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsUnder(
|
||||
xCHLHSignalBBuffer,
|
||||
xCHLHSignalTBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check LC and MC has Same HH ...
|
||||
bool XCHLHIsLCMCHasSameHH(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lcValue = xCHLHLcHHBuffer[bar_index];
|
||||
double mcValue = xCHLHMcHHBuffer[bar_index];
|
||||
|
||||
//
|
||||
result = lcValue == mcValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check LC and MC has Same LL ...
|
||||
bool XCHLHIsLCMCHasSameLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lcValue = xCHLHLcLLBuffer[bar_index];
|
||||
double mcValue = xCHLHMcLLBuffer[bar_index];
|
||||
|
||||
//
|
||||
result = lcValue == mcValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check LC and SC has Same HH ...
|
||||
bool XCHLHIsLCSCHasSameHH(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lcValue = xCHLHLcHHBuffer[bar_index];
|
||||
double scValue = xCHLHScHHBuffer[bar_index];
|
||||
|
||||
//
|
||||
result = lcValue == scValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check LC and SC has Same LL ...
|
||||
bool XCHLHIsLCSCHasSameLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lcValue = xCHLHLcLLBuffer[bar_index];
|
||||
double scValue = xCHLHScLLBuffer[bar_index];
|
||||
|
||||
//
|
||||
result = lcValue == scValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check MC and SC has Same HH ...
|
||||
bool XCHLHIsMCSCHasSameHH(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double mcValue = xCHLHMcHHBuffer[bar_index];
|
||||
double scValue = xCHLHScHHBuffer[bar_index];
|
||||
|
||||
//
|
||||
result = mcValue == scValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check MC and SC has Same LL ...
|
||||
bool XCHLHIsMCSCHasSameLL(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double mcValue = xCHLHMcLLBuffer[bar_index];
|
||||
double scValue = xCHLHScLLBuffer[bar_index];
|
||||
|
||||
//
|
||||
result = mcValue == scValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Is Same Highest Highs ...
|
||||
bool XCHLHIsSameHHs(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lcValue = xCHLHLcHHBuffer[bar_index];
|
||||
double mcValue = xCHLHMcHHBuffer[bar_index];
|
||||
double scValue = xCHLHScHHBuffer[bar_index];
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
lcValue == mcValue &&
|
||||
mcValue == scValue
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Is Same Lowest Lows ...
|
||||
bool XCHLHIsSameLLs(
|
||||
int bar_index // Specified Bar Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Validate Args ...
|
||||
if (!XCHLHIsValidBufferSizes(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
double lcValue = xCHLHLcLLBuffer[bar_index];
|
||||
double mcValue = xCHLHMcLLBuffer[bar_index];
|
||||
double scValue = xCHLHScLLBuffer[bar_index];
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
lcValue == mcValue &&
|
||||
mcValue == scValue
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check and Validate Buffer Sizes ...
|
||||
bool XCHLHIsValidBufferSizes(
|
||||
int size // Specified Min Size
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
ArraySize(xCHLHLcHHBuffer) > size &&
|
||||
ArraySize(xCHLHLcLLBuffer) > size &&
|
||||
//
|
||||
ArraySize(xCHLHMcHHBuffer) > size &&
|
||||
ArraySize(xCHLHMcLLBuffer) > size &&
|
||||
//
|
||||
ArraySize(xCHLHScHHBuffer) > size &&
|
||||
ArraySize(xCHLHScLLBuffer) > size;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END XCHLH Custom Functions ...
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,417 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 XOBD Oscillator Helper for Signal Providers
|
||||
// --------------------------------------------------------------------------
|
||||
//
|
||||
// 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 "..\Libraries\x-saherelm.log.lib.mq5"
|
||||
#include "..\Libraries\x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// START Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XOBD Oscillator Buffer Lines ...
|
||||
enum ENUM_X_XOBD_BUFFER_LINES
|
||||
{
|
||||
X_XOBD_SWING_HIGH_LINE = 0,
|
||||
X_XOBD_SWING_LOW_LINE = 1,
|
||||
X_XOBD_SIGNAL_LINE = 2,
|
||||
};
|
||||
|
||||
//
|
||||
// END Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
|
||||
input group "XOBD Oscillator";
|
||||
input int xOBDLength = 72; // Market Length
|
||||
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Definitions ...
|
||||
//
|
||||
|
||||
int xOBDHandler = INVALID_HANDLE;
|
||||
double xOBDSwingHighBuffer[];
|
||||
double xOBDSwingLowBuffer[];
|
||||
double xOBDSignalBuffer[];
|
||||
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Handler Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Init Oscillators ...
|
||||
bool XOBDInitHandlers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Initialize Indicator/Oscillator Handlers ...
|
||||
ResetLastError();
|
||||
|
||||
//
|
||||
// XOBD Handler ...
|
||||
ArraySetAsSeries(xOBDSwingHighBuffer, true);
|
||||
ArraySetAsSeries(xOBDSwingLowBuffer, true);
|
||||
ArraySetAsSeries(xOBDSignalBuffer, true);
|
||||
xOBDHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.xobd.oscillator",
|
||||
//
|
||||
// Inputs ...
|
||||
xOBDLength
|
||||
//
|
||||
);
|
||||
if (xOBDHandler == INVALID_HANDLE)
|
||||
{
|
||||
//
|
||||
LogMessage("failed to Initialize XOBD Oscillator: " + (string)GetLastError());
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Release Oscillators ...
|
||||
void XOBDReleaseHandlers()
|
||||
{
|
||||
IndicatorRelease(xOBDHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle Reading Buffers ...
|
||||
void XOBDReadBuffers(
|
||||
int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
// XOBD Swing High ...
|
||||
CopyBuffer(
|
||||
xOBDHandler,
|
||||
X_XOBD_SWING_HIGH_LINE,
|
||||
0,
|
||||
xOBDItemsPerTick,
|
||||
xOBDSwingHighBuffer);
|
||||
|
||||
//
|
||||
// XOBD Swing Low ...
|
||||
CopyBuffer(
|
||||
xOBDHandler,
|
||||
X_XOBD_SWING_LOW_LINE,
|
||||
0,
|
||||
xOBDItemsPerTick,
|
||||
xOBDSwingLowBuffer);
|
||||
|
||||
//
|
||||
// XOBD Signal ...
|
||||
CopyBuffer(
|
||||
xOBDHandler,
|
||||
X_XOBD_SIGNAL_LINE,
|
||||
0,
|
||||
xOBDItemsPerTick,
|
||||
xOBDSignalBuffer);
|
||||
}
|
||||
|
||||
//
|
||||
// END Handler Funcions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XOBD Long Conditions ...
|
||||
bool XOBDHasLongConditions(
|
||||
int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isVale = XOBDIsVale();
|
||||
bool isInPeak = IsInPeak(
|
||||
xOBDItemsPerTick,
|
||||
xOBDSignalBuffer);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isVale
|
||||
//
|
||||
&&
|
||||
//
|
||||
!isInPeak
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XOBD Short Conditions ...
|
||||
bool XOBDHasShortConditions(
|
||||
int xOBDItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START XOBD Custom Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Check all Buffers has valid Size ...
|
||||
bool XOBDIsValidBuffersSize(
|
||||
int size // the size of buffers which min size for requirements
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
size <= 0 ||
|
||||
//
|
||||
ArraySize(xOBDSignalBuffer) < size ||
|
||||
ArraySize(xOBDSwingLowBuffer) < size ||
|
||||
ArraySize(xOBDSwingHighBuffer) < size
|
||||
//
|
||||
)
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check SC is Peak ...
|
||||
bool XOBDIsPeak()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isIncreasing = IsIncreasing(
|
||||
10,
|
||||
3,
|
||||
xOBDSignalBuffer);
|
||||
|
||||
//
|
||||
bool isDecreasing = IsDecreasing(
|
||||
3,
|
||||
1,
|
||||
xOBDSignalBuffer);
|
||||
|
||||
//
|
||||
// Generating Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check SC is Vale ...
|
||||
bool XOBDIsVale()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isIncreasing = IsIncreasing(
|
||||
5,
|
||||
1,
|
||||
xOBDSignalBuffer);
|
||||
|
||||
//
|
||||
bool isDecreasing = IsDecreasing(
|
||||
20,
|
||||
5,
|
||||
xOBDSignalBuffer);
|
||||
|
||||
//
|
||||
// Generating Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Crossed Over Swing High ...
|
||||
bool XOBDIsSignalCrossedOverSwingHigh(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XOBDIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossOver(
|
||||
xOBDSignalBuffer,
|
||||
xOBDSwingHighBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Over Swing High ...
|
||||
bool XOBDIsSignalOverSwingHigh(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XOBDIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsOver(
|
||||
xOBDSignalBuffer,
|
||||
xOBDSwingHighBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Crossed Under Swing High ...
|
||||
bool XOBDIsSignalCrossedUnderSwingHigh(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XOBDIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossUnder(
|
||||
xOBDSignalBuffer,
|
||||
xOBDSwingHighBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Under Swing High ...
|
||||
bool XOBDIsSignalUnderSwingHigh(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XOBDIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsUnder(
|
||||
xOBDSignalBuffer,
|
||||
xOBDSwingHighBuffer,
|
||||
bar_index);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END XOBD Custom Functions ...
|
||||
//
|
||||
@@ -0,0 +1,424 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 XRSI Oscillator Helper for Signal Providers
|
||||
// --------------------------------------------------------------------------
|
||||
//
|
||||
// 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 "..\Libraries\x-saherelm.log.lib.mq5"
|
||||
#include "..\Libraries\x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// START Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XRSI Oscillator Buffer Lines ...
|
||||
//
|
||||
|
||||
//
|
||||
// END Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
|
||||
input group "XRSI Oscillator";
|
||||
|
||||
//
|
||||
input group "XRSI Market";
|
||||
input int xRSILength = 14; // Market Length
|
||||
input ENUM_APPLIED_PRICE xRSIAppliedTo = PRICE_CLOSE; // Applied To
|
||||
|
||||
//
|
||||
input group "XRSI Short Entry";
|
||||
input double xRSIShortEntryValue = 70; // Short Entry Level
|
||||
input color xRSIShortEntryColor = clrRed; // Short Entry Level Color
|
||||
input ENUM_LINE_STYLE xRSIShortEntryLineStyle = STYLE_SOLID; // Short Entry Style
|
||||
|
||||
//
|
||||
input group "XRSI Short Exit";
|
||||
input double xRSIShortExitValue = 40; // Short Exit Level
|
||||
input color xRSIShortExitColor = clrFuchsia; // Short Exit Level Color
|
||||
input ENUM_LINE_STYLE xRSIShortExitLineStyle = STYLE_DOT; // Short Exit Style
|
||||
|
||||
//
|
||||
input group "XRSI Long Entry";
|
||||
input double xRSILongEntryValue = 30; // Long Entry Level
|
||||
input color xRSILongEntryColor = clrGreen; // Long Entry Level Color
|
||||
input ENUM_LINE_STYLE xRSILongEntryLineStyle = STYLE_SOLID; // Long Entry Style
|
||||
|
||||
//
|
||||
input group "XRSI Long Exit";
|
||||
input double xRSILongExitValue = 60; // Long Exit Level
|
||||
input color xRSILongExitColor = clrAqua; // Long Exit Level Color
|
||||
input ENUM_LINE_STYLE xRSILongExitLineStyle = STYLE_DOT; // Long Exit Style
|
||||
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Definitions ...
|
||||
//
|
||||
|
||||
int xRSIHandler = INVALID_HANDLE;
|
||||
double xRSIBuffer[];
|
||||
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Handler Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Init Oscillators ...
|
||||
bool XRSIInitHandlers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Initialize Indicator/Oscillator Handlers ...
|
||||
ResetLastError();
|
||||
|
||||
//
|
||||
// XRSI Handler ...
|
||||
ArraySetAsSeries(xRSIBuffer, true);
|
||||
xRSIHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.xrsi.oscillator",
|
||||
//
|
||||
// Inputs ...
|
||||
//
|
||||
// Market ...
|
||||
"",
|
||||
xRSILength,
|
||||
xRSIAppliedTo,
|
||||
//
|
||||
// Short Entry ...
|
||||
"",
|
||||
xRSIShortEntryValue,
|
||||
xRSIShortEntryColor,
|
||||
xRSIShortEntryLineStyle,
|
||||
//
|
||||
// Short Exit ...
|
||||
"",
|
||||
xRSIShortExitValue,
|
||||
xRSIShortExitColor,
|
||||
xRSIShortExitLineStyle,
|
||||
//
|
||||
// Long Entry ...
|
||||
"",
|
||||
xRSILongEntryValue,
|
||||
xRSILongEntryColor,
|
||||
xRSILongEntryLineStyle,
|
||||
//
|
||||
// Long Exit ...
|
||||
"",
|
||||
xRSILongExitValue,
|
||||
xRSILongExitColor,
|
||||
xRSILongExitLineStyle
|
||||
//
|
||||
);
|
||||
if (xRSIHandler == INVALID_HANDLE)
|
||||
{
|
||||
//
|
||||
LogMessage("failed to Initialize XRSI Oscillator: " + (string)GetLastError());
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Release Oscillators ...
|
||||
void XRSIReleaseHandlers()
|
||||
{
|
||||
IndicatorRelease(xRSIHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle Reading Buffers ...
|
||||
void XRSIReadBuffers(
|
||||
int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
// XRSI Signal ...
|
||||
CopyBuffer(
|
||||
xRSIHandler,
|
||||
0,
|
||||
0,
|
||||
xRSIItemsPerTick,
|
||||
xRSIBuffer);
|
||||
}
|
||||
|
||||
//
|
||||
// END Handler Funcions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XRSI Long Conditions ...
|
||||
bool XRSIHasLongConditions(
|
||||
int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XRSI Short Conditions ...
|
||||
bool XRSIHasShortConditions(
|
||||
int xRSIItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START XRSI Custom Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Check SC is Peak ...
|
||||
bool XRSIIsPeak()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isIncreasing = IsIncreasing(
|
||||
11,
|
||||
3,
|
||||
xRSIBuffer);
|
||||
|
||||
//
|
||||
bool isDecreasing = IsDecreasing(
|
||||
3,
|
||||
1,
|
||||
xRSIBuffer);
|
||||
|
||||
//
|
||||
// Generating Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check SC is Vale ...
|
||||
bool XRSIIsVale()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isIncreasing = IsIncreasing(
|
||||
3,
|
||||
1,
|
||||
xRSIBuffer);
|
||||
|
||||
//
|
||||
bool isDecreasing = IsDecreasing(
|
||||
11,
|
||||
3,
|
||||
xRSIBuffer);
|
||||
|
||||
//
|
||||
// Generating Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// RSI Value GO Up from Long Entry ...
|
||||
bool XRSIIsCrossedOverLongEntry(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XRSIIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
xRSIBuffer[bar_index + 1] > xRSILongEntryValue &&
|
||||
xRSIBuffer[bar_index + 2] <= xRSILongEntryValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// RSI Value GO Up from Long Exit ...
|
||||
bool XRSIIsCrossedOverLongExit(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XRSIIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
xRSIBuffer[bar_index + 1] > xRSILongExitValue &&
|
||||
xRSIBuffer[bar_index + 2] <= xRSILongExitValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// RSI Value Go Down Short Entry ...
|
||||
bool XRSIIsCrossedUnderShortEntry(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XRSIIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
xRSIBuffer[bar_index + 1] < xRSIShortEntryValue &&
|
||||
xRSIBuffer[bar_index + 2] >= xRSIShortEntryValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// RSI Value Go Down Short Exit ...
|
||||
bool XRSIIsCrossedUnderShortExit(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XRSIIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
xRSIBuffer[bar_index + 1] < xRSIShortExitValue &&
|
||||
xRSIBuffer[bar_index + 2] >= xRSIShortExitValue;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check all Buffers has valid Size ...
|
||||
bool XRSIIsValidBuffersSize(
|
||||
int size // the size of buffers which min size for requirements
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
size <= 0 ||
|
||||
//
|
||||
ArraySize(xRSIBuffer) < size
|
||||
//
|
||||
)
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END XRSI Custom Functions ...
|
||||
//
|
||||
@@ -0,0 +1,917 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 XTD Oscillator Helper for Signal Providers
|
||||
// --------------------------------------------------------------------------
|
||||
//
|
||||
// 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 "..\Libraries\x-saherelm.log.lib.mq5"
|
||||
#include "..\Libraries\x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// START Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XTD Oscillator States ...
|
||||
enum ENUM_X_XTD_STATES
|
||||
{
|
||||
X_XTD_BULLISH_CROSSED_OVER_BEARISH = 2,
|
||||
X_XTD_BULLISH_OVER_BEARISH = 1,
|
||||
X_XTD_NEUTURAL = 0,
|
||||
X_XTD_BULLISH_UNDER_BEARISH = -1,
|
||||
X_XTD_BULLISH_CROSSED_UNDER_BEARISH = -2
|
||||
};
|
||||
|
||||
//
|
||||
// XTD Oscillator Buffer Lines ...
|
||||
enum ENUM_X_XTD_BUFFER_LINES
|
||||
{
|
||||
X_XTD_BULLISH_POWER_LINE = 0,
|
||||
X_XTD_BEARISH_POWER_LINE = 1,
|
||||
X_XTD_SIGNAL_LINE = 2,
|
||||
};
|
||||
|
||||
//
|
||||
// END Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
|
||||
input group "XTD Oscillator";
|
||||
input int xTDLength = 14; // Market Length
|
||||
input bool xTDDrawCrosses = false; // Draw Cross Arrows
|
||||
input uchar xTDBullishArrowCode = 228; // Cross Over Arrow Code
|
||||
input color xTDBullishArrowColor = clrAqua; // Cross Over Arrow Color
|
||||
input uchar xTDBearishArrowCode = 230; // Cross Under Arrow Code
|
||||
input color xTDBearishArrowColor = clrMagenta; // Cross Under Arrow Color
|
||||
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Definitions ...
|
||||
//
|
||||
|
||||
int xTDHandler = INVALID_HANDLE;
|
||||
double xTDBullishBuffer[];
|
||||
double xTDBearishBuffer[];
|
||||
double xTDSignalBuffer[];
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Handler Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Init Oscillators ...
|
||||
bool XTDInitHandlers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Initialize Indicator/Oscillator Handlers ...
|
||||
ResetLastError();
|
||||
|
||||
//
|
||||
// XTD Handler ...
|
||||
ArraySetAsSeries(xTDBullishBuffer, true);
|
||||
ArraySetAsSeries(xTDBearishBuffer, true);
|
||||
ArraySetAsSeries(xTDSignalBuffer, true);
|
||||
xTDHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.xtd.oscillator",
|
||||
//
|
||||
// Inputs ...
|
||||
xTDLength,
|
||||
xTDDrawCrosses,
|
||||
xTDBullishArrowCode,
|
||||
xTDBullishArrowColor,
|
||||
xTDBearishArrowCode,
|
||||
xTDBearishArrowColor);
|
||||
if (xTDHandler == INVALID_HANDLE)
|
||||
{
|
||||
//
|
||||
LogMessage("failed to Initialize XTD Oscillator: " + (string)GetLastError());
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Release Oscillators ...
|
||||
void XTDReleaseHandlers()
|
||||
{
|
||||
IndicatorRelease(xTDHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle Reading Buffers ...
|
||||
void XTDReadBuffers(
|
||||
int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
// XTD Bullish Buffer ...
|
||||
CopyBuffer(
|
||||
xTDHandler,
|
||||
X_XTD_BULLISH_POWER_LINE,
|
||||
0,
|
||||
xTDItemsPerTick,
|
||||
xTDBullishBuffer);
|
||||
|
||||
//
|
||||
// XTD Bullish Buffer ...
|
||||
CopyBuffer(
|
||||
xTDHandler,
|
||||
X_XTD_BEARISH_POWER_LINE,
|
||||
0,
|
||||
xTDItemsPerTick,
|
||||
xTDBearishBuffer);
|
||||
|
||||
//
|
||||
// XTD Signal Buffer ...
|
||||
CopyBuffer(
|
||||
xTDHandler,
|
||||
X_XTD_SIGNAL_LINE,
|
||||
0,
|
||||
xTDItemsPerTick,
|
||||
xTDSignalBuffer);
|
||||
}
|
||||
|
||||
//
|
||||
// END Handler Funcions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XTD Long Conditions ...
|
||||
bool XTDHasLongConditions(
|
||||
int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isVale = XTDIsSignalVale();
|
||||
|
||||
//
|
||||
bool isInPeak = IsInPeak(
|
||||
15,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
bool isSharpChanged = IsSharpChanged(
|
||||
15,
|
||||
1,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
double entry = GetEntry(X_SIGNAL_LONG);
|
||||
double maxPrice = GetHighestHigh(
|
||||
7,
|
||||
0);
|
||||
double minPrice = GetLowestLow(
|
||||
7,
|
||||
0);
|
||||
double priceDelta = maxPrice - minPrice;
|
||||
double priceStep = priceDelta / 7;
|
||||
|
||||
//
|
||||
bool isPricePassed =
|
||||
entry < maxPrice &&
|
||||
maxPrice - entry < (priceDelta / 4) * 3;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isVale
|
||||
//
|
||||
&&
|
||||
//
|
||||
!isInPeak
|
||||
//
|
||||
&&
|
||||
//
|
||||
!isSharpChanged
|
||||
//
|
||||
&&
|
||||
//
|
||||
isPricePassed
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XTD Short Conditions ...
|
||||
bool XTDHasShortConditions(
|
||||
int xTDItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isPeak = XTDIsSignalPeak();
|
||||
|
||||
//
|
||||
bool isInVale = IsInVale(
|
||||
15,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
bool isSharpChanged = IsSharpChanged(
|
||||
15,
|
||||
1,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
double entry = GetEntry(X_SIGNAL_SHORT);
|
||||
double maxPrice = GetHighestHigh(
|
||||
7,
|
||||
0);
|
||||
double minPrice = GetLowestLow(
|
||||
7,
|
||||
0);
|
||||
double priceDelta = maxPrice - minPrice;
|
||||
double priceStep = priceDelta / 7;
|
||||
|
||||
//
|
||||
bool isPricePassed =
|
||||
entry > minPrice &&
|
||||
minPrice + entry > (priceDelta / 4);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isPeak
|
||||
//
|
||||
&&
|
||||
//
|
||||
!isInVale
|
||||
//
|
||||
&&
|
||||
//
|
||||
!isSharpChanged
|
||||
//
|
||||
&&
|
||||
//
|
||||
isPricePassed
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START XTD Custom Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Check Signal Vale ...
|
||||
bool XTDIsSignalVale()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Must Decreasing ...
|
||||
bool isIncreasing = IsIncreasing(
|
||||
3,
|
||||
1,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
// Must Increasing ...
|
||||
bool isDecreasing = IsDecreasing(
|
||||
15,
|
||||
3,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
// Generating Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Peak ...
|
||||
bool XTDIsSignalPeak()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Must Decreasing ...
|
||||
bool isIncreasing = IsIncreasing(
|
||||
15,
|
||||
3,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
// Must Increasing ...
|
||||
bool isDecreasing = IsDecreasing(
|
||||
3,
|
||||
1,
|
||||
xTDSignalBuffer);
|
||||
|
||||
//
|
||||
// Generating Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Peak ...
|
||||
|
||||
//
|
||||
// Check Bullish Crossed Over Bearish ...
|
||||
bool XTDIsBullCrossedOverBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossOver(
|
||||
xTDBullishBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Over Bearish ...
|
||||
bool XTDIsBullOverBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsOver(
|
||||
xTDBullishBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Crossed Under Bearish ...
|
||||
bool XTDIsBullCrossedUnderBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossUnder(
|
||||
xTDBullishBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Bullish Under Bearish ...
|
||||
bool XTDIsBullUnderBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsUnder(
|
||||
xTDBullishBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Crossed Over Bearish ...
|
||||
bool XTDIsSignalCrossedOverBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossOver(
|
||||
xTDSignalBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Over Bearish ...
|
||||
bool XTDIsSignalOverBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsOver(
|
||||
xTDSignalBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Crossed Under Bearish ...
|
||||
bool XTDIsSignalCrossedUnderBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsCrossUnder(
|
||||
xTDSignalBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Signal Under Bearish ...
|
||||
bool XTDIsSignalUnderBear(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTDIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = IsUnder(
|
||||
xTDSignalBuffer,
|
||||
xTDBearishBuffer,
|
||||
1);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check all Buffers has valid Size ...
|
||||
bool XTDIsValidBuffersSize(
|
||||
int size // the size of buffers which min size for requirements
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
size <= 0 ||
|
||||
ArraySize(xTDBullishBuffer) < size ||
|
||||
ArraySize(xTDBullishBuffer) < size ||
|
||||
ArraySize(xTDSignalBuffer) < size)
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Count Signal Crossed Over Bear ...
|
||||
int XTDCountSignalCrossedOverBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsSignalCrossedOverBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Count Signal Crossed Under Bear ...
|
||||
int XTDCountSignalCrossedUnderBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Count Bull Crossed Over Bear ...
|
||||
int XTDCountBullCrossedOverBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsBullCrossedOverBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Count Bull Crossed Under Bear ...
|
||||
int XTDCountBullCrossedUnderBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsBullCrossedUnderBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Last Signal Crossed Over Bear ...
|
||||
int XTDFindLastSignalCrossedOverBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsSignalCrossedOverBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Last Signal Crossed Onder Bear ...
|
||||
int XTDFindLastSignalCrossedUnderBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsSignalCrossedUnderBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Last Bull Crossed Over Bear ...
|
||||
int XTDFindLastBullCrossedOverBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsBullCrossedOverBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Last Bull Crossed Under Bear ...
|
||||
int XTDFindLastBullCrossedUnderBearIndex(
|
||||
int bar_index // Specified Bar Index
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
int count = ArraySize(xTDSignalBuffer) - 1;
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
count <= bar_index + 1)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Loop Through ...
|
||||
for (int i = bar_index + 1; i < count && result == -1; i++)
|
||||
{
|
||||
//
|
||||
// Check Cross On i Point ...
|
||||
bool isCrossedOnI = XTDIsBullCrossedUnderBear(i);
|
||||
if (isCrossedOnI)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END XTD Custom Functions ...
|
||||
//
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,82 @@
|
||||
///////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 XTEST Signal Provider Library Inputs
|
||||
// -----------------------------------------------------------
|
||||
//
|
||||
// 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
|
||||
|
||||
//
|
||||
input group "XTEST Provider";
|
||||
|
||||
//
|
||||
input group "XTEST Common";
|
||||
input bool xTESTEnableProvider = true; // Enable Provider
|
||||
input bool xTESTEnableAlerts = false; // Enable Events Alert
|
||||
input int xTESTNumberOfItemsPerTick = 110; // Number Of items Readed In Each Tick
|
||||
|
||||
//
|
||||
input group "XTEST Trader";
|
||||
input int xTESTMagicNumber = 16940567; // Trader MagicNumber
|
||||
input int xTESTSlippage = 10; // Trader Slippage
|
||||
|
||||
//
|
||||
input group "XTEST Trade Management";
|
||||
input bool xTESTAllowLongTrades = true; // Allow Long Trades
|
||||
input bool xTESTAllowShortTrades = true; // Allow Short Trades
|
||||
|
||||
//
|
||||
input group "XTEST Risk Management";
|
||||
//
|
||||
// Trade Count ...
|
||||
input int xTESTMaxAllowedTrades = 5; // Max Allowed Trades at Same Time
|
||||
input int xTESTMaxAllowedSupportTrades = 3; // Max Allowed Support Trades for Single Position
|
||||
//
|
||||
// Trades Age ...
|
||||
// 1 Day = 288
|
||||
// 14 Day = 4320
|
||||
input int xTESTMaxInDrawDownTradeAge = 0; // Max In DrawDown Trades Age
|
||||
//
|
||||
// Trade Volume ...
|
||||
input double xTESTStaticVolume = 0.3; // Static Volume
|
||||
input double xTESTVolumeMultiplier = 2; // Volume Multiplier
|
||||
input double xTESTMaxSupportedVolumePerTradeInLots = 2.4; // Max Supported Volume Per Trade in Lot
|
||||
//
|
||||
// Trade Profits ...
|
||||
input double xTESTMinRewardPerTradeInPips = 8; // Min Reward Per Trade In Pips
|
||||
input double xTESTRiskFreeTradesInPips = 3; // Make Trades Risk Free in Pips
|
||||
input int xTESTMinRewardPerSupportTradesInPips = 2; // Min Reward for Support Trade
|
||||
input int xTESTSupportTradesPriceDistanceInPips = 5; // Distance Price to Open Support Trade In Pips
|
||||
//
|
||||
// 1000000 Pips = 100$ in EURUSD ...
|
||||
input double xTESTMaxAllowedDrawDownPerTradesInPips = 0; // Max Allowed Drawdown Per Trade In Pips
|
||||
input double xTESTRiskFreeRate = 0.5; // Volume Multiplier for Risk Free
|
||||
//
|
||||
// Account ...
|
||||
input double xTESTFreeMarginFactorForOpenTrades = 0.8; // Minimum Free Marging for Open Trades
|
||||
input double xTESTBalanceFactorForOpenTrades = 0.5; // Minimum Balance for Open Trades
|
||||
|
||||
//
|
||||
// Validate Inputs before Initialization ...
|
||||
bool XTESTValidateInputs()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// TODO: Fix this ...
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,664 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 XTM Indicator Helper for Signal Providers
|
||||
// --------------------------------------------------------------------------
|
||||
//
|
||||
// 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 "..\Libraries\x-saherelm.log.lib.mq5"
|
||||
#include "..\Libraries\x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// START Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XTM Indicator States ...
|
||||
enum ENUM_X_XTM_STATES
|
||||
{
|
||||
X_XTM_BULLISH = 1,
|
||||
X_XTM_BEARISH = -1,
|
||||
X_XTM_NEUTURAL = 0,
|
||||
};
|
||||
|
||||
//
|
||||
// XTM Indicator Buffer Lines ...
|
||||
enum ENUM_X_XTM_BUFFER_LINES
|
||||
{
|
||||
X_XTM_MA_LINE = 0,
|
||||
X_XTM_MC_COLOR_LINE = 1,
|
||||
X_XTM_STATE_LINE = 2,
|
||||
};
|
||||
|
||||
//
|
||||
// END Enum Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Inputs ...
|
||||
//
|
||||
|
||||
input group "XTM Indicator";
|
||||
input int xTMMaPeriod = 14; // Period
|
||||
input int xTMMaShift = 0; // Shift
|
||||
input ENUM_MA_METHOD xTMMaMethod = MODE_EMA; // Method
|
||||
input ENUM_APPLIED_PRICE xTMMaAppliedTo = PRICE_WEIGHTED; // Applied To
|
||||
|
||||
//
|
||||
// END Inputs ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Definitions ...
|
||||
//
|
||||
|
||||
int xTMHandler = INVALID_HANDLE;
|
||||
double xTMMaBuffer[];
|
||||
double xTMStateBuffer[];
|
||||
|
||||
//
|
||||
// END Definitions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Handler Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Init Indicators ...
|
||||
bool XTMInitHandlers()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Initialize Indicator/Oscillator Handlers ...
|
||||
ResetLastError();
|
||||
|
||||
//
|
||||
// XTM Handler ...
|
||||
ArraySetAsSeries(xTMMaBuffer, true);
|
||||
ArraySetAsSeries(xTMStateBuffer, true);
|
||||
xTMHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.xtm.indicator",
|
||||
//
|
||||
// Inputs ...
|
||||
xTMMaPeriod,
|
||||
xTMMaShift,
|
||||
xTMMaMethod,
|
||||
xTMMaAppliedTo);
|
||||
if (xTMHandler == INVALID_HANDLE)
|
||||
{
|
||||
//
|
||||
LogMessage("failed to Initialize XTM Indicator: " + (string)GetLastError());
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// xTMOHandler ...
|
||||
// ArraySetAsSeries(xTMOBuffer, true);
|
||||
// xTMOHandler = iCustom(
|
||||
// _Symbol,
|
||||
// _Period,
|
||||
// "x-saherelm.xma.indicator",
|
||||
// //
|
||||
// // Inputs ...
|
||||
// xTMMaPeriod,
|
||||
// xTMMaShift,
|
||||
// MODE_SMA,
|
||||
// PRICE_OPEN);
|
||||
// if (xTMOHandler == INVALID_HANDLE)
|
||||
// {
|
||||
// //
|
||||
// LogMessage("failed to Initialize XMA Indicator: " + (string)GetLastError());
|
||||
// return result;
|
||||
// }
|
||||
|
||||
//
|
||||
result = true;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Release Indicators ...
|
||||
void XTMReleaseHandlers()
|
||||
{
|
||||
IndicatorRelease(xTMHandler);
|
||||
// IndicatorRelease(xTMOHandler);
|
||||
}
|
||||
|
||||
//
|
||||
// Handle Reading Buffers ...
|
||||
void XTMReadBuffers(
|
||||
int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
// Ma Buffer ...
|
||||
CopyBuffer(
|
||||
xTMHandler,
|
||||
X_XTM_MA_LINE,
|
||||
0,
|
||||
xTMItemsPerTick,
|
||||
xTMMaBuffer);
|
||||
|
||||
//
|
||||
// State Buffer ...
|
||||
CopyBuffer(
|
||||
xTMHandler,
|
||||
X_XTM_STATE_LINE,
|
||||
0,
|
||||
xTMItemsPerTick,
|
||||
xTMStateBuffer);
|
||||
|
||||
//
|
||||
// XTMO Buffer ...
|
||||
// CopyBuffer(
|
||||
// xTMOHandler,
|
||||
// 0,
|
||||
// 0,
|
||||
// xTMItemsPerTick,
|
||||
// xTMOBuffer);
|
||||
}
|
||||
|
||||
//
|
||||
// END Handler Funcions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// XTM Long Conditions ...
|
||||
bool XTMHasLongConditions(
|
||||
int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isVale = XTMIsVale();
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isVale
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// XTM Short Conditions ...
|
||||
bool XTMHasShortConditions(
|
||||
int xTMItemsPerTick // Number Of Reading Buffer Items Per Tick
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isPeak = XTMIsPeak();
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isPeak
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END Signal Related Conditions ...
|
||||
//
|
||||
|
||||
//
|
||||
// START XTM Custom Functions ...
|
||||
//
|
||||
|
||||
//
|
||||
// Find Peak based On this Indicator ...
|
||||
bool XTMIsPeak()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Must Decreasing ...
|
||||
bool isIncreasing = IsIncreasing(
|
||||
20,
|
||||
5,
|
||||
xTMMaBuffer);
|
||||
|
||||
//
|
||||
// Must Increasing ...
|
||||
bool isDecreasing = IsDecreasing(
|
||||
5,
|
||||
1,
|
||||
xTMMaBuffer);
|
||||
|
||||
//
|
||||
// Calculate Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find Vale based On this Indicator ...
|
||||
bool XTMIsVale()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Must Decreasing ...
|
||||
bool isIncreasing = IsIncreasing(
|
||||
5,
|
||||
1,
|
||||
xTMMaBuffer);
|
||||
|
||||
//
|
||||
// Must Increasing ...
|
||||
bool isDecreasing = IsDecreasing(
|
||||
20,
|
||||
5,
|
||||
xTMMaBuffer);
|
||||
|
||||
//
|
||||
// Calculate Result ...
|
||||
result =
|
||||
//
|
||||
isIncreasing
|
||||
//
|
||||
&&
|
||||
//
|
||||
isDecreasing
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Crossed Up ...
|
||||
bool XTMIsStartBullish(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_BULLISH &&
|
||||
xTMStateBuffer[bar_index + 1] != X_XTM_BULLISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Crossed Up After Neutural State ...
|
||||
bool XTMIsStartBullishAfterNeutural(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_BULLISH &&
|
||||
xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM In Up State ...
|
||||
bool XTMIsBullish(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_BULLISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Ends Up State ...
|
||||
bool XTMIsEndBullish(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] != X_XTM_BULLISH &&
|
||||
xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Ends Up State By Neutural ...
|
||||
bool XTMIsEndBullishByNeutural(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] == X_XTM_NEUTURAL &&
|
||||
xTMStateBuffer[bar_index + 1] == X_XTM_BULLISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Crossed Down ...
|
||||
bool XTMIsStartBearish(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_BEARISH &&
|
||||
xTMStateBuffer[bar_index + 1] != X_XTM_BEARISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Crossed Down After Neutural State ...
|
||||
bool XTMIsStartBearishAfterNeutural(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_BEARISH &&
|
||||
xTMStateBuffer[bar_index + 1] == X_XTM_NEUTURAL
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM In Down State ...
|
||||
bool XTMIsBearish(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_BEARISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Ends Down State ...
|
||||
bool XTMIsEndBearish(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] != X_XTM_BEARISH &&
|
||||
xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM Ends Down State By Neutural ...
|
||||
bool XTMIsEndBearishByNeutural(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 2))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] == X_XTM_NEUTURAL &&
|
||||
xTMStateBuffer[bar_index + 1] == X_XTM_BEARISH
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check TM In Neutural State ...
|
||||
bool XTMIsNeutural(
|
||||
int bar_index // Specified Index ...
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
bar_index <= 0 ||
|
||||
!XTMIsValidBuffersSize(bar_index + 1))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
xTMStateBuffer[bar_index] = X_XTM_NEUTURAL
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check all Buffers has valid Size ...
|
||||
bool XTMIsValidBuffersSize(
|
||||
int size // the size of buffers which min size for requirements
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
if (
|
||||
size <= 0 ||
|
||||
//
|
||||
ArraySize(xTMMaBuffer) < size ||
|
||||
ArraySize(xTMStateBuffer) < size
|
||||
//
|
||||
)
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// END XTM Custom Functions ...
|
||||
//
|
||||
Reference in New Issue
Block a user