513 lines
9.2 KiB
Plaintext
513 lines
9.2 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center XTest MQL5 Expert Advisor
|
|
// -------------------------------------------------
|
|
// Name: XSTRCCIEA
|
|
// Description: an Exper Advisor which used Panels
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://saherelm.ir"
|
|
#property version "1.00"
|
|
#property description "SaherElm XSTRCCIEA"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../Classes/x-saherelm.x-alert.class.mq5"
|
|
#include "../Classes/x-saherelm.x-trade.class.mq5"
|
|
#include "../XSTRCCI/Signals/xstrcci.signaller.class.mq5"
|
|
|
|
//
|
|
#define ShortName "XSTRCCIEA"
|
|
|
|
//
|
|
// Inputs ...
|
|
|
|
//
|
|
// Common ...
|
|
input group "Common";
|
|
input long eaMagicNumber = 78692110; // Magic Number
|
|
input int eaSlippage = 10; // Slippgae
|
|
input string eaLogSuffix = ""; // Log Suffix
|
|
|
|
//
|
|
// Alert ...
|
|
// Here we Provider All Requirements for
|
|
// Configuring Alert Provider ...
|
|
input group "Alert";
|
|
input bool eaEnableAlerts = true; // Enable Alerts
|
|
input bool eaLogAlerts = true; // Log Alerts
|
|
input bool eaMailAlerts = false; // Mail Alerts
|
|
input bool eaPushAlerts = false; // Push Alerts
|
|
input bool eaTerminalAlerts = false; // Terminal Alerts
|
|
|
|
//
|
|
// Time Report ...
|
|
input group "Reports";
|
|
input bool eaReportNewMonths = false; // Report New Month
|
|
input bool eaReportNewWeeks = false; // Report New Weeks
|
|
input bool eaReportNewDays = true; // Report New Days
|
|
input bool eaReportNewHours = false; // Report New Hours
|
|
|
|
//
|
|
// Variables, Instances ...
|
|
XCAlert *eaAlert;
|
|
XCTrade *eaTrade;
|
|
|
|
//
|
|
XSignal eaSignal;
|
|
XCXSTRCCISignaller *eaSignaller;
|
|
XSTRCCIStrategyConditions eaConditions;
|
|
|
|
//
|
|
int eaMaxAllowedPositions = 5;
|
|
double eaMaxAllowedSpread = 25;
|
|
double eaMaxAllowedDrawdownFactor = 0.3;
|
|
|
|
//
|
|
string eaTag = "";
|
|
|
|
//
|
|
// Event Handlers ...
|
|
|
|
//
|
|
// Initialization ...
|
|
int OnInit()
|
|
{
|
|
//
|
|
// Validate Inputs and Required Parameters
|
|
// for EA to Works fine ...
|
|
if (!ValidateInputs())
|
|
{
|
|
return INIT_PARAMETERS_INCORRECT;
|
|
}
|
|
|
|
//
|
|
// Initialize Timer ...
|
|
if (!InitTimer())
|
|
{
|
|
return INIT_FAILED;
|
|
}
|
|
|
|
//
|
|
// Initial Requirements ...
|
|
InitRequirements();
|
|
|
|
//
|
|
// Init Succeed ...
|
|
return INIT_SUCCEEDED;
|
|
}
|
|
|
|
//
|
|
// DeInitialization ...
|
|
void OnDeinit(const int reason)
|
|
{
|
|
//
|
|
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
|
|
// REASON_REMOVE 1 Program removed from a chart
|
|
// REASON_RECOMPILE 2 Program recompiled
|
|
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
|
|
// REASON_CHARTCLOSE 4 Chart closed
|
|
// REASON_PARAMETERS 5 Inputs changed by a user
|
|
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
|
|
// REASON_TEMPLATE 7 Another chart template applied
|
|
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
|
|
// REASON_CLOSE 9 Terminal closed
|
|
|
|
//
|
|
// Destroy Timer ...
|
|
}
|
|
|
|
//
|
|
// On Tick Handler ...
|
|
void OnTick()
|
|
{
|
|
//
|
|
int idx = -1;
|
|
int count = 0;
|
|
bool has = false;
|
|
|
|
//
|
|
eaSignal.Clean();
|
|
eaConditions.Clean();
|
|
|
|
//
|
|
double sl = 0;
|
|
double tp = 0;
|
|
double r2r = 5;
|
|
double risk = 0;
|
|
double entry = 0;
|
|
double reward = 0;
|
|
double volume = 0.01;
|
|
string provider = "XSTRCCI";
|
|
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
|
|
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
|
|
|
|
//
|
|
bool hasLong = false;
|
|
bool hasShort = false;
|
|
|
|
//
|
|
double selectedSL = 0;
|
|
|
|
//
|
|
// Start Calculations ...
|
|
|
|
//
|
|
// Retrieve Common Data ...
|
|
string symbol = eaSignaller.GetSymbol();
|
|
ENUM_TIMEFRAMES period = eaSignaller.GetPeriod();
|
|
|
|
//
|
|
datetime cTime = TimeCurrent();
|
|
|
|
//
|
|
// Required Value For SL/TP Calculations ...
|
|
double points = GetPoints(symbol);
|
|
double pip = GetPipPrice(symbol);
|
|
double pip2 = 2 * pip;
|
|
|
|
//
|
|
has = eaSignaller.DetectSignalSetup(
|
|
r2r,
|
|
300 // Max Allowed SL Distance ...
|
|
);
|
|
if (has)
|
|
{
|
|
//
|
|
count = eaSignaller
|
|
.AddConditionsIfNotExists();
|
|
|
|
//
|
|
eaSignaller.mConditions.Clean();
|
|
}
|
|
|
|
//
|
|
// Check Setuped Conditions Exists ...
|
|
count = ArraySize(eaSignaller.mConditionsCollection);
|
|
has = IsValidSize(count);
|
|
if (!has)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
//
|
|
has = eaSignaller
|
|
.DetectSignalTrigger(eaSignaller
|
|
.mConditionsCollection[i]);
|
|
|
|
//
|
|
if (has)
|
|
{
|
|
//
|
|
idx = i;
|
|
eaConditions = eaSignaller.mConditionsCollection[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
has = IsValidIndex(idx);
|
|
if (has)
|
|
{
|
|
//
|
|
ArrayRemove(
|
|
eaSignaller.mConditionsCollection,
|
|
idx,
|
|
1 //
|
|
);
|
|
}
|
|
|
|
//
|
|
// Check EA Conditions is Valid or not ...
|
|
has = eaConditions.IsSetuped() &&
|
|
eaConditions.CanTrigger();
|
|
if (!has)
|
|
{
|
|
//
|
|
eaConditions.Clean();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Checking Trigger Direction ...
|
|
hasLong = eaConditions.HasBullishSignal();
|
|
hasShort = eaConditions.HasBearishSignal();
|
|
has = hasLong ||
|
|
hasShort;
|
|
if (!has)
|
|
{
|
|
//
|
|
eaConditions.Clean();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Preparing Signal ...
|
|
//
|
|
eaSignal.sl = sl;
|
|
eaSignal.tp = tp;
|
|
eaSignal.type = type;
|
|
eaSignal.mode = mode;
|
|
eaSignal.entry = entry;
|
|
eaSignal.volume = volume;
|
|
eaSignal.symbol = symbol;
|
|
eaSignal.period = period;
|
|
eaSignal.provider = provider;
|
|
eaSignal.time = TimeCurrent();
|
|
|
|
//
|
|
Copy(
|
|
eaConditions.targets,
|
|
eaSignal.targets //
|
|
);
|
|
|
|
//
|
|
has = eaSignal.IsValid();
|
|
if (!has)
|
|
{
|
|
//
|
|
eaSignal.Clean();
|
|
eaConditions.Clean();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Draw Signal ...
|
|
|
|
//
|
|
// Execute Signal ...
|
|
|
|
//
|
|
Print("Execute Signal ...");
|
|
|
|
//
|
|
eaSignal.Clean();
|
|
eaConditions.Clean();
|
|
}
|
|
|
|
//
|
|
// Handle On Trade Event ...
|
|
void OnTrade()
|
|
{
|
|
}
|
|
|
|
//
|
|
// On Timer ...
|
|
void OnTimer()
|
|
{
|
|
}
|
|
|
|
//
|
|
// Chart Event Handler ...
|
|
void OnChartEvent(
|
|
const int id,
|
|
const long &lparam,
|
|
const double &dparam,
|
|
const string &sparam //
|
|
)
|
|
{
|
|
}
|
|
|
|
//
|
|
// Event Listeners ...
|
|
|
|
/**
|
|
* Handle StopLoss Triggered Positions ...
|
|
*
|
|
* @param deal: XDeal instance ...
|
|
*/
|
|
void OnStopLossTriggered(const XDeal &deal)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Take Profit Triggered Positions ...
|
|
*
|
|
* @param deal: XDeal instance ...
|
|
*/
|
|
void OnTakeProfitTriggered(const XDeal &deal)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Force Close a Position ...
|
|
*
|
|
* @param ticket: ULONG ...
|
|
* @param position: XPosition instance ...
|
|
* @param comment: String ...
|
|
*/
|
|
void OnPositionForceClosed(
|
|
const ulong ticket,
|
|
const XPosition &position,
|
|
const string comment //
|
|
)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Deals Changes ...
|
|
*
|
|
* @param count: Integer, Number of Changes ...
|
|
*/
|
|
void OnDealsChanged(int count)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Orders Changes ...
|
|
*
|
|
* @param count: Integer, Number of Changes ...
|
|
*/
|
|
void OnOrdersChanged(int count)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Handle Positions Changes ...
|
|
*
|
|
* @param count: Integer, Number of Changes ...
|
|
*/
|
|
void OnPositionsChanged(int count)
|
|
{
|
|
}
|
|
|
|
//
|
|
// Custom Functions ...
|
|
|
|
/**
|
|
* Validate all Inputs of Expert Adviser ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool ValidateInputs()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
string errMessage = "";
|
|
|
|
//
|
|
bool isCommonValid = (
|
|
//
|
|
eaSlippage > 0 &&
|
|
eaMagicNumber > 0
|
|
//
|
|
);
|
|
if (!isCommonValid)
|
|
{
|
|
//
|
|
errMessage += "common configurations error;" + "\n";
|
|
}
|
|
|
|
//
|
|
result =
|
|
//
|
|
// Common ...
|
|
isCommonValid &&
|
|
//
|
|
// Otere ...
|
|
true
|
|
//
|
|
;
|
|
|
|
//
|
|
if (!result)
|
|
{
|
|
//
|
|
// Since here Logger not Initiallized, we Use Raw Print Command ...
|
|
Print(ShortName + " Errors: \n", errMessage);
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Initialize Timer ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool InitTimer()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// TODO: Initialize Timer if necessary ...
|
|
// result = EventSetTimer(1);
|
|
// result = EventSetMillisecondTimer(100);
|
|
result = true;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Destroy Timer ...
|
|
*/
|
|
void DestroyTimer()
|
|
{
|
|
//
|
|
// TODO: Use This ...
|
|
// EventKillTimer();
|
|
}
|
|
|
|
/**
|
|
* Initial Requirements of EA ...
|
|
*
|
|
*/
|
|
void InitRequirements()
|
|
{
|
|
//
|
|
// Preparing Tags ...
|
|
eaTag =
|
|
(IsValid(eaLogSuffix)
|
|
? eaLogSuffix + "_"
|
|
: "") +
|
|
ShortName;
|
|
|
|
//
|
|
// EA Alert ...
|
|
eaAlert = new XCAlert(
|
|
eaTag,
|
|
eaEnableAlerts,
|
|
eaLogAlerts,
|
|
eaTerminalAlerts,
|
|
eaMailAlerts,
|
|
eaPushAlerts //
|
|
);
|
|
|
|
//
|
|
// EA Trade ...
|
|
eaTrade = new XCTrade(
|
|
eaSlippage,
|
|
eaMagicNumber,
|
|
eaMaxAllowedSpread,
|
|
eaMaxAllowedPositions,
|
|
eaMaxAllowedDrawdownFactor //
|
|
);
|
|
|
|
//
|
|
// EA Signaller ...
|
|
eaSignaller = new XCXSTRCCISignaller(
|
|
_Symbol,
|
|
_Period //
|
|
);
|
|
|
|
//
|
|
}
|
|
|
|
//
|