900 lines
20 KiB
Plaintext
900 lines
20 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 Indicator
|
|
// -------------------------------------------------
|
|
// Name: XCXCAEASignaller ...
|
|
// Description: Class for XCAEA Signaller ...
|
|
//
|
|
//
|
|
// 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 Class for XCAEA Signaller"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../../Classes/x-saherelm.base.class.mq5"
|
|
#include "../../Classes/x-saherelm.x-cobject.class.mq5"
|
|
#include "../Classes/xcaea.x-poi.detector.class.mq5"
|
|
#include "../Classes/xcaea.x-poi.drawer.class.mq5"
|
|
#include "../Helpers/xcaea.helper.mq5"
|
|
#include "../Libraries/xcaea.signaller.lib.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
|
|
class XCXCAEASignaller : XCBase
|
|
{
|
|
//
|
|
// Public ...
|
|
public:
|
|
//
|
|
// Props ...
|
|
bool useGuards;
|
|
bool useTargets;
|
|
int poiLoopback;
|
|
XCAEAInputs inputs;
|
|
XBarTracker barTraker;
|
|
XCXCAEAHelper *helper;
|
|
XCXCAEAPOIDrawer *drawer;
|
|
bool continuesRFTillTarget;
|
|
XBoxZone unAvailableBoxes[];
|
|
XCXCAEAPOIDetector *detector;
|
|
XCAEAStrategyConditions mConditions;
|
|
XCAEAStrategyConditions mConditionsCollection[];
|
|
|
|
//
|
|
// Constructor ...
|
|
XCXCAEASignaller(
|
|
string _symbol,
|
|
ENUM_TIMEFRAMES _period //
|
|
)
|
|
{
|
|
//
|
|
symbol = _symbol;
|
|
period = _period;
|
|
|
|
//
|
|
Init();
|
|
}
|
|
|
|
//
|
|
// Deconstructor ...
|
|
~XCXCAEASignaller()
|
|
{
|
|
DeInit();
|
|
}
|
|
|
|
//
|
|
// Properties ...
|
|
|
|
/**
|
|
* Initialize ...
|
|
*/
|
|
void Init()
|
|
{
|
|
//
|
|
useGuards = false;
|
|
useTargets = true;
|
|
continuesRFTillTarget = false;
|
|
|
|
//
|
|
barTraker.Init(
|
|
symbol,
|
|
period //
|
|
);
|
|
|
|
//
|
|
inputs.Default();
|
|
|
|
//
|
|
// Configure Indicators ...
|
|
|
|
//
|
|
// XCC ...
|
|
inputs.ccInputs.showCandles = true;
|
|
|
|
//
|
|
// XCT ...
|
|
inputs.ctInputs.showCandleTime = true;
|
|
|
|
//
|
|
// XCA ...
|
|
|
|
//
|
|
inputs.caInputs.supResSmoothingLength = 7;
|
|
inputs.caInputs.supResSmoothingMode = X_MA_MODE_NONE;
|
|
|
|
//
|
|
inputs.x3maInputs.applyColor = true;
|
|
|
|
//
|
|
inputs.x3maInputs.fastLength = 5;
|
|
|
|
//
|
|
inputs.x3maInputs.showFast = false;
|
|
inputs.x3maInputs.showSlow = false;
|
|
inputs.x3maInputs.showMedium = false;
|
|
|
|
//
|
|
inputs.caInputs.showMAH = false;
|
|
inputs.caInputs.showMAL = false;
|
|
inputs.caInputs.showMAC = false;
|
|
inputs.caInputs.showSar = false;
|
|
inputs.caInputs.showSwings = true;
|
|
inputs.caInputs.showFiboLevel1 = false;
|
|
inputs.caInputs.showFiboLevel2 = false;
|
|
inputs.caInputs.showFiboLevel3 = false;
|
|
inputs.caInputs.showFiboLevel4 = false;
|
|
inputs.caInputs.showFiboLevel5 = false;
|
|
inputs.caInputs.showPeaksAndVales = true;
|
|
|
|
//
|
|
inputs.caInputs.showKI = false;
|
|
inputs.caInputs.showTKI = false;
|
|
inputs.caInputs.showVidya = false;
|
|
inputs.caInputs.showTrend = false;
|
|
inputs.caInputs.showPeakAndValeGolden = false;
|
|
inputs.caInputs.showSupportAndResistance = false;
|
|
|
|
//
|
|
// XOSCS ...
|
|
// inputs.oscsInputs.rsiLength = 5;
|
|
// inputs.oscsInputs.rsiOBLevel = 90;
|
|
// inputs.oscsInputs.rsiOSLevel = 10;
|
|
// inputs.oscsInputs.cciLength = 7;
|
|
// inputs.oscsInputs.cciOBLevel = 130;
|
|
// inputs.oscsInputs.cciOSLevel = -130;
|
|
// inputs.oscsInputs.mfiLength = 5;
|
|
// inputs.oscsInputs.rviLength = 5;
|
|
|
|
//
|
|
// Oscillators Views ...
|
|
inputs.showRSI = false;
|
|
inputs.showCCI = false;
|
|
inputs.showMFI = false;
|
|
inputs.showRVI = false;
|
|
inputs.showADX = false;
|
|
inputs.showMACD = false;
|
|
|
|
//
|
|
// XCAEA Helper ...
|
|
helper = new XCXCAEAHelper();
|
|
helper.Init(
|
|
symbol,
|
|
period,
|
|
inputs //
|
|
);
|
|
|
|
//
|
|
// Initialize and Configure Detector ...
|
|
detector = new XCXCAEAPOIDetector(helper);
|
|
|
|
//
|
|
// Common Configurations ...
|
|
detector.maxAllowedPivots = 0;
|
|
detector.pivotVerifications = 5;
|
|
detector.ticksDividerInPoints = 15;
|
|
detector.pivotDetectionLoopbac = 1000;
|
|
|
|
//
|
|
// Configure Detector ...
|
|
|
|
//
|
|
// PV ...
|
|
|
|
//
|
|
detector.maxAllowedPVLifetime = 0;
|
|
detector.applySwingsOnPVPivots = true;
|
|
detector.selectRejectedPVPivots = true;
|
|
detector.selectEngulfedPVPivots = true;
|
|
detector.applySupportAndResistanceOnPVPivots = true;
|
|
|
|
//
|
|
// PEAK ...
|
|
detector.detectPeakPivots = true;
|
|
|
|
//
|
|
// VALE ...
|
|
detector.detectValePivots = true;
|
|
|
|
//
|
|
// FVG ...
|
|
|
|
//
|
|
detector.selectSameBarFVGs = false;
|
|
detector.maxAllowedFVGLifetime = 0;
|
|
detector.validateFVGUsingPV = false;
|
|
detector.applyPVToFVGBoundary = false;
|
|
detector.selectRejectedFVGPivots = false;
|
|
detector.selectEngulfedFVGPivots = false;
|
|
detector.validateFVGUsingManalyser = true;
|
|
detector.applyLastBarToFVGBoundary = false;
|
|
detector.selectOnlyFVGWhichHasIndirectionalLastBar = true;
|
|
|
|
//
|
|
// Bullish ...
|
|
detector.detectFVGBullishPivots = true;
|
|
|
|
//
|
|
// Bearish ...
|
|
detector.detectFVGBearishPivots = true;
|
|
|
|
//
|
|
// TREND ...
|
|
|
|
//
|
|
detector.maxAllowedTrendLifetime = 0;
|
|
|
|
//
|
|
// Bullish ...
|
|
detector.detectTrendBullishPivots = true;
|
|
|
|
//
|
|
// Bearish ...
|
|
detector.detectTrendBearishPivots = true;
|
|
|
|
//
|
|
// DRAWER ...
|
|
|
|
//
|
|
// Initialize and Configure Drawer ...
|
|
drawer = new XCXCAEAPOIDrawer(detector);
|
|
|
|
//
|
|
drawer.ignoreUpdateOSCTos = true;
|
|
|
|
//
|
|
// Configure Drawer ...
|
|
drawer.drawPeakPivots = true;
|
|
drawer.drawValePivots = true;
|
|
drawer.drawFVGBullishPivots = true;
|
|
drawer.drawFVGBearishPivots = true;
|
|
drawer.drawTrendBullishPivots = true;
|
|
drawer.drawTrendBearishPivots = true;
|
|
|
|
//
|
|
// Configure Styles ...
|
|
|
|
//
|
|
// PV ...
|
|
|
|
//
|
|
// PEAK ...
|
|
XCAPivotStyle peakStyle;
|
|
peakStyle.width = 2;
|
|
peakStyle.clr = clrMagenta;
|
|
peakStyle.style = STYLE_SOLID;
|
|
drawer.peakPivotStyle = peakStyle;
|
|
peakStyle.Clean();
|
|
|
|
//
|
|
// VALE ...
|
|
XCAPivotStyle valeStyle;
|
|
valeStyle.width = 2;
|
|
valeStyle.clr = clrAqua;
|
|
valeStyle.style = STYLE_SOLID;
|
|
drawer.valePivotStyle = valeStyle;
|
|
valeStyle.Clean();
|
|
|
|
//
|
|
// FVG ...
|
|
|
|
//
|
|
// Bullish ...
|
|
XCAPivotStyle fvgBullishStyle;
|
|
fvgBullishStyle.width = 2;
|
|
fvgBullishStyle.clr = clrLime;
|
|
fvgBullishStyle.style = STYLE_DASH;
|
|
drawer.fvgBullishPivotStyle = fvgBullishStyle;
|
|
fvgBullishStyle.Clean();
|
|
|
|
//
|
|
// Bearish ...
|
|
XCAPivotStyle fvgBearishStyle;
|
|
fvgBearishStyle.width = 2;
|
|
fvgBearishStyle.clr = clrRed;
|
|
fvgBearishStyle.style = STYLE_DASH;
|
|
drawer.fvgBearishPivotStyle = fvgBearishStyle;
|
|
fvgBearishStyle.Clean();
|
|
|
|
//
|
|
// TREND ...
|
|
|
|
//
|
|
// Bullish ...
|
|
XCAPivotStyle trendBullishStyle;
|
|
trendBullishStyle.width = 2;
|
|
trendBullishStyle.clr = clrLime;
|
|
trendBullishStyle.style = STYLE_DOT;
|
|
drawer.trendBullishPivotStyle = trendBullishStyle;
|
|
trendBullishStyle.Clean();
|
|
|
|
//
|
|
// Bearish ...
|
|
XCAPivotStyle trendBearishStyle;
|
|
trendBearishStyle.width = 2;
|
|
trendBearishStyle.clr = clrRed;
|
|
trendBearishStyle.style = STYLE_DOT;
|
|
drawer.trendBearishPivotStyle = trendBearishStyle;
|
|
trendBearishStyle.Clean();
|
|
|
|
//
|
|
}
|
|
|
|
/**
|
|
* DeInitialize ...
|
|
*/
|
|
void DeInit()
|
|
{
|
|
//
|
|
inputs.Clean();
|
|
|
|
//
|
|
// Cleaning Draws ...
|
|
drawer.Clear();
|
|
|
|
//
|
|
ZeroMemory(drawer);
|
|
ZeroMemory(helper);
|
|
ZeroMemory(detector);
|
|
|
|
//
|
|
mConditions.Clean();
|
|
Clean(mConditionsCollection);
|
|
|
|
//
|
|
mObjects.Clear();
|
|
mBarObjects.Clear();
|
|
|
|
//
|
|
barTraker.Clean();
|
|
}
|
|
|
|
//
|
|
string GetSymbol()
|
|
{
|
|
return symbol;
|
|
}
|
|
|
|
//
|
|
ENUM_TIMEFRAMES GetPeriod()
|
|
{
|
|
return period;
|
|
}
|
|
|
|
//
|
|
// Signaller Tools ...
|
|
|
|
/**
|
|
* Detect Setup Conditions based on Signalling ...
|
|
*
|
|
* @param maxAllowedSLDistanceInPoint: int, Max Allowed SL Distance in Points (if Bigger thn Zero Provided) ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool DetectSignalSetup(
|
|
double tpReward = 3,
|
|
double maxAllowedSLDistanceInPoint = 100 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
// Check Bar Processing ...
|
|
if (!barTraker.CanProcessBar())
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool isBullish = false;
|
|
bool isBearish = false;
|
|
|
|
//
|
|
int zIndex = 0;
|
|
int cIndex = zIndex + 1;
|
|
int pIndex = cIndex + 1;
|
|
int ppIndex = pIndex + 1;
|
|
|
|
//
|
|
int loopback = 10;
|
|
|
|
//
|
|
int idx = -1;
|
|
int count = 0;
|
|
bool has = false;
|
|
|
|
//
|
|
double ask = GetAsk(symbol);
|
|
double bid = GetBid(symbol);
|
|
datetime cTime = TimeCurrent();
|
|
double points = GetPoints(symbol);
|
|
|
|
//
|
|
XOHCL zBar;
|
|
XOHCL cBar;
|
|
XOHCL pBar;
|
|
XOHCL pPBar;
|
|
result = zBar.Init(
|
|
symbol,
|
|
period,
|
|
zIndex //
|
|
);
|
|
result =
|
|
result &&
|
|
zBar.GetPreviousBar(cBar);
|
|
result =
|
|
result &&
|
|
cBar.GetPreviousBar(pBar);
|
|
result =
|
|
result &&
|
|
pBar.GetPreviousBar(pPBar);
|
|
if (!result)
|
|
{
|
|
//
|
|
zBar.Clean();
|
|
cBar.Clean();
|
|
pBar.Clean();
|
|
pPBar.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Setup Conditions ...
|
|
XBoxZone decisionZone;
|
|
bool hasDecisionZone = false;
|
|
XCAEAConditions conditions;
|
|
ENUM_X_DIRECTION decisionZoneDir = X_DIRECTION_NONE;
|
|
|
|
//
|
|
// Checking Signal's Decision Zone ...
|
|
hasDecisionZone = DetectDecisionZone(
|
|
helper,
|
|
drawer,
|
|
decisionZone,
|
|
decisionZoneDir,
|
|
conditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
|
|
//
|
|
// Make Signal Box UnAvailable ...
|
|
if (hasDecisionZone)
|
|
{
|
|
//
|
|
AddRef(
|
|
decisionZone,
|
|
unAvailableBoxes //
|
|
);
|
|
}
|
|
|
|
//
|
|
isBullish = hasDecisionZone &&
|
|
IsBullish(decisionZoneDir);
|
|
|
|
//
|
|
isBearish = hasDecisionZone &&
|
|
IsBearish(decisionZoneDir);
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (result)
|
|
{
|
|
//
|
|
// Do What we Want ...
|
|
barTraker.Waits();
|
|
|
|
//
|
|
// Prepare Conditions ...
|
|
mConditions.symbol = symbol;
|
|
mConditions.period = period;
|
|
mConditions.time = zBar.time;
|
|
mConditions.reward = tpReward;
|
|
mConditions.provider = "XCAEA";
|
|
mConditions.setupTime = zBar.time;
|
|
mConditions.dir = decisionZoneDir;
|
|
mConditions.conditions = conditions;
|
|
mConditions.decisionZone = decisionZone;
|
|
}
|
|
|
|
//
|
|
// Cleanup Resource ...
|
|
|
|
//
|
|
zBar.Clean();
|
|
cBar.Clean();
|
|
pBar.Clean();
|
|
pPBar.Clean();
|
|
|
|
//
|
|
conditions.Clean();
|
|
decisionZone.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Detect Trigger Conditions for Specified Signal ...
|
|
*
|
|
* @param conditions: XCAEAStrategyConditions instance Reference, Specified Signal Conditions ...
|
|
* @param maxAllowedSetupAge: specified Setup Age for Expiration (if bigger than Zero) ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool DetectSignalTrigger(
|
|
XCAEAStrategyConditions &conditions,
|
|
int barIndex = 0,
|
|
int maxAllowedSetupAge = 200 //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
barIndex = NormalizeInt(barIndex, 0);
|
|
|
|
//
|
|
result = conditions.IsSetuped();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
datetime setupTime = conditions.setupTime;
|
|
ENUM_X_DIRECTION setupDir = conditions.dir;
|
|
|
|
//
|
|
helper.GetConditions(
|
|
conditions.conditions,
|
|
barIndex //
|
|
);
|
|
|
|
//
|
|
bool isBullish = IsBullish(setupDir);
|
|
bool isBearish = IsBearish(setupDir);
|
|
|
|
//
|
|
int zIndex = 0;
|
|
int cIndex = zIndex + 1;
|
|
int pIndex = cIndex + 1;
|
|
int ppIndex = pIndex + 1;
|
|
|
|
//
|
|
int loopback = 10;
|
|
|
|
//
|
|
double ask = GetAsk(symbol);
|
|
double bid = GetBid(symbol);
|
|
datetime cTime = TimeCurrent();
|
|
double points = GetPoints(symbol);
|
|
|
|
//
|
|
// Check Signal Validation ...
|
|
// IMPORTANT: since all Validations done in SetUp Process ...
|
|
// here we only Execute Signal ...
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Checking Trigger Conditions ...
|
|
double sl = 0;
|
|
double tp = 0;
|
|
ENUM_X_DIRECTION triggerDir = X_DIRECTION_NONE;
|
|
|
|
//
|
|
// Checking Trigger Cond 0 ...
|
|
bool canTriggerCond0 = CanTriggerCond0(
|
|
helper,
|
|
conditions.decisionZone,
|
|
triggerDir,
|
|
sl,
|
|
tp,
|
|
barIndex //
|
|
);
|
|
|
|
//
|
|
// Checking Trigger Cond 1 ...
|
|
bool canTriggerCond1 = false;
|
|
// CanTriggerCond1(
|
|
// helper,
|
|
// conditions.decisionZone,
|
|
// triggerDir,
|
|
// sl,
|
|
// tp,
|
|
// barIndex //
|
|
// );
|
|
|
|
//
|
|
// Checking Trigger Cond 2 ...
|
|
bool canTriggerCond2 = false;
|
|
// CanTriggerCond2(
|
|
// helper,
|
|
// conditions.decisionZone,
|
|
// triggerDir,
|
|
// sl,
|
|
// tp,
|
|
// barIndex //
|
|
// );
|
|
|
|
//
|
|
// Update Signal Box To ...
|
|
conditions.decisionZone.to = cTime;
|
|
|
|
//
|
|
XCBoxObject *iObj;
|
|
bool has = helper.poiDrawer.DrawBox(
|
|
conditions.decisionZone,
|
|
iObj //
|
|
);
|
|
if (has)
|
|
{
|
|
mObjects.Add(iObj);
|
|
}
|
|
ZeroMemory(iObj);
|
|
|
|
//
|
|
// Summarizing Result ...
|
|
result =
|
|
canTriggerCond0 ||
|
|
canTriggerCond1 ||
|
|
canTriggerCond2;
|
|
|
|
//
|
|
isBullish = result &&
|
|
IsBullish(triggerDir);
|
|
isBearish = result &&
|
|
IsBearish(triggerDir);
|
|
|
|
//
|
|
// Configure Conditions for Preparing Signal ...
|
|
if (result)
|
|
{
|
|
//
|
|
// Reconfigure Position TP/SL Entry and etc ...
|
|
|
|
//
|
|
double entry = GetEntry(
|
|
conditions.symbol,
|
|
triggerDir //
|
|
);
|
|
conditions.entry = entry;
|
|
|
|
//
|
|
if (tp > 0.0)
|
|
{
|
|
//
|
|
Add(
|
|
tp,
|
|
conditions.targets //
|
|
);
|
|
}
|
|
|
|
//
|
|
double spred = GetSpread(conditions.symbol);
|
|
|
|
//
|
|
double risk = MathAbs(entry - sl) + spred;
|
|
double reward = (risk * conditions.reward);
|
|
tp =
|
|
isBullish
|
|
? entry + reward
|
|
: entry - reward;
|
|
|
|
//
|
|
// Handling RF ...
|
|
double rfReward = risk * 1.85;
|
|
double rfPrice =
|
|
isBullish
|
|
? entry + rfReward
|
|
: entry - rfReward;
|
|
Add(
|
|
rfPrice,
|
|
conditions.targets //
|
|
);
|
|
|
|
//
|
|
rfReward = risk * 2.85;
|
|
rfPrice =
|
|
isBullish
|
|
? entry + rfReward
|
|
: entry - rfReward;
|
|
Add(
|
|
rfPrice,
|
|
conditions.targets //
|
|
);
|
|
|
|
//
|
|
// Handling Partial Close ...
|
|
// conditions.partialCloseOnTPLevel = 1;
|
|
// conditions.partialCloseMultiplier = 0.5;
|
|
|
|
//
|
|
conditions.sl = sl;
|
|
conditions.tp = tp;
|
|
conditions.dir = triggerDir;
|
|
conditions.triggerTime = cTime;
|
|
conditions.type = isBullish
|
|
? X_POSITION_TYPE_LONG
|
|
: X_POSITION_TYPE_SHORT;
|
|
|
|
//
|
|
}
|
|
|
|
//
|
|
// Validating Conditions if not Triggered ...
|
|
if (!result)
|
|
{
|
|
//
|
|
// Check Box Age ...
|
|
int age = conditions.GetSetupAge();
|
|
bool has = age <= maxAllowedSetupAge;
|
|
if (!has)
|
|
{
|
|
conditions.Clean();
|
|
}
|
|
|
|
//
|
|
// Check Box Price ...
|
|
has = IsBoxBreaked(
|
|
helper,
|
|
conditions.decisionZone,
|
|
barIndex //
|
|
);
|
|
if (has)
|
|
{
|
|
conditions.Clean();
|
|
}
|
|
}
|
|
|
|
//
|
|
// Cleanup ...
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Detect Guards bsed on Signalling Class ...
|
|
*
|
|
* @param guards: XCAEAGuard instance Collection, Holds Provided Guards ...
|
|
* @param positions: XPosition instance Collection, Provides Signalling Based Positions for Apply Guards on them ...
|
|
* @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool DetectGuards(
|
|
XCAEAGuard &guards[],
|
|
const XPosition &positions[] //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Add Conditions to Conditions Collection if not Exists ...
|
|
*
|
|
* @param maxAllowed: int, Specified Max Allowed Holding Conditions ...
|
|
*
|
|
* @return ( int )
|
|
*/
|
|
int AddConditionsIfNotExists(
|
|
int maxAllowed = 10 //
|
|
)
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
bool isSetuped = IsValid(mConditions.setupTime) &&
|
|
HasDirection(mConditions.dir);
|
|
if (!isSetuped)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
int count = ArraySize(mConditionsCollection);
|
|
if (IsValidSize(count))
|
|
{
|
|
//
|
|
// Copy Original Items ...
|
|
XCAEAStrategyConditions tmpItems[];
|
|
Copy(
|
|
mConditionsCollection,
|
|
tmpItems //
|
|
);
|
|
|
|
//
|
|
// Prese Item Data ...
|
|
bool isBullish = IsBullish(mConditions.dir);
|
|
|
|
//
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
//
|
|
XCAEAStrategyConditions iItem = tmpItems[i];
|
|
|
|
//
|
|
bool canRemove = mConditions.dir == iItem.dir &&
|
|
mConditions.pivot == iItem.pivot;
|
|
if (canRemove)
|
|
{
|
|
//
|
|
ArrayRemove(
|
|
mConditionsCollection,
|
|
i,
|
|
1 //
|
|
);
|
|
}
|
|
}
|
|
|
|
//
|
|
Clean(tmpItems);
|
|
}
|
|
|
|
//
|
|
AddRef(
|
|
mConditions,
|
|
mConditionsCollection //
|
|
);
|
|
|
|
//
|
|
// Remove Olds ...
|
|
CleanupArray(
|
|
mConditionsCollection,
|
|
maxAllowed //
|
|
);
|
|
|
|
//
|
|
result = ArraySize(mConditionsCollection);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Protected ...
|
|
protected:
|
|
//
|
|
|
|
//
|
|
// Private ...
|
|
private:
|
|
//
|
|
// Props ...
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
CArrayObj mObjects;
|
|
CArrayObj mBarObjects;
|
|
|
|
//
|
|
};
|
|
|
|
// |