Files
MQL5Data/XCATBEA/Classes/xcatbea.expert.class.mq5
T

3376 lines
106 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class
// -------------------------------------------------
// Name: XCXCATBEAExpert ...
// Description: XCATB Expert 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 XCATB Expert Class"
#property strict
//
// Imports ...
#include "../../Classes/x-saherelm.x-guard.class.mq5"
#include "../../Classes/x-saherelm.x-trade.class.mq5"
#include "../../Classes/x-saherelm.x-volume.class.mq5"
#include "../Classes/xcatbea.signaller.class.mq5"
#include "../Classes/xcatbea.x-trade.manager.class.mq5"
//
// Definitions ...
#define XCATBEA_INPUTS_PREFIX "X121XCATBEA"
//
// Implementation ...
//
class XCXCATBEASignallerInputParser : public XCBase
{
//
// Public ...
public:
//
//
// Constructor(s) ...
XCXCATBEASignallerInputParser(
XCAlert *_alert //
)
{
//
alert = _alert;
//
// Instantiate Data Collector ...
collector = new XCDataCollector();
//
// Generate Path and Attached to Data Collector ...
// string mPath = alert.GetPrefix();
collector.Path("");
}
//
// Deconstructor ...
~XCXCATBEASignallerInputParser()
{
//
delete collector;
ZeroMemory(collector);
}
//
// Tools and Actions ...
/**
* Retrieve Specified Symbol / Period Signaller Inputs ...
*
* @param symbol: string, Specified Signaller Symbol ...
* @param period: ENUM_TIMEFRAMES member, Specified Signaller Period ...
*
* @return ( bool )
*/
string GetFileName(
string symbol,
ENUM_TIMEFRAMES period //
)
{
//
string result = NULL;
//
// Validate Args ...
if (!IsValid(symbol) ||
!IsValid(period))
{
return result;
}
//
result = XCATBEA_INPUTS_PREFIX + "_" + symbol + "_" + ToXString(period);
result = collector.GetFilePath(result);
//
return result;
}
/**
* Check Specified Symbol / Period Signaller Inputs File Exists ...
*
* @param symbol: string, Specified Signaller Symbol ...
* @param period: ENUM_TIMEFRAMES member, Specified Signaller Period ...
*
* @return ( bool )
*/
bool IsSignallerInputsFileExists(
string symbol,
ENUM_TIMEFRAMES period //
)
{
//
bool result = false;
//
string fileName = GetFileName(
symbol,
period //
);
result = IsValid(fileName);
if (!result)
{
return result;
}
//
result = collector.IsExists(fileName);
if (!result)
{
return result;
}
//
return result;
}
/**
* Parse Specified Symbol / Period Signaller Inputs file ...
*
* @param inputs: XCATBEASignallerInputs instance reference, To Fill Loaded Configs ...
* @param symbol: string, Specified Signaller Symbol ...
* @param period: ENUM_TIMEFRAMES member, Specified Signaller Period ...
*
* @return ( bool )
*/
bool ParseSignallerInputs(
XCATBEASignallerInputs &inputs,
string symbol,
ENUM_TIMEFRAMES period //
)
{
//
bool result = false;
//
// Validate Args ...
result =
IsValid(symbol) &&
IsValid(period);
if (!result)
{
return result;
}
//
inputs.symbol = symbol;
inputs.period = period;
//
// Prepare File Name and Check File Exists ...
string fileName = GetFileName(symbol, period);
result = collector.IsExists(fileName);
if (!result)
{
return result;
}
//
// Read Content ...
string content[];
result = collector.Read(fileName, content);
if (!result)
{
return result;
}
//
// Try to Parse Content ...
result = HasChild(content);
if (result)
{
//
int count = ArraySize(content);
for (int i = 0; i < count; i++)
{
//
string iLine = content[i];
//
Parse(iLine, inputs);
}
}
//
return result;
}
//
// Protected ...
protected:
//
//
// Private ...
private:
//
// Props ...
XCAlert *alert;
XCDataCollector *collector;
/**
* Parse Condition and Attached to related Properties if Exists ...
*/
void Parse(
string line,
XCATBEASignallerInputs &inputs //
)
{
//
string parts[];
bool has = false;
int partsCount = 0;
//
// Validations ...
//
// eaForceHasSwing ...
has = Contains(
"eaForceHasSwing",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.forceHasSwing = has;
}
}
}
//
// eaForceOBBarType ...
has = Contains(
"eaForceOBBarType",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.forceOBBarType = has;
}
}
}
//
// eaForceFVGBarType ...
has = Contains(
"eaForceFVGBarType",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.forceFVGBarType = has;
}
}
}
//
// eaForceHasFLiquidity ...
has = Contains(
"eaForceHasFLiquidity",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.forceHasFLiquidity = has;
}
}
}
//
// eaForceHasRLiquidity ...
has = Contains(
"eaForceHasRLiquidity",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.forceHasRLiquidity = has;
}
}
}
//
// eaValidateGapSequence ...
has = Contains(
"eaValidateGapSequence",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.validateGapSequence = has;
}
}
}
//
// eaValidateBlockEdgeBreakout ...
has = Contains(
"eaValidateBlockEdgeBreakout",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.validations.validateBlockEdgeBreakout = has;
}
}
}
//
// Filters ...
//
// eaFilterBasedOnKI ...
has = Contains(
"eaFilterBasedOnKI",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnKI = has;
}
}
}
//
// eaFilterBasedOnPV ...
has = Contains(
"eaFilterBasedOnPV",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnPV = has;
}
}
}
//
// eaFilterBasedOnSar ...
has = Contains(
"eaFilterBasedOnSar",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnSar = has;
}
}
}
//
// eaForceSarSwitched ...
has = Contains(
"eaForceSarSwitched",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceSarSwitched = has;
}
}
}
//
// eaForceSarOnBothSide ...
has = Contains(
"eaForceSarOnBothSide",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceSarOnBothSide = has;
}
}
}
//
// eaForceSarHasBreakout ...
has = Contains(
"eaForceSarHasBreakout",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceSarHasBreakout = has;
}
}
}
//
// eaForceSarHasReversalSide ...
has = Contains(
"eaForceSarHasReversalSide",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceSarHasReversalSide = has;
}
}
}
//
// eaFilterBasedOnRSI ...
has = Contains(
"eaFilterBasedOnRSI",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnRSI = has;
}
}
}
//
// eaForceHasRSITrending ...
has = Contains(
"eaForceHasRSITrending",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasRSITrending = has;
}
}
}
//
// eaForceHasRSIVPattern ...
has = Contains(
"eaForceHasRSIVPattern",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasRSIVPattern = has;
}
}
}
//
// eaForceHasRSICrossing ...
has = Contains(
"eaForceHasRSICrossing",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasRSICrossing = has;
}
}
}
//
// eaFilterBasedOnADX ...
has = Contains(
"eaFilterBasedOnADX",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnADX = has;
}
}
}
//
// eaForceHasADXTrending ...
has = Contains(
"eaForceHasADXTrending",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasADXTrending = has;
}
}
}
//
// eaForceHasADXCrossing ...
has = Contains(
"eaForceHasADXCrossing",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasADXCrossing = has;
}
}
}
//
// eaFilterBasedOnATR ...
has = Contains(
"eaFilterBasedOnATR",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnATR = has;
}
}
}
//
// eaForceHasATRTrending ...
has = Contains(
"eaForceHasATRTrending",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasATRTrending = has;
}
}
}
//
// eaForceHasATRBreakout ...
has = Contains(
"eaForceHasATRBreakout",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasATRBreakout = has;
}
}
}
//
// eaFilterBasedOnTrend ...
has = Contains(
"eaFilterBasedOnTrend",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnTrend = has;
}
}
}
//
// eaForceHasTrendDir ...
has = Contains(
"eaForceHasTrendDir",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendDir = has;
}
}
}
//
// eaForceHasTrendPlace ...
has = Contains(
"eaForceHasTrendPlace",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendPlace = has;
}
}
}
//
// eaForceHasTrendChange ...
has = Contains(
"eaForceHasTrendChange",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendChange = has;
}
}
}
//
// eaForceHasTrendTrending ...
has = Contains(
"eaForceHasTrendTrending",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendTrending = has;
}
}
}
//
// eaForceHasTrendRejection ...
has = Contains(
"eaForceHasTrendRejection",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendRejection = has;
}
}
}
//
// eaForceHasTrendLineInside ...
has = Contains(
"eaForceHasTrendLineInside",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendLineInside = has;
}
}
}
//
// eaForceHasTrendDirOnBothSide ...
has = Contains(
"eaForceHasTrendDirOnBothSide",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.forceHasTrendDirOnBothSide = has;
}
}
}
//
// eaFilterBasedOnDelta ...
has = Contains(
"eaFilterBasedOnDelta",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnDelta = has;
}
}
}
//
// eaFilterBasedOnVolume ...
has = Contains(
"eaFilterBasedOnVolume",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnVolume = has;
}
}
}
//
// eaFilterBasedOnSignalBar ...
has = Contains(
"eaFilterBasedOnSignalBar",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnSignalBar = has;
}
}
}
//
// eaFilterBasedOnHKSignalBar ...
has = Contains(
"eaFilterBasedOnHKSignalBar",
line,
false //
);
if (has)
{
//
// Split Content ...
partsCount = SplitContent(
parts,
line,
":" //
);
has = partsCount == 2;
if (has)
{
//
has = ToBoolean(parts[1]);
if (has)
{
inputs.filters.filterBasedOnHKSignalBar = has;
}
}
}
//
}
//
};
//
class XCXCATBEAExpert : public XCBase
{
//
// public ...
public:
//
// Props ...
//
// Common ...
long eaMagicNumber; // Magic Number
int eaSlippage; // Slippgae
string eaLogSuffix; // Log Suffix
//
// Detector ...
//
// Validating ...
bool eaForceHasSwing; // Force Block to Has Propper Swing
bool eaForceOBBarType; // Force Order Block to Has InDirectional Bars
int eaMinRequiredOBBar; // Min Required OB Bar
bool eaForceFVGBarType; // Force Fair Value Gaps Bars Type
int eaLiquidityLoopback; // Liquidity Detection Loopback
double eaMaxAllowedRange; // Max Allowed Order Block Range
double eaMinAllowedRange; // Min Allowed Order Block Range
bool eaForceHasFLiquidity; // Force Order Block To Has Reversal Liquidity
bool eaForceHasRLiquidity; // Force Order Block to Has Following Liquidity
bool eaValidateGapSequence; // Validate Fair Value Gaps Bar Sequences
int eaMinAllowedBlockLength; // Min Allowed Block Length
bool eaValidateBlockEdgeBreakout; // Validate Order Block Edge Breakeout
//
// Filtering ...
bool eaFilterBasedOnKI; // Filter Based On KI Flats
bool eaFilterBasedOnPV; // Filter Based On PV
int eaBosLoopback; // PV Based Filtering BOS Lookup
bool eaFilterBasedOnSar; // Filter Based On SAR
bool eaForceSarSwitched; // SAR Switched on Sides for Filtering
bool eaForceSarOnBothSide; // SAR Check on Both Sides for Filtering
bool eaForceSarHasBreakout; // SAR Must Breakout
bool eaForceSarHasReversalSide; // SAR Must Has Reversal Direction
bool eaFilterBasedOnRSI; // Filter Based On RSI
bool eaForceHasRSITrending; // RSI Must Has Trending
bool eaForceHasRSIVPattern; // RSI Must Has Pattern
bool eaForceHasRSICrossing; // RSI Must Has Crossing Levels
bool eaFilterBasedOnADX; // Filter Based On ADX
bool eaForceHasADXTrending; // ADX Must Has Trending
bool eaForceHasADXCrossing; // ADX Must Has Crossing +DI/-DI
bool eaFilterBasedOnATR; // Filter Based On ATR
bool eaForceHasATRTrending; // ATR Must Has Trending
bool eaForceHasATRBreakout; // ATR Must Has Breakout
bool eaFilterBasedOnTrend; // Filter Based On Trend
bool eaForceHasTrendDir; // TREND Must Has Following Direction
bool eaForceHasTrendPlace; // TREND Place Based Filtering
bool eaForceHasTrendChange; // TREND Change Filtering
bool eaForceHasTrendTrending; // TREND Must Has Trending
bool eaForceHasTrendRejection; // TREND Line Must Rejected
bool eaForceHasTrendLineInside; // TREND Line has Inside
bool eaForceHasTrendDirOnBothSide; // TREND Must Has Following Direction in Both Side
bool eaFilterBasedOnDelta; // Filter Based On Delta
bool eaFilterBasedOnVolume; // Filter Based On Volume
bool eaFilterBasedOnSignalBar; // Filter Based on Signal Bar
bool eaFilterBasedOnHKSignalBar; // Filter Based On HK Signal Bar
//
// Signal ...
int eaSignalR2R; // Risk Reward Ratio
double eaSLATRMultiplier; // ATR Multiplier for SL
bool eaAllowSignallingBasedOnConditions; // Signalling Based on Market Conditions
bool eaAllowSignallingBasedOnTriggerBlocks; // Signalling Based on Trigger Blocks
bool eaAllowSignallingBasedOnTriggerBlocksInsideOther; // Signalling Based on Trigger Blocks Seccond inputs
bool eaSecondsTriggersSLUsingFirstTriggerBlock; // Use First Trigger Block for SL of Seconds Trigger Block Signalss
bool eaApplyValidateAndFilterOnSelectInsideOthers; // Select Trigger Blocks by Applying Validations and Filterss
bool eaAllowSignallingConditions1; // Allow Market Conditions Signaller to Using Sar Starter Signals
bool eaAllowSignallingConditions2; // Allow Market Conditions Signaller to Using Trend Starter Signals
bool eaAllowSignallingConditions3; // Allow Market Conditions Signaller to Using Delta Starter Signals
bool eaAllowSignallingConditions4; // Allow Market Conditions Signaller to Using Volume Starter Signals
bool eaAllowSignallingConditions5; // Allow Market Conditions Signaller to Using Signal Bar Starter Signals
bool eaAllowSignallingConditions6; // Allow Market Conditions Signaller to Using HK Signal Bar Starter Signals
//
// Volume ...
ENUM_X_VOLUME_SELECT_TYPE eaVolumeSelect; // Volume Applying Type
double eaStaticVoluem; // Static Volume
double eaDynamicVolumeStepBalance; // Step of Balance for Increase Volume
double eaDynamicVolumeStepVolume; // Step of Volume Increasing
double eaConstantRiskBalance; // Constant Risk Balance per Trade
double eaConstantPercent; // Constant Percent of Balance Per Trade
double eaConstantBalance; // Constant Balance for Calculations
//
// Management ...
string eaSymbols; // Allowed Trading Symbols
bool eaAllowGuards; // Allow Guards
bool eaAllowTrade; // Allow Trade on Signals
bool eaAllowLongs; // Allow Long Trades
bool eaAllowShorts; // Allow Short Trades
string eaSessions; // Active Sessions
ENUM_XCATBEA_TRADE_RESTRICTION_PERIOD eaRestrictionsPeriod; // Restrictions Period
int eaMaxAllowedTPs; // Max Allowed TP(s) in Restrictions Period
int eaMaxAllowedSLs; // Max Allowed SL(s) in Restrictions Period
int eaMaxAllowedTrades; // Max Allowed Trades in Restrictions Period
int eaMaxAllowedPositions; // Max Allowed Same Time Trades
double eaMaxAllowedSpread; // Max Allowed Spread For Trade
double eaMaxAllowedDrawdownFactor; // Max Allowed DrawDown for Trade
string eaCloseAllOpenTradesAt; // Close All Open Trades per Day At Specified Time
//
// Alert ...
bool eaEnableAlerts; // Enable Alerts
bool eaSaveAlerts; // Save Alerts
bool eaLogAlerts; // Log Alerts
bool eaMailAlerts; // Mail Alerts
bool eaPushAlerts; // Push Alerts
bool eaTerminalAlerts; // Terminal Alerts
//
// Time Report ...
bool eaReportNewMonths; // Report New Month
bool eaReportNewWeeks; // Report New Weeks
bool eaReportNewDays; // Report New Days
bool eaReportNewHours; // Report New Hours
bool eaReportTrades; // Report Trades
bool eaReportSignals; // Report Signals
bool eaReportProtector; // Report Protector Actions
bool eaReportRestrictions; // Report Restrictions
bool eaReportAfterTradesBalance; // Report Balance after a Trade Finished
//
// Collector ...
bool eaSaveTrades; // Save Trades
bool eaSaveSignals; // Save Signals
bool eaSaveWins; // Save Winning Conditions
bool eaSaveLosts; // Save Lost Conditions
bool eaSaveRestrictions; // Save Restriction Reports
//
// Requirements ...
//
XCAlert *eaAlert; // EA Scope Alert Handler ...
XCTrade *eaTrade; // EA Scope Trade Handler ...
XCGuard *eaGuard; // EA Scope Guard Handler ...
XCVolume *eaVolume; // EA Scope Voluem Handler ...
XTimeTracker eaTimeTracker; // EA Scope Time Tracker ...
XCDataCollector *eaCollector; // EA Scope Data Collector ...
XCXCATBEASignaller *eaSignallers[]; // EA Signallers Collection ...
XCXCATBEATradeManager *eaTradeManager; // EA Scope Trade Manager ...
XCXCATBEASignallerInputParser *eaSignallerInputParser; // EA Scope Signaller Input Parser ...
//
// Tools / Actions / Handlers ...
//
// Trade Event Handlers ...
//
void AddOnStopLossEventHandler(TOnStopLoss handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mStopLossEventHandlers
//
);
}
//
void AddOnTakeProfitEventHandler(TOnTakeProfit handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mTakeProfitEventHandlers
//
);
}
//
void AddOnDealsChangedEventHandler(TOnDealsChanged handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mDealsChangedEventHandlers
//
);
}
//
void AddOnOrdersChangedEventHandler(TOnOrdersChanged handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mOrdersChangedEventHandlers
//
);
}
//
void AddOnModifyPositionEventHandler(TOnModify handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mOnModifyEventHandlers
//
);
}
//
void AddOnPositionsChangedEventHandler(TOnPositionsChanged handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mPositionsChangedEventHandlers
//
);
}
//
void AddOnTradeStateChangedEventHandler(TOnTradeStateChanged handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mTradeStateChangedEventHandlers
//
);
}
//
void AddOnForceClosePositionEventHandler(TOnForceClose handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mOnForceCloseEventHandlers
//
);
}
//
void AddOnPartialClosePositionEventHandler(TOnPartialClose handler)
{
//
if (handler == NULL)
{
return;
}
//
Add(
handler,
mOnPartialCloseEventHandlers
//
);
}
//
// Validators ...
/**
* Validate Inputs ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result = false;
//
// Implement all Inputs Validation ...
result = eaMagicNumber > 0 &&
eaSignalR2R > 0;
//
return result;
}
//
// Expert Advisor Event Handlers ...
/**
* Handle Initialization of Expert ...
*
* @return ( bool )
*/
bool HandleOnInit()
{
//
bool result = false;
//
// Validate Inputs ...
result = ValidateInputs();
if (!result)
{
return result;
}
//
bool has = false;
int count = -1;
//
// Initialize Alert Handler ...
eaAlert = new XCAlert();
eaAlert.SetPrefix(eaLogSuffix);
eaAlert.SetLogAlerts(eaLogAlerts);
eaAlert.SetMailAlerts(eaMailAlerts);
eaAlert.SetPushAlerts(eaPushAlerts);
eaAlert.SetSaveAlerts(eaSaveAlerts);
eaAlert.SetEnableAlerts(eaEnableAlerts);
eaAlert.SetTerminalAlerts(eaTerminalAlerts);
//
// Initialize Volume Manager ...
eaVolume = new XCVolume();
result = eaVolume.Init(
eaVolumeSelect,
eaStaticVoluem,
eaDynamicVolumeStepBalance,
eaDynamicVolumeStepVolume,
eaConstantRiskBalance,
eaConstantPercent,
eaConstantBalance //
);
if (!result)
{
return result;
}
//
// Initialize Trader ...
eaTrade = new XCTrade(
eaSlippage,
eaMagicNumber,
eaMaxAllowedSpread,
eaMaxAllowedPositions,
eaMaxAllowedDrawdownFactor //
);
//
// Trade Handler Attachments ...
//
// Position Modifiy Event Handlers ...
count = ArraySize(mOnModifyEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnModifyPositionEventHandler(mOnModifyEventHandlers[i]);
}
}
//
// Position Stop Loss Event Handlers ...
if (has)
{
//
count = ArraySize(mStopLossEventHandlers);
has = IsValidSize(count);
for (int i = 0; i < count; i++)
{
eaTrade.AddOnStopLossEventHandler(mStopLossEventHandlers[i]);
}
}
//
// Position Take Profit Event Handlers ...
count = ArraySize(mTakeProfitEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnTakeProfitEventHandler(mTakeProfitEventHandlers[i]);
}
}
//
// Position Force Close Event Handlers ...
count = ArraySize(mOnForceCloseEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnForceClosePositionEventHandler(mOnForceCloseEventHandlers[i]);
}
}
//
// Deals Changed Event Handlers ...
count = ArraySize(mDealsChangedEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnDealsChangedEventHandler(mDealsChangedEventHandlers[i]);
}
}
//
// Orders Changed Event Handlers ...
count = ArraySize(mOrdersChangedEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnOrdersChangedEventHandler(mOrdersChangedEventHandlers[i]);
}
}
//
// Positions Changed Event Handlers ...
count = ArraySize(mPositionsChangedEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnPositionsChangedEventHandler(mPositionsChangedEventHandlers[i]);
}
}
//
// Trade Changed Event Handlers ...
count = ArraySize(mTradeStateChangedEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnTradeStateChangedEventHandler(mTradeStateChangedEventHandlers[i]);
}
}
//
// Postion Partially Close Event Handlers ...
count = ArraySize(mOnPartialCloseEventHandlers);
has = IsValidSize(count);
if (has)
{
//
for (int i = 0; i < count; i++)
{
eaTrade.AddOnPartialClosePositionEventHandler(mOnPartialCloseEventHandlers[i]);
}
}
//
// Initialize Guard Handler ...
eaGuard = new XCGuard(
eaAlert,
eaTrade //
);
//
// Initialize Data Collector ...
eaCollector = new XCDataCollector();
string mPath = eaAlert.GetPrefix() + "\\" + "Configs";
eaCollector.Path(mPath);
//
// Instantiating Signaller Input Parser ...
eaSignallerInputParser = new XCXCATBEASignallerInputParser(eaAlert);
//
// Initialize Trae Manager ...
eaTradeManager = new XCXCATBEATradeManager(
eaAlert,
eaTrade //
);
//
eaTradeManager.SaveWins(eaSaveWins);
eaTradeManager.SaveLosts(eaSaveLosts);
eaTradeManager.SaveTrades(eaSaveTrades);
eaTradeManager.SaveSignals(eaSaveSignals);
eaTradeManager.SaveRestrictions(eaSaveRestrictions);
//
// Enable Force Close At ...
eaTradeManager.SetForceCloseTradesAt(eaCloseAllOpenTradesAt);
//
// Setting Trade Reports ...
eaTradeManager
.SetTradeReports(
eaReportTrades,
eaReportSignals,
eaReportProtector,
eaReportRestrictions,
eaReportAfterTradesBalance //
);
//
// Setting Trade Permissions ...
eaTradeManager
.SetTradePermissions(
eaAllowTrade,
eaAllowLongs,
eaAllowShorts //
);
//
// Setting Trade Restrictions ...
eaTradeManager
.SetTradeRestrictions(
eaRestrictionsPeriod,
eaMaxAllowedTPs,
eaMaxAllowedSLs,
eaMaxAllowedTrades //
);
//
// Parsing Symbols ...
//
string symbols[];
int symbolsCount = 0;
if (IsValid(eaSymbols))
{
//
symbolsCount = SplitContent(
symbols,
eaSymbols,
"," //
);
}
//
// Adding Default Symbol, if eaSymbols not Filled ...
if (!HasChild(symbols))
{
//
Add(
_Symbol,
symbols //
);
//
symbolsCount = ArraySize(symbols);
}
bool hasSymbols = HasChild(symbols);
//
// Initializing Sessions ...
string sessions[];
int sessionsCount = 0;
bool hasSession = IsValid(eaSessions);
if (hasSession)
{
//
// Extract Per Symbol Sessions ...
sessionsCount = SplitContent(
sessions,
eaSessions,
"," //
);
//
// Try to Extract Start and End Times Series ...
hasSession = IsValidSize(sessionsCount);
if (hasSession)
{
//
// Iterate Sessions ...
for (int i = 0; i < sessionsCount; i++)
{
//
// Ignore unused Cases and Extracts only Content ...
string iSessionDescriptorStr = ExtractString(sessions[i]);
bool isInited = IsValid(iSessionDescriptorStr);
if (isInited)
{
//
// Extract Session Descriptor Data ...
string parts[];
int partsCount = SplitContent(
parts,
iSessionDescriptorStr,
"_" //
);
isInited = IsValidSize(partsCount) && partsCount == 3;
if (isInited)
{
//
string iName = parts[0];
string iStart = parts[1];
string iEnd = parts[2];
isInited = IsValid(iName) &&
IsValid(iStart) &&
IsValid(iEnd);
if (isInited)
{
//
// Set Active Session Per Symbols ...
if (hasSymbols)
{
//
for (int j = 0; j < symbolsCount; j++)
{
//
eaTradeManager
.SetTradeSession(
symbols[j],
iStart,
iEnd,
iName //
);
}
}
}
}
}
}
}
}
//
// Initialize Signallers ...
if (hasSymbols)
{
//
// Prepare Signaller Inputs ...
XCATBEASignallerInputs iSignallerInputs;
//
// Common Configs ...
//
// Provider Name ...
iSignallerInputs.period = _Period;
iSignallerInputs.allowDraws = false;
iSignallerInputs.provider = "XTRGB";
iSignallerInputs.allowGuards = eaAllowGuards;
iSignallerInputs.riskToRewardRatio = eaSignalR2R;
iSignallerInputs.slATRMultiplier = eaSLATRMultiplier;
//
// CATB Indicator ...
iSignallerInputs.catbInputs.Default();
iSignallerInputs.catbInputs.Hide();
//
// Make Available all Requirement Buffers of XCATB indicator ...
iSignallerInputs.catbInputs.showPV = true;
iSignallerInputs.catbInputs.showKI = true;
iSignallerInputs.catbInputs.showSar = true;
iSignallerInputs.catbInputs.showTrend = true;
iSignallerInputs.catbInputs.showATRBand = true;
iSignallerInputs.catbInputs.showPVGolden = true;
//
// Signalling Configurations ...
iSignallerInputs.signallerConfigs.allowSignallingBasedOnConditions = eaAllowSignallingBasedOnConditions;
iSignallerInputs.signallerConfigs.allowSignallingBasedOnTriggerBlocks = eaAllowSignallingBasedOnTriggerBlocks;
iSignallerInputs.signallerConfigs.secondsTriggersSLUsingFirstTriggerBlock = eaSecondsTriggersSLUsingFirstTriggerBlock;
iSignallerInputs.signallerConfigs.applyValidateAndFilterOnSelectInsideOthers = eaApplyValidateAndFilterOnSelectInsideOthers;
iSignallerInputs.signallerConfigs.allowSignallingBasedOnTriggerBlocksInsideOther = eaAllowSignallingBasedOnTriggerBlocksInsideOther;
iSignallerInputs.signallerConfigs.allowSignallingConditions1 = eaAllowSignallingConditions1;
iSignallerInputs.signallerConfigs.allowSignallingConditions2 = eaAllowSignallingConditions2;
iSignallerInputs.signallerConfigs.allowSignallingConditions3 = eaAllowSignallingConditions3;
iSignallerInputs.signallerConfigs.allowSignallingConditions4 = eaAllowSignallingConditions4;
iSignallerInputs.signallerConfigs.allowSignallingConditions5 = eaAllowSignallingConditions5;
iSignallerInputs.signallerConfigs.allowSignallingConditions6 = eaAllowSignallingConditions6;
//
// Prepare Trigger Block Validations ...
//
iSignallerInputs.validations.forceHasSwing = eaForceHasSwing;
iSignallerInputs.validations.forceOBBarType = eaForceOBBarType;
iSignallerInputs.validations.minRequiredOBBar = eaMinRequiredOBBar;
iSignallerInputs.validations.forceFVGBarType = eaForceFVGBarType;
iSignallerInputs.validations.liquidityLoopback = eaLiquidityLoopback;
iSignallerInputs.validations.maxAllowedRange = eaMaxAllowedRange;
iSignallerInputs.validations.minAllowedRange = eaMinAllowedRange;
iSignallerInputs.validations.forceHasFLiquidity = eaForceHasFLiquidity;
iSignallerInputs.validations.forceHasRLiquidity = eaForceHasRLiquidity;
iSignallerInputs.validations.validateGapSequence = eaValidateGapSequence;
iSignallerInputs.validations.minAllowedBlockLength = eaMinAllowedBlockLength;
iSignallerInputs.validations.validateBlockEdgeBreakout = eaValidateBlockEdgeBreakout;
//
// Prepare Trigger Block Filters ...
//
iSignallerInputs.filters.filterBasedOnPV = eaFilterBasedOnPV;
iSignallerInputs.filters.bosLoopback = eaBosLoopback;
//
iSignallerInputs.filters.filterBasedOnSar = eaFilterBasedOnSar;
iSignallerInputs.filters.forceSarSwitched = eaForceSarSwitched;
iSignallerInputs.filters.forceSarOnBothSide = eaForceSarOnBothSide;
iSignallerInputs.filters.forceSarHasBreakout = eaForceSarHasBreakout;
iSignallerInputs.filters.forceSarHasReversalSide = eaForceSarHasReversalSide;
//
iSignallerInputs.filters.filterBasedOnRSI = eaFilterBasedOnRSI;
iSignallerInputs.filters.forceHasRSITrending = eaForceHasRSITrending;
iSignallerInputs.filters.forceHasRSIVPattern = eaForceHasRSIVPattern;
iSignallerInputs.filters.forceHasRSICrossing = eaForceHasRSICrossing;
//
iSignallerInputs.filters.filterBasedOnADX = eaFilterBasedOnADX;
iSignallerInputs.filters.forceHasADXTrending = eaForceHasADXTrending;
iSignallerInputs.filters.forceHasADXCrossing = eaForceHasADXCrossing;
//
iSignallerInputs.filters.filterBasedOnATR = eaFilterBasedOnATR;
iSignallerInputs.filters.forceHasATRTrending = eaForceHasATRTrending;
iSignallerInputs.filters.forceHasATRBreakout = eaForceHasATRBreakout;
//
iSignallerInputs.filters.filterBasedOnTrend = eaFilterBasedOnTrend;
iSignallerInputs.filters.forceHasTrendDir = eaForceHasTrendDir;
iSignallerInputs.filters.forceHasTrendPlace = eaForceHasTrendPlace;
iSignallerInputs.filters.forceHasTrendChange = eaForceHasTrendChange;
iSignallerInputs.filters.forceHasTrendTrending = eaForceHasTrendTrending;
iSignallerInputs.filters.forceHasTrendRejection = eaForceHasTrendRejection;
iSignallerInputs.filters.forceHasTrendLineInside = eaForceHasTrendLineInside;
iSignallerInputs.filters.forceHasTrendDirOnBothSide = eaForceHasTrendDirOnBothSide;
//
iSignallerInputs.filters.filterBasedOnKI = eaFilterBasedOnKI;
iSignallerInputs.filters.filterBasedOnDelta = eaFilterBasedOnDelta;
iSignallerInputs.filters.filterBasedOnVolume = eaFilterBasedOnVolume;
iSignallerInputs.filters.filterBasedOnSignalBar = eaFilterBasedOnSignalBar;
iSignallerInputs.filters.filterBasedOnHKSignalBar = eaFilterBasedOnHKSignalBar;
//
// Loop through Symbols and Initialize Signaller
// for it, then Attached it to eaSignallers ...
for (int i = 0; i < symbolsCount; i++)
{
//
// Attach Symbol ...
iSignallerInputs.symbol = symbols[i];
//
// Check if Provided Inputs File Exists ...
// if Exists, Load and Parse it ...
// LoadConfig(iSignallerInputs);
//
// Set Specified Configurations Per Symbols ...
// Based on Repack 1 ...
AssignRepack1Configs(iSignallerInputs);
//
// Check Inputs Validation ...
if (iSignallerInputs.IsValid())
{
//
// Initialize Signaller ...
XCXCATBEASignaller *iSignaller = new XCXCATBEASignaller(iSignallerInputs);
//
// Add it to the Signallers List ...
Add(
iSignaller,
eaSignallers //
);
//
ZeroMemory(iSignaller);
}
}
//
// Cleanup Resources ...
iSignallerInputs.Clean();
}
//
// since atleast one Signaller must
// exists to Expert works ...
// we check it as Last Step ...
result = hasSymbols &&
HasChild(eaSignallers);
if (result)
{
//
string message = "Initialized Successfully ...";
eaAlert.SendAlert(message);
//
SaveConfigs();
}
else
{
//
string message = "Initialization Failed ...";
eaAlert.SendAlert(message);
}
//
return result;
}
/**
* Handle De Initialization of Expert ...
*/
void HandleOnDeInit()
{
//
delete eaTrade;
ZeroMemory(eaTrade);
//
delete eaGuard;
ZeroMemory(eaGuard);
//
delete eaVolume;
ZeroMemory(eaVolume);
//
eaTimeTracker.Clean();
//
Clean(eaSignallers);
//
delete eaTradeManager;
ZeroMemory(eaTradeManager);
//
delete eaCollector;
ZeroMemory(eaCollector);
//
delete eaSignallerInputParser;
ZeroMemory(eaSignallerInputParser);
//
string message = "DeInitialized Successfully ...";
eaAlert.SendAlert(message);
//
delete eaAlert;
ZeroMemory(eaAlert);
}
/**
* Handle Tick ...
*/
void HandleOnTick()
{
//
// Time Report Handling ...
HandleTimeReport();
//
// Position Management / Protections Handling ...
eaTradeManager.Manage();
//
// Check Signallers Registered ...
bool has = HasChild(eaSignallers);
if (!has)
{
return;
}
//
// Define Collection of Requirements ...
XGuard guards[];
XCATBEAStrategyConditions conditions[];
//
// Loop through Registered Signallers to Proccess Ticks and
// Collect:
// - Guards;
// - Triggered Conditions;
// - ...
int count = ArraySize(eaSignallers);
for (int i = 0; i < count; i++)
{
//
// Retrieve indexed Signaller ...
XCXCATBEASignaller *iSignaller = eaSignallers[i];
//
string iSymbol = iSignaller.GetSymbol();
string iProvider = iSignaller.GetProvider();
ENUM_TIMEFRAMES iPeriod = iSignaller.GetPeriod();
//
// Now we Have to Check Handle Tick Resoult ...
//
// Requirements ...
XGuard iGuards[]; // Hold Provided Guards ...
XPosition iPositions[]; // Retrieve Signaller Positions ...
XCATBEAStrategyConditions iConditions; // Recieve Triggered Conditions ...
//
// Check Active Session ...
bool isActiveSession = eaTradeManager.IsActiveSession(iSymbol);
//
// Reading Signaller Positions ...
eaTradeManager.GetPositions(
iPositions,
iSymbol,
iProvider,
iPeriod //
);
//
// Processing Tick for Signaller ...
iSignaller.ProcessTick(
iPositions,
iGuards,
iConditions,
isActiveSession //
);
//
// Check Results ...
has = HasChild(iGuards);
if (has)
{
//
Copy(
iGuards,
guards,
false // Force Clean ...
);
}
//
// Check Triggered Conditions ...
has = iConditions.IsValid() &&
iConditions.IsSetuped() &&
iConditions.CanTrigger();
if (has)
{
//
AddRef(
iConditions,
conditions //
);
}
//
// Cleanup Resources ...
Clean(iGuards);
Clean(iPositions);
iConditions.Clean();
}
//
// Do Actions Based on Provided Info ...
//
// Guards ...
has = HasChild(guards);
if (has)
{
//
// Handle Guards Firing ...
eaGuard.DoGuards(guards);
}
//
// Triggers ...
has = HasChild(conditions);
if (has)
{
//
// Handle Conditions Triggering ...
TriggerConditions(conditions);
}
//
// Cleanup Resources ...
//
Clean(guards);
Clean(conditions);
}
/**
* Handle Trade ...
*/
void HandleOnTrade()
{
eaTrade.HandleOnTrade();
}
/**
* Handle Timer ...
*/
void HandleOnTimer()
{
}
/**
* Handle Chart Event ...
*
* @param id: int, Event id ...
* @param lparam: long, Event Long Parameter ...
* @param dparam: double, Event Double Parameter ...
* @param sparam: string, Event String Parameter ...
*/
void HandleOnChartEvent(
const int id,
const long &lparam,
const double &dparam,
const string &sparam //
)
{
}
//
// Trade Event Handlers ...
/**
* Handle Stop Loss Event Triggered ...
*
* @param deal: XDeal instance refrence, provides Triggered Deal info ...
*/
void HandleOnStopLossTriggered(const XDeal &deal)
{
eaTradeManager.HandleSL(deal);
}
/**
* Handle Take Profit Event Triggered ...
*
* @param deal: XDeal instance refrence, provides Triggered Deal info ...
*/
void HandleOnTakeProfitTriggered(const XDeal &deal)
{
eaTradeManager.HandleTP(deal);
}
/**
* Handle Position Force Closed Event ...
*
* @param ticket: ulong, triggered Positions ticket ...
* @param position: XPosition instance refrence, Triggered Position ...
* @param comment: string, Comment ...
*/
void HandleOnPositionForceClosed(
const ulong ticket,
const XPosition &position,
const string comment //
)
{
eaTradeManager.HandleForceClose(position);
}
/**
* Handle Position Partially Closed Event ...
*
* @param ticket: ulong, triggered Positions ticket ...
* @param profit: double, Position Profit ...
* @param comment: string, Comment ...
*/
void HandleOnPositionPartialClosed(
const ulong ticket,
const double profit,
const string comment //
)
{
//
eaTradeManager.HandlePartiallyClosed(
ticket,
profit,
comment //
);
}
/**
* Handle Deals Changed ...
*
* @param count: int, number of changes ...
* if the count is positive, means new added ...
* if the count is negative, means removed ...
*/
void HandleOnDealsChanged(int count)
{
}
/**
* Handle Orders Changed ...
*
* @param count: int, number of changes ...
* if the count is positive, means new added ...
* if the count is negative, means removed ...
*/
void HandleOnOrdersChanged(int count)
{
}
/**
* Handle Positions Changed ...
*
* @param count: int, number of changes ...
* if the count is positive, means new added ...
* if the count is negative, means removed ...
*/
void HandleOnPositionsChanged(int count)
{
}
/**
* Handle Position Modified Event ...
*
* @param ticket: ulong, triggered Positions ticket ...
* @param profit: double, Position Profit ...
* @param comment: string, Comment ...
*/
void HandleOnPositionModified(
const ulong ticket,
const double profit,
const string comment //
)
{
}
/**
* Handle all Trades States Changed Event ...
*
* @param state: XOnTradeHandlerState instance refrence, Changed Trade State data ...
*/
void HandleOnTradeStateChanged(const XOnTradeHandlerState &state)
{
}
//
// protected ...
protected:
//
/**
* Report Time Changes based on Given Configurations ...
*/
void HandleTimeReport()
{
//
if (eaAlert == NULL)
{
return;
}
//
// Monthly Report ....
if (eaReportNewMonths &&
eaTimeTracker.IsNewMonth())
{
//
string msg = "New Month ...";
//
eaAlert.SendAlert(msg);
}
//
// Weekly Report ....
if (eaReportNewWeeks &&
eaTimeTracker.IsNewWeek())
{
//
string msg = "New Week ...";
//
eaAlert.SendAlert(msg);
}
//
// Daily Report ....
if (eaReportNewDays &&
eaTimeTracker.IsNewDay())
{
//
string msg = "New Day ...";
//
eaAlert.SendAlert(msg);
}
//
// Hourly Report ....
if (eaReportNewHours &&
eaTimeTracker.IsNewHour())
{
//
string msg = "New Hour ...";
//
eaAlert.SendAlert(msg);
}
}
/**
* Update Signal Targets ...
*/
void UpdateSignalTargets(XSignal &signal)
{
//
bool has = signal.IsValid();
if (!has)
{
return;
}
//
// Clean Signal Targets ...
Clean(signal.targets);
//
// Calculate Requirements ...
double r2r = eaSignalR2R > 0
? eaSignalR2R
: 1;
double risk = signal.GetRisk();
double reward = risk * r2r;
//
double isLong = IsLong(signal.type);
//
// Handling Signal TP ...
signal.tp =
isLong
? signal.entry + reward
: signal.entry - reward;
//
// Try to Apply Money Management ...
//
// Sort Targets ...
ENUM_X_DIRECTION sortingDir =
isLong
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
ApplySortOnTargets(
sortingDir,
signal.targets //
);
}
/**
* Convert a Triggered Conditions to Signal and
* Execute it ...
*/
void TriggerConditions(XCATBEAStrategyConditions &conditions[])
{
//
int count = 0;
bool has = false;
//
has = HasChild(conditions);
if (!has)
{
return;
}
//
count = ArraySize(conditions);
for (int i = 0; i < count; i++)
{
//
// Retrieve Indexed Conditions ...
XCATBEAStrategyConditions iConditions = conditions[i];
//
// Define Signal Structure ...
XSignal iSignal;
//
// Check Conditions is Valid Triggered Conditions ...
has =
iConditions.IsValid() &&
iConditions.IsSetuped() &&
iConditions.CanTrigger();
if (has)
{
//
// Preparing Signal ...
has = ToSignal(
iSignal,
iConditions //
);
}
//
// Validate Signal ...
has = iSignal.IsValid();
if (has)
{
//
// Retrieve Signal Type ...
bool isLong = IsLong(iSignal.type);
//
// Update Signal Entry ...
iSignal.entry = GetEntry(
iSignal.symbol,
iSignal.type //
);
//
// Update Signal Targets ...
UpdateSignalTargets(iSignal);
//
// Handle Volume Management ...
double iVolume = eaVolume.CalculateVolume(iSignal);
has = iVolume > X_MIN_VOLUME &&
iVolume != iSignal.volume;
if (has)
{
iSignal.volume = iVolume;
}
//
// Execute Signal ...
has = eaTradeManager.Execute(
iSignal,
iConditions //
);
}
//
// Cleanup Resources ...
//
iSignal.Clean();
iConditions.Clean();
}
}
//
// private ...
private:
//
//
TOnModify mOnModifyEventHandlers[];
TOnStopLoss mStopLossEventHandlers[];
TOnTakeProfit mTakeProfitEventHandlers[];
TOnForceClose mOnForceCloseEventHandlers[];
TOnDealsChanged mDealsChangedEventHandlers[];
TOnOrdersChanged mOrdersChangedEventHandlers[];
TOnPartialClose mOnPartialCloseEventHandlers[];
TOnPositionsChanged mPositionsChangedEventHandlers[];
TOnTradeStateChanged mTradeStateChangedEventHandlers[];
//
void SaveConfigs()
{
//
string content = NULL;
//
string separator = "\n";
bool ignoreFalseConditions = false;
//
// Preparng Condtions ...
content +=
//
"-----------------------" + separator +
"Validating: " + separator +
"-----------------------" + separator +
ToXString("eaForceHasSwing", eaForceHasSwing, ignoreFalseConditions, separator) +
ToXString("eaForceOBBarType", eaForceOBBarType, ignoreFalseConditions, separator) +
ToXString("eaForceFVGBarType", eaForceFVGBarType, ignoreFalseConditions, separator) +
ToXString("eaForceHasFLiquidity", eaForceHasFLiquidity, ignoreFalseConditions, separator) +
ToXString("eaForceHasRLiquidity", eaForceHasRLiquidity, ignoreFalseConditions, separator) +
ToXString("eaValidateGapSequence", eaValidateGapSequence, ignoreFalseConditions, separator) +
ToXString("eaValidateBlockEdgeBreakout", eaValidateBlockEdgeBreakout, ignoreFalseConditions, separator) +
//
"-----------------------" + separator +
"Filtering: " + separator +
"-----------------------" + separator +
ToXString("eaFilterBasedOnKI", eaFilterBasedOnKI, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnPV", eaFilterBasedOnPV, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnSar", eaFilterBasedOnSar, ignoreFalseConditions, separator) +
ToXString("eaForceSarSwitched", eaForceSarSwitched, ignoreFalseConditions, separator) +
ToXString("eaForceSarOnBothSide", eaForceSarOnBothSide, ignoreFalseConditions, separator) +
ToXString("eaForceSarHasBreakout", eaForceSarHasBreakout, ignoreFalseConditions, separator) +
ToXString("eaForceSarHasReversalSide", eaForceSarHasReversalSide, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnRSI", eaFilterBasedOnRSI, ignoreFalseConditions, separator) +
ToXString("eaForceHasRSITrending", eaForceHasRSITrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasRSIVPattern", eaForceHasRSIVPattern, ignoreFalseConditions, separator) +
ToXString("eaForceHasRSICrossing", eaForceHasRSICrossing, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnADX", eaFilterBasedOnADX, ignoreFalseConditions, separator) +
ToXString("eaForceHasADXTrending", eaForceHasADXTrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasADXCrossing", eaForceHasADXCrossing, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnATR", eaFilterBasedOnATR, ignoreFalseConditions, separator) +
ToXString("eaForceHasATRTrending", eaForceHasATRTrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasATRBreakout", eaForceHasATRBreakout, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnTrend", eaFilterBasedOnTrend, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendDir", eaForceHasTrendDir, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendPlace", eaForceHasTrendPlace, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendChange", eaForceHasTrendChange, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendTrending", eaForceHasTrendTrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendRejection", eaForceHasTrendRejection, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendLineInside", eaForceHasTrendLineInside, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendDirOnBothSide", eaForceHasTrendDirOnBothSide, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnDelta", eaFilterBasedOnDelta, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnVolume", eaFilterBasedOnVolume, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnSignalBar", eaFilterBasedOnSignalBar, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnHKSignalBar", eaFilterBasedOnHKSignalBar, ignoreFalseConditions, separator) +
//
""
//
;
//
// Try to Save Condtions ...
string fileName = eaCollector.GetFilePath("XConfigs");
bool has = IsValid(fileName);
if (!has)
{
return;
}
//
eaCollector.Save(
fileName,
content //
);
//
// Try to Save Inputs ...
fileName = eaCollector.GetFilePath("XInputs");
has = IsValid(fileName);
if (!has)
{
return;
}
//
// Preparing Inputs String Reperesentation ...
content = NULL;
content +=
//
"//" + separator +
"// Common ..." + separator +
ToXString("eaMagicNumber", eaMagicNumber, separator) +
ToXString("eaSlippage", eaSlippage, separator) +
ToXString("eaLogSuffix", eaLogSuffix, separator) +
"" + separator +
"//" + separator +
"// Detector ..." + separator +
"" + separator +
"//" + separator +
"// Validating ..." + separator +
ToXString("eaForceHasSwing", eaForceHasSwing, ignoreFalseConditions, separator) +
ToXString("eaForceOBBarType", eaForceOBBarType, ignoreFalseConditions, separator) +
ToXString("eaMinRequiredOBBar", eaMinRequiredOBBar, ignoreFalseConditions, separator) +
ToXString("eaForceFVGBarType", eaForceFVGBarType, ignoreFalseConditions, separator) +
ToXString("eaLiquidityLoopback", eaLiquidityLoopback, ignoreFalseConditions, separator) +
ToXString("eaMaxAllowedRange", ToXString(eaMaxAllowedRange), separator) +
ToXString("eaMinAllowedRange", ToXString(eaMinAllowedRange), separator) +
ToXString("eaForceHasFLiquidity", eaForceHasFLiquidity, ignoreFalseConditions, separator) +
ToXString("eaForceHasRLiquidity", eaForceHasRLiquidity, ignoreFalseConditions, separator) +
ToXString("eaValidateGapSequence", eaValidateGapSequence, ignoreFalseConditions, separator) +
ToXString("eaMinAllowedBlockLength", eaMinAllowedBlockLength, ignoreFalseConditions, separator) +
ToXString("eaValidateBlockEdgeBreakout", eaValidateBlockEdgeBreakout, ignoreFalseConditions, separator) +
"" + separator +
"//" + separator +
"// Filtering ..." + separator +
ToXString("eaFilterBasedOnKI", eaFilterBasedOnKI, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnPV", eaFilterBasedOnPV, ignoreFalseConditions, separator) +
ToXString("eaBosLoopback", eaBosLoopback, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnSar", eaFilterBasedOnSar, ignoreFalseConditions, separator) +
ToXString("eaForceSarSwitched", eaForceSarSwitched, ignoreFalseConditions, separator) +
ToXString("eaForceSarOnBothSide", eaForceSarOnBothSide, ignoreFalseConditions, separator) +
ToXString("eaForceSarHasBreakout", eaForceSarHasBreakout, ignoreFalseConditions, separator) +
ToXString("eaForceSarHasReversalSide", eaForceSarHasReversalSide, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnRSI", eaFilterBasedOnRSI, ignoreFalseConditions, separator) +
ToXString("eaForceHasRSITrending", eaForceHasRSITrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasRSIVPattern", eaForceHasRSIVPattern, ignoreFalseConditions, separator) +
ToXString("eaForceHasRSICrossing", eaForceHasRSICrossing, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnADX", eaFilterBasedOnADX, ignoreFalseConditions, separator) +
ToXString("eaForceHasADXTrending", eaForceHasADXTrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasADXCrossing", eaForceHasADXCrossing, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnATR", eaFilterBasedOnATR, ignoreFalseConditions, separator) +
ToXString("eaForceHasATRTrending", eaForceHasATRTrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasATRBreakout", eaForceHasATRBreakout, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnTrend", eaFilterBasedOnTrend, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendDir", eaForceHasTrendDir, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendPlace", eaForceHasTrendPlace, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendChange", eaForceHasTrendChange, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendTrending", eaForceHasTrendTrending, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendRejection", eaForceHasTrendRejection, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendLineInside", eaForceHasTrendLineInside, ignoreFalseConditions, separator) +
ToXString("eaForceHasTrendDirOnBothSide", eaForceHasTrendDirOnBothSide, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnDelta", eaFilterBasedOnDelta, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnVolume", eaFilterBasedOnVolume, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnSignalBar", eaFilterBasedOnSignalBar, ignoreFalseConditions, separator) +
ToXString("eaFilterBasedOnHKSignalBar", eaFilterBasedOnHKSignalBar, ignoreFalseConditions, separator) +
"" + separator +
"//" + separator +
"// Signal ..." + separator +
ToXString("eaSignalR2R", eaSignalR2R, ignoreFalseConditions, separator) +
ToXString("eaSLATRMultiplier", ToXString(eaSLATRMultiplier), separator) +
ToXString("eaAllowSignallingBasedOnConditions", eaAllowSignallingBasedOnConditions, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingBasedOnTriggerBlocks", eaAllowSignallingBasedOnTriggerBlocks, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingBasedOnTriggerBlocksInsideOther", eaAllowSignallingBasedOnTriggerBlocksInsideOther, ignoreFalseConditions, separator) +
ToXString("eaSecondsTriggersSLUsingFirstTriggerBlock", eaSecondsTriggersSLUsingFirstTriggerBlock, ignoreFalseConditions, separator) +
ToXString("eaApplyValidateAndFilterOnSelectInsideOthers", eaApplyValidateAndFilterOnSelectInsideOthers, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingConditions1", eaAllowSignallingConditions1, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingConditions2", eaAllowSignallingConditions2, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingConditions3", eaAllowSignallingConditions3, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingConditions4", eaAllowSignallingConditions4, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingConditions5", eaAllowSignallingConditions5, ignoreFalseConditions, separator) +
ToXString("eaAllowSignallingConditions6", eaAllowSignallingConditions6, ignoreFalseConditions, separator) +
"" + separator +
"//" + separator +
"// Volume ..." + separator +
ToXString("eaVolumeSelect", ToXString(eaVolumeSelect), separator) +
ToXString("eaStaticVoluem", ToXString(eaStaticVoluem), separator) +
ToXString("eaDynamicVolumeStepBalance", ToXString(eaDynamicVolumeStepBalance), separator) +
ToXString("eaDynamicVolumeStepVolume", ToXString(eaDynamicVolumeStepVolume), separator) +
ToXString("eaConstantRiskBalance", ToXString(eaConstantRiskBalance), separator) +
ToXString("eaConstantPercent", ToXString(eaConstantPercent), separator) +
ToXString("eaConstantBalance", ToXString(eaConstantBalance), separator) +
"" + separator +
"//" + separator +
"// Management ..." + separator +
ToXString("eaSymbols", eaSymbols, separator) +
ToXString("eaAllowGuards", eaAllowGuards, ignoreFalseConditions, separator) +
ToXString("eaAllowTrade", eaAllowTrade, ignoreFalseConditions, separator) +
ToXString("eaAllowLongs", eaAllowLongs, ignoreFalseConditions, separator) +
ToXString("eaAllowShorts", eaAllowShorts, ignoreFalseConditions, separator) +
ToXString("eaSessions", eaSessions, separator) +
ToXString("eaRestrictionsPeriod", ToXString(eaRestrictionsPeriod), separator) +
ToXString("eaMaxAllowedTPs", eaMaxAllowedTPs, ignoreFalseConditions, separator) +
ToXString("eaMaxAllowedSLs", eaMaxAllowedSLs, ignoreFalseConditions, separator) +
ToXString("eaMaxAllowedTrades", eaMaxAllowedTrades, ignoreFalseConditions, separator) +
ToXString("eaMaxAllowedPositions", eaMaxAllowedPositions, ignoreFalseConditions, separator) +
ToXString("eaMaxAllowedSpread", ToXString(eaMaxAllowedSpread), separator) +
ToXString("eaMaxAllowedDrawdownFactor", ToXString(eaMaxAllowedDrawdownFactor), separator) +
ToXString("eaCloseAllOpenTradesAt", eaCloseAllOpenTradesAt, separator) +
"" + separator +
"//" + separator +
"// Alert ..." + separator +
ToXString("eaEnableAlerts", eaEnableAlerts, ignoreFalseConditions, separator) +
ToXString("eaSaveAlerts", eaSaveAlerts, ignoreFalseConditions, separator) +
ToXString("eaLogAlerts", eaLogAlerts, ignoreFalseConditions, separator) +
ToXString("eaMailAlerts", eaMailAlerts, ignoreFalseConditions, separator) +
ToXString("eaPushAlerts", eaPushAlerts, ignoreFalseConditions, separator) +
ToXString("eaTerminalAlerts", eaTerminalAlerts, ignoreFalseConditions, separator) +
"" + separator +
"//" + separator +
"// Time Report ..." + separator +
ToXString("eaReportNewMonths", eaReportNewMonths, ignoreFalseConditions, separator) +
ToXString("eaReportNewWeeks", eaReportNewWeeks, ignoreFalseConditions, separator) +
ToXString("eaReportNewDays", eaReportNewDays, ignoreFalseConditions, separator) +
ToXString("eaReportNewHours", eaReportNewHours, ignoreFalseConditions, separator) +
ToXString("eaReportTrades", eaReportTrades, ignoreFalseConditions, separator) +
ToXString("eaReportSignals", eaReportSignals, ignoreFalseConditions, separator) +
ToXString("eaReportProtector", eaReportProtector, ignoreFalseConditions, separator) +
ToXString("eaReportRestrictions", eaReportRestrictions, ignoreFalseConditions, separator) +
ToXString("eaReportAfterTradesBalance", eaReportAfterTradesBalance, ignoreFalseConditions, separator) +
"" + separator +
"//" + separator +
"// Collector ..." + separator +
ToXString("eaSaveTrades", eaSaveTrades, ignoreFalseConditions, separator) +
ToXString("eaSaveSignals", eaSaveSignals, ignoreFalseConditions, separator) +
ToXString("eaSaveWins", eaSaveWins, ignoreFalseConditions, separator) +
ToXString("eaSaveLosts", eaSaveLosts, ignoreFalseConditions, separator) +
ToXString("eaSaveRestrictions", eaSaveRestrictions, ignoreFalseConditions, separator) +
//
""
//
;
//
eaCollector.Save(
fileName,
content //
);
}
//
bool LoadConfig(XCATBEASignallerInputs &inputs)
{
//
bool result = false;
//
// Validate Args ...
result =
IsValid(inputs.period) &&
IsValid(inputs.symbol);
if (!result)
{
return result;
}
//
// Check the Provided File Exists or not ...
result =
eaSignallerInputParser
.IsSignallerInputsFileExists(
inputs.symbol,
inputs.period //
);
if (!result)
{
return result;
}
//
// Parse File Content ...
result =
eaSignallerInputParser
.ParseSignallerInputs(
inputs,
inputs.symbol,
inputs.period //
);
//
return result;
}
//
bool AssignRepack1Configs(XCATBEASignallerInputs &inputs)
{
//
// Validate Requirements ...
bool result =
IsValid(inputs.period) &&
IsValid(inputs.symbol);
if (!result)
{
return result;
}
//
if (inputs.symbol == "XAUUSDb")
{
//
// Validators ...
inputs.validations.forceHasSwing = false;
inputs.validations.forceOBBarType = false;
inputs.validations.forceFVGBarType = true;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = true;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = true;
inputs.filters.filterBasedOnPV = true;
inputs.filters.filterBasedOnSar = true;
inputs.filters.forceSarSwitched = false;
inputs.filters.forceSarOnBothSide = true;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = false;
inputs.filters.forceHasRSITrending = true;
inputs.filters.forceHasRSIVPattern = true;
inputs.filters.forceHasRSICrossing = false;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = true;
inputs.filters.forceHasADXCrossing = true;
inputs.filters.filterBasedOnATR = false;
inputs.filters.forceHasATRTrending = true;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = true;
inputs.filters.forceHasTrendDir = true;
inputs.filters.forceHasTrendPlace = true;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = true;
inputs.filters.forceHasTrendRejection = false;
inputs.filters.forceHasTrendLineInside = false;
inputs.filters.forceHasTrendDirOnBothSide = false;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = false;
inputs.filters.filterBasedOnSignalBar = false;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "XAGUSDb")
{
//
// Validators ...
inputs.validations.forceHasSwing = false;
inputs.validations.forceOBBarType = true;
inputs.validations.forceFVGBarType = true;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = true;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = false;
inputs.filters.filterBasedOnPV = false;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = true;
inputs.filters.forceSarOnBothSide = false;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = false;
inputs.filters.forceHasRSITrending = false;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = true;
inputs.filters.filterBasedOnADX = true;
inputs.filters.forceHasADXTrending = true;
inputs.filters.forceHasADXCrossing = true;
inputs.filters.filterBasedOnATR = false;
inputs.filters.forceHasATRTrending = true;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = false;
inputs.filters.forceHasTrendDir = true;
inputs.filters.forceHasTrendPlace = false;
inputs.filters.forceHasTrendChange = false;
inputs.filters.forceHasTrendTrending = false;
inputs.filters.forceHasTrendRejection = true;
inputs.filters.forceHasTrendLineInside = true;
inputs.filters.forceHasTrendDirOnBothSide = true;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = false;
inputs.filters.filterBasedOnSignalBar = false;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "EURUSDb")
{
//
// Validators ...
inputs.validations.forceHasSwing = false;
inputs.validations.forceOBBarType = true;
inputs.validations.forceFVGBarType = false;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = false;
inputs.validations.validateBlockEdgeBreakout = true;
//
// Filters ...
inputs.filters.filterBasedOnKI = false;
inputs.filters.filterBasedOnPV = false;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = true;
inputs.filters.forceSarOnBothSide = false;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = true;
inputs.filters.forceHasRSITrending = true;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = false;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = true;
inputs.filters.forceHasADXCrossing = false;
inputs.filters.filterBasedOnATR = true;
inputs.filters.forceHasATRTrending = true;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = true;
inputs.filters.forceHasTrendDir = true;
inputs.filters.forceHasTrendPlace = false;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = false;
inputs.filters.forceHasTrendRejection = false;
inputs.filters.forceHasTrendLineInside = false;
inputs.filters.forceHasTrendDirOnBothSide = true;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = false;
inputs.filters.filterBasedOnSignalBar = false;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "GBPUSDb")
{
//
// Validators ...
inputs.validations.forceHasSwing = false;
inputs.validations.forceOBBarType = true;
inputs.validations.forceFVGBarType = true;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = true;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = false;
inputs.filters.filterBasedOnPV = true;
inputs.filters.filterBasedOnSar = true;
inputs.filters.forceSarSwitched = false;
inputs.filters.forceSarOnBothSide = true;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = false;
inputs.filters.filterBasedOnRSI = false;
inputs.filters.forceHasRSITrending = false;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = true;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = true;
inputs.filters.forceHasADXCrossing = false;
inputs.filters.filterBasedOnATR = false;
inputs.filters.forceHasATRTrending = false;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = false;
inputs.filters.forceHasTrendDir = true;
inputs.filters.forceHasTrendPlace = true;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = true;
inputs.filters.forceHasTrendRejection = false;
inputs.filters.forceHasTrendLineInside = true;
inputs.filters.forceHasTrendDirOnBothSide = false;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = true;
inputs.filters.filterBasedOnSignalBar = true;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "USDCHFb")
{
//
// Validators ...
inputs.validations.forceHasSwing = false;
inputs.validations.forceOBBarType = false;
inputs.validations.forceFVGBarType = false;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = true;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = true;
inputs.filters.filterBasedOnPV = true;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = false;
inputs.filters.forceSarOnBothSide = false;
inputs.filters.forceSarHasBreakout = true;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = true;
inputs.filters.forceHasRSITrending = true;
inputs.filters.forceHasRSIVPattern = true;
inputs.filters.forceHasRSICrossing = false;
inputs.filters.filterBasedOnADX = true;
inputs.filters.forceHasADXTrending = false;
inputs.filters.forceHasADXCrossing = false;
inputs.filters.filterBasedOnATR = false;
inputs.filters.forceHasATRTrending = false;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = false;
inputs.filters.forceHasTrendDir = false;
inputs.filters.forceHasTrendPlace = false;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = false;
inputs.filters.forceHasTrendRejection = false;
inputs.filters.forceHasTrendLineInside = true;
inputs.filters.forceHasTrendDirOnBothSide = true;
inputs.filters.filterBasedOnDelta = true;
inputs.filters.filterBasedOnVolume = true;
inputs.filters.filterBasedOnSignalBar = true;
inputs.filters.filterBasedOnHKSignalBar = true;
}
else if (inputs.symbol == "USDJPYb")
{
//
// Validators ...
inputs.validations.forceHasSwing = true;
inputs.validations.forceOBBarType = false;
inputs.validations.forceFVGBarType = false;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = false;
inputs.validations.validateBlockEdgeBreakout = true;
//
// Filters ...
inputs.filters.filterBasedOnKI = true;
inputs.filters.filterBasedOnPV = false;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = true;
inputs.filters.forceSarOnBothSide = true;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = false;
inputs.filters.forceHasRSITrending = true;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = false;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = false;
inputs.filters.forceHasADXCrossing = false;
inputs.filters.filterBasedOnATR = false;
inputs.filters.forceHasATRTrending = false;
inputs.filters.forceHasATRBreakout = true;
inputs.filters.filterBasedOnTrend = false;
inputs.filters.forceHasTrendDir = false;
inputs.filters.forceHasTrendPlace = true;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = true;
inputs.filters.forceHasTrendRejection = false;
inputs.filters.forceHasTrendLineInside = true;
inputs.filters.forceHasTrendDirOnBothSide = false;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = false;
inputs.filters.filterBasedOnSignalBar = true;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "USDCADb")
{
//
// Validators ...
inputs.validations.forceHasSwing = true;
inputs.validations.forceOBBarType = true;
inputs.validations.forceFVGBarType = false;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = true;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = false;
inputs.filters.filterBasedOnPV = true;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = true;
inputs.filters.forceSarOnBothSide = true;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = true;
inputs.filters.forceHasRSITrending = false;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = false;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = false;
inputs.filters.forceHasADXCrossing = false;
inputs.filters.filterBasedOnATR = true;
inputs.filters.forceHasATRTrending = true;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = true;
inputs.filters.forceHasTrendDir = true;
inputs.filters.forceHasTrendPlace = true;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = true;
inputs.filters.forceHasTrendRejection = true;
inputs.filters.forceHasTrendLineInside = false;
inputs.filters.forceHasTrendDirOnBothSide = false;
inputs.filters.filterBasedOnDelta = true;
inputs.filters.filterBasedOnVolume = true;
inputs.filters.filterBasedOnSignalBar = true;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "NZDUSDb")
{
//
// Validators ...
inputs.validations.forceHasSwing = true;
inputs.validations.forceOBBarType = false;
inputs.validations.forceFVGBarType = false;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = false;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = true;
inputs.filters.filterBasedOnPV = false;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = true;
inputs.filters.forceSarOnBothSide = true;
inputs.filters.forceSarHasBreakout = false;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = false;
inputs.filters.forceHasRSITrending = true;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = true;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = true;
inputs.filters.forceHasADXCrossing = true;
inputs.filters.filterBasedOnATR = true;
inputs.filters.forceHasATRTrending = false;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = true;
inputs.filters.forceHasTrendDir = false;
inputs.filters.forceHasTrendPlace = false;
inputs.filters.forceHasTrendChange = false;
inputs.filters.forceHasTrendTrending = true;
inputs.filters.forceHasTrendRejection = true;
inputs.filters.forceHasTrendLineInside = true;
inputs.filters.forceHasTrendDirOnBothSide = true;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = false;
inputs.filters.filterBasedOnSignalBar = true;
inputs.filters.filterBasedOnHKSignalBar = false;
}
else if (inputs.symbol == "DowJones30")
{
//
// Validators ...
inputs.validations.forceHasSwing = true;
inputs.validations.forceOBBarType = false;
inputs.validations.forceFVGBarType = true;
inputs.validations.forceHasFLiquidity = false;
inputs.validations.forceHasRLiquidity = false;
inputs.validations.validateGapSequence = false;
inputs.validations.validateBlockEdgeBreakout = false;
//
// Filters ...
inputs.filters.filterBasedOnKI = true;
inputs.filters.filterBasedOnPV = false;
inputs.filters.filterBasedOnSar = false;
inputs.filters.forceSarSwitched = true;
inputs.filters.forceSarOnBothSide = true;
inputs.filters.forceSarHasBreakout = true;
inputs.filters.forceSarHasReversalSide = true;
inputs.filters.filterBasedOnRSI = false;
inputs.filters.forceHasRSITrending = false;
inputs.filters.forceHasRSIVPattern = false;
inputs.filters.forceHasRSICrossing = true;
inputs.filters.filterBasedOnADX = false;
inputs.filters.forceHasADXTrending = true;
inputs.filters.forceHasADXCrossing = false;
inputs.filters.filterBasedOnATR = false;
inputs.filters.forceHasATRTrending = true;
inputs.filters.forceHasATRBreakout = false;
inputs.filters.filterBasedOnTrend = true;
inputs.filters.forceHasTrendDir = true;
inputs.filters.forceHasTrendPlace = false;
inputs.filters.forceHasTrendChange = true;
inputs.filters.forceHasTrendTrending = true;
inputs.filters.forceHasTrendRejection = false;
inputs.filters.forceHasTrendLineInside = false;
inputs.filters.forceHasTrendDirOnBothSide = false;
inputs.filters.filterBasedOnDelta = false;
inputs.filters.filterBasedOnVolume = false;
inputs.filters.filterBasedOnSignalBar = true;
inputs.filters.filterBasedOnHKSignalBar = false;
}
//
return result;
}
//
};
//