1059 lines
27 KiB
Plaintext
1059 lines
27 KiB
Plaintext
///////////////////////////////////////////////////////
|
|
//
|
|
// SaherElm IT Center MQL5 X121 SMC Signal Class
|
|
// -------------------------------------------------
|
|
// Name:
|
|
// Description: provide all Signalling functions ...
|
|
//
|
|
//
|
|
// Maintainer:
|
|
// ------------
|
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
|
//
|
|
//////////////////////////////////////////////////////
|
|
//
|
|
// Global Properties ...
|
|
#property library
|
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
|
#property link "https://www.saherelm.ir"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//
|
|
// Imports ...
|
|
#include "../Classes/x-121.smc.market.cycle.helper.class.mq5"
|
|
#include "../Libraries/x-121.smc.lib.mq5"
|
|
|
|
//
|
|
// Definitions ...
|
|
struct X121SMCStrategyXOEPVSignalConditions
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
double sl;
|
|
double target;
|
|
ENUM_X_DIRECTION dir;
|
|
ENUM_X_POSITION_TYPES type;
|
|
|
|
//
|
|
// Setup Props ...
|
|
|
|
//
|
|
datetime setupTime;
|
|
datetime triggerTime;
|
|
|
|
//
|
|
XCFVG *bullishOBs[];
|
|
XCFVG *bearishOBs[];
|
|
|
|
//
|
|
// Constructor ...
|
|
X121SMCStrategyXOEPVSignalConditions()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleaning Up ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
sl = 0;
|
|
target = 0;
|
|
|
|
//
|
|
dir = X_DIRECTION_NONE;
|
|
type = X_POSITION_TYPE_NONE;
|
|
|
|
//
|
|
symbol = NULL;
|
|
period = NULL;
|
|
setupTime = NULL;
|
|
triggerTime = NULL;
|
|
|
|
//
|
|
ExtensionClean();
|
|
}
|
|
|
|
/**
|
|
* Check Condition is Setting Up ...
|
|
*
|
|
* @param dir: ENUM_X_DIRECTION member, Setting Up Direction ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool IsSetuped()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = IsValid(setupTime) &&
|
|
HasDirection(dir);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Calculate Setup Age ...
|
|
*
|
|
* @return ( int )
|
|
*/
|
|
int GetSetupAge()
|
|
{
|
|
//
|
|
int result = 0;
|
|
|
|
//
|
|
if (!IsSetuped())
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = (int)(TimeCurrent() - setupTime) / PeriodSeconds(period);
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Detect How we Can Trigger Signal ...
|
|
*
|
|
* @return ( bool )
|
|
*/
|
|
bool CanTrigger()
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result =
|
|
//
|
|
sl > 0 &&
|
|
IsValid(symbol) &&
|
|
IsValid(period) &&
|
|
IsValid(triggerTime) &&
|
|
type != X_POSITION_TYPE_ALL &&
|
|
type != X_POSITION_TYPE_NONE
|
|
//
|
|
;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Extensions ...
|
|
|
|
/**
|
|
* Clean Additional Properties ...
|
|
*/
|
|
void ExtensionClean()
|
|
{
|
|
CleanOBs();
|
|
}
|
|
|
|
void CleanOBs()
|
|
{
|
|
//
|
|
Clean(bullishOBs);
|
|
Clean(bearishOBs);
|
|
}
|
|
|
|
int CountBullishOBs()
|
|
{
|
|
return ArraySize(bullishOBs);
|
|
}
|
|
|
|
bool HasBullishOBs()
|
|
{
|
|
return CountBullishOBs() >= 3;
|
|
}
|
|
|
|
int CountBearishOBs()
|
|
{
|
|
return ArraySize(bearishOBs);
|
|
}
|
|
|
|
bool HasBearishOBs()
|
|
{
|
|
return CountBearishOBs() >= 3;
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
//
|
|
// Extension Functions ...
|
|
|
|
//
|
|
// Detect Setup Conditions ...
|
|
bool DetectX121SMCXOEPVSiganlSetup(
|
|
string _symbol,
|
|
ENUM_TIMEFRAMES _period,
|
|
//
|
|
X121SMCStrategyXOEPVSignalConditions &conditions,
|
|
//
|
|
XC121SMCCycleHelper *triggerCycleHelper,
|
|
XC121SMCCycleHelper *decisionCycleHelper,
|
|
XC121SMCCycleHelper *analyseCycleHelper,
|
|
XC121SMCCycleHelper *verificationCycleHelper,
|
|
XC121SMCCycleHelper *consolidationCycleHelper,
|
|
XC121SMCCycleHelper *visionCycleHelper
|
|
//
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
bool isBullish = false;
|
|
bool isBearish = false;
|
|
|
|
//
|
|
int zIndex = 0;
|
|
int cIndex = zIndex + 1;
|
|
int pIndex = cIndex + 1;
|
|
int ppIndex = pIndex + 1;
|
|
|
|
//
|
|
int loopback = 10;
|
|
|
|
//
|
|
string symbol = _symbol;
|
|
ENUM_TIMEFRAMES period = _period;
|
|
|
|
//
|
|
conditions.symbol = symbol;
|
|
conditions.period = period;
|
|
|
|
//
|
|
XOHCL zBar;
|
|
result = zBar.Init(
|
|
symbol,
|
|
period,
|
|
zIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL cBar;
|
|
result = cBar.Init(
|
|
symbol,
|
|
period,
|
|
cIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double ask = GetAsk(symbol);
|
|
double bid = GetBid(symbol);
|
|
datetime cTime = TimeCurrent();
|
|
|
|
//
|
|
double ll = cBar.FindLowest(9, MODE_LOW);
|
|
double hh = cBar.FindHighest(9, MODE_HIGH);
|
|
|
|
//
|
|
int zoneValidationDivider = 10;
|
|
int validPivotRepetition = triggerCycleHelper.mX121Helper
|
|
.GetDonChainLength();
|
|
|
|
//
|
|
double selectedSL = 0;
|
|
|
|
//
|
|
// Cycles Conditions ...
|
|
|
|
//
|
|
// Trigger ...
|
|
ENUM_XPOI_EVENTS triggerPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS triggerCycleEvents[];
|
|
X121SMCCycleConditions triggerConditions;
|
|
result = triggerCycleHelper.GetConditions(
|
|
triggerCycleEvents,
|
|
triggerPoiEvents,
|
|
triggerConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Decision ...
|
|
ENUM_XPOI_EVENTS decisionPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
|
|
X121SMCCycleConditions decisionConditions;
|
|
result = decisionCycleHelper.GetConditions(
|
|
decisionCycleEvents,
|
|
decisionPoiEvents,
|
|
decisionConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Analyse ...
|
|
ENUM_XPOI_EVENTS analysePoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
|
|
X121SMCCycleConditions analyseConditions;
|
|
result = analyseCycleHelper.GetConditions(
|
|
analyseCycleEvents,
|
|
analysePoiEvents,
|
|
analyseConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Verification ...
|
|
ENUM_XPOI_EVENTS verificationPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS verificationCycleEvents[];
|
|
X121SMCCycleConditions verificationConditions;
|
|
result = verificationCycleHelper.GetConditions(
|
|
verificationCycleEvents,
|
|
verificationPoiEvents,
|
|
verificationConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Consolidation ...
|
|
ENUM_XPOI_EVENTS consolidationPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
|
|
X121SMCCycleConditions consolidationConditions;
|
|
result = consolidationCycleHelper.GetConditions(
|
|
consolidationCycleEvents,
|
|
consolidationPoiEvents,
|
|
consolidationConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Vision ...
|
|
ENUM_XPOI_EVENTS visionPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
|
|
X121SMCCycleConditions visionConditions;
|
|
result = visionCycleHelper.GetConditions(
|
|
visionCycleEvents,
|
|
visionPoiEvents,
|
|
visionConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Cycles POI States ...
|
|
XPOIState triggerState = triggerConditions.state;
|
|
XPOIState decisionState = decisionConditions.state;
|
|
XPOIState analyseState = analyseConditions.state;
|
|
XPOIState verificationState = verificationConditions.state;
|
|
XPOIState consolidationState = consolidationConditions.state;
|
|
XPOIState visionState = visionConditions.state;
|
|
|
|
//
|
|
// Setup Conditions ...
|
|
|
|
//
|
|
// Vision ...
|
|
|
|
//
|
|
double visionVWapFast = visionConditions.x121Conditions.vwapFastBuffer[1];
|
|
double visionVWapMid = visionConditions.x121Conditions.vwapMidBuffer[1];
|
|
double visionVWapSlow = visionConditions.x121Conditions.vwapSlowBuffer[1];
|
|
|
|
//
|
|
double visionVWapFastPrev = visionConditions.x121Conditions.vwapFastBuffer[2];
|
|
double visionVWapMidPrev = visionConditions.x121Conditions.vwapMidBuffer[2];
|
|
double visionVWapSlowPrev = visionConditions.x121Conditions.vwapSlowBuffer[2];
|
|
|
|
//
|
|
double visionVWaps[3] = {
|
|
visionVWapFast,
|
|
visionVWapMid,
|
|
visionVWapSlow,
|
|
};
|
|
double visionVWapMax = GetMax(visionVWaps);
|
|
double visionVWapMin = GetMin(visionVWaps);
|
|
|
|
//
|
|
bool isVisionVWapFastCrossedOverMid = visionVWapFast > visionVWapMid &&
|
|
!(visionVWapFastPrev > visionVWapMidPrev);
|
|
|
|
//
|
|
bool isVisionVWapFastCrossedUnderMid = visionVWapFast < visionVWapMid &&
|
|
!(visionVWapFastPrev < visionVWapMidPrev);
|
|
|
|
//
|
|
bool isVisionVWapBullishState = visionConditions.x121Conditions.isVWapBullishState;
|
|
bool isVisionVWapSwitchedToBullishState = visionConditions.x121Conditions.isVWapSwitchedToBullishState;
|
|
|
|
//
|
|
bool isVisionVWapBearishState = visionConditions.x121Conditions.isVWapBearishState;
|
|
bool isVisionVWapSwitchedToBearishState = visionConditions.x121Conditions.isVWapSwitchedToBearishState;
|
|
|
|
//
|
|
bool isVisionVWapBullishOrdered = visionConditions.x121Conditions.isVWapBullishOrdered;
|
|
bool isVisionVWapSwitchedToBullishOrdered = visionConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
|
|
|
|
//
|
|
bool isVisionVWapBearishOrdered = visionConditions.x121Conditions.isVWapBearishOrdered;
|
|
bool isVisionVWapSwitchedToBearishOrdered = visionConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isVisionVWapBullishFormed =
|
|
//
|
|
(isVisionVWapBullishOrdered ||
|
|
isVisionVWapSwitchedToBullishOrdered) &&
|
|
(isVisionVWapBullishState ||
|
|
isVisionVWapSwitchedToBullishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isVisionVWapBearishFormed =
|
|
//
|
|
(isVisionVWapBearishOrdered ||
|
|
isVisionVWapSwitchedToBearishOrdered) &&
|
|
(isVisionVWapBearishState ||
|
|
isVisionVWapSwitchedToBearishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Consolidation ...
|
|
|
|
//
|
|
double consolidationVWapFast = consolidationConditions.x121Conditions.vwapFastBuffer[1];
|
|
double consolidationVWapMid = consolidationConditions.x121Conditions.vwapMidBuffer[1];
|
|
double consolidationVWapSlow = consolidationConditions.x121Conditions.vwapSlowBuffer[1];
|
|
|
|
//
|
|
double consolidationVWapFastPrev = consolidationConditions.x121Conditions.vwapFastBuffer[2];
|
|
double consolidationVWapMidPrev = consolidationConditions.x121Conditions.vwapMidBuffer[2];
|
|
double consolidationVWapSlowPrev = consolidationConditions.x121Conditions.vwapSlowBuffer[2];
|
|
|
|
//
|
|
double consolidationVWaps[3] = {
|
|
consolidationVWapFast,
|
|
consolidationVWapMid,
|
|
consolidationVWapSlow,
|
|
};
|
|
double consolidationVWapMax = GetMax(consolidationVWaps);
|
|
double consolidationVWapMin = GetMin(consolidationVWaps);
|
|
|
|
//
|
|
bool isConsolidationVWapBullishState = consolidationConditions.x121Conditions.isVWapBullishState;
|
|
bool isConsolidationVWapSwitchedToBullishState = consolidationConditions.x121Conditions.isVWapSwitchedToBullishState;
|
|
|
|
//
|
|
bool isConsolidationVWapBearishState = consolidationConditions.x121Conditions.isVWapBearishState;
|
|
bool isConsolidationVWapSwitchedToBearishState = consolidationConditions.x121Conditions.isVWapSwitchedToBearishState;
|
|
|
|
//
|
|
bool isConsolidationVWapBullishOrdered = consolidationConditions.x121Conditions.isVWapBullishOrdered;
|
|
bool isConsolidationVWapSwitchedToBullishOrdered = consolidationConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
|
|
|
|
//
|
|
bool isConsolidationVWapBearishOrdered = consolidationConditions.x121Conditions.isVWapBearishOrdered;
|
|
bool isConsolidationVWapSwitchedToBearishOrdered = consolidationConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isConsolidationVWapBullishFormed =
|
|
//
|
|
(isConsolidationVWapBullishOrdered ||
|
|
isConsolidationVWapSwitchedToBullishOrdered) &&
|
|
(isConsolidationVWapBullishState ||
|
|
isConsolidationVWapSwitchedToBullishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isConsolidationVWapBearishFormed =
|
|
//
|
|
(isConsolidationVWapBearishOrdered ||
|
|
isConsolidationVWapSwitchedToBearishOrdered) &&
|
|
(isConsolidationVWapBearishState ||
|
|
isConsolidationVWapSwitchedToBearishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Verification ...
|
|
|
|
//
|
|
double verificationVWapFast = verificationConditions.x121Conditions.vwapFastBuffer[1];
|
|
double verificationVWapMid = verificationConditions.x121Conditions.vwapMidBuffer[1];
|
|
double verificationVWapSlow = verificationConditions.x121Conditions.vwapSlowBuffer[1];
|
|
|
|
//
|
|
double verificationVWapFastPrev = verificationConditions.x121Conditions.vwapFastBuffer[2];
|
|
double verificationVWapMidPrev = verificationConditions.x121Conditions.vwapMidBuffer[2];
|
|
double verificationVWapSlowPrev = verificationConditions.x121Conditions.vwapSlowBuffer[2];
|
|
|
|
//
|
|
double verificationVWaps[3] = {
|
|
verificationVWapFast,
|
|
verificationVWapMid,
|
|
verificationVWapSlow,
|
|
};
|
|
double verificationVWapMax = GetMax(verificationVWaps);
|
|
double verificationVWapMin = GetMin(verificationVWaps);
|
|
|
|
//
|
|
bool isVerificationVWapBullishState = verificationConditions.x121Conditions.isVWapBullishState;
|
|
bool isVerificationVWapSwitchedToBullishState = verificationConditions.x121Conditions.isVWapSwitchedToBullishState;
|
|
|
|
//
|
|
bool isVerificationVWapBearishState = verificationConditions.x121Conditions.isVWapBearishState;
|
|
bool isVerificationVWapSwitchedToBearishState = verificationConditions.x121Conditions.isVWapSwitchedToBearishState;
|
|
|
|
//
|
|
bool isVerificationVWapBullishOrdered = verificationConditions.x121Conditions.isVWapBullishOrdered;
|
|
bool isVerificationVWapSwitchedToBullishOrdered = verificationConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
|
|
|
|
//
|
|
bool isVerificationVWapBearishOrdered = verificationConditions.x121Conditions.isVWapBearishOrdered;
|
|
bool isVerificationVWapSwitchedToBearishOrdered = verificationConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isVerificationVWapBullishFormed =
|
|
//
|
|
(isVerificationVWapBullishOrdered ||
|
|
isVerificationVWapSwitchedToBullishOrdered) &&
|
|
(isVerificationVWapBullishState ||
|
|
isVerificationVWapSwitchedToBullishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isVerificationVWapBearishFormed =
|
|
//
|
|
(isVerificationVWapBearishOrdered ||
|
|
isVerificationVWapSwitchedToBearishOrdered) &&
|
|
(isVerificationVWapBearishState ||
|
|
isVerificationVWapSwitchedToBearishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Analyse ...
|
|
|
|
//
|
|
double analyseVWapFast = analyseConditions.x121Conditions.vwapFastBuffer[1];
|
|
double analyseVWapMid = analyseConditions.x121Conditions.vwapMidBuffer[1];
|
|
double analyseVWapSlow = analyseConditions.x121Conditions.vwapSlowBuffer[1];
|
|
|
|
//
|
|
double analyseVWapFastPrev = analyseConditions.x121Conditions.vwapFastBuffer[2];
|
|
double analyseVWapMidPrev = analyseConditions.x121Conditions.vwapMidBuffer[2];
|
|
double analyseVWapSlowPrev = analyseConditions.x121Conditions.vwapSlowBuffer[2];
|
|
|
|
//
|
|
double analyseVWaps[3] = {
|
|
analyseVWapFast,
|
|
analyseVWapMid,
|
|
analyseVWapSlow,
|
|
};
|
|
double analyseVWapMax = GetMax(analyseVWaps);
|
|
double analyseVWapMin = GetMin(analyseVWaps);
|
|
|
|
//
|
|
bool isAnalyseVWapBullishState = analyseConditions.x121Conditions.isVWapBullishState;
|
|
bool isAnalyseVWapSwitchedToBullishState = analyseConditions.x121Conditions.isVWapSwitchedToBullishState;
|
|
|
|
//
|
|
bool isAnalyseVWapBearishState = analyseConditions.x121Conditions.isVWapBearishState;
|
|
bool isAnalyseVWapSwitchedToBearishState = analyseConditions.x121Conditions.isVWapSwitchedToBearishState;
|
|
|
|
//
|
|
bool isAnalyseVWapBullishOrdered = analyseConditions.x121Conditions.isVWapBullishOrdered;
|
|
bool isAnalyseVWapSwitchedToBullishOrdered = analyseConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
|
|
|
|
//
|
|
bool isAnalyseVWapBearishOrdered = analyseConditions.x121Conditions.isVWapBearishOrdered;
|
|
bool isAnalyseVWapSwitchedToBearishOrdered = analyseConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isAnalyseVWapBullishFormed =
|
|
//
|
|
(isAnalyseVWapBullishOrdered ||
|
|
isAnalyseVWapSwitchedToBullishOrdered) &&
|
|
(isAnalyseVWapBullishState ||
|
|
isAnalyseVWapSwitchedToBullishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isAnalyseVWapBearishFormed =
|
|
//
|
|
(isAnalyseVWapBearishOrdered ||
|
|
isAnalyseVWapSwitchedToBearishOrdered) &&
|
|
(isAnalyseVWapBearishState ||
|
|
isAnalyseVWapSwitchedToBearishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Summary VWap ...
|
|
|
|
//
|
|
isBullish =
|
|
// isVisionVWapBullishFormed &&
|
|
isConsolidationVWapBullishFormed &&
|
|
isVerificationVWapBullishFormed &&
|
|
isAnalyseVWapBullishFormed;
|
|
|
|
//
|
|
isBearish =
|
|
// isVisionVWapBearishFormed &&
|
|
isConsolidationVWapBearishFormed &&
|
|
isVerificationVWapBearishFormed &&
|
|
isAnalyseVWapBearishFormed;
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
//
|
|
// Clean Conditions for Regenerate ...
|
|
conditions.CleanOBs();
|
|
return result;
|
|
}
|
|
|
|
//
|
|
conditions.setupTime = cTime;
|
|
conditions.dir =
|
|
isBullish
|
|
? X_DIRECTION_BULLISH
|
|
: X_DIRECTION_BEARISH;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Detect Trigger Conditions ...
|
|
bool DetectX121SMCXOEPVSiganlTrigger(
|
|
//
|
|
X121SMCStrategyXOEPVSignalConditions &conditions,
|
|
//
|
|
string _symbol,
|
|
ENUM_TIMEFRAMES _period,
|
|
//
|
|
XC121SMCCycleHelper *triggerCycleHelper,
|
|
XC121SMCCycleHelper *decisionCycleHelper,
|
|
XC121SMCCycleHelper *analyseCycleHelper,
|
|
XC121SMCCycleHelper *verificationCycleHelper,
|
|
XC121SMCCycleHelper *consolidationCycleHelper,
|
|
XC121SMCCycleHelper *visionCycleHelper,
|
|
//
|
|
int maxAllowedSetupAge = 60 //
|
|
//
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
result = conditions.IsSetuped();
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
datetime setupTime = conditions.setupTime;
|
|
ENUM_X_DIRECTION setupDir = conditions.dir;
|
|
|
|
//
|
|
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;
|
|
|
|
//
|
|
string symbol = _symbol;
|
|
ENUM_TIMEFRAMES period = _period;
|
|
|
|
//
|
|
XOHCL zBar;
|
|
result = zBar.Init(
|
|
symbol,
|
|
period,
|
|
zIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL cBar;
|
|
result = cBar.Init(
|
|
symbol,
|
|
period,
|
|
cIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
double ask = GetAsk(symbol);
|
|
double bid = GetBid(symbol);
|
|
datetime cTime = TimeCurrent();
|
|
|
|
//
|
|
double ll = cBar.FindLowest(9, MODE_LOW);
|
|
double hh = cBar.FindHighest(9, MODE_HIGH);
|
|
|
|
//
|
|
int zoneValidationDivider = 10;
|
|
int validPivotRepetition = triggerCycleHelper.mX121Helper
|
|
.GetDonChainLength();
|
|
|
|
//
|
|
double selectedSL = 0;
|
|
|
|
//
|
|
// Cycles Conditions ...
|
|
|
|
//
|
|
// Trigger ...
|
|
ENUM_XPOI_EVENTS triggerPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS triggerCycleEvents[];
|
|
X121SMCCycleConditions triggerConditions;
|
|
result = triggerCycleHelper.GetConditions(
|
|
triggerCycleEvents,
|
|
triggerPoiEvents,
|
|
triggerConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Decision ...
|
|
ENUM_XPOI_EVENTS decisionPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
|
|
X121SMCCycleConditions decisionConditions;
|
|
result = decisionCycleHelper.GetConditions(
|
|
decisionCycleEvents,
|
|
decisionPoiEvents,
|
|
decisionConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Analyse ...
|
|
ENUM_XPOI_EVENTS analysePoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
|
|
X121SMCCycleConditions analyseConditions;
|
|
result = analyseCycleHelper.GetConditions(
|
|
analyseCycleEvents,
|
|
analysePoiEvents,
|
|
analyseConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Verification ...
|
|
ENUM_XPOI_EVENTS verificationPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS verificationCycleEvents[];
|
|
X121SMCCycleConditions verificationConditions;
|
|
result = verificationCycleHelper.GetConditions(
|
|
verificationCycleEvents,
|
|
verificationPoiEvents,
|
|
verificationConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Consolidation ...
|
|
ENUM_XPOI_EVENTS consolidationPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
|
|
X121SMCCycleConditions consolidationConditions;
|
|
result = consolidationCycleHelper.GetConditions(
|
|
consolidationCycleEvents,
|
|
consolidationPoiEvents,
|
|
consolidationConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Vision ...
|
|
ENUM_XPOI_EVENTS visionPoiEvents[];
|
|
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
|
|
X121SMCCycleConditions visionConditions;
|
|
result = visionCycleHelper.GetConditions(
|
|
visionCycleEvents,
|
|
visionPoiEvents,
|
|
visionConditions,
|
|
zIndex,
|
|
loopback //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Cycles POI States ...
|
|
XPOIState triggerState = triggerConditions.state;
|
|
XPOIState decisionState = decisionConditions.state;
|
|
XPOIState analyseState = analyseConditions.state;
|
|
XPOIState verificationState = verificationConditions.state;
|
|
XPOIState consolidationState = consolidationConditions.state;
|
|
XPOIState visionState = visionConditions.state;
|
|
|
|
//
|
|
// Trigger Conditions ...
|
|
|
|
//
|
|
// Decision ...
|
|
|
|
//
|
|
double decisionVWapFast = decisionConditions.x121Conditions.vwapFastBuffer[1];
|
|
double decisionVWapMid = decisionConditions.x121Conditions.vwapMidBuffer[1];
|
|
double decisionVWapSlow = decisionConditions.x121Conditions.vwapSlowBuffer[1];
|
|
|
|
//
|
|
double decisionVWapFastPrev = decisionConditions.x121Conditions.vwapFastBuffer[2];
|
|
double decisionVWapMidPrev = decisionConditions.x121Conditions.vwapMidBuffer[2];
|
|
double decisionVWapSlowPrev = decisionConditions.x121Conditions.vwapSlowBuffer[2];
|
|
|
|
//
|
|
double decisionVWaps[3] = {
|
|
decisionVWapFast,
|
|
decisionVWapMid,
|
|
decisionVWapSlow,
|
|
};
|
|
double decisionVWapMax = GetMax(decisionVWaps);
|
|
double decisionVWapMin = GetMin(decisionVWaps);
|
|
|
|
//
|
|
bool isDecisionVWapBullishState = decisionConditions.x121Conditions.isVWapBullishState;
|
|
bool isDecisionVWapSwitchedToBullishState = decisionConditions.x121Conditions.isVWapSwitchedToBullishState;
|
|
|
|
//
|
|
bool isDecisionVWapBearishState = decisionConditions.x121Conditions.isVWapBearishState;
|
|
bool isDecisionVWapSwitchedToBearishState = decisionConditions.x121Conditions.isVWapSwitchedToBearishState;
|
|
|
|
//
|
|
bool isDecisionVWapBullishOrdered = decisionConditions.x121Conditions.isVWapBullishOrdered;
|
|
bool isDecisionVWapSwitchedToBullishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
|
|
|
|
//
|
|
bool isDecisionVWapBearishOrdered = decisionConditions.x121Conditions.isVWapBearishOrdered;
|
|
bool isDecisionVWapSwitchedToBearishOrdered = decisionConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isDecisionVWapBullishFormed =
|
|
//
|
|
(isDecisionVWapBullishOrdered ||
|
|
isDecisionVWapSwitchedToBullishOrdered) &&
|
|
(isDecisionVWapBullishState ||
|
|
isDecisionVWapSwitchedToBullishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isDecisionVWapBearishFormed =
|
|
//
|
|
(isDecisionVWapBearishOrdered ||
|
|
isDecisionVWapSwitchedToBearishOrdered) &&
|
|
(isDecisionVWapBearishState ||
|
|
isDecisionVWapSwitchedToBearishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Trigger ...
|
|
|
|
//
|
|
double triggerVWapFast = triggerConditions.x121Conditions.vwapFastBuffer[1];
|
|
double triggerVWapMid = triggerConditions.x121Conditions.vwapMidBuffer[1];
|
|
double triggerVWapSlow = triggerConditions.x121Conditions.vwapSlowBuffer[1];
|
|
|
|
//
|
|
double triggerVWapFastPrev = triggerConditions.x121Conditions.vwapFastBuffer[2];
|
|
double triggerVWapMidPrev = triggerConditions.x121Conditions.vwapMidBuffer[2];
|
|
double triggerVWapSlowPrev = triggerConditions.x121Conditions.vwapSlowBuffer[2];
|
|
|
|
//
|
|
double triggerVWaps[3] = {
|
|
triggerVWapFast,
|
|
triggerVWapMid,
|
|
triggerVWapSlow,
|
|
};
|
|
double triggerVWapMax = GetMax(triggerVWaps);
|
|
double triggerVWapMin = GetMin(triggerVWaps);
|
|
|
|
//
|
|
bool isTriggerVWapBullishState = triggerConditions.x121Conditions.isVWapBullishState;
|
|
bool isTriggerVWapSwitchedToBullishState = triggerConditions.x121Conditions.isVWapSwitchedToBullishState;
|
|
|
|
//
|
|
bool isTriggerVWapBearishState = triggerConditions.x121Conditions.isVWapBearishState;
|
|
bool isTriggerVWapSwitchedToBearishState = triggerConditions.x121Conditions.isVWapSwitchedToBearishState;
|
|
|
|
//
|
|
bool isTriggerVWapBullishOrdered = triggerConditions.x121Conditions.isVWapBullishOrdered;
|
|
bool isTriggerVWapSwitchedToBullishOrdered = triggerConditions.x121Conditions.isVWapSwitchedToBullishOrdered;
|
|
|
|
//
|
|
bool isTriggerVWapBearishOrdered = triggerConditions.x121Conditions.isVWapBearishOrdered;
|
|
bool isTriggerVWapSwitchedToBearishOrdered = triggerConditions.x121Conditions.isVWapSwitchedToBearishOrdered;
|
|
|
|
//
|
|
bool isTriggerVWapBullishFormed =
|
|
//
|
|
(isTriggerVWapBullishState &&
|
|
isTriggerVWapSwitchedToBullishOrdered) ||
|
|
(isTriggerVWapBullishOrdered &&
|
|
isTriggerVWapSwitchedToBullishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isTriggerVWapBearishFormed =
|
|
//
|
|
(isTriggerVWapBearishState &&
|
|
isTriggerVWapSwitchedToBearishOrdered) ||
|
|
(isTriggerVWapBearishOrdered &&
|
|
isTriggerVWapSwitchedToBearishState)
|
|
//
|
|
;
|
|
|
|
//
|
|
isBullish =
|
|
//
|
|
isBullish &&
|
|
isTriggerVWapBullishFormed &&
|
|
isDecisionVWapBullishFormed
|
|
//
|
|
;
|
|
|
|
//
|
|
isBearish =
|
|
//
|
|
isBearish &&
|
|
isTriggerVWapBearishFormed &&
|
|
isDecisionVWapBearishFormed
|
|
//
|
|
;
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
//
|
|
// Cleanup Setup Conditions ...
|
|
int setupAge = conditions.GetSetupAge();
|
|
if (IsValidSize(setupAge) &&
|
|
IsValidSize(maxAllowedSetupAge) &&
|
|
setupAge >= maxAllowedSetupAge)
|
|
{
|
|
conditions.Clean();
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
conditions.triggerTime = cTime;
|
|
conditions.sl = isBullish
|
|
? triggerVWapMin
|
|
: triggerVWapMax;
|
|
conditions.type = isBullish
|
|
? X_POSITION_TYPE_LONG
|
|
: X_POSITION_TYPE_SHORT;
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|