884 lines
22 KiB
Plaintext
884 lines
22 KiB
Plaintext
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Temp Test Strategy:
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//
|
|
// TODO: Remove this ...
|
|
XSMCStrategySetupConditions mTestConditions;
|
|
bool DetectTestSignal(
|
|
X121SMCStrategyConditions &conditions //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
string symbol = GetSymbol();
|
|
ENUM_TIMEFRAMES period = GetPeriod();
|
|
|
|
//
|
|
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV;
|
|
string providerStr = ToString(provider);
|
|
|
|
//
|
|
int zIndex = 0;
|
|
int cIndex = zIndex + 1;
|
|
int pIndex = cIndex + 1;
|
|
int ppIndex = pIndex + 1;
|
|
|
|
//
|
|
XOHCL zBar;
|
|
result = zBar.Init(
|
|
symbol,
|
|
period,
|
|
zIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL cBar;
|
|
result = cBar.Init(
|
|
symbol,
|
|
period,
|
|
cIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool isBullish = false;
|
|
bool isBearish = false;
|
|
|
|
//
|
|
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);
|
|
|
|
//
|
|
double selectedSL = 0;
|
|
|
|
//
|
|
X121SMCCycleConditions triggerConditions = conditions.triggerConditions;
|
|
X121SMCCycleConditions decisionConditions = conditions.decisionConditions;
|
|
X121SMCCycleConditions analyseConditions = conditions.analyseConditions;
|
|
X121SMCCycleConditions verificationConditions = conditions.verificationConditions;
|
|
X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions;
|
|
X121SMCCycleConditions visionConditions = conditions.visionConditions;
|
|
|
|
//
|
|
XPOIState triggerState = triggerConditions.state;
|
|
XPOIState decisionState = decisionConditions.state;
|
|
XPOIState analyseState = analyseConditions.state;
|
|
XPOIState verificationState = verificationConditions.state;
|
|
XPOIState consolidationState = consolidationConditions.state;
|
|
XPOIState visionState = visionConditions.state;
|
|
|
|
//
|
|
// Retrieve Peak and Vale ...
|
|
double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[0];
|
|
double triggerVale = triggerConditions.x121Conditions.valesBuffer[0];
|
|
|
|
//
|
|
int zoneValidationDivider = 10;
|
|
int validPivotRepetition = mTriggerCycleHelper.mX121Helper
|
|
.GetDonChainLength();
|
|
|
|
//
|
|
datetime setupTime = mTestConditions.setupTime;
|
|
bool isSetuped = mTestConditions.IsSetuped();
|
|
ENUM_X_DIRECTION setupDir = mTestConditions.dir;
|
|
if (!isSetuped)
|
|
{
|
|
//
|
|
// Detect Signal Setup ...
|
|
|
|
//
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Detect Trigger Conditions ...
|
|
bool canTrigger = mTestConditions.CanTrigger();
|
|
datetime triggerTime = mTestConditions.triggerTime;
|
|
result = canTrigger;
|
|
if (!canTrigger)
|
|
{
|
|
//
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
isBullish = IsBullish(setupDir);
|
|
isBearish = IsBearish(setupDir);
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
//
|
|
// Check Trigger Consitions ...
|
|
if (cTime - setupTime > 2400)
|
|
{
|
|
//
|
|
ClearDraws();
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mTestConditions.symbol = symbol;
|
|
mTestConditions.period = period;
|
|
mTestConditions.triggerTime = cTime;
|
|
mTestConditions.sl = isBullish
|
|
? 0
|
|
: 0;
|
|
mTestConditions.type = isBullish
|
|
? X_POSITION_TYPE_LONG
|
|
: X_POSITION_TYPE_SHORT;
|
|
|
|
//
|
|
canTrigger = mTestConditions.CanTrigger();
|
|
triggerTime = mTestConditions.triggerTime;
|
|
result = canTrigger;
|
|
if (!result)
|
|
{
|
|
//
|
|
// Check Trigger Consitions ...
|
|
if (cTime - setupTime > 2400)
|
|
{
|
|
//
|
|
ClearDraws();
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check Signal Direction ...
|
|
|
|
//
|
|
isBullish = IsBullish(setupDir);
|
|
isBearish = IsBearish(setupDir);
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
if (cTime - setupTime > 2400)
|
|
{
|
|
//
|
|
ClearDraws();
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
}
|
|
|
|
//
|
|
// Issues Signal on Conditions ...
|
|
conditions.signalDir = mTestConditions.dir;
|
|
conditions.provider = providerStr;
|
|
conditions.sl = mTestConditions.sl;
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Custom Providers Conditions ...
|
|
struct XSMCStrategySetupConditions
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
double sl;
|
|
ENUM_X_DIRECTION dir;
|
|
ENUM_X_POSITION_TYPES type;
|
|
|
|
//
|
|
// Setup Props ...
|
|
|
|
//
|
|
datetime setupTime;
|
|
datetime triggerTime;
|
|
|
|
//
|
|
// Trigger Props ...
|
|
|
|
//
|
|
// Constructor ...
|
|
XSMCStrategySetupConditions()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleaning Up ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
sl = 0;
|
|
|
|
//
|
|
dir = X_DIRECTION_NONE;
|
|
type = X_POSITION_TYPE_NONE;
|
|
|
|
//
|
|
symbol = NULL;
|
|
period = NULL;
|
|
setupTime = NULL;
|
|
triggerTime = NULL;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Consolidation Based Strategy:
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//
|
|
// TODO: Remove this ...
|
|
XSMCStrategySetupConditions mTestConditions;
|
|
bool DetectTestSignal(
|
|
X121SMCStrategyConditions &conditions //
|
|
)
|
|
{
|
|
//
|
|
bool result = false;
|
|
|
|
//
|
|
string symbol = GetSymbol();
|
|
ENUM_TIMEFRAMES period = GetPeriod();
|
|
|
|
//
|
|
ENUM_X_121_SMC_PROVIDERS provider = X_121_SMC_PROVIDER_SMPV;
|
|
string providerStr = ToString(provider);
|
|
|
|
//
|
|
int zIndex = 0;
|
|
int cIndex = zIndex + 1;
|
|
int pIndex = cIndex + 1;
|
|
int ppIndex = pIndex + 1;
|
|
|
|
//
|
|
XOHCL zBar;
|
|
result = zBar.Init(
|
|
symbol,
|
|
period,
|
|
zIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XOHCL cBar;
|
|
result = cBar.Init(
|
|
symbol,
|
|
period,
|
|
cIndex //
|
|
);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
bool isBullish = false;
|
|
bool isBearish = false;
|
|
|
|
//
|
|
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);
|
|
|
|
//
|
|
double selectedSL = 0;
|
|
|
|
//
|
|
X121SMCCycleConditions triggerConditions = conditions.triggerConditions;
|
|
X121SMCCycleConditions decisionConditions = conditions.decisionConditions;
|
|
X121SMCCycleConditions analyseConditions = conditions.analyseConditions;
|
|
X121SMCCycleConditions verificationConditions = conditions.verificationConditions;
|
|
X121SMCCycleConditions consolidationConditions = conditions.consolidationConditions;
|
|
X121SMCCycleConditions visionConditions = conditions.visionConditions;
|
|
|
|
//
|
|
XPOIState triggerState = triggerConditions.state;
|
|
XPOIState decisionState = decisionConditions.state;
|
|
XPOIState analyseState = analyseConditions.state;
|
|
XPOIState verificationState = verificationConditions.state;
|
|
XPOIState consolidationState = consolidationConditions.state;
|
|
XPOIState visionState = visionConditions.state;
|
|
|
|
//
|
|
// Retrieve Peak and Vale ...
|
|
double triggerPeak = triggerConditions.x121Conditions.peaksBuffer[0];
|
|
double triggerVale = triggerConditions.x121Conditions.valesBuffer[0];
|
|
|
|
//
|
|
int zoneValidationDivider = 10;
|
|
int validPivotRepetition = mTriggerCycleHelper.mX121Helper
|
|
.GetDonChainLength();
|
|
|
|
//
|
|
XOHCL breakerBar;
|
|
bool hasZone = false;
|
|
XPVPivotPoint validPeak;
|
|
XPVPivotPoint validVale;
|
|
bool canTrigger = false;
|
|
bool hasValidPeak = false;
|
|
bool hasValidVale = false;
|
|
datetime setupTime = NULL;
|
|
bool isZoneBreaked = false;
|
|
bool hasConsolidation = false;
|
|
XConsolidationZone consolidation;
|
|
|
|
//
|
|
setupTime = mTestConditions.setupTime;
|
|
bool isSetuped = mTestConditions.IsSetuped();
|
|
ENUM_X_DIRECTION setupDir = mTestConditions.dir;
|
|
if (!isSetuped)
|
|
{
|
|
//
|
|
bool isNewPeak = triggerConditions.x121Conditions.isNewPeak;
|
|
bool isNewVale = triggerConditions.x121Conditions.isNewVale;
|
|
bool isNewPivot = isNewPeak ||
|
|
isNewVale;
|
|
result = isNewPivot;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mTestConditions.peak = triggerPeak;
|
|
mTestConditions.vale = triggerVale;
|
|
hasConsolidation = Contains(
|
|
CONSOLIDATION_BREAKED_DETECTED,
|
|
mTriggerCycleEvents //
|
|
);
|
|
|
|
//
|
|
result = hasConsolidation;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
result = mTriggerCycleHelper
|
|
.GetLastConsolidationZone(consolidation);
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Validate Breaker Bar ...
|
|
result = consolidation.breakerBar
|
|
.GetPreviousBar(breakerBar);
|
|
|
|
//
|
|
// Find Momentum, Engulf Bar ...
|
|
|
|
//
|
|
// Engulfing ...
|
|
ENUM_X_DIRECTION engulfDir;
|
|
bool isEngulf = mTriggerCycleHelper.mBarAnalyser.IsEngulfBar(
|
|
breakerBar,
|
|
engulfDir //
|
|
);
|
|
|
|
//
|
|
// Momentum ...
|
|
ENUM_X_DIRECTION momentumDir;
|
|
bool isMomentum = mTriggerCycleHelper.mBarAnalyser.IsMomentumBar(
|
|
breakerBar,
|
|
momentumDir //
|
|
);
|
|
|
|
//
|
|
// Rejection ...
|
|
ENUM_X_DIRECTION rejectionDir;
|
|
bool isRejection = mTriggerCycleHelper.mBarAnalyser.IsRejectionBar(
|
|
breakerBar,
|
|
rejectionDir //
|
|
);
|
|
|
|
//
|
|
// Fibo Pressure ...
|
|
ENUM_X_DIRECTION fiboPresureDir;
|
|
bool hasFiboPressure = mTriggerCycleHelper.mBarAnalyser.HasFiboPressure(
|
|
breakerBar,
|
|
fiboPresureDir //
|
|
);
|
|
|
|
//
|
|
// Check Bar is Bullished ...
|
|
bool isBarBullish =
|
|
//
|
|
// Fibo Pressure ...
|
|
(hasFiboPressure &&
|
|
IsBullish(fiboPresureDir))
|
|
//
|
|
||
|
|
//
|
|
(
|
|
//
|
|
// Engulfing ...
|
|
(isEngulf &&
|
|
IsBullish(engulfDir))
|
|
//
|
|
||
|
|
//
|
|
// Momentum ...
|
|
(isMomentum &&
|
|
IsBullish(momentumDir))
|
|
//
|
|
||
|
|
//
|
|
// Rejection ...
|
|
(isRejection &&
|
|
IsBullish(rejectionDir))
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
// Check Bar is Bearish ...
|
|
bool isBarBearish =
|
|
//
|
|
// Fibo Pressure ...
|
|
(hasFiboPressure &&
|
|
IsBearish(fiboPresureDir))
|
|
//
|
|
||
|
|
//
|
|
(
|
|
//
|
|
// Engulfing ...
|
|
(isEngulf &&
|
|
IsBearish(engulfDir))
|
|
//
|
|
||
|
|
//
|
|
// Momentum ...
|
|
(isMomentum &&
|
|
IsBearish(momentumDir))
|
|
//
|
|
||
|
|
//
|
|
// Rejection ...
|
|
(isRejection &&
|
|
IsBearish(rejectionDir))
|
|
//
|
|
)
|
|
//
|
|
;
|
|
|
|
//
|
|
bool isBarPassed = isBarBullish ||
|
|
isBarBearish;
|
|
result = isBarPassed;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
isBullish =
|
|
//
|
|
isBarBullish &&
|
|
IsBullish(consolidation.breakDirection)
|
|
//
|
|
;
|
|
|
|
//
|
|
isBearish =
|
|
//
|
|
isBarBearish &&
|
|
IsBearish(consolidation.breakDirection)
|
|
//
|
|
;
|
|
|
|
//
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
//
|
|
XCConsolidationZoneObject *iConsolidationObj;
|
|
iConsolidationObj = new XCConsolidationZoneObject();
|
|
bool isCreated = iConsolidationObj.Create(
|
|
mPOIDrawer.ChartIdentification(),
|
|
mPOIDrawer.SubWindowIdentification(),
|
|
consolidation //
|
|
);
|
|
if (isCreated)
|
|
{
|
|
//
|
|
iConsolidationObj.ZoneWidth(2);
|
|
iConsolidationObj.ZoneColor(clrLightBlue);
|
|
|
|
//
|
|
AddObjectIfNotExists(iConsolidationObj);
|
|
}
|
|
|
|
//
|
|
isSetuped = true;
|
|
setupTime = cTime;
|
|
mTestConditions.setupTime = setupTime;
|
|
setupDir = consolidation.breakDirection;
|
|
mTestConditions.dir = setupDir;
|
|
}
|
|
|
|
//
|
|
// Detect Trigger Conditions ...
|
|
canTrigger = mTestConditions.CanTrigger();
|
|
datetime triggerTime = mTestConditions.triggerTime;
|
|
if (!canTrigger)
|
|
{
|
|
//
|
|
isBullish = IsBullish(setupDir);
|
|
isBearish = IsBearish(setupDir);
|
|
result = isBullish ||
|
|
isBearish;
|
|
if (!result)
|
|
{
|
|
//
|
|
// Check Trigger Consitions ...
|
|
if (cTime - setupTime > 2400)
|
|
{
|
|
//
|
|
ClearDraws();
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
//
|
|
mTestConditions.symbol = symbol;
|
|
mTestConditions.period = period;
|
|
mTestConditions.triggerTime = cTime;
|
|
mTestConditions.sl = isBullish
|
|
? consolidation.lower
|
|
: consolidation.upper;
|
|
mTestConditions.type = isBullish
|
|
? X_POSITION_TYPE_LONG
|
|
: X_POSITION_TYPE_SHORT;
|
|
|
|
//
|
|
canTrigger = mTestConditions.CanTrigger();
|
|
triggerTime = mTestConditions.triggerTime;
|
|
result = canTrigger;
|
|
if (!result)
|
|
{
|
|
//
|
|
// Check Trigger Consitions ...
|
|
if (cTime - setupTime > 2400)
|
|
{
|
|
//
|
|
ClearDraws();
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
}
|
|
|
|
//
|
|
return result;
|
|
}
|
|
}
|
|
|
|
//
|
|
if (cTime - setupTime > 2400)
|
|
{
|
|
//
|
|
ClearDraws();
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
}
|
|
|
|
//
|
|
// Issues Signal on Conditions ...
|
|
conditions.signalDir = mTestConditions.dir;
|
|
conditions.provider = providerStr;
|
|
conditions.sl = mTestConditions.sl;
|
|
|
|
//
|
|
mTestConditions.Clean();
|
|
|
|
//
|
|
return result;
|
|
}
|
|
|
|
//
|
|
// Custom Providers Conditions ...
|
|
struct XSMCStrategySetupConditions
|
|
{
|
|
//
|
|
// Props ...
|
|
|
|
//
|
|
string symbol;
|
|
ENUM_TIMEFRAMES period;
|
|
|
|
//
|
|
double sl;
|
|
ENUM_X_DIRECTION dir;
|
|
ENUM_X_POSITION_TYPES type;
|
|
|
|
//
|
|
// Setup Props ...
|
|
|
|
//
|
|
datetime setupTime;
|
|
datetime triggerTime;
|
|
XConsolidationZone zone;
|
|
XConsolidationZone consolidation;
|
|
|
|
//
|
|
double peak;
|
|
double vale;
|
|
XPVPivotPoint validPeak;
|
|
XPVPivotPoint validVale;
|
|
|
|
//
|
|
// Trigger Props ...
|
|
|
|
//
|
|
// Constructor ...
|
|
XSMCStrategySetupConditions()
|
|
{
|
|
Clean();
|
|
}
|
|
|
|
//
|
|
// Tools ...
|
|
|
|
/**
|
|
* Cleaning Up ...
|
|
*/
|
|
void Clean()
|
|
{
|
|
//
|
|
sl = 0;
|
|
|
|
//
|
|
zone.Clean();
|
|
consolidation.Clean();
|
|
dir = X_DIRECTION_NONE;
|
|
type = X_POSITION_TYPE_NONE;
|
|
|
|
//
|
|
symbol = NULL;
|
|
period = NULL;
|
|
setupTime = NULL;
|
|
triggerTime = NULL;
|
|
|
|
//
|
|
peak = 0;
|
|
vale = 0;
|
|
validPeak.Clean();
|
|
validVale.Clean();
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
//
|
|
// Helpers ...
|
|
|
|
void UpdateZone()
|
|
{
|
|
//
|
|
if (!zone.IsValid() ||
|
|
!validPeak.IsValid() ||
|
|
!validVale.IsValid())
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
zone.upper = validPeak.value;
|
|
zone.lower = validVale.value;
|
|
|
|
//
|
|
zone.Update();
|
|
|
|
//
|
|
if (consolidation.IsValid())
|
|
{
|
|
consolidation.Update();
|
|
}
|
|
}
|
|
|
|
//
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Consolidation Based Strategy:
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|