Files
MQL5Data/Experts/xcatb.test.ea.mq5
T
2025-05-30 16:16:15 +03:30

1142 lines
30 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center XCATB MQL5 Expert Advisor
// -------------------------------------------------
// Name: XCAEA
// Description: an Exper Advisor which used XCATB
//
// Maintainer:
// ------------
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
//
//////////////////////////////////////////////////////
//
// Global Properties ...
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "EA based on X121 XCATB indicator"
#property strict
//
// Include Common Library ...
#include "../Classes/x-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-bar.analyser.class.mq5"
#include "../Classes/x-saherelm.x-poi.drawer.class.mq5"
#include "../Classes/x-saherelm.x-trade.class.mq5"
#include "../Classes/x-saherelm.x-volume.class.mq5"
#include "../Helpers/x-saherelm.x121.xcatb.helper.mq5"
#include "../XCATBEA/Classes/xcatbea.x-trade.manager.class.mq5"
#include "../XCATBEA/Libraries/xcatbea.signaller.lib.mq5"
//
#define ShortName "XCATBEA"
//
// Inputs ...
//
// Common ...
input group "Common";
input long eaMagicNumber = 1694056; // Magic Number
input int eaSlippage = 10; // Slippgae
input string eaLogSuffix = ""; // Log Suffix
//
// Detector ...
input group "Detector";
//
// Validating ...
input group "Validations";
input bool eaForceHasSwing = false; // Force Block to Has Propper Swing
input bool eaForceOBBarType = false; // Force Order Block to Has InDirectional Bars
input int eaMinRequiredOBBar = 0; // Min Required OB Bar
input bool eaForceFVGBarType = false; // Force Fair Value Gaps Bars Type
input int eaLiquidityLoopback = 0; // Liquidity Detection Loopback
input double eaMaxAllowedRange = 0.0; // Max Allowed Order Block Range
input double eaMinAllowedRange = 0.0; // Min Allowed Order Block Range
input bool eaForceHasFLiquidity = false; // Force Order Block To Has Reversal Liquidity
input bool eaForceHasRLiquidity = false; // Force Order Block to Has Following Liquidity
input bool eaValidateGapSequence = false; // Validate Fair Value Gaps Bar Sequences
input int eaMinAllowedBlockLength = 0; // Min Allowed Block Length
input bool eaValidateBlockEdgeBreakout = false; // Validate Order Block Edge Breakeout
//
// Filtering ...
input group "Filters";
input bool eaFilterBasedOnPV = false; // Filter Based On PV
input int eaBosLoopback = 0; // PV Based Filtering BOS Lookup
input bool eaFilterBasedOnSar = false; // Filter Based On SAR
input bool eaForceSarSwitched = false; // SAR Switched on Sides for Filtering
input bool eaForceSarOnBothSide = false; // SAR Check on Both Sides for Filtering
input bool eaForceSarHasBreakout = false; // SAR Must Breakout
input bool eaForceSarHasReversalSide = false; // SAR Must Has Reversal Direction
input bool eaFilterBasedOnRSI = false; // Filter Based On RSI
input bool eaForceHasRSITrending = false; // RSI Must Has Trending
input bool eaForceHasRSIVPattern = false; // RSI Must Has Pattern
input bool eaForceHasRSICrossing = false; // RSI Must Has Crossing Levels
input bool eaFilterBasedOnADX = false; // Filter Based On ADX
input bool eaForceHasADXTrending = false; // ADX Must Has Trending
input bool eaForceHasADXCrossing = false; // ADX Must Has Crossing +DI/-DI
input bool eaFilterBasedOnATR = false; // Filter Based On ATR
input bool eaForceHasATRTrending = false; // ATR Must Has Trending
input bool eaForceHasATRBreakout = false; // ATR Must Has Breakout
input bool eaFilterBasedOnTrend = false; // Filter Based On Trend
input bool eaForceHasTrendDir = false; // TREND Must Has Following Direction
input bool eaForceHasTrendPlace = false; // TREND Place Based Filtering
input bool eaForceHasTrendChange = false; // TREND Change Filtering
input bool eaForceHasTrendTrending = false; // TREND Must Has Trending
input bool eaForceHasTrendRejection = false; // TREND Line Must Rejected
input bool eaForceHasTrendLineInside = false; // TREND Line has Inside
input bool eaForceHasTrendDirOnBothSide = false; // TREND Must Has Following Direction in Both Side
input bool eaFilterBasedOnDelta = false; // Filter Based On Delta
input bool eaFilterBasedOnVolume = false; // Filter Based On Volume
input bool eaFilterBasedOnSignalBar = false; // Filter Based on Signal Bar
input bool eaFilterBasedOnHKSignalBar = false; // Filter Based On HK Signal Bar
//
// Signal ...
input group "Signal";
input int eaSignalR2R = 2; // Risk Reward Ratio
input double eaSLAtrMultiplier = 0; // ATR Multiplier for SL
//
// Volume ...
input group "Volume";
input ENUM_X_VOLUME_SELECT_TYPE eaVolumeSelect = X_VOLUME_EQUITY; // 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 = 0.5; // Constant Percent of Balance Per Trade
input double eaConstantBalance = 0.0; // Constant Balance for Calculations
//
// Management ...
// eaSessions => (SYDNEY_02:00_14:00),(NY_19:00_23:00)
input group "Management";
input bool eaAllowTrade = true; // Allow Trade on Signals
input bool eaAllowLongs = true; // Allow Long Trades
input bool eaAllowShorts = true; // Allow Short Trades
input string eaSessions = ""; // Active Sessions
input ENUM_XCATBEA_TRADE_RESTRICTION_PERIOD eaRestrictionsPeriod = XCATBEA_TRADE_RESTRICATION_NONE; // Restrictions Period
input int eaMaxAllowedTPs = 0; // Max Allowed TP(s) in Restrictions Period
input int eaMaxAllowedSLs = 0; // Max Allowed SL(s) in Restrictions Period
input int eaMaxAllowedTrades = 0; // Max Allowed Trades in Restrictions Period
input int eaMaxAllowedPositions = 5; // Max Allowed Same Time Trades
input double eaMaxAllowedSpread = 25; // Max Allowed Spread For Trade
input double eaMaxAllowedDrawdownFactor = 0.3; // Max Allowed DrawDown for Trade
input string eaCloseAllOpenTradesAt = ""; // Close All Open Trades per Day At Specified Time
//
// Alert ...
// Here we Provider All Requirements for
// Configuring Alert Provider ...
input group "Alert";
input bool eaEnableAlerts = true; // Enable Alerts
input bool eaLogAlerts = true; // Log Alerts
input bool eaMailAlerts = false; // Mail Alerts
input bool eaPushAlerts = true; // Push Alerts
input bool eaTerminalAlerts = false; // Terminal Alerts
//
// Time Report ...
input group "Reports";
input bool eaReportNewMonths = false; // Report New Month
input bool eaReportNewWeeks = false; // Report New Weeks
input bool eaReportNewDays = true; // Report New Days
input bool eaReportNewHours = false; // Report New Hours
input bool eaReportTrades = true; // Report Trades
input bool eaReportSignals = true; // Report Signals
input bool eaReportProtector = true; // Report Protector Actions
input bool eaReportAfterTradesBalance = true; // Report Balance after a Trade Finished
//
// Collector ...
input group "Collector";
input bool eaSaveTrades = false; // Save Trades
input bool eaSaveSignals = false; // Save Signals
input bool eaSaveWins = false; // Save Winning Conditions
input bool eaSaveLosts = false; // Save Lost Conditions
//
// Variables ...
//
XCAlert *eaAlert;
XCTrade *eaTrade;
XSignal eaSignal;
string eaTag = "";
XCVolume *eaVolume;
XTriggerBlock eaTB;
CArrayObj *eaObjects;
XCPOIDrawer *eaDrawer;
XBarTracker eaBarTraker;
X121XCatbInputs eaInputs;
XTimeTracker eaTimeTracker;
XCX121XCatbHelper *eaHelper;
XCBarAnalyser *eaBarAnalyser;
XTriggerBlockFilters eaFilters;
X121XCatbConditions eaCatbConditions;
XCXCATBEATradeManager *eaTradeManager;
XCATBEAStrategyConditions eaConditions;
XTriggerBlockValidationRules eaValidations;
//
// Event Handlers ...
//
// Initialization ...
int OnInit()
{
//
// Validate Inputs and Required Parameters
// for EA to Works fine ...
if (!ValidateInputs())
{
return INIT_PARAMETERS_INCORRECT;
}
//
// Initial Requirements ...
InitRequirements();
//
// Initialize Volume Manger ...
if (!InitVolume())
{
return INIT_FAILED;
}
//
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
//
// eaObjects.Clear();
//
delete eaHelper;
ZeroMemory(eaHelper);
//
delete eaAlert;
ZeroMemory(eaAlert);
//
delete eaTrade;
ZeroMemory(eaTrade);
//
delete eaDrawer;
ZeroMemory(eaDrawer);
//
delete eaVolume;
ZeroMemory(eaVolume);
//
delete eaBarAnalyser;
ZeroMemory(eaBarAnalyser);
//
eaTB.Clean();
eaSignal.Clean();
eaSignal.Clean();
eaFilters.Clean();
eaBarTraker.Clean();
eaConditions.Clean();
eaConditions.Clean();
eaTimeTracker.Clean();
eaValidations.Clean();
eaCatbConditions.Clean();
//
DestroyTimer();
}
//
// On Tick Handler ...
void OnTick()
{
//
// Handle Tradings ...
bool tradeUsingTriggerBlock = true;
bool tradeUsingMarketConditions1 = true;
//
HandleTimeReport();
//
// Handle Position Management / Protections ...
eaTradeManager.Manage();
//
eaTB.Clean();
eaSignal.Clean();
eaConditions.Clean();
eaCatbConditions.Clean();
//
bool has = false;
int barIndex = 0;
int cBarIndex = 0;
//
// Check Bar Processing ...
if (!eaBarTraker.CanProcessBar())
{
return;
}
//
eaHelper.Check(barIndex);
//
// Reading Required Bars ...
XOHCL zBar;
XOHCL cBar;
has = zBar.Init(
_Symbol,
_Period,
barIndex //
);
has =
has &&
zBar.GetPreviousBar(cBar);
if (!has)
{
//
zBar.Clean();
cBar.Clean();
//
return;
}
//
cBarIndex = barIndex + 1;
//
// Update All Required Buffers ...
eaHelper.Update(cBarIndex);
//
// Check Trigger Block Detected or Not ...
if (tradeUsingTriggerBlock)
{
//
// Trigger Block Detection ...
has = DetectTriggerBlock1(
eaHelper,
eaBarAnalyser,
eaTB,
eaCatbConditions,
eaValidations,
eaFilters,
barIndex,
10 // Loopback ...
);
//
if (has)
{
//
// Wait for Next Bar for anything ...
eaBarTraker.Waits();
//
// Prepare Target ...
double targets[];
for (int i = 1; i <= eaSignalR2R; i++)
{
//
Add(
(double)i,
targets //
);
}
//
// Calculate SL Additions ...
double iATR = 0;
if (barIndex > 0 &&
barIndex < ArraySize(eaHelper.atrBuffer))
{
iATR = eaHelper.atrBuffer[barIndex];
}
double slAdditional = eaSLAtrMultiplier * iATR;
//
// Preparing Signal ...
has = ToSignal(
eaTB.trigger,
eaTB.signal,
targets,
slAdditional //
);
//
// Draw Trigger Block ...
DrawTriggerBlock(
eaTB,
eaDrawer,
eaObjects,
NULL //
);
//
// Attach Signal ...
eaSignal = eaTB.signal;
//
// Check Signal Type ...
bool isLong = IsLong(eaSignal.type);
//
// Update Entry ...
eaSignal.entry = GetEntry(
eaSignal.symbol,
eaSignal.type //
);
//
// Update Signal Targets ...
UpdateSignalTargets(eaSignal);
//
// Handle Volume Management ...
double iVolume = eaVolume.CalculateVolume(eaSignal);
if (iVolume > X_MIN_VOLUME &&
iVolume != eaSignal.volume)
{
eaSignal.volume = iVolume;
}
//
eaConditions.sl = eaSignal.sl;
eaConditions.tp = eaSignal.tp;
eaConditions.pivot = eaSignal.sl;
eaConditions.time = eaSignal.time;
eaConditions.reward = eaSignalR2R;
eaConditions.point = eaSignal.entry;
eaConditions.entry = eaSignal.entry;
eaConditions.symbol = eaSignal.symbol;
eaConditions.period = eaSignal.period;
eaConditions.setupTime = eaSignal.time;
eaConditions.triggerTime = eaSignal.time;
eaConditions.decisionZone = eaTB.trigger;
eaConditions.provider = eaSignal.provider;
eaConditions.conditions = eaCatbConditions;
eaConditions.type = ToPositionType(eaSignal.type);
eaConditions.dir =
isLong
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
Copy(
eaSignal.targets,
eaConditions.targets //
);
eaSignal.conditions =
eaCatbConditions
.GenerateSummary(
false, // Commons ...
true, // Conditions ...
true, // Scores ...
false // Ignore Falses ...
);
//
// Execute Signal ...
has = eaTradeManager.Execute(
eaSignal,
eaConditions //
);
}
//
eaTB.Clean();
}
//
// Trade Using Market Conditions ...
if (tradeUsingMarketConditions1)
{
//
XBoxZone signalZone;
X121XCatbConditions conditions;
has = DetectSignalZone(
eaDrawer,
eaHelper,
eaBarAnalyser,
signalZone,
conditions,
barIndex //
);
if (has)
{
//
// Convert Box to Signal ...
}
}
//
// Cleanup Resources ...
//
zBar.Clean();
cBar.Clean();
eaTB.Clean();
eaSignal.Clean();
eaConditions.Clean();
eaCatbConditions.Clean();
}
//
// Handle On Trade Event ...
void OnTrade()
{
eaTrade.HandleOnTrade();
}
//
// On Timer ...
void OnTimer()
{
}
//
// Chart Event Handler ...
void OnChartEvent(
const int id,
const long &lparam,
const double &dparam,
const string &sparam //
)
{
}
//
// Event Listeners ...
/**
* Handle StopLoss Triggered Positions ...
*
* @param deal: XDeal instance ...
*/
void OnStopLossTriggered(const XDeal &deal)
{
eaTradeManager.HandleSL(deal);
}
/**
* Handle Take Profit Triggered Positions ...
*
* @param deal: XDeal instance ...
*/
void OnTakeProfitTriggered(const XDeal &deal)
{
eaTradeManager.HandleTP(deal);
}
/**
* Handle Force Close a Position ...
*
* @param ticket: ULONG ...
* @param position: XPosition instance ...
* @param comment: string ...
*/
void OnPositionForceClosed(
const ulong ticket,
const XPosition &position,
const string comment //
)
{
eaTradeManager.HandleForceClose(position);
}
/**
* Handle Position Partially Closed Event ...
*
* @param ticket: ULONG ...
* @param profit: double ...
* @param comment: string ...
*/
void OnPositionPartiallyClosed(
const ulong ticket,
const double profit,
const string comment //
)
{
eaTradeManager.HandlePartiallyClosed(
ticket,
profit,
comment //
);
}
/**
* Handle Deals Changes ...
*
* @param count: Integer, Number of Changes ...
*/
void OnDealsChanged(int count)
{
}
/**
* Handle Orders Changes ...
*
* @param count: Integer, Number of Changes ...
*/
void OnOrdersChanged(int count)
{
}
/**
* Handle Positions Changes ...
*
* @param count: Integer, Number of Changes ...
*/
void OnPositionsChanged(int count)
{
}
//
// Custom Functions ...
/**
* Validate all Inputs of Expert Adviser ...
*
* @return ( bool )
*/
bool ValidateInputs()
{
//
bool result = false;
//
string errMessage = "";
//
bool isCommonValid = (
//
eaSlippage > 0 &&
eaMagicNumber > 0
//
);
if (!isCommonValid)
{
//
errMessage += "common configurations error;" + "\n";
}
//
result =
//
// Common ...
isCommonValid &&
//
// Otere ...
true
//
;
//
if (!result)
{
//
// Since here Logger not Initiallized, we Use Raw Print Command ...
Print(ShortName + " Errors: \n", errMessage);
}
//
return result;
}
/**
* Initialize Timer ...
*
* @return ( bool )
*/
bool InitTimer()
{
//
bool result = false;
//
// TODO: Initialize Timer if necessary ...
// result = EventSetTimer(1);
// result = EventSetMillisecondTimer(100);
result = true;
//
return result;
}
/**
* Destroy Timer ...
*/
void DestroyTimer()
{
//
// TODO: Use This ...
// EventKillTimer();
}
/**
* Initial Volume Manager Class Based on Given Configuration ...
*
* @return ( bool )
*/
bool InitVolume()
{
//
bool result = false;
//
eaVolume = new XCVolume();
//
result = eaVolume.Init(
eaVolumeSelect,
eaStaticVoluem,
eaDynamicVolumeStepBalance,
eaDynamicVolumeStepVolume,
eaConstantRiskBalance,
eaConstantPercent,
eaConstantBalance //
);
//
return result;
}
/**
* Initial Requirements of EA ...
*/
void InitRequirements()
{
//
// Initial Bar Tracker ...
eaBarTraker.Init(
_Symbol,
_Period //
);
//
// Preparing Tags ...
eaTag =
(IsValid(eaLogSuffix)
? eaLogSuffix + "_"
: "") +
ShortName;
//
eaAlert = new XCAlert();
eaAlert.SetPrefix(eaLogSuffix);
eaAlert.SetLogAlerts(eaLogAlerts);
eaAlert.SetMailAlerts(eaMailAlerts);
eaAlert.SetPushAlerts(eaPushAlerts);
eaAlert.SetEnableAlerts(eaEnableAlerts);
eaAlert.SetTerminalAlerts(eaTerminalAlerts);
//
// Objects ...
eaObjects = new CArrayObj();
//
// Configure XCA ...
eaInputs.Default();
//
// Hide all Visible Buffers ...
eaInputs.Hide();
//
// we Can make Show all requirements here ...
//
eaInputs.showPV = true;
eaInputs.showSar = true;
eaInputs.showTrend = true;
eaInputs.showATRBand = true;
eaInputs.showPVGolden = true;
//
eaHelper = new XCX121XCatbHelper();
bool isInited = eaHelper.Init(
_Symbol,
_Period,
eaInputs //
);
//
eaDrawer = new XCPOIDrawer();
eaBarAnalyser = new XCBarAnalyser();
//
// EA Trade ...
eaTrade = new XCTrade(
eaSlippage,
eaMagicNumber,
eaMaxAllowedSpread,
eaMaxAllowedPositions,
eaMaxAllowedDrawdownFactor //
);
eaTrade.AddOnStopLossEventHandler(OnStopLossTriggered);
eaTrade.AddOnTakeProfitEventHandler(OnTakeProfitTriggered);
eaTrade.AddOnForceClosePositionEventHandler(OnPositionForceClosed);
eaTrade.AddOnPartialClosePositionEventHandler(OnPositionPartiallyClosed);
//
// EA Trae Manager ...
eaTradeManager = new XCXCATBEATradeManager(
eaTrade //
);
//
eaTradeManager.SetAlertPrefix(eaTag);
eaTradeManager.SetAlertLogAlerts(eaLogAlerts);
eaTradeManager.SetAlertMailAlerts(eaMailAlerts);
eaTradeManager.SetAlertPushAlerts(eaPushAlerts);
eaTradeManager.SetAlertEnableAlerts(eaEnableAlerts);
eaTradeManager.SetAlertTerminalAlerts(eaTerminalAlerts);
//
eaTradeManager.SaveWins(eaSaveWins);
eaTradeManager.SaveLosts(eaSaveLosts);
eaTradeManager.SaveTrades(eaSaveTrades);
eaTradeManager.SaveSignals(eaSaveSignals);
//
// Setting Trade Reports ...
eaTradeManager
.SetTradeReports(
eaReportTrades,
eaReportSignals,
eaReportProtector,
eaReportAfterTradesBalance //
);
//
// Setting Trade Permissions ...
eaTradeManager
.SetTradePermissions(
eaAllowTrade,
eaAllowLongs,
eaAllowShorts //
);
//
// Setting Trade Restrictions ...
eaTradeManager
.SetTradeRestrictions(
eaRestrictionsPeriod,
eaMaxAllowedTPs,
eaMaxAllowedSLs,
eaMaxAllowedTrades //
);
//
// 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]);
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 ...
eaTradeManager
.SetTradeSession(
_Symbol,
iStart,
iEnd,
iName //
);
}
}
}
}
}
}
//
// Fill Validations ...
eaValidations.forceHasSwing = eaForceHasSwing;
eaValidations.forceOBBarType = eaForceOBBarType;
eaValidations.minRequiredOBBar = eaMinRequiredOBBar;
eaValidations.forceFVGBarType = eaForceFVGBarType;
eaValidations.liquidityLoopback = eaLiquidityLoopback;
eaValidations.maxAllowedRange = eaMaxAllowedRange;
eaValidations.minAllowedRange = eaMinAllowedRange;
eaValidations.forceHasFLiquidity = eaForceHasFLiquidity;
eaValidations.forceHasRLiquidity = eaForceHasRLiquidity;
eaValidations.validateGapSequence = eaValidateGapSequence;
eaValidations.minAllowedBlockLength = eaMinAllowedBlockLength;
eaValidations.validateBlockEdgeBreakout = eaValidateBlockEdgeBreakout;
//
// Fill Filters ...
//
eaFilters.filterBasedOnPV = eaFilterBasedOnPV;
eaFilters.bosLoopback = eaBosLoopback;
//
eaFilters.filterBasedOnSar = eaFilterBasedOnSar;
eaFilters.forceSarSwitched = eaForceSarSwitched;
eaFilters.forceSarOnBothSide = eaForceSarOnBothSide;
eaFilters.forceSarHasBreakout = eaForceSarHasBreakout;
eaFilters.forceSarHasReversalSide = eaForceSarHasReversalSide;
//
eaFilters.filterBasedOnRSI = eaFilterBasedOnRSI;
eaFilters.forceHasRSITrending = eaForceHasRSITrending;
eaFilters.forceHasRSIVPattern = eaForceHasRSIVPattern;
eaFilters.forceHasRSICrossing = eaForceHasRSICrossing;
//
eaFilters.filterBasedOnADX = eaFilterBasedOnADX;
eaFilters.forceHasADXTrending = eaForceHasADXTrending;
eaFilters.forceHasADXCrossing = eaForceHasADXCrossing;
//
eaFilters.filterBasedOnATR = eaFilterBasedOnATR;
eaFilters.forceHasATRTrending = eaForceHasATRTrending;
eaFilters.forceHasATRBreakout = eaForceHasATRBreakout;
//
eaFilters.filterBasedOnTrend = eaFilterBasedOnTrend;
eaFilters.forceHasTrendDir = eaForceHasTrendDir;
eaFilters.forceHasTrendPlace = eaForceHasTrendPlace;
eaFilters.forceHasTrendChange = eaForceHasTrendChange;
eaFilters.forceHasTrendTrending = eaForceHasTrendTrending;
eaFilters.forceHasTrendRejection = eaForceHasTrendRejection;
eaFilters.forceHasTrendLineInside = eaForceHasTrendLineInside;
eaFilters.forceHasTrendDirOnBothSide = eaForceHasTrendDirOnBothSide;
//
eaFilters.filterBasedOnDelta = eaFilterBasedOnDelta;
eaFilters.filterBasedOnVolume = eaFilterBasedOnVolume;
eaFilters.filterBasedOnSignalBar = eaFilterBasedOnSignalBar;
eaFilters.filterBasedOnHKSignalBar = eaFilterBasedOnHKSignalBar;
//
}
/**
* Handling Time Reporting ...
*/
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 ...
//
// if (r2r <= 1)
// {
// return;
// }
//
// XTarget iTarget;
// //
// // Partial Close 0.5 of Position on Reward 1 ...
// reward = risk * 1;
// iTarget.target =
// isLong
// ? signal.entry + reward
// : signal.entry - reward;
// iTarget.volumeMultiplier = 0.5;
// //
// AddRef(iTarget, signal.targets);
// iTarget.Clean();
// //
// if (r2r <= 2)
// {
// return;
// }
//
// Making Loop ...
// for (int i = 2; i < ((int)r2r - 1); i++)
// {
// //
// iTarget.Clean();
// //
// reward = i * risk;
// iTarget.target =
// isLong
// ? signal.entry + reward
// : signal.entry - reward;
// iTarget.volumeMultiplier = 1 / (r2r - 2);
// //
// AddRef(iTarget, signal.targets);
// }
//
// Sort Targets ...
ENUM_X_DIRECTION sortingDir =
isLong
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
ApplySortOnTargets(
sortingDir,
signal.targets //
);
}
//