Add Template for X121SHDEA ...
This commit is contained in:
@@ -0,0 +1,832 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Expert Advisor
|
||||
// -------------------------------------------------
|
||||
// Name: X121SHDEABackTester
|
||||
// Description: Backtester Expert for X121SHD ...
|
||||
//
|
||||
// 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 icon "../Images/SaherElm_Logo_Color.ico"
|
||||
#property description "SaherElm X121SHD BackTester Expert Advisor"
|
||||
#property strict
|
||||
|
||||
//
|
||||
#define ShortName "X121SHDEABackTester"
|
||||
|
||||
//
|
||||
// Importts ...
|
||||
#include "../Classes/x-saherelm.x-backtester.expert.class.mq5"
|
||||
#include "../X121SHDEA/Classes/x-saherelm.x121.shd.signaller.class.mq5"
|
||||
|
||||
// #region Inputs ...
|
||||
// #region Commons ...
|
||||
input group "Common";
|
||||
input long eaMagicNumber = 78692110; // Magic Number
|
||||
input int eaSlippage = 10; // Slippgae
|
||||
input string eaLogSuffix = ""; // Log Suffix
|
||||
// #endregion
|
||||
|
||||
// #region Volume ...
|
||||
input group "Volume";
|
||||
input ENUM_X_VOLUME_SELECT_TYPE eaVolumeSelect = X_VOLUME_CONSTANT; // Volume Applying Type
|
||||
input double eaStaticVoluem = 0.0; // Static Volume
|
||||
input double eaDynamicVolumeStepBalance = 0.0; // Step of Balance for Increase Volume
|
||||
input double eaDynamicVolumeStepVolume = X_MIN_VOLUME; // Step of Volume Increasing
|
||||
input double eaConstantRiskBalance = 0.0; // Constant Risk Balance per Trade
|
||||
input double eaConstantPercent = 1; // Constant Percent of Balance Per Trade
|
||||
input double eaConstantBalance = 1000.0; // Constant Balance for Calculations
|
||||
// #endregion
|
||||
|
||||
// #region Alert ...
|
||||
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
|
||||
// #endregion
|
||||
|
||||
// #region Configurations ...
|
||||
input group "Configuration";
|
||||
input bool eaProcessAllTicks = false; // Process All Ticks
|
||||
input double eaSignallerR2R = 2.0; // Risk To Reward Ratio
|
||||
input double eaSignallerVolume = 0.01; // Default Volume
|
||||
input double eaSignallerRiskInPoint = 50; // Default Risk In Point
|
||||
// #endregion
|
||||
|
||||
// #region Bar Time ...
|
||||
input group "Bar Timer";
|
||||
input int barTimeFontSize = 10; // Font Size
|
||||
input string barTimeFont = "Arial"; // Font
|
||||
input color barTimeColor = clrYellow; // Text Color
|
||||
input ENUM_BASE_CORNER barTimeCorner = CORNER_RIGHT_LOWER; // Text Position
|
||||
input bool showBars = true; // Show Bars
|
||||
input bool showBarTime = true; // Show Bar Time
|
||||
// #endregion
|
||||
|
||||
// #region Indicator Inputs ...
|
||||
// #endregion
|
||||
// #endregion
|
||||
|
||||
// #region Local Variables ...
|
||||
//
|
||||
// Requirements ...
|
||||
string eaLogTag; // EA Log Prefix ...
|
||||
XCBackTesterEA *eaExpert; // EA Expert ...
|
||||
|
||||
//
|
||||
// Registered Signallers ...
|
||||
XCX121SHDStrategy1Signaller *signaller1; // XFIMA1 Signaller ...
|
||||
|
||||
//
|
||||
XBarTracker eaBarTracker; // EA Bar Traker ...
|
||||
|
||||
//
|
||||
// Registered Handlers ...
|
||||
int eaCTHandler = INVALID_HANDLE; // Candle Timer Handler ...
|
||||
int eaCCHandler = INVALID_HANDLE; // Candle Cleaner Handler ...
|
||||
|
||||
//
|
||||
bool eaIsNewBar; // Check New Bar ...
|
||||
|
||||
//
|
||||
ENUM_CHART_MODE eaBarMode = CHART_CANDLES;
|
||||
|
||||
//
|
||||
color eaBarUpColor = clrLime;
|
||||
color eaBarDownColor = clrRed;
|
||||
color eaBarLineColor = clrLime;
|
||||
color eaBarBearishColor = clrRed;
|
||||
color eaBarBullishColor = clrLime;
|
||||
color eaBarVolumesColor = clrGreen;
|
||||
// #endregion
|
||||
|
||||
// #region Event Handlers ...
|
||||
//
|
||||
// Initialization ...
|
||||
int OnInit()
|
||||
{
|
||||
//
|
||||
// Preparing Tags ...
|
||||
string eaTag =
|
||||
(IsValid(eaLogSuffix)
|
||||
? eaLogSuffix + "_"
|
||||
: "") +
|
||||
ShortName;
|
||||
|
||||
//
|
||||
// Validate Inputs and Required Parameters
|
||||
// for EA to Works fine ...
|
||||
if (!ValidateInputs())
|
||||
{
|
||||
return INIT_PARAMETERS_INCORRECT;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize Timer ...
|
||||
if (!InitTimer())
|
||||
{
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Configure EA Expert Class ...
|
||||
eaExpert = new XCBackTesterEA();
|
||||
|
||||
//
|
||||
// Symbol / Period ...
|
||||
eaExpert.symbol = _Symbol;
|
||||
eaExpert.period = _Period;
|
||||
|
||||
//
|
||||
// Common ...
|
||||
eaExpert.eaMagicNumber = eaMagicNumber;
|
||||
eaExpert.eaSlippage = eaSlippage;
|
||||
eaExpert.eaLogSuffix = eaTag;
|
||||
|
||||
//
|
||||
// Volume ...
|
||||
eaExpert.eaVolumeSelect = eaVolumeSelect;
|
||||
eaExpert.eaStaticVoluem = eaStaticVoluem;
|
||||
eaExpert.eaDynamicVolumeStepBalance = eaDynamicVolumeStepBalance;
|
||||
eaExpert.eaDynamicVolumeStepVolume = eaDynamicVolumeStepVolume;
|
||||
eaExpert.eaConstantRiskBalance = eaConstantRiskBalance;
|
||||
eaExpert.eaConstantPercent = eaConstantPercent;
|
||||
eaExpert.eaConstantBalance = eaConstantBalance;
|
||||
|
||||
//
|
||||
// Alert ...
|
||||
eaExpert.eaEnableAlerts = eaEnableAlerts;
|
||||
eaExpert.eaLogAlerts = eaLogAlerts;
|
||||
eaExpert.eaMailAlerts = eaMailAlerts;
|
||||
eaExpert.eaPushAlerts = eaPushAlerts;
|
||||
eaExpert.eaTerminalAlerts = eaTerminalAlerts;
|
||||
|
||||
//
|
||||
// Attach Event Handlers ...
|
||||
eaExpert.AddOnDealsChangedEventHandler(OnDealsChanged);
|
||||
eaExpert.AddOnStopLossEventHandler(OnStopLossTriggered);
|
||||
eaExpert.AddOnOrdersChangedEventHandler(OnOrdersChanged);
|
||||
eaExpert.AddOnSignalExecutedEventHandler(OnSignalExecuted);
|
||||
eaExpert.AddOnTakeProfitEventHandler(OnTakeProfitTriggered);
|
||||
eaExpert.AddOnModifyPositionEventHandler(OnPositionModified);
|
||||
eaExpert.AddOnPositionsChangedEventHandler(OnPositionsChanged);
|
||||
eaExpert.AddOnTradeStateChangedEventHandler(OnTradeStateChanged);
|
||||
eaExpert.AddOnForceClosePositionEventHandler(OnPositionForceClosed);
|
||||
eaExpert.AddOnPartialClosePositionEventHandler(OnPositionPartialClosed);
|
||||
|
||||
//
|
||||
// Configure Other Requirements ...
|
||||
eaExpert.allowedTPSLStep = 10;
|
||||
eaExpert.minAllowedRiskInPoint = 20;
|
||||
eaExpert.volume = eaSignallerVolume;
|
||||
eaExpert.riskToRewardRatio = eaSignallerR2R;
|
||||
eaExpert.riskInPoint = eaSignallerRiskInPoint;
|
||||
|
||||
//
|
||||
// Try to Initialize eaExpert ...
|
||||
bool isInited = eaExpert.HandleOnInit();
|
||||
if (!isInited)
|
||||
{
|
||||
//
|
||||
Print(ShortName, ": Initialization Failed ...");
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Here Instantiate Signaller Class ...
|
||||
|
||||
// //
|
||||
// // Preparing Indicator Inputs ...
|
||||
// X121XKIInputs kiInputs;
|
||||
|
||||
// //
|
||||
// // This is Default Configuration ...
|
||||
// kiInputs.Default();
|
||||
// kiInputs.Hide();
|
||||
|
||||
// //
|
||||
// // Here we Attach Inputs to Indicator ...
|
||||
// kiInputs.kiFastLength = kiFastLength;
|
||||
// kiInputs.kiSlowLength = kiSlowLength;
|
||||
// kiInputs.kiSuperSlowLength = kiSuperSlowLength;
|
||||
// kiInputs.maFastLength = maFastLength;
|
||||
// kiInputs.maSlowLength = maSlowLength;
|
||||
// kiInputs.maSuperSlowLength = maSuperSlowLength;
|
||||
// kiInputs.maMethod = maMethod;
|
||||
// kiInputs.maAppliedTo = maAppliedTo;
|
||||
// kiInputs.rsiLength = rsiLength;
|
||||
// kiInputs.rsiAppliedTo = rsiAppliedTo;
|
||||
// kiInputs.kiWaveSmoothingLength = kiWaveSmoothingLength;
|
||||
// kiInputs.kiWaveSmoothingMode = kiWaveSmoothingMode;
|
||||
// kiInputs.rsiMultiplier = rsiMultiplier;
|
||||
// kiInputs.atrLength = atrLength;
|
||||
// kiInputs.atrMultiplier = atrMultiplier;
|
||||
// kiInputs.atrSmoothingLength = atrSmoothingLength;
|
||||
// kiInputs.atrSmoothingMode = atrSmoothingMode;
|
||||
// kiInputs.atrUpperPriceType = atrUpperPriceType;
|
||||
// kiInputs.atrLowerPriceType = atrLowerPriceType;
|
||||
// kiInputs.showPV = showPV;
|
||||
// kiInputs.showKIFast = showKIFast;
|
||||
// kiInputs.showKISlow = showKISlow;
|
||||
// kiInputs.showKISuperSlow = showKISuperSlow;
|
||||
// kiInputs.showMaFast = showMaFast;
|
||||
// kiInputs.showMaSlow = showMaSlow;
|
||||
// kiInputs.showMaSuperSlow = showMaSuperSlow;
|
||||
// kiInputs.showKIWave = showKIWave;
|
||||
// kiInputs.showKIUpper = showKIUpper;
|
||||
// kiInputs.showKILower = showKILower;
|
||||
// kiInputs.startCalculationForLastBars = startCalculationForLastBars;
|
||||
|
||||
//
|
||||
// Instantiate Signaller ...
|
||||
|
||||
//
|
||||
// X121SHD1 Signaller ...
|
||||
signaller1 = new XCX121SHDStrategy1Signaller(
|
||||
_Symbol,
|
||||
_Period,
|
||||
eaProcessAllTicks, // Process All Ticks ...
|
||||
eaSignallerR2R, // Signaller Risk to Reward Ratio ...
|
||||
eaSignallerRiskInPoint, // Default Risk In Points ...
|
||||
eaSignallerVolume // Defaul Volume ...
|
||||
);
|
||||
|
||||
//
|
||||
// Configure Signaller ...
|
||||
signaller1.ignoreTargets = false;
|
||||
signaller1.slAdditionDistance = 30;
|
||||
signaller1.maxAllowedRiskDistance = 350;
|
||||
signaller1.AddOnSignalEventHandler(OnSignalTriggered);
|
||||
|
||||
//
|
||||
isInited =
|
||||
signaller1.IsValid();
|
||||
if (!isInited)
|
||||
{
|
||||
//
|
||||
Print(ShortName, ": Initialization Failed ...");
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize Candle Timer Handler ...
|
||||
eaCTHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.x121.xct",
|
||||
//
|
||||
// Inputs ...
|
||||
barTimeFontSize, // Font Size ...
|
||||
barTimeFont, // Font ...
|
||||
barTimeColor, // Text Color ...
|
||||
barTimeCorner, // Text Position ...
|
||||
//
|
||||
// Presentation ...
|
||||
"",
|
||||
showBarTime // Show Candle Time
|
||||
//
|
||||
);
|
||||
isInited = eaCTHandler != INVALID_HANDLE;
|
||||
if (!isInited)
|
||||
{
|
||||
//
|
||||
Print(ShortName, ": Initialization Failed ...");
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize Candle Cleaner Handler ...
|
||||
eaCCHandler = iCustom(
|
||||
_Symbol,
|
||||
_Period,
|
||||
"x-saherelm.x121.xcc",
|
||||
//
|
||||
// Inputs ...
|
||||
//
|
||||
// Chart Style ...
|
||||
"",
|
||||
eaBarMode, // Mode
|
||||
eaBarUpColor, // Up Color
|
||||
eaBarDownColor, // Down Color
|
||||
eaBarLineColor, // Line mode and Doji candlestick Color
|
||||
eaBarBullishColor, // Bearish Color
|
||||
eaBarBearishColor, // Bullish Color
|
||||
eaBarVolumesColor, // Volumes Color
|
||||
//
|
||||
// Presentation ...
|
||||
"",
|
||||
showBars // Show Candles
|
||||
//
|
||||
);
|
||||
isInited = eaCCHandler != INVALID_HANDLE;
|
||||
if (!isInited)
|
||||
{
|
||||
//
|
||||
Print(ShortName, ": Initialization Failed ...");
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize Bar Tracker ...
|
||||
isInited = eaBarTracker.Init(
|
||||
_Symbol,
|
||||
_Period //
|
||||
);
|
||||
if (!isInited)
|
||||
{
|
||||
//
|
||||
Print(ShortName, ": Initialization Failed ...");
|
||||
return INIT_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Configure XFIMA POI Detector / Drawer ...
|
||||
// detectorConfig.Default();
|
||||
// detectorConfig.FullDetect();
|
||||
// marketStructureDrawerConfig.FullDraw();
|
||||
|
||||
//
|
||||
// Ignoring Position Drawer ...
|
||||
delete eaExpert.eaPositionDrawer;
|
||||
ZeroMemory(eaExpert.eaPositionDrawer);
|
||||
eaExpert.eaPositionDrawer = NULL;
|
||||
|
||||
//
|
||||
Print(ShortName, ": Initialized Successfully ...");
|
||||
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 ...
|
||||
eaExpert.HandleOnDeInit();
|
||||
|
||||
//
|
||||
// De Init Indicator ...
|
||||
IndicatorRelease(eaCTHandler);
|
||||
|
||||
//
|
||||
eaBarTracker.Clean();
|
||||
|
||||
//
|
||||
delete signaller1;
|
||||
ZeroMemory(signaller1);
|
||||
|
||||
//
|
||||
delete eaExpert;
|
||||
ZeroMemory(eaExpert);
|
||||
}
|
||||
|
||||
//
|
||||
// On Tick Handler ...
|
||||
void OnTick()
|
||||
{
|
||||
//
|
||||
eaIsNewBar = eaBarTracker.IsNewBar();
|
||||
bool canProcess = eaProcessAllTicks
|
||||
? true
|
||||
: eaIsNewBar;
|
||||
//
|
||||
eaExpert.HandleOnTick();
|
||||
|
||||
//
|
||||
if (!canProcess)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Bar Index ...
|
||||
int barIndex = 0;
|
||||
|
||||
//
|
||||
// Signallers Calling OnTick ...
|
||||
signaller1.OnTick(barIndex);
|
||||
|
||||
//
|
||||
// Checking For Guard only When has Position ...
|
||||
XPosition positions[];
|
||||
int positionsCount = eaExpert.eaTrader.GetPositions(
|
||||
positions,
|
||||
signaller1.symbol,
|
||||
signaller1.name,
|
||||
signaller1.period,
|
||||
NULL, // All Types ...
|
||||
true, // Filter By Magic ...
|
||||
true // Force Clean ...
|
||||
);
|
||||
if (IsValidSize(positionsCount))
|
||||
{
|
||||
//
|
||||
XGuard guards[];
|
||||
int guardsCount = signaller1.CheckForGuard(
|
||||
guards,
|
||||
positions,
|
||||
barIndex //
|
||||
);
|
||||
if (IsValidSize(guardsCount))
|
||||
{
|
||||
//
|
||||
// Handling Guards ...
|
||||
eaExpert.eaGuard.DoGuards(guards);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Handle On Trade Event ...
|
||||
void OnTrade()
|
||||
{
|
||||
eaExpert.HandleOnTrade();
|
||||
}
|
||||
|
||||
//
|
||||
// On Timer ...
|
||||
void OnTimer()
|
||||
{
|
||||
eaExpert.HandleOnTimer();
|
||||
}
|
||||
|
||||
//
|
||||
// Chart Event Handler ...
|
||||
void OnChartEvent(
|
||||
const int id,
|
||||
const long &lparam,
|
||||
const double &dparam,
|
||||
const string &sparam //
|
||||
)
|
||||
{
|
||||
eaExpert.HandleOnChartEvent(id, lparam, dparam, sparam);
|
||||
}
|
||||
// #endregion
|
||||
|
||||
// #region Custom Event Handlers ...
|
||||
/**
|
||||
* Validate all Inputs of Expert Adviser ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool ValidateInputs()
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
string errMessage = "";
|
||||
|
||||
//
|
||||
bool isCommonValid = (
|
||||
//
|
||||
eaSlippage > 0 &&
|
||||
eaMagicNumber > 0
|
||||
//
|
||||
// Indicator Inputs ...
|
||||
//
|
||||
//
|
||||
);
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger OnSignal Event ...
|
||||
*
|
||||
* @param signal: XSignal
|
||||
*/
|
||||
void OnSignalTriggered(XSignal &signal)
|
||||
{
|
||||
// //
|
||||
// // Draw Signal on Chart ...
|
||||
// XCSignalObject *iSignalObj;
|
||||
// bool has = signaller1.poiDrawer.DrawSignal(
|
||||
// signal,
|
||||
// iSignalObj,
|
||||
// 7 //
|
||||
// );
|
||||
|
||||
//
|
||||
eaExpert.HandleOnSignalTriggered(signal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger OnSignal Executed Event ...
|
||||
*
|
||||
* @param signal: XSignal
|
||||
*/
|
||||
void OnSignalExecuted(XSignal &signal)
|
||||
{
|
||||
eaExpert.HandleOnSignalExecuted(signal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check For Guard ...
|
||||
*
|
||||
* @param guards: XGuard, reference Collection to holds result ...
|
||||
* @param positions: XPosition, refrence collection to Provides Positions ...
|
||||
* @param barIndex: int, Specified Bar index ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
int CheckForGuard(
|
||||
XGuard &guards[],
|
||||
XPosition &positions[],
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = signaller1.CheckForGuard(
|
||||
guards,
|
||||
positions,
|
||||
barIndex //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Trade Event Handlers ...
|
||||
|
||||
/**
|
||||
* Handle StopLoss Triggered Positions ...
|
||||
*
|
||||
* @param deal: XDeal instance ...
|
||||
*/
|
||||
void OnStopLossTriggered(const XDeal &deal)
|
||||
{
|
||||
//
|
||||
eaExpert.HandleOnStopLossTriggered(deal);
|
||||
|
||||
//
|
||||
HandleBalanceReport();
|
||||
HandleWinTrade(deal.positionId, deal.profit);
|
||||
HandleLoseTrade(deal.positionId, deal.profit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Take Profit Triggered Positions ...
|
||||
*
|
||||
* @param deal: XDeal instance ...
|
||||
*/
|
||||
void OnTakeProfitTriggered(const XDeal &deal)
|
||||
{
|
||||
//
|
||||
eaExpert.HandleOnTakeProfitTriggered(deal);
|
||||
|
||||
//
|
||||
HandleBalanceReport();
|
||||
HandleWinTrade(deal.positionId, deal.profit);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 //
|
||||
)
|
||||
{
|
||||
//
|
||||
eaExpert.HandleOnPositionForceClosed(
|
||||
ticket,
|
||||
position,
|
||||
comment //
|
||||
);
|
||||
|
||||
//
|
||||
HandleBalanceReport();
|
||||
HandleWinTrade(ticket, position.profit);
|
||||
HandleLoseTrade(ticket, position.profit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Deals Changes ...
|
||||
*
|
||||
* @param count: Integer, Number of Changes ...
|
||||
*/
|
||||
void OnDealsChanged(int count)
|
||||
{
|
||||
eaExpert.HandleOnDealsChanged(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Orders Changes ...
|
||||
*
|
||||
* @param count: Integer, Number of Changes ...
|
||||
*/
|
||||
void OnOrdersChanged(int count)
|
||||
{
|
||||
eaExpert.HandleOnOrdersChanged(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Positions Changes ...
|
||||
*
|
||||
* @param count: Integer, Number of Changes ...
|
||||
*/
|
||||
void OnPositionsChanged(int count)
|
||||
{
|
||||
eaExpert.HandleOnPositionsChanged(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Position Modified ...
|
||||
*
|
||||
* @param ticket: ulong, Position Ticket ...
|
||||
* @param profit: double, Position Profit ...
|
||||
* @param comment: string, Comment ...
|
||||
*/
|
||||
void OnPositionModified(
|
||||
const ulong ticket,
|
||||
const double profit,
|
||||
const string comment //
|
||||
)
|
||||
{
|
||||
//
|
||||
eaExpert.HandleOnPositionModified(
|
||||
ticket,
|
||||
profit,
|
||||
comment //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Position Partial Closed ...
|
||||
*
|
||||
* @param ticket: ulong, Position Ticket ...
|
||||
* @param profit: double, Position Profit ...
|
||||
* @param comment: string, Comment ...
|
||||
*/
|
||||
void OnPositionPartialClosed(
|
||||
const ulong ticket,
|
||||
const double profit,
|
||||
const string comment //
|
||||
)
|
||||
{
|
||||
//
|
||||
eaExpert.HandleOnPositionPartialClosed(
|
||||
ticket,
|
||||
profit,
|
||||
comment //
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Trade State Changed ...
|
||||
*
|
||||
* @param state: XOnTradeHandlerState instance ...
|
||||
*/
|
||||
void OnTradeStateChanged(const XOnTradeHandlerState &state)
|
||||
{
|
||||
eaExpert.HandleOnTradeStateChanged(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Resting Signals ...
|
||||
*
|
||||
* @param ticket: ulong, Position Ticket ...
|
||||
* @param profit: double, Position Profit ...
|
||||
*/
|
||||
void HandleLoseTrade(
|
||||
ulong ticket = 0,
|
||||
double profit = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
// Check Position Loose ...
|
||||
bool has = ticket > 0 &&
|
||||
profit < 0;
|
||||
if (!has)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: Here we Can Add Restrictions on Signaller based on our Requirements ...
|
||||
// restingSignals: Specified Number of Signals which must to Ignore ...
|
||||
// restUntil: Specified DateTime to Ignore all Signals before it Expiration ...
|
||||
// restingDelay: Specified Bars Delay to Ignore all Signals before it passed ...
|
||||
|
||||
//
|
||||
// Increase Resting Signals of Signallers ...
|
||||
signaller1.LoseTrade();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Win Trade ...
|
||||
*
|
||||
* @param ticket: ulong, Position Ticket ...
|
||||
* @param profit: double, Position Profit ...
|
||||
*/
|
||||
void HandleWinTrade(
|
||||
ulong ticket = 0,
|
||||
double profit = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool has = ticket > 0 &&
|
||||
profit > 0;
|
||||
if (!has)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
signaller1.WinTrade();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle Balance Report ...
|
||||
*/
|
||||
void HandleBalanceReport()
|
||||
{
|
||||
//
|
||||
string message = eaExpert.eaTrader.mAccount.GetBalanceReportMessage();
|
||||
eaExpert.eaAlert.SendAlert(message);
|
||||
}
|
||||
// #endregion
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,40 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class
|
||||
// -------------------------------------------------
|
||||
// Name: XCX121SHDPoiDetector ...
|
||||
// Description: X121SHD POI Detector Class ...
|
||||
//
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
//
|
||||
// Global Properties ...
|
||||
#property library
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm X121SHD POI Detector Class"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Classes/x-saherelm.base.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-bar.analyser.class.mq5"
|
||||
#include "../../Classes/x-saherelm.x-market.pattern.class.mq5"
|
||||
|
||||
//
|
||||
// Definitions ...
|
||||
|
||||
//
|
||||
// Implementation ...
|
||||
class XCX121SHDPOIDetector : public XCMarketPatternDetector
|
||||
{
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
@@ -0,0 +1,35 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Class
|
||||
// -------------------------------------------------
|
||||
// Name: XCX121SHDPoiDrawer ...
|
||||
// Description: X121SHD POI Drawer Class ...
|
||||
//
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
//
|
||||
// Global Properties ...
|
||||
#property library
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm X121SHD POI Drawer Class"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
|
||||
|
||||
//
|
||||
// Implementation ...
|
||||
class XCX121SHDPOIDrawer : public XCPOIDrawer
|
||||
{
|
||||
|
||||
//
|
||||
};
|
||||
|
||||
//
|
||||
@@ -0,0 +1,135 @@
|
||||
///////////////////////////////////////////////////////
|
||||
//
|
||||
// SaherElm IT Center MQL5 Library
|
||||
// -------------------------------------------------
|
||||
// Name: XCX121SHDLib ...
|
||||
// Description: X121SHD Library ...
|
||||
//
|
||||
//
|
||||
// Maintainer:
|
||||
// ------------
|
||||
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||
//
|
||||
//////////////////////////////////////////////////////
|
||||
//
|
||||
// Global Properties ...
|
||||
#property library
|
||||
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||
#property link "https://saherelm.ir"
|
||||
#property version "1.00"
|
||||
#property description "SaherElm X121SHD Library"
|
||||
#property strict
|
||||
|
||||
//
|
||||
// Imports ...
|
||||
#include "../../Libraries/x-saherelm.common.lib.mq5"
|
||||
|
||||
//
|
||||
// Enums ...
|
||||
|
||||
// #region SHDStrategies ...
|
||||
enum X121SHDStrategies
|
||||
{
|
||||
X121_SHD_STRATEGY_UNKNOWN = 0,
|
||||
X121_SHD_STRATEGY_1 = 1,
|
||||
X121_SHD_STRATEGY_2 = 2,
|
||||
X121_SHD_STRATEGY_3 = 3,
|
||||
X121_SHD_STRATEGY_4 = 4,
|
||||
X121_SHD_STRATEGY_5 = 5,
|
||||
X121_SHD_STRATEGY_6 = 6,
|
||||
X121_SHD_STRATEGY_7 = 7,
|
||||
};
|
||||
bool IsXValid(X121SHDStrategies value)
|
||||
{
|
||||
return value != X121_SHD_STRATEGY_UNKNOWN;
|
||||
}
|
||||
string ToXString(X121SHDStrategies value)
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (IsXValid(value))
|
||||
{
|
||||
//
|
||||
switch (value)
|
||||
{
|
||||
//
|
||||
case X121_SHD_STRATEGY_1:
|
||||
result = "1";
|
||||
break;
|
||||
//
|
||||
case X121_SHD_STRATEGY_2:
|
||||
result = "2";
|
||||
break;
|
||||
//
|
||||
case X121_SHD_STRATEGY_3:
|
||||
result = "3";
|
||||
break;
|
||||
//
|
||||
case X121_SHD_STRATEGY_4:
|
||||
result = "4";
|
||||
break;
|
||||
//
|
||||
case X121_SHD_STRATEGY_5:
|
||||
result = "5";
|
||||
break;
|
||||
//
|
||||
case X121_SHD_STRATEGY_6:
|
||||
result = "6";
|
||||
break;
|
||||
//
|
||||
case X121_SHD_STRATEGY_7:
|
||||
result = "7";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
X121SHDStrategies ToX121SHDStrategy(string value)
|
||||
{
|
||||
//
|
||||
X121SHDStrategies result = X121_SHD_STRATEGY_UNKNOWN;
|
||||
|
||||
//
|
||||
if (IsXValid(value))
|
||||
{
|
||||
//
|
||||
if (value == ToXString(X121_SHD_STRATEGY_1))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_1;
|
||||
}
|
||||
else if (value == ToXString(X121_SHD_STRATEGY_2))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_2;
|
||||
}
|
||||
else if (value == ToXString(X121_SHD_STRATEGY_3))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_3;
|
||||
}
|
||||
else if (value == ToXString(X121_SHD_STRATEGY_4))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_4;
|
||||
}
|
||||
else if (value == ToXString(X121_SHD_STRATEGY_5))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_5;
|
||||
}
|
||||
else if (value == ToXString(X121_SHD_STRATEGY_6))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_6;
|
||||
}
|
||||
else if (value == ToXString(X121_SHD_STRATEGY_7))
|
||||
{
|
||||
result = X121_SHD_STRATEGY_7;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
// #endregion
|
||||
|
||||
//
|
||||
Reference in New Issue
Block a user