Files
MQL5Data/Documents/BKP/x-121.smc.market.cycle.helper.class.mq5
T

4034 lines
110 KiB
Plaintext

///////////////////////////////////////////////////////
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XC121SMCCycleHelper
// Description: provides all based classes for use ...
//
//
// 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-saherelm.x-bar.analyser.class.mq5"
#include "../../Classes/x-saherelm.x-poi.class.mq5"
#include "../Libraries/x-121.smc.lib.mq5"
//
// Definitions ...
//
// Implementations ...
//
// Cycles Enumeration ...
enum ENUM_X_CYCLES
{
X_CYCLE_NONE,
X_CYCLE_TRIGGER,
X_CYCLE_DECISION,
X_CYCLE_ANALYSE,
X_CYCLE_VERIFICATION,
X_CYCLE_CONSOLIDATION,
X_CYCLE_VISION,
};
//
// String Representation of Cycles Enumeration ...
string ToString(ENUM_X_CYCLES value)
{
//
string result = EnumToString(value);
//
StringReplace(result, "X_CYCLE_", "");
//
return result;
}
//
// Validate a Cycle ...
bool IsValid(ENUM_X_CYCLES value)
{
//
bool result = false;
//
result =
value != X_CYCLE_NONE;
//
return result;
}
//
// Cycle Events Enumeration ...
enum ENUM_X_CYCLE_EVENTS
{
SAR_CHANGE_DETECTED,
NEW_PEAK_DETECTED,
NEW_VALE_DETECTED,
PIVOT_POINT_DETECTED,
VWAP_ORDER_CHANGE_ETECTED,
VWAP_STATE_CHANGE_DETCTED,
CONSOLIDATION_BREAKED_DETECTED,
PEAK_PIVOT_STARTED,
PEAK_PIVOT_ENDED,
VALE_PIVOT_STARTED,
VALE_PIVOT_ENDED,
};
//
// Cycle Helper ...
class XC121SMCCycleHelper : public XCBase
{
//
public:
//
// Props ...
//
// X121 ...
XCX121Helper *mX121Helper;
//
// POI Detector ...
XCPOIDrawer *mPOIDrawer;
XCPOIDetector *mPOIDetector;
//
// Bar Analyser
XCBarAnalyser *mBarAnalyser;
//
// Constructor(s) ...
XC121SMCCycleHelper()
{
Default();
}
//
// Deconstructor ...
~XC121SMCCycleHelper()
{
DeInit();
}
//
// Getter/Setter(s) ...
//
// Actions ...
/**
* Initialize ...
*
* @param symbol: String ...
* @param period: ENUM_TIMEFRAMES member ...
* @param x121Inputs: X121Inputs instance ...
*
* @return ( bool )
*/
bool Init(
string symbol,
ENUM_TIMEFRAMES period,
X121Inputs &x121Inputs,
int requiredPOIs = 50 //
)
{
//
bool result = false;
//
if (requiredPOIs < 0)
{
requiredPOIs = 0;
}
//
result = IsValid(symbol) &&
IsValid(period);
if (!result)
{
return result;
}
//
mSymbol = symbol;
mPeriod = period;
//
// X121 ...
mX121Helper = new XCX121Helper();
result = mX121Helper.Init(
symbol,
period,
x121Inputs //
);
if (!result)
{
return result;
}
//
mPOIDetector = new XCPOIDetector(
symbol,
period //
);
mPOIDetector.MaxRequiredPOIs(requiredPOIs);
//
int maxLoopbackBars = mPOIDetector.MaxAllowedLoopbackForInit();
int periodSeconds = PeriodSeconds(period);
if (periodSeconds > PeriodSeconds(PERIOD_M15))
{
//
int multiplier = periodSeconds / PeriodSeconds(PERIOD_M15);
//
if (multiplier >= 1)
{
maxLoopbackBars *= 2;
}
}
mPOIDetector.MaxAllowedLoopbackForInit(maxLoopbackBars);
mPOIDetector.Init();
//
// Initialize Bar Analyser Class Instance ...
mBarAnalyser = new XCBarAnalyser();
//
// Initial and Configure POI Drawer if Required ...
mPOIDrawer = new XCPOIDrawer();
mPOIDrawer.ChartIdentification(0);
mPOIDrawer.SubWindowIdentification(0);
//
mPOIDrawer.DemandZoneFill(false);
mPOIDrawer.SupplyZoneFill(false);
mPOIDrawer.BullishFVGFill(false);
mPOIDrawer.BearishFVGFill(false);
mPOIDrawer.SupportZoneFill(false);
mPOIDrawer.ResistanceZoneFill(false);
mPOIDrawer.BullishOrderBlockFill(false);
mPOIDrawer.BearishOrderBlockFill(false);
//
// Set Chart Style ...
ApplyChartStyle();
//
return result;
}
/**
* Retrieve Symbol ...
*
* @return ( string )
*/
string GetSymbol()
{
return mSymbol;
}
/**
* Retrieve TimeFrame (Period) ...
*
* @return ( ENUM_TIMEFRAMES )
*/
ENUM_TIMEFRAMES GetPeriod()
{
return mPeriod;
}
/**
* Get Specified Bar ...
*
* @param source: XOHCL instance, Source Bar ...
* @param bar: XOHCL instance, Dest Bar ...
*
* @return ( bool )
*/
bool GetBar(
XOHCL &source,
XOHCL &bar //
)
{
//
bool result = false;
//
bar.Clean();
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
result =
IsValid(symbol) &&
IsValid(period) &&
source.IsValid();
if (!result)
{
return result;
}
//
int index = iBarShift(
symbol,
period,
source.time //
);
result = bar.Init(
symbol,
period,
index //
);
if (!result)
{
//
bar.Clean();
return result;
}
//
return result;
}
/**
* Retrieve Specified Bar ...
*
* @param bar: XOHCL instance ...
* @param index: Integer ...
*
* @return ( bool )
*/
bool GetBar(
XOHCL &bar,
int index = 0 //
)
{
//
bool result = false;
//
bar.Clean();
//
if (index < 0)
{
index = 0;
}
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
result = bar.Init(
symbol,
period,
index //
);
//
return result;
}
/**
* Retrieve Specified Bar ...
*
* @param bar: XOHCL instance ...
* @param time: Datetime ...
*
* @return ( bool )
*/
bool GetBar(
XOHCL &bar,
datetime time = NULL //
)
{
//
bool result = false;
//
int index = GetBarIndex(time);
result = GetBar(bar,
index //
);
//
return result;
}
/**
* Retrieve Specified Time Bar Index ...
*
* @param time: DateTime ...
*
* @return ( int )
*/
int GetBarIndex(datetime time = NULL)
{
//
int result = -1;
//
time = NormalizeTime(time);
//
string symbol = GetSymbol();
ENUM_TIMEFRAMES period = GetPeriod();
//
result = iBarShift(
symbol,
period,
time //
);
//
return result;
}
/**
* Retrieve Cycle Conditions ...
*
* @param events: ENUM_X_CYCLE_EVENTS member, Array ...
* @param conditions: X121SMCCycleConditions instance ...
* @param barIndex: Integer ...
* @param loopback: Integer ...
*
* @return ( bool )
*/
bool GetConditions(
ENUM_X_CYCLE_EVENTS &events[],
ENUM_XPOI_EVENTS &poiEvents[],
X121SMCCycleConditions &conditions,
int barIndex = 0,
int loopback = 7 //
)
{
//
bool result = false;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
if (loopback < 5)
{
loopback = 5;
}
//
Clean(events);
Clean(poiEvents);
conditions.Clean();
//
result = mX121Helper.GetConditions(
conditions.x121Conditions,
barIndex,
loopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
//
mPOIDetector.Update(poiEvents);
mPOIDetector.GetState(conditions.state);
//
conditions.symbol = GetSymbol();
conditions.period = GetPeriod();
conditions.time = TimeCurrent();
//
// Update();
//
result = conditions.IsValid();
//
return result;
}
//
bool GeneratePVBox(
XBoxZone &box,
int barIndex = 0 //
)
{
//
bool result = false;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
box.Clean();
box.symbol = GetSymbol();
box.period = GetPeriod();
//
int index = barIndex;
//
// Peak ...
datetime peaksSameFrom = NULL;
double peak = mX121Helper.xpvHelper.GetPeak(index);
double prevPeak = mX121Helper.xpvHelper.GetPeak(index + 1);
bool startsByPeak = peak == prevPeak;
//
// Vale ...
datetime valesSameFrom = NULL;
double vale = mX121Helper.xpvHelper.GetVale(index);
double prevVale = mX121Helper.xpvHelper.GetVale(index + 1);
bool startsByVale =
!startsByPeak &&
vale == prevVale;
//
bool canBreak = false;
while (!canBreak)
{
//
index++;
//
datetime cTime = iTime(
box.symbol,
box.period,
index //
);
//
// Peak ...
double iPeak = mX121Helper.xpvHelper.GetPeak(index);
//
// Vale ...
double iVale = mX121Helper.xpvHelper.GetVale(index);
//
// Start By Peak or Value ...
bool isSame = false;
if (startsByPeak)
{
//
isSame = iPeak == peak;
bool canSetVale = vale == 0
? true
: iVale > vale;
if (canSetVale)
{
vale = iVale;
}
}
else if (startsByVale)
{
//
isSame = iVale == vale;
bool canSetPeak = peak == 0
? true
: iPeak < peak;
if (canSetPeak)
{
peak = iPeak;
}
}
//
if (isSame)
{
//
box.from = cTime;
box.upper = peak;
box.lower = vale;
}
else if (IsValid(box.from))
{
//
// Complete Box ...
box.to = iTime(
box.symbol,
box.period,
barIndex //
);
//
box.type = "XPVBox";
box.dir = startsByPeak
? X_DIRECTION_BEARISH
: startsByVale
? X_DIRECTION_BULLISH
: X_DIRECTION_NONE;
}
//
canBreak = !isSame;
}
//
result = box.IsValid();
if (!result)
{
box.Clean();
}
//
return result;
}
//
int DetectRejections(
XBoxZone &rejections[],
int barIndex = 0,
bool forceBarType = true,
bool forceFiboPressure = true,
bool forceUnUsedRejections = true,
int maxAllowedLoopback = 587 //
)
{
//
int result = 0;
//
// Normalize Args ...
Clean(rejections);
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int idx = -1;
bool has = false;
for (int i = barIndex + 1; i < barIndex + maxAllowedLoopback; i++)
{
//
// Init Indexed Bar ...
XOHCL iBar;
XOHCL iCBar;
XOHCL iPBar;
has = GetBar(iBar, i);
has =
has &&
iBar.GetPreviousBar(iCBar);
has =
has &&
iCBar.GetPreviousBar(iPBar);
if (!has)
{
//
iBar.Clean();
iCBar.Clean();
iPBar.Clean();
break;
}
//
// Check CBar Bullish Fibo Pressure ...
bool cBarHasBullishFiboPressure =
mBarAnalyser
.HasFiboPressure(
iCBar,
X_DIRECTION_BULLISH,
X_FIBO_LEVEL_382 //
);
//
// Check CBar Bearish Fibo Pressure ...
bool cBarHasBearishFiboPressure =
mBarAnalyser
.HasFiboPressure(
iCBar,
X_DIRECTION_BEARISH,
X_FIBO_LEVEL_382 //
);
//
// Check Bar is Bullish Rejection Swing ...
bool isBullishRejection =
//
iCBar.low < iBar.low &&
iCBar.low < iPBar.low &&
//
iCBar.low < iCBar.GetDown() &&
iCBar.GetLowShadow() > iCBar.GetBody() &&
iCBar.GetLowShadow() > iCBar.GetHighShadow()
//
;
//
// Check Bar is Bearish Rejection Swing ...
bool isBearishRejection =
//
iCBar.high > iBar.high &&
iCBar.high > iPBar.high &&
//
iCBar.high > iCBar.GetUp() &&
iCBar.GetHighShadow() > iCBar.GetBody() &&
iCBar.GetHighShadow() > iCBar.GetLowShadow()
//
;
//
// Apply Fibo Pressure ...
if (forceFiboPressure)
{
//
isBullishRejection =
isBullishRejection &&
cBarHasBullishFiboPressure;
//
isBearishRejection =
isBearishRejection &&
cBarHasBearishFiboPressure;
}
//
// Apply Force Bar Type ...
if (forceBarType)
{
//
isBullishRejection =
isBullishRejection &&
iCBar.IsBullish();
//
isBearishRejection =
isBearishRejection &&
iCBar.IsBearish();
}
//
// Summarize Result ...
has = isBullishRejection ||
isBearishRejection;
if (has)
{
//
XBoxZone iBox;
//
iBox.to = iBar.time;
iBox.from = iCBar.time;
iBox.period = iBar.period;
iBox.symbol = iBar.symbol;
//
iBox.dir =
isBullishRejection
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
iBox.upper =
isBullishRejection
? iCBar.GetDown()
: iCBar.high;
//
iBox.lower =
isBullishRejection
? iCBar.low
: iCBar.GetUp();
//
iBox.type =
isBullishRejection
? "XSwingLow"
: "XSwingHigh";
//
// Validate Box ...
has = iBox.IsValid();
if (has)
{
//
// Apply Force Unused Rejections ...
if (forceUnUsedRejections)
{
//
has = !IsBoxBreaked(
iBox,
iCBar.Index() + 1,
barIndex //
);
}
//
if (has)
{
//
idx = FindIndex(
iBox,
rejections //
);
has = !IsValidIndex(idx);
if (has)
{
//
AddRef(
iBox,
rejections //
);
}
}
}
//
iBox.Clean();
}
//
iBar.Clean();
iCBar.Clean();
iPBar.Clean();
}
//
result = ArraySize(rejections);
//
return result;
}
//
// Virtuals ...
/**
* Set Default Properties Values ...
*/
virtual void Default()
{
}
//
protected:
//
//
private:
//
// Props ...
string mSymbol;
ENUM_TIMEFRAMES mPeriod;
//
// Actions ...
/**
* Release All Resources ...
*/
void DeInit()
{
//
ZeroMemory(mX121Helper);
ZeroMemory(mPOIDetector);
ZeroMemory(mBarAnalyser);
//
delete mX121Helper;
delete mPOIDetector;
delete mBarAnalyser;
}
/**
* Apply Chart Style ...
*/
void ApplyChartStyle()
{
//
// Retrieve Current Chart ID ...
long chartId = ChartID();
//
ENUM_CHART_MODE mMode = CHART_CANDLES; // chart's mMode
bool mShowBidLine = true; // show bid line
bool mShowAskLine = true; // show ask line
bool mShowGrid = false; // show grids on chart
bool mShowVolumes = true; // show volumes
bool mShowTradeLevels = true; // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders)
bool mAutoScroll = true; // chart autoscroll
bool mQuickNavigation = true; // chart quick navigation state
color mForeGroundColor = clrWhite; // chart's foreground color
color mBackGroundColor = clrBlack; // chart's background color
color mUpColor = clrGreen; // Up Color
color mDownColor = clrRed; // Down Color
color mBullishColor = clrGreen; // Bullish color
color mBearishColor = clrRed; // Bearish color
color mGridColor = clrGray; // grid color
color mBidLineColor = clrGray; // bid line color
color mAskLineColor = clrRed; // ask line color
color mLineColor = clrLime; // line mMode and doji candlestick color
color mStopColor = clrGold; // Color of stop order levels (Stop Loss and Take Profit)
color mVolumesColor = clrGreen; // volumes color
//
ChartSetInteger(chartId, CHART_SHOW_BID_LINE, mShowBidLine);
ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, mShowAskLine);
ChartSetInteger(chartId, CHART_SHOW_GRID, mShowGrid);
ChartSetInteger(chartId, CHART_SHOW_VOLUMES, mShowVolumes);
ChartSetInteger(chartId, CHART_SHOW_TRADE_LEVELS, mShowTradeLevels);
ChartSetInteger(chartId, CHART_AUTOSCROLL, mAutoScroll);
ChartSetInteger(chartId, CHART_QUICK_NAVIGATION, mQuickNavigation);
ChartSetInteger(chartId, CHART_COLOR_FOREGROUND, mForeGroundColor);
ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, mBackGroundColor);
ChartSetInteger(chartId, CHART_COLOR_GRID, mGridColor);
ChartSetInteger(chartId, CHART_COLOR_BID, mBidLineColor);
ChartSetInteger(chartId, CHART_COLOR_ASK, mAskLineColor);
ChartSetInteger(chartId, CHART_COLOR_STOP_LEVEL, mStopColor);
ChartSetInteger(chartId, CHART_COLOR_VOLUME, mVolumesColor);
//
// For Enabling XCC ...
// ChartSetInteger(chartId, CHART_MODE, mMode);
// ChartSetInteger(chartId, CHART_COLOR_CHART_UP, mUpColor);
// ChartSetInteger(chartId, CHART_COLOR_CHART_DOWN, mDownColor);
// ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, mBullishColor);
// ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, mBearishColor);
// ChartSetInteger(chartId, CHART_COLOR_CHART_LINE, mLineColor);
}
//
};
//
// Signal Provider Data ...
struct X121SMCStrategySignalProviderData
{
//
// Props ...
//
// Trigger ...
XPOIState triggerState;
double triggerBullishScore;
double triggerBearishScore;
X121Conditions triggerXConditions;
ENUM_XPOI_EVENTS triggerPoiEvents[];
XC121SMCCycleHelper *triggerCycleHelper;
ENUM_X_CYCLE_EVENTS triggerCycleEvents[];
X121SMCCycleConditions triggerConditions;
//
// Decision ...
XPOIState decisionState;
double decisionBullishScore;
double decisionBearishScore;
X121Conditions decisionXConditions;
ENUM_XPOI_EVENTS decisionPoiEvents[];
XC121SMCCycleHelper *decisionCycleHelper;
ENUM_X_CYCLE_EVENTS decisionCycleEvents[];
X121SMCCycleConditions decisionConditions;
//
// Analyse ...
XPOIState analyseState;
double analyseBullishScore;
double analyseBearishScore;
X121Conditions analyseXConditions;
ENUM_XPOI_EVENTS analysePoiEvents[];
XC121SMCCycleHelper *analyseCycleHelper;
ENUM_X_CYCLE_EVENTS analyseCycleEvents[];
X121SMCCycleConditions analyseConditions;
//
// Verification ...
XPOIState verificationState;
double verificationBullishScore;
double verificationBearishScore;
X121Conditions verificationXConditions;
ENUM_XPOI_EVENTS verificationPoiEvents[];
XC121SMCCycleHelper *verificationCycleHelper;
ENUM_X_CYCLE_EVENTS verificationCycleEvents[];
X121SMCCycleConditions verificationConditions;
//
// Consolidation ...
XPOIState consolidationState;
double consolidationBullishScore;
double consolidationBearishScore;
X121Conditions consolidationXConditions;
ENUM_XPOI_EVENTS consolidationPoiEvents[];
XC121SMCCycleHelper *consolidationCycleHelper;
ENUM_X_CYCLE_EVENTS consolidationCycleEvents[];
X121SMCCycleConditions consolidationConditions;
//
// Vision ...
XPOIState visionState;
double visionBullishScore;
double visionBearishScore;
X121Conditions visionXConditions;
ENUM_XPOI_EVENTS visionPoiEvents[];
XC121SMCCycleHelper *visionCycleHelper;
ENUM_X_CYCLE_EVENTS visionCycleEvents[];
X121SMCCycleConditions visionConditions;
//
// Constructor ...
X121SMCStrategySignalProviderData()
{
Clean();
}
//
// Tools ...
//
// Cleanup ...
void Clean()
{
//
// Trigger ...
triggerState.Clean();
triggerBullishScore = 0;
triggerBearishScore = 0;
Clean(triggerPoiEvents);
Clean(triggerCycleEvents);
triggerConditions.Clean();
triggerXConditions.Clean();
//
// Decision ...
decisionState.Clean();
decisionBullishScore = 0;
decisionBearishScore = 0;
Clean(decisionPoiEvents);
Clean(decisionCycleEvents);
decisionConditions.Clean();
decisionXConditions.Clean();
//
// Analyse ...
analyseState.Clean();
analyseBullishScore = 0;
analyseBearishScore = 0;
Clean(analysePoiEvents);
Clean(analyseCycleEvents);
analyseConditions.Clean();
analyseXConditions.Clean();
//
// Verification ...
verificationState.Clean();
verificationBullishScore = 0;
verificationBearishScore = 0;
Clean(verificationPoiEvents);
Clean(verificationCycleEvents);
verificationConditions.Clean();
verificationXConditions.Clean();
//
// Consolidation ...
consolidationState.Clean();
consolidationBullishScore = 0;
consolidationBearishScore = 0;
Clean(consolidationPoiEvents);
Clean(consolidationCycleEvents);
consolidationConditions.Clean();
consolidationXConditions.Clean();
//
// Vision ...
visionState.Clean();
visionBullishScore = 0;
visionBearishScore = 0;
Clean(visionPoiEvents);
Clean(visionCycleEvents);
visionConditions.Clean();
visionXConditions.Clean();
}
//
void Destroy()
{
//
Clean();
//
ZeroMemory(visionCycleHelper);
ZeroMemory(triggerCycleHelper);
ZeroMemory(analyseCycleHelper);
ZeroMemory(decisionCycleHelper);
ZeroMemory(verificationCycleHelper);
ZeroMemory(consolidationCycleHelper);
//
ZeroMemory(this);
}
//
bool IsValid()
{
//
bool result = false;
//
result =
visionCycleHelper != NULL &&
triggerCycleHelper != NULL &&
analyseCycleHelper != NULL &&
decisionCycleHelper != NULL &&
verificationCycleHelper != NULL &&
consolidationCycleHelper != NULL;
//
return result;
}
//
// Initialize ...
bool Init(
XC121SMCCycleHelper *_triggerCycleHelper,
XC121SMCCycleHelper *_decisionCycleHelper,
XC121SMCCycleHelper *_analyseCycleHelper,
XC121SMCCycleHelper *_verificationCycleHelper,
XC121SMCCycleHelper *_consolidationCycleHelper,
XC121SMCCycleHelper *_visionCycleHelper //
)
{
//
bool result = false;
//
// Validate Cycle Helpers ...
result =
//
_visionCycleHelper != NULL &&
_triggerCycleHelper != NULL &&
_analyseCycleHelper != NULL &&
_decisionCycleHelper != NULL &&
_verificationCycleHelper != NULL &&
_consolidationCycleHelper != NULL
//
;
if (!result)
{
return result;
}
//
visionCycleHelper = _visionCycleHelper;
triggerCycleHelper = _triggerCycleHelper;
analyseCycleHelper = _analyseCycleHelper;
decisionCycleHelper = _decisionCycleHelper;
verificationCycleHelper = _verificationCycleHelper;
consolidationCycleHelper = _consolidationCycleHelper;
//
result = IsValid();
//
return result;
}
//
// Prepare all ...
bool Prepare(
int barIndex = 0,
int loopback = 10,
bool trigger = false,
bool decision = true,
bool analyse = true,
bool verification = false,
bool consolidation = true,
bool vision = true //
)
{
//
bool result = false;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
if (loopback < 7)
{
loopback = 7;
}
//
result = IsValid();
if (!result)
{
return result;
}
//
// Trigger ...
if (trigger)
{
//
result = triggerCycleHelper.GetConditions(
triggerCycleEvents,
triggerPoiEvents,
triggerConditions,
barIndex,
loopback //
);
if (!result)
{
//
Clean(triggerPoiEvents);
Clean(triggerCycleEvents);
//
triggerConditions.Clean();
//
return result;
}
}
//
// Decision ...
if (decision)
{
//
result = decisionCycleHelper.GetConditions(
decisionCycleEvents,
decisionPoiEvents,
decisionConditions,
barIndex,
loopback //
);
if (!result)
{
//
Clean(triggerPoiEvents);
Clean(decisionPoiEvents);
Clean(triggerCycleEvents);
triggerConditions.Clean();
Clean(decisionCycleEvents);
decisionConditions.Clean();
//
return result;
}
}
//
// Analyse ...
if (analyse)
{
//
result = analyseCycleHelper.GetConditions(
analyseCycleEvents,
analysePoiEvents,
analyseConditions,
barIndex,
loopback //
);
if (!result)
{
//
Clean(triggerPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(triggerCycleEvents);
Clean(analyseCycleEvents);
triggerConditions.Clean();
analyseConditions.Clean();
Clean(decisionCycleEvents);
decisionConditions.Clean();
//
return result;
}
}
//
// Verification ...
if (verification)
{
//
result = verificationCycleHelper.GetConditions(
verificationCycleEvents,
verificationPoiEvents,
verificationConditions,
barIndex,
loopback //
);
if (!result)
{
//
Clean(triggerPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(triggerCycleEvents);
Clean(analyseCycleEvents);
triggerConditions.Clean();
analyseConditions.Clean();
Clean(decisionCycleEvents);
decisionConditions.Clean();
Clean(verificationPoiEvents);
Clean(verificationCycleEvents);
verificationConditions.Clean();
//
return result;
}
}
//
// Consolidation ...
if (consolidation)
{
//
result = consolidationCycleHelper.GetConditions(
consolidationCycleEvents,
consolidationPoiEvents,
consolidationConditions,
barIndex,
loopback //
);
if (!result)
{
//
Clean(triggerPoiEvents);
Clean(analysePoiEvents);
Clean(decisionPoiEvents);
Clean(triggerCycleEvents);
Clean(analyseCycleEvents);
triggerConditions.Clean();
analyseConditions.Clean();
Clean(decisionCycleEvents);
decisionConditions.Clean();
Clean(verificationPoiEvents);
Clean(consolidationPoiEvents);
Clean(verificationCycleEvents);
verificationConditions.Clean();
Clean(consolidationCycleEvents);
consolidationConditions.Clean();
//
return result;
}
}
//
// Vision ...
if (vision)
{
result = visionCycleHelper.GetConditions(
visionCycleEvents,
visionPoiEvents,
visionConditions,
barIndex,
loopback //
);
if (!result)
{
//
Clean(visionPoiEvents);
Clean(triggerPoiEvents);
Clean(analysePoiEvents);
Clean(visionCycleEvents);
visionConditions.Clean();
Clean(decisionPoiEvents);
Clean(triggerCycleEvents);
Clean(analyseCycleEvents);
triggerConditions.Clean();
analyseConditions.Clean();
Clean(decisionCycleEvents);
decisionConditions.Clean();
Clean(verificationPoiEvents);
Clean(consolidationPoiEvents);
Clean(verificationCycleEvents);
verificationConditions.Clean();
Clean(consolidationCycleEvents);
consolidationConditions.Clean();
//
return result;
}
}
//
// Cycles POI States ...
visionState = visionConditions.state;
triggerState = triggerConditions.state;
analyseState = analyseConditions.state;
decisionState = decisionConditions.state;
verificationState = verificationConditions.state;
consolidationState = consolidationConditions.state;
//
// Cycle X121Conditions ...
visionXConditions = visionConditions.x121Conditions;
triggerXConditions = triggerConditions.x121Conditions;
analyseXConditions = analyseConditions.x121Conditions;
decisionXConditions = decisionConditions.x121Conditions;
verificationXConditions = verificationConditions.x121Conditions;
consolidationXConditions = consolidationConditions.x121Conditions;
//
// Trigger ...
triggerXConditions.GenerateScore(
triggerBullishScore,
triggerBearishScore //
);
//
// Decision ...
decisionXConditions.GenerateScore(
decisionBullishScore,
decisionBearishScore //
);
//
// Analyse ...
analyseXConditions.GenerateScore(
analyseBullishScore,
analyseBearishScore //
);
//
// Verification ...
verificationXConditions.GenerateScore(
verificationBullishScore,
verificationBearishScore //
);
//
// Consolidation ...
consolidationXConditions.GenerateScore(
consolidationBullishScore,
consolidationBearishScore //
);
//
// Vision ...
visionXConditions.GenerateScore(
visionBullishScore,
visionBearishScore //
);
//
return result;
}
//
bool SelectCycle(
ENUM_X_CYCLES cycle,
XPOIState &cState,
X121Conditions &cXConditions,
XC121SMCCycleHelper *&cHelper,
X121SMCCycleConditions &cConditions //
)
{
//
bool result = false;
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
result = cycle != X_CYCLE_NONE;
if (!result)
{
return result;
}
//
if (cycle == X_CYCLE_TRIGGER)
{
//
cState = triggerState;
cHelper = triggerCycleHelper;
cConditions = triggerConditions;
cXConditions = triggerXConditions;
}
else if (cycle == X_CYCLE_DECISION)
{
//
cState = decisionState;
cHelper = decisionCycleHelper;
cConditions = decisionConditions;
cXConditions = decisionXConditions;
}
else if (cycle == X_CYCLE_ANALYSE)
{
//
cState = analyseState;
cHelper = analyseCycleHelper;
cConditions = analyseConditions;
cXConditions = analyseXConditions;
}
else if (cycle == X_CYCLE_VERIFICATION)
{
//
cState = verificationState;
cHelper = verificationCycleHelper;
cConditions = verificationConditions;
cXConditions = verificationXConditions;
}
else if (cycle == X_CYCLE_CONSOLIDATION)
{
//
cState = consolidationState;
cHelper = consolidationCycleHelper;
cConditions = consolidationConditions;
cXConditions = consolidationXConditions;
}
else if (cycle == X_CYCLE_VISION)
{
//
cState = visionState;
cHelper = visionCycleHelper;
cConditions = visionConditions;
cXConditions = visionXConditions;
}
//
result = cState.IsValid() &&
cHelper != NULL;
//
return result;
}
//
void MaxRequiredPOIs(int value)
{
//
if (!IsValid())
{
return;
}
//
visionCycleHelper.mPOIDetector.MaxRequiredPOIs(value);
analyseCycleHelper.mPOIDetector.MaxRequiredPOIs(value);
decisionCycleHelper.mPOIDetector.MaxRequiredPOIs(value);
consolidationCycleHelper.mPOIDetector.MaxRequiredPOIs(value);
}
//
void MaxAllowedLoopbackForInit(int value)
{
//
if (!IsValid())
{
return;
}
//
visionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value);
analyseCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value);
decisionCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value);
consolidationCycleHelper.mPOIDetector.MaxAllowedLoopbackForInit(value);
}
//
};
//
// Condition Parser ...
struct X121SMCStrategyConditionParser
{
//
// Props ...
//
// XSAR ...
//
bool isSarBullishOverPeaksGoldenZone;
bool isSarSwitchedToBullishOverPeaksGoldenZone;
bool isSarBearishOverPeaksGoldenZone;
bool isSarSwitchedToBearishOverPeaksGoldenZone;
bool isSarBullishUnderValesGoldenZone;
bool isSarSwitchedToBullishUnderValesGoldenZone;
bool isSarBearishUnderValesGoldenZone;
bool isSarSwitchedToBearishUnderValesGoldenZone;
//
// XMA ...
//
bool isX3MaFastUnderValesGoldenZone;
bool isX3MaFastCrossedUnderValesGoldenZone;
bool isX3MaFastOverPeaksGoldenZone;
bool isX3MaFastCrossedOverPeaksGoldenZone;
//
bool isX3MaInsidePeaksGoldenZone;
bool isX3MaCrossedInsidePeaksGoldenZone;
bool isX3MaInsideValesGoldenZone;
bool isX3MaCrossedInsideValesGoldenZone;
//
bool isX3MaBullishStateOverPeaksGoldenZone;
bool isX3MaBearishStateOverPeaksGoldenZone;
bool isX3MaSwitchedToBullishStateOverPeaksGoldenZone;
bool isX3MaSwitchedToBearishStateOverPeaksGoldenZone;
//
bool isX3MaBullishOrderedOverPeaksGoldenZone;
bool isX3MaBearishOrderedOverPeaksGoldenZone;
bool isX3MaSwitchedToBullishOrderedOverPeaksGoldenZone;
bool isX3MaSwitchedToBearishOrderedOverPeaksGoldenZone;
//
bool isX3MaBullishStateUnderValesGoldenZone;
bool isX3MaBearishStateUnderValesGoldenZone;
bool isX3MaSwitchedToBullishStateUnderValesGoldenZone;
bool isX3MaSwitchedToBearishStateUnderValesGoldenZone;
//
bool isX3MaBullishOrderedUnderValesGoldenZone;
bool isX3MaBearishOrderedUnderValesGoldenZone;
bool isX3MaSwitchedToBullishOrderedUnderValesGoldenZone;
bool isX3MaSwitchedToBearishOrderedUnderValesGoldenZone;
//
// XVWAP ...
//
bool isVWapFastUnderValesGoldenZone;
bool isVWapFastCrossedUnderValesGoldenZone;
bool isVWapFastOverPeaksGoldenZone;
bool isVWapFastCrossedOverPeaksGoldenZone;
//
bool isVWapInsidePeaksGoldenZone;
bool isVWapCrossedInsidePeaksGoldenZone;
bool isVWapInsideValesGoldenZone;
bool isVWapCrossedInsideValesGoldenZone;
//
bool isVWapBullishStateOverPeaksGoldenZone;
bool isVWapBearishStateOverPeaksGoldenZone;
bool isVWapSwitchedToBullishStateOverPeaksGoldenZone;
bool isVWapSwitchedToBearishStateOverPeaksGoldenZone;
//
bool isVWapBullishOrderedOverPeaksGoldenZone;
bool isVWapBearishOrderedOverPeaksGoldenZone;
bool isVWapSwitchedToBullishOrderedOverPeaksGoldenZone;
bool isVWapSwitchedToBearishOrderedOverPeaksGoldenZone;
//
bool isVWapBullishStateUnderValesGoldenZone;
bool isVWapBearishStateUnderValesGoldenZone;
bool isVWapSwitchedToBullishStateUnderValesGoldenZone;
bool isVWapSwitchedToBearishStateUnderValesGoldenZone;
//
bool isVWapBullishOrderedUnderValesGoldenZone;
bool isVWapBearishOrderedUnderValesGoldenZone;
bool isVWapSwitchedToBullishOrderedUnderValesGoldenZone;
bool isVWapSwitchedToBearishOrderedUnderValesGoldenZone;
//
// XHK ...
//
// XRWHK ...
//
bool isRawHKBearishOverPeaksGoldenZone;
bool isRawHKSwitchedToBearishOverPeaksGoldenZone;
bool isRawHKBullishUnderValesGoldenZone;
bool isRawHKSwitchedToBullishUnderValesGoldenZone;
//
// XSMHK ...
//
bool isSMHKBearishOverPeaksGoldenZone;
bool isSMHKSwitchedToBearishOverPeaksGoldenZone;
bool isSMHKBullishUnderValesGoldenZone;
bool isSMHKSwitchedToBullishUnderValesGoldenZone;
//
// XATR ...
//
bool isAtrUpperOverPeaksGoldenZone;
bool isAtrLowerOverPeaksGoldenZone;
bool isAtrOverPeaksGoldenZone;
bool isAtrCrossedOverPeaksGoldenZone;
//
bool isAtrUpperUnderValesGoldenZone;
bool isAtrLowerUnderValesGoldenZone;
bool isAtrUnderValesGoldenZone;
bool isAtrCrossedUnderValesGoldenZone;
//
// XSTR ...
//
bool isStrBullishOverPeaksGoldenZone;
bool isStrBearishOverPeaksGoldenZone;
bool isStrSwitchedToBullishOverPeaksGoldenZone;
bool isStrSwitchedToBearishOverPeaksGoldenZone;
//
bool isStrBullishUnderValesGoldenZone;
bool isStrBearishUnderValesGoldenZone;
bool isStrSwitchedToBullishUnderValesGoldenZone;
bool isStrSwitchedToBearishUnderValesGoldenZone;
//
// XCHE ...
//
bool isCheBullishOverPeaksGoldenZone;
bool isCheBearishOverPeaksGoldenZone;
bool isCheSwitchedBullishOverPeaksGoldenZone;
bool isCheSwitchedBearishOverPeaksGoldenZone;
//
bool isCheBullishUnderValesGoldenZone;
bool isCheBearishUnderValesGoldenZone;
bool isCheSwitchedBullishUnderValesGoldenZone;
bool isCheSwitchedBearishUnderValesGoldenZone;
//
// Constructor ...
X121SMCStrategyConditionParser()
{
Clean();
}
//
// Tools ...
//
void Clean()
{
//
// XSAR ...
//
isSarBullishOverPeaksGoldenZone = false;
isSarSwitchedToBullishOverPeaksGoldenZone = false;
isSarBearishOverPeaksGoldenZone = false;
isSarSwitchedToBearishOverPeaksGoldenZone = false;
isSarBullishUnderValesGoldenZone = false;
isSarSwitchedToBullishUnderValesGoldenZone = false;
isSarBearishUnderValesGoldenZone = false;
isSarSwitchedToBearishUnderValesGoldenZone = false;
//
// X3MA ...
//
isX3MaFastUnderValesGoldenZone = false;
isX3MaFastCrossedUnderValesGoldenZone = false;
isX3MaFastOverPeaksGoldenZone = false;
isX3MaFastCrossedOverPeaksGoldenZone = false;
//
isX3MaInsidePeaksGoldenZone = false;
isX3MaCrossedInsidePeaksGoldenZone = false;
isX3MaInsideValesGoldenZone = false;
isX3MaCrossedInsideValesGoldenZone = false;
//
isX3MaBullishStateOverPeaksGoldenZone = false;
isX3MaBearishStateOverPeaksGoldenZone = false;
isX3MaSwitchedToBullishStateOverPeaksGoldenZone = false;
isX3MaSwitchedToBearishStateOverPeaksGoldenZone = false;
//
isX3MaBullishOrderedOverPeaksGoldenZone = false;
isX3MaBearishOrderedOverPeaksGoldenZone = false;
isX3MaSwitchedToBullishOrderedOverPeaksGoldenZone = false;
isX3MaSwitchedToBearishOrderedOverPeaksGoldenZone = false;
//
isX3MaBullishStateUnderValesGoldenZone = false;
isX3MaBearishStateUnderValesGoldenZone = false;
isX3MaSwitchedToBullishStateUnderValesGoldenZone = false;
isX3MaSwitchedToBearishStateUnderValesGoldenZone = false;
//
isX3MaBullishOrderedUnderValesGoldenZone = false;
isX3MaBearishOrderedUnderValesGoldenZone = false;
isX3MaSwitchedToBullishOrderedUnderValesGoldenZone = false;
isX3MaSwitchedToBearishOrderedUnderValesGoldenZone = false;
//
// XVWAP ...
//
isVWapFastUnderValesGoldenZone = false;
isVWapFastCrossedUnderValesGoldenZone = false;
isVWapFastOverPeaksGoldenZone = false;
isVWapFastCrossedOverPeaksGoldenZone = false;
//
isVWapInsidePeaksGoldenZone = false;
isVWapCrossedInsidePeaksGoldenZone = false;
isVWapInsideValesGoldenZone = false;
isVWapCrossedInsideValesGoldenZone = false;
//
isVWapBullishStateOverPeaksGoldenZone = false;
isVWapBearishStateOverPeaksGoldenZone = false;
isVWapSwitchedToBullishStateOverPeaksGoldenZone = false;
isVWapSwitchedToBearishStateOverPeaksGoldenZone = false;
//
isVWapBullishOrderedOverPeaksGoldenZone = false;
isVWapBearishOrderedOverPeaksGoldenZone = false;
isVWapSwitchedToBullishOrderedOverPeaksGoldenZone = false;
isVWapSwitchedToBearishOrderedOverPeaksGoldenZone = false;
//
isVWapBullishStateUnderValesGoldenZone = false;
isVWapBearishStateUnderValesGoldenZone = false;
isVWapSwitchedToBullishStateUnderValesGoldenZone = false;
isVWapSwitchedToBearishStateUnderValesGoldenZone = false;
//
isVWapBullishOrderedUnderValesGoldenZone = false;
isVWapBearishOrderedUnderValesGoldenZone = false;
isVWapSwitchedToBullishOrderedUnderValesGoldenZone = false;
isVWapSwitchedToBearishOrderedUnderValesGoldenZone = false;
//
// XHK ...
//
// XRWHK ...
//
isRawHKBearishOverPeaksGoldenZone = false;
isRawHKSwitchedToBearishOverPeaksGoldenZone = false;
isRawHKBullishUnderValesGoldenZone = false;
isRawHKSwitchedToBullishUnderValesGoldenZone = false;
//
// XSMHK ...
//
isSMHKBearishOverPeaksGoldenZone = false;
isSMHKSwitchedToBearishOverPeaksGoldenZone = false;
isSMHKBullishUnderValesGoldenZone = false;
isSMHKSwitchedToBullishUnderValesGoldenZone = false;
//
// XATR ...
//
isAtrUpperOverPeaksGoldenZone = false;
isAtrLowerOverPeaksGoldenZone = false;
isAtrOverPeaksGoldenZone = false;
isAtrCrossedOverPeaksGoldenZone = false;
//
isAtrUpperUnderValesGoldenZone = false;
isAtrLowerUnderValesGoldenZone = false;
isAtrUnderValesGoldenZone = false;
isAtrCrossedUnderValesGoldenZone = false;
//
// XSTR ...
//
isStrBullishOverPeaksGoldenZone = false;
isStrBearishOverPeaksGoldenZone = false;
isStrSwitchedToBullishOverPeaksGoldenZone = false;
isStrSwitchedToBearishOverPeaksGoldenZone = false;
//
isStrBullishUnderValesGoldenZone = false;
isStrBearishUnderValesGoldenZone = false;
isStrSwitchedToBullishUnderValesGoldenZone = false;
isStrSwitchedToBearishUnderValesGoldenZone = false;
//
// XCHE ...
//
isCheBullishOverPeaksGoldenZone = false;
isCheBearishOverPeaksGoldenZone = false;
isCheSwitchedBullishOverPeaksGoldenZone = false;
isCheSwitchedBearishOverPeaksGoldenZone = false;
//
isCheBullishUnderValesGoldenZone = false;
isCheBearishUnderValesGoldenZone = false;
isCheSwitchedBullishUnderValesGoldenZone = false;
isCheSwitchedBearishUnderValesGoldenZone = false;
//
ZeroMemory(this);
}
//
void Parse(
X121Conditions &conditions //
)
{
//
Clean();
//
//
int zIDX = 0;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
//
// XSAR ...
//
isSarBullishOverPeaksGoldenZone =
conditions.isSarBullish &&
conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isSarSwitchedToBullishOverPeaksGoldenZone =
conditions.isSarSwitchedToBullish &&
conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isSarBearishOverPeaksGoldenZone =
conditions.isSarBearish &&
conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isSarSwitchedToBearishOverPeaksGoldenZone =
conditions.isSarSwitchedToBearish &&
conditions.sarBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isSarBullishUnderValesGoldenZone =
conditions.isSarBullish &&
conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isSarSwitchedToBullishUnderValesGoldenZone =
conditions.isSarSwitchedToBullish &&
conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isSarBearishUnderValesGoldenZone =
conditions.isSarBearish &&
conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isSarSwitchedToBearishUnderValesGoldenZone =
conditions.isSarSwitchedToBearish &&
conditions.sarBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
// X3MA ...
//
isX3MaFastUnderValesGoldenZone =
conditions.x3maFastBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isX3MaFastCrossedUnderValesGoldenZone =
isX3MaFastUnderValesGoldenZone &&
conditions.x3maFastBuffer[pIDX] >= conditions.valesGoldenBuffer[pIDX];
//
isX3MaFastOverPeaksGoldenZone =
conditions.x3maFastBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isX3MaFastCrossedOverPeaksGoldenZone =
isX3MaFastOverPeaksGoldenZone &&
conditions.x3maFastBuffer[pIDX] <= conditions.peaksGoldenBuffer[pIDX];
//
isX3MaInsidePeaksGoldenZone =
//
conditions.x3maMin < conditions.peaksBuffer[cIDX] &&
conditions.x3maMin > conditions.peaksGoldenBuffer[cIDX] &&
//
conditions.x3maMax < conditions.peaksBuffer[cIDX] &&
conditions.x3maMax > conditions.peaksGoldenBuffer[cIDX]
//
;
//
isX3MaCrossedInsidePeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
!(
//
conditions.x3maMin < conditions.peaksBuffer[pIDX] &&
conditions.x3maMin > conditions.peaksGoldenBuffer[pIDX] &&
//
conditions.x3maMax < conditions.peaksBuffer[pIDX] &&
conditions.x3maMax > conditions.peaksGoldenBuffer[pIDX]
//
);
//
isX3MaInsideValesGoldenZone =
//
conditions.x3maMin > conditions.valesBuffer[cIDX] &&
conditions.x3maMin < conditions.valesGoldenBuffer[cIDX] &&
//
conditions.x3maMax > conditions.valesBuffer[cIDX] &&
conditions.x3maMax < conditions.valesGoldenBuffer[cIDX]
//
;
isX3MaCrossedInsideValesGoldenZone =
isX3MaInsideValesGoldenZone &&
!(
//
conditions.x3maMin > conditions.valesBuffer[pIDX] &&
conditions.x3maMin < conditions.valesGoldenBuffer[pIDX] &&
//
conditions.x3maMax > conditions.valesBuffer[pIDX] &&
conditions.x3maMax < conditions.valesGoldenBuffer[pIDX]
//
);
//
isX3MaBullishStateOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaBullishState;
//
isX3MaBearishStateOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaBearishState;
//
isX3MaSwitchedToBullishStateOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaSwitchedToBullishState;
//
isX3MaSwitchedToBearishStateOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaSwitchedToBearishState;
//
isX3MaBullishOrderedOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaBullishOrdered;
//
isX3MaBearishOrderedOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaBearishOrdered;
//
isX3MaSwitchedToBullishOrderedOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaSwitchedToBullishOrdered;
//
isX3MaSwitchedToBearishOrderedOverPeaksGoldenZone =
isX3MaInsidePeaksGoldenZone &&
conditions.isX3MaSwitchedToBearishOrdered;
//
isX3MaBullishStateUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaBullishState;
//
isX3MaBearishStateUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaBearishState;
//
isX3MaSwitchedToBullishStateUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaSwitchedToBullishState;
//
isX3MaSwitchedToBearishStateUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaSwitchedToBearishState;
//
isX3MaBullishOrderedUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaBullishOrdered;
//
isX3MaBearishOrderedUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaBearishOrdered;
//
isX3MaSwitchedToBullishOrderedUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaSwitchedToBullishOrdered;
//
isX3MaSwitchedToBearishOrderedUnderValesGoldenZone =
isX3MaInsideValesGoldenZone &&
conditions.isX3MaSwitchedToBearishOrdered;
//
// XVWAP ...
//
isVWapFastUnderValesGoldenZone =
conditions.vwapFastBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isVWapFastCrossedUnderValesGoldenZone =
isVWapFastUnderValesGoldenZone &&
conditions.vwapFastBuffer[pIDX] >= conditions.valesGoldenBuffer[pIDX];
//
isVWapFastOverPeaksGoldenZone =
conditions.vwapFastBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isVWapFastCrossedOverPeaksGoldenZone =
isVWapFastOverPeaksGoldenZone &&
conditions.vwapFastBuffer[pIDX] <= conditions.peaksGoldenBuffer[pIDX];
//
isVWapInsidePeaksGoldenZone =
//
conditions.vwapMin < conditions.peaksBuffer[cIDX] &&
conditions.vwapMin > conditions.peaksGoldenBuffer[cIDX] &&
//
conditions.vwapMax < conditions.peaksBuffer[cIDX] &&
conditions.vwapMax > conditions.peaksGoldenBuffer[cIDX]
//
;
//
isVWapCrossedInsidePeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
!(
//
conditions.vwapMin < conditions.peaksBuffer[pIDX] &&
conditions.vwapMin > conditions.peaksGoldenBuffer[pIDX] &&
//
conditions.vwapMax < conditions.peaksBuffer[pIDX] &&
conditions.vwapMax > conditions.peaksGoldenBuffer[pIDX]
//
);
//
isVWapInsideValesGoldenZone =
//
conditions.vwapMin > conditions.valesBuffer[cIDX] &&
conditions.vwapMin < conditions.valesGoldenBuffer[cIDX] &&
//
conditions.vwapMax > conditions.valesBuffer[cIDX] &&
conditions.vwapMax < conditions.valesGoldenBuffer[cIDX]
//
;
//
isVWapCrossedInsideValesGoldenZone =
isVWapInsideValesGoldenZone &&
!(
//
conditions.vwapMin > conditions.valesBuffer[pIDX] &&
conditions.vwapMin < conditions.valesGoldenBuffer[pIDX] &&
//
conditions.vwapMax > conditions.valesBuffer[pIDX] &&
conditions.vwapMax < conditions.valesGoldenBuffer[pIDX]
//
);
//
isVWapBullishStateOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapBullishState;
//
isVWapBearishStateOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapBearishState;
//
isVWapSwitchedToBullishStateOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapSwitchedToBullishState;
//
isVWapSwitchedToBearishStateOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapSwitchedToBearishState;
//
isVWapBullishOrderedOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapBullishOrdered;
//
isVWapBearishOrderedOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapBearishOrdered;
//
isVWapSwitchedToBullishOrderedOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapSwitchedToBullishOrdered;
//
isVWapSwitchedToBearishOrderedOverPeaksGoldenZone =
isVWapInsidePeaksGoldenZone &&
conditions.isVWapSwitchedToBearishOrdered;
//
isVWapBullishStateUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapBullishState;
//
isVWapBearishStateUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapBearishState;
//
isVWapSwitchedToBullishStateUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapSwitchedToBullishState;
//
isVWapSwitchedToBearishStateUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapSwitchedToBearishState;
//
isVWapBullishOrderedUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapBullishOrdered;
//
isVWapBearishOrderedUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapBearishOrdered;
//
isVWapSwitchedToBullishOrderedUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapSwitchedToBullishOrdered;
//
isVWapSwitchedToBearishOrderedUnderValesGoldenZone =
isVWapInsideValesGoldenZone &&
conditions.isVWapSwitchedToBearishOrdered;
//
// XHK ...
//
// XRWHK ...
//
isRawHKBearishOverPeaksGoldenZone =
conditions.isRawHKBearish &&
conditions.xhkRawHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isRawHKSwitchedToBearishOverPeaksGoldenZone =
conditions.isRawHKSwitchedToBearish &&
conditions.xhkRawHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isRawHKBullishUnderValesGoldenZone =
conditions.isRawHKBullish &&
conditions.xhkRawLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isRawHKSwitchedToBullishUnderValesGoldenZone =
conditions.isRawHKSwitchedToBullish &&
conditions.xhkRawLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
// XSMHK ...
//
isSMHKBearishOverPeaksGoldenZone =
conditions.isSMHKBearish &&
conditions.xhkSMHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isSMHKSwitchedToBearishOverPeaksGoldenZone =
conditions.isSMHKSwitchedToBearish &&
conditions.xhkSMHighBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isSMHKBullishUnderValesGoldenZone =
conditions.isSMHKBullish &&
conditions.xhkSMLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isSMHKSwitchedToBullishUnderValesGoldenZone =
conditions.isSMHKSwitchedToBullish &&
conditions.xhkSMLowBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
// XATR ...
//
isAtrUpperOverPeaksGoldenZone =
conditions.atrUpperBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.atrUpperBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isAtrLowerOverPeaksGoldenZone =
conditions.atrLowerBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.atrLowerBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isAtrOverPeaksGoldenZone =
isAtrUpperOverPeaksGoldenZone &&
isAtrLowerOverPeaksGoldenZone;
//
isAtrCrossedOverPeaksGoldenZone =
isAtrOverPeaksGoldenZone &&
!(
//
conditions.atrUpperBuffer[pIDX] < conditions.peaksBuffer[pIDX] &&
conditions.atrUpperBuffer[pIDX] > conditions.peaksGoldenBuffer[pIDX]
//
&&
//
conditions.atrLowerBuffer[pIDX] < conditions.peaksBuffer[pIDX] &&
conditions.atrLowerBuffer[pIDX] > conditions.peaksGoldenBuffer[pIDX]
//
);
//
isAtrUpperUnderValesGoldenZone =
conditions.atrUpperBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
conditions.atrUpperBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isAtrLowerUnderValesGoldenZone =
conditions.atrLowerBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
conditions.atrLowerBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isAtrUnderValesGoldenZone =
isAtrUpperUnderValesGoldenZone &&
isAtrLowerUnderValesGoldenZone;
//
isAtrCrossedUnderValesGoldenZone =
isAtrUnderValesGoldenZone &&
!(
//
conditions.atrUpperBuffer[pIDX] > conditions.valesBuffer[pIDX] &&
conditions.atrUpperBuffer[pIDX] < conditions.valesGoldenBuffer[pIDX]
//
&&
//
conditions.atrLowerBuffer[pIDX] > conditions.valesBuffer[pIDX] &&
conditions.atrLowerBuffer[pIDX] < conditions.valesGoldenBuffer[pIDX]
//
);
//
// XSTR ...
//
isStrBullishOverPeaksGoldenZone =
conditions.isStrBullish &&
conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isStrBearishOverPeaksGoldenZone =
conditions.isStrBearish &&
conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isStrSwitchedToBullishOverPeaksGoldenZone =
conditions.isStrSwitchedToBullish &&
conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isStrSwitchedToBearishOverPeaksGoldenZone =
conditions.isStrSwitchedToBearish &&
conditions.strBuffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.strBuffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isStrBullishUnderValesGoldenZone =
conditions.isStrBullish &&
conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isStrBearishUnderValesGoldenZone =
conditions.isStrBearish &&
conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isStrSwitchedToBullishUnderValesGoldenZone =
conditions.isStrSwitchedToBullish &&
conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
isStrSwitchedToBearishUnderValesGoldenZone =
conditions.isStrSwitchedToBearish &&
conditions.strBuffer[cIDX] > conditions.valesBuffer[cIDX] &&
conditions.strBuffer[cIDX] < conditions.valesGoldenBuffer[cIDX];
//
// XCHE ...
//
isCheBullishOverPeaksGoldenZone =
conditions.isCheBullish &&
conditions.le1Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.le1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] &&
conditions.le2Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.le2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isCheBearishOverPeaksGoldenZone =
conditions.isCheSwitchedToBullish &&
conditions.se1Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.se1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] &&
conditions.se2Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.se2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isCheSwitchedBullishOverPeaksGoldenZone =
conditions.isCheSwitchedToBullish &&
conditions.le1Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.le1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] &&
conditions.le2Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.le2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isCheSwitchedBearishOverPeaksGoldenZone =
conditions.isCheSwitchedToBearish &&
conditions.se1Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.se1Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX] &&
conditions.se2Buffer[cIDX] < conditions.peaksBuffer[cIDX] &&
conditions.se2Buffer[cIDX] > conditions.peaksGoldenBuffer[cIDX];
//
isCheBullishUnderValesGoldenZone =
conditions.isCheBullish &&
conditions.cheMin > conditions.valesBuffer[cIDX] &&
conditions.cheMin < conditions.valesGoldenBuffer[cIDX] &&
conditions.cheMax > conditions.valesBuffer[cIDX] &&
conditions.cheMax < conditions.valesGoldenBuffer[cIDX];
//
isCheBearishUnderValesGoldenZone =
conditions.isCheBearish &&
conditions.cheMin > conditions.valesBuffer[cIDX] &&
conditions.cheMin < conditions.valesGoldenBuffer[cIDX] &&
conditions.cheMax > conditions.valesBuffer[cIDX] &&
conditions.cheMax < conditions.valesGoldenBuffer[cIDX];
//
isCheSwitchedBullishUnderValesGoldenZone =
conditions.isCheSwitchedToBullish &&
conditions.cheMin > conditions.valesBuffer[cIDX] &&
conditions.cheMin < conditions.valesGoldenBuffer[cIDX] &&
conditions.cheMax > conditions.valesBuffer[cIDX] &&
conditions.cheMax < conditions.valesGoldenBuffer[cIDX];
//
isCheSwitchedBearishUnderValesGoldenZone =
conditions.isCheSwitchedToBearish &&
conditions.cheMin > conditions.valesBuffer[cIDX] &&
conditions.cheMin < conditions.valesGoldenBuffer[cIDX] &&
conditions.cheMax > conditions.valesBuffer[cIDX] &&
conditions.cheMax < conditions.valesGoldenBuffer[cIDX];
}
//
bool HasSenario1Conditions(
ENUM_X_CYCLES cycle,
XBoxZone &box,
XBoxZone &holderBox,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
ENUM_X_CYCLES holderCycle = X_CYCLE_NONE,
int barIndex = 0 //
)
{
//
bool result = false;
//
// Fil Selected Data ...
XPOIState cState;
X121Conditions cXConditions;
XC121SMCCycleHelper *cHelper;
X121SMCCycleConditions cConditions;
result = provider.SelectCycle(
cycle,
cState,
cXConditions,
cHelper,
cConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
Parse(cXConditions);
//
// Fil Selected Data ...
XPOIState chState;
X121Conditions chXConditions;
XC121SMCCycleHelper *chHelper;
X121SMCCycleConditions chConditions;
if (holderCycle != X_CYCLE_NONE)
{
//
result = provider.SelectCycle(
holderCycle,
chState,
chXConditions,
chHelper,
chConditions //
);
if (!result)
{
//
chState.Clean();
ZeroMemory(chHelper);
chConditions.Clean();
chXConditions.Clean();
//
return result;
}
//
Parse(chXConditions);
}
//
// Normalize Args ...
//
box.Clean();
holderBox.Clean();
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int idx = -1;
int count = 0;
bool has = false;
//
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
//
bool isBullish = false;
bool isBearish = false;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
//
// Initial Bars ...
result = zBar.Init(
cState.symbol,
cState.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
chState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
ZeroMemory(chHelper);
chConditions.Clean();
chXConditions.Clean();
//
return result;
}
//
// Detecting Signal Conditions ...
//
// Bullish Conditions ...
isBullish =
//
// Base Condition ...
(
//
cXConditions.supportsBuffer[cIDX] == cXConditions.valesBuffer[zIDX]
//
// cXConditions.isSarSwitchedToBullish &&
// cXConditions.isSMHKSwitchedToBullish &&
// cBar.low < cXConditions.masLowerBuffer[cIDX] &&
// cBar.low < cXConditions.valesGoldenBuffer[cIDX] &&
// zBar.close < cXConditions.valesGoldenBuffer[cIDX] &&
// cXConditions.xhkSMCloseBuffer[cIDX] < cXConditions.valesGoldenBuffer[cIDX]
//
)
//
;
//
// Bearish Conditions ...
isBearish =
//
// Base Condition ...
(
//
false
//
)
//
;
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
box.dir = dir;
box.to = TimeCurrent();
box.symbol = cXConditions.symbol;
box.period = cXConditions.period;
//
int fromIDX = -1;
if (isBullish)
{
//
double vale = cXConditions.valesBuffer[cIDX];
box.lower = vale;
box.upper = cXConditions.valesGoldenBuffer[cIDX];
//
int lowerValeIDX = -1;
double lowerVale = cHelper
.mX121Helper
.xpvHelper
.GetLowerVale(
lowerValeIDX,
vale,
cBar.Index() //
);
//
int higherValeIDX = -1;
double higherVale = cHelper
.mX121Helper
.xpvHelper
.GetHigherVale(
higherValeIDX,
vale,
cBar.Index() //
);
//
if (IsValidIndex(lowerValeIDX) &&
IsValidIndex(higherValeIDX))
{
//
fromIDX =
lowerValeIDX < higherValeIDX
? lowerValeIDX
: higherValeIDX;
}
else if (IsValidIndex(lowerValeIDX) &&
!IsValidIndex(higherValeIDX))
{
//
fromIDX = lowerValeIDX;
}
else if (!IsValidIndex(lowerValeIDX) &&
IsValidIndex(higherValeIDX))
{
//
fromIDX = higherValeIDX;
}
}
else
{
//
double peak = cXConditions.peaksBuffer[cIDX];
box.upper = peak;
//
box.lower = cXConditions.peaksGoldenBuffer[cIDX];
//
int lowerPeakIDX = -1;
double lowerPeak = cHelper
.mX121Helper
.xpvHelper
.GetLowerPeak(
lowerPeakIDX,
peak,
cBar.Index() //
);
//
int higherPeakIDX = -1;
double higherPeak = cHelper
.mX121Helper
.xpvHelper
.GetHigherPeak(
higherPeakIDX,
peak,
cBar.Index() //
);
//
if (IsValidIndex(lowerPeakIDX) &&
IsValidIndex(higherPeakIDX))
{
//
fromIDX =
lowerPeakIDX < higherPeakIDX
? lowerPeakIDX
: higherPeakIDX;
}
else if (IsValidIndex(lowerPeakIDX) &&
!IsValidIndex(higherPeakIDX))
{
//
fromIDX = lowerPeakIDX;
}
else if (!IsValidIndex(lowerPeakIDX) &&
IsValidIndex(higherPeakIDX))
{
//
fromIDX = higherPeakIDX;
}
}
//
if (IsValidIndex(fromIDX))
{
//
box.from = iTime(
zBar.symbol,
zBar.period,
fromIDX //
);
}
else
{
box.from = pBar.time;
}
//
// Detect Holder Box ...
XBoxZone tmpBoxes[];
if (chState.IsValid())
{
//
if (isBullish)
{
//
// Demand Zones ...
XBoxZone tmp[];
ToBox(
chState.demandZones,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bullish Order Blocks ...
ToBox(
chState.bullishOrderBlocks,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bullish Fair Value Gaps ...
ToBox(
chState.bullishFairValueGaps,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
}
else
{
//
// Supply Zones ...
XBoxZone tmp[];
ToBox(
chState.supplyZones,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bearish Order Blocks ...
ToBox(
chState.bearishOrderBlocks,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bearish Fair Value Gaps ...
ToBox(
chState.bearishFairValueGaps,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
}
}
//
has = HasChild(tmpBoxes);
if (has)
{
//
while (HasChild(tmpBoxes))
{
//
idx = GetOldest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox = tmpBoxes[idx];
ArrayRemove(
tmpBoxes,
idx,
1 //
);
//
has = IsBoxInside(
box,
iBox //
);
if (has)
{
//
holderBox = iBox;
holderBox.to = TimeCurrent();
iBox.Clean();
break;
}
//
iBox.Clean();
}
}
//
Clean(tmpBoxes);
//
// Fix Box Upper and Lower based on Strategy ...
//
double points = GetPoints(box.symbol);
double minPointsDiff = points * 20;
//
double prefferSL = 0;
//
// Other SL Conditions ...
if (prefferSL <= 0)
{
//
if (isBullish)
{
//
if (zBar.open < cXConditions.valesGoldenBuffer[cIDX])
{
prefferSL = cXConditions.valesBuffer[cIDX];
}
else if (zBar.open > cXConditions.valesGoldenBuffer[cIDX] &&
zBar.open < cXConditions.peaksGoldenBuffer[cIDX])
{
prefferSL = cXConditions.valesGoldenBuffer[cIDX];
}
else if (zBar.open > cXConditions.peaksGoldenBuffer[cIDX])
{
//
if (cXConditions.sarBuffer[cIDX] > cXConditions.peaksGoldenBuffer[cIDX])
{
prefferSL = cXConditions.sarBuffer[cIDX];
}
else
{
prefferSL = zBar.open > cXConditions.peaksGoldenBuffer[cIDX];
}
}
}
else
{
//
if (zBar.open > cXConditions.peaksGoldenBuffer[cIDX])
{
prefferSL = cXConditions.peaksBuffer[cIDX];
}
else if (zBar.open < cXConditions.peaksGoldenBuffer[cIDX] &&
zBar.open > cXConditions.valesGoldenBuffer[cIDX])
{
prefferSL = cXConditions.peaksGoldenBuffer[cIDX];
}
else if (zBar.open < cXConditions.valesGoldenBuffer[cIDX])
{
//
if (cXConditions.sarBuffer[cIDX] < cXConditions.valesGoldenBuffer[cIDX])
{
prefferSL = cXConditions.sarBuffer[cIDX];
}
else
{
prefferSL = cXConditions.valesGoldenBuffer[cIDX];
}
}
}
}
//
if (prefferSL > 0)
{
//
box.upper =
isBullish
? zBar.open
: prefferSL;
//
box.lower =
isBullish
? prefferSL
: zBar.open;
}
//
// Validate Conditions to Force Has Holder Box ...
result =
result &&
holderBox.IsValid() &&
dir == holderBox.dir;
//
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
chState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
ZeroMemory(chHelper);
chConditions.Clean();
chXConditions.Clean();
//
return result;
}
//
bool HasSenario2Conditions(
ENUM_X_CYCLES ttfCycle,
XBoxZone &breakedBoxes[],
XBoxZone &box,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
int barIndex = 0,
bool forceBarType = false,
bool forceFiboPressure = false //
)
{
//
bool result = false;
//
// Validate Args ...
result =
IsValid(ttfCycle) &&
HasChild(breakedBoxes);
if (!result)
{
return result;
}
//
// TODO: Add support for Extracting Trend ...
ENUM_X_DIRECTION trend = X_DIRECTION_NONE;
bool hasBullishTrend = IsBullish(trend);
bool hasBearishTrend = IsBearish(trend);
//
// TTF Cycle Extract ...
XPOIState ttfState;
X121Conditions ttfXConditions;
XC121SMCCycleHelper *ttfHelper;
X121SMCCycleConditions ttfConditions;
result = provider.SelectCycle(
ttfCycle,
ttfState,
ttfXConditions,
ttfHelper,
ttfConditions //
);
if (!result)
{
//
ttfState.Clean();
ZeroMemory(ttfHelper);
ttfConditions.Clean();
ttfXConditions.Clean();
//
return result;
}
Parse(ttfXConditions);
//
// Normalize Args ...
//
box.Clean();
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
// Define Resources ...
//
int idx = -1;
int count = 0;
bool has = false;
//
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
//
double ask = GetAsk(ttfState.symbol);
double bid = GetBid(ttfState.symbol);
//
bool isBullish = false;
bool isBearish = false;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
//
// Initial Bars ...
result = zBar.Init(
ttfState.symbol,
ttfState.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ttfState.Clean();
ZeroMemory(ttfHelper);
ttfConditions.Clean();
ttfXConditions.Clean();
//
return result;
}
//
// Conditions ...
//
// First we Have to Detect Inside Box ...
XBoxZone insideBox;
count = ArraySize(breakedBoxes);
for (int i = 0; i < count; i++)
{
//
XBoxZone iBox = breakedBoxes[i];
//
bool isInside =
IsInsideBox(
zBar,
iBox //
);
if (isInside)
{
//
// Since we have to Follow Trend based on Breaked Boxes ...
// we have to use:
// - Breaked Bullish Boxes on Bearish Trend ...
// - Breaked Bearish Boxes on Bullish Trend ...
isInside =
hasBullishTrend
? iBox.IsBearish()
: hasBearishTrend
? iBox.IsBullish()
: false;
//
// Check Inside ...
if (isInside)
{
//
insideBox = iBox;
iBox.Clean();
//
break;
}
}
//
iBox.Clean();
}
//
// Check Inside Box is Valid or not ...
result = insideBox.IsValid();
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ttfState.Clean();
insideBox.Clean();
ZeroMemory(ttfHelper);
ttfConditions.Clean();
ttfXConditions.Clean();
}
//
// Update Inside Box From and To ...
// Based on Breaked ...
insideBox.from = insideBox.to;
insideBox.to = TimeCurrent();
//
// Detect Breaked Box Direction ...
bool isInsideBoxBullish = insideBox.IsBullish();
bool isInsideBoxBearish = insideBox.IsBearish();
//
// Detect Inside Box Rejection ...
//
bool isUpperBearishReject =
cBar.high >= insideBox.upper &&
cBar.GetUp() < insideBox.upper;
//
bool isUpperBullishReject =
cBar.low <= insideBox.upper &&
cBar.GetDown() > insideBox.upper;
//
bool isLowerBearishReject =
cBar.high >= insideBox.lower &&
cBar.GetUp() < insideBox.lower;
//
bool isLowerBullishReject =
cBar.low <= insideBox.lower &&
cBar.GetDown() > insideBox.lower;
//
// Apply Force Bar Type ...
if (forceBarType)
{
//
isUpperBearishReject =
isUpperBearishReject &&
cBar.IsBearish();
//
isUpperBullishReject =
isUpperBullishReject &&
cBar.IsBullish();
//
isLowerBearishReject =
isLowerBearishReject &&
cBar.IsBearish();
//
isLowerBullishReject =
isLowerBullishReject &&
cBar.IsBullish();
}
//
// Apply Force Fibo Pressure ...
if (forceBarType)
{
//
isUpperBearishReject =
isUpperBearishReject &&
ttfHelper
.mBarAnalyser
.HasFiboPressure(
cBar,
X_DIRECTION_BEARISH,
X_FIBO_LEVEL_382 //
);
//
isUpperBullishReject =
isUpperBullishReject &&
ttfHelper
.mBarAnalyser
.HasFiboPressure(
cBar,
X_DIRECTION_BULLISH,
X_FIBO_LEVEL_382 //
);
//
isLowerBearishReject =
isLowerBearishReject &&
ttfHelper
.mBarAnalyser
.HasFiboPressure(
cBar,
X_DIRECTION_BEARISH,
X_FIBO_LEVEL_382 //
);
//
isLowerBullishReject =
isLowerBullishReject &&
ttfHelper
.mBarAnalyser
.HasFiboPressure(
cBar,
X_DIRECTION_BULLISH,
X_FIBO_LEVEL_382 //
);
}
//
// Bullish Conditions ...
isBullish = (
//
hasBullishTrend &&
isInsideBoxBearish &&
isLowerBullishReject
//
);
//
// Bearish Conditions ...
isBearish = (
//
hasBearishTrend &&
isInsideBoxBullish &&
isUpperBearishReject
//
);
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
box = insideBox;
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish //
);
//
// Cleanup Resource ...
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
//
ttfState.Clean();
insideBox.Clean();
ZeroMemory(ttfHelper);
ttfConditions.Clean();
ttfXConditions.Clean();
//
return result;
}
//
bool HasSenario4Conditions(
ENUM_X_CYCLES cycle,
XBoxZone &box,
XBoxZone &holderBox,
ENUM_X_DIRECTION &dir,
X121SMCStrategySignalProviderData &provider,
ENUM_X_CYCLES holderCycle = X_CYCLE_NONE,
int barIndex = 0 //
)
{
//
bool result = false;
//
// Fil Selected Data ...
XPOIState cState;
X121Conditions cXConditions;
XC121SMCCycleHelper *cHelper;
X121SMCCycleConditions cConditions;
result = provider.SelectCycle(
cycle,
cState,
cXConditions,
cHelper,
cConditions //
);
if (!result)
{
//
cState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
//
return result;
}
Parse(cXConditions);
//
// Fil Selected Data ...
XPOIState chState;
X121Conditions chXConditions;
XC121SMCCycleHelper *chHelper;
X121SMCCycleConditions chConditions;
if (holderCycle != X_CYCLE_NONE)
{
//
result = provider.SelectCycle(
holderCycle,
chState,
chXConditions,
chHelper,
chConditions //
);
if (!result)
{
//
chState.Clean();
ZeroMemory(chHelper);
chConditions.Clean();
chXConditions.Clean();
//
return result;
}
//
Parse(chXConditions);
}
//
// Normalize Args ...
//
box.Clean();
holderBox.Clean();
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
//
int idx = -1;
int count = 0;
bool has = false;
//
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
//
bool isBullish = false;
bool isBearish = false;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
//
// Initial Bars ...
result = zBar.Init(
cState.symbol,
cState.period,
barIndex //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
chState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
ZeroMemory(chHelper);
chConditions.Clean();
chXConditions.Clean();
//
return result;
}
//
// Detecting Signal Conditions ...
//
// Bullish Conditions ...
isBullish =
//
// Base Condition ...
(
//
cBar.IsBullish() &&
zBar.open >= cBar.close &&
(
//
// Regular Reject ...
(pBar.low > cBar.low &&
cBar.low < cXConditions.valesGoldenBuffer[cIDX] &&
cBar.GetDown() > cXConditions.valesGoldenBuffer[cIDX])
//
||
//
// Regular Exit ...
(pBar.low < cXConditions.valesGoldenBuffer[cIDX] &&
(cBar.low > cXConditions.valesGoldenBuffer[cIDX] ||
cBar.GetUp() > cXConditions.valesGoldenBuffer[cIDX]))
//
||
//
IsBarBreak(
cXConditions.valesGoldenBuffer[cIDX],
X_DIRECTION_BULLISH,
cBar //
)
//
||
//
IsBarReject(
cXConditions.valesGoldenBuffer[cIDX],
X_DIRECTION_BULLISH,
cBar //
)
//
)
//
)
//
&&
//
// Checking other Conditions ...
(
//
// XSAR ...
cXConditions.isSarBullish &&
//
// XSTR ...
cXConditions.isStrSwitchedToBullish &&
//
// // X3MA ...
// // XVWAP ...
// (cXConditions.isX3MaFastOverMid ||
// cXConditions.isVWapFastOverMid) &&
//
// XHK ...
cXConditions.isSMHKBullish &&
cXConditions.isRawHKBullish &&
//
// XCHE ...
cXConditions.isCheBullish &&
cXConditions.le1Buffer[cIDX] < cBar.low &&
cXConditions.le2Buffer[cIDX] < cBar.low
//
)
//
;
//
// Bearish Conditions ...
isBearish =
//
// Base Condition ...
(
//
cBar.IsBearish() &&
zBar.open <= cBar.close &&
(
//
// Regular Reject ...
(pBar.high < cBar.high &&
cBar.high > cXConditions.peaksGoldenBuffer[cIDX] &&
cBar.GetUp() < cXConditions.peaksGoldenBuffer[cIDX])
//
||
//
// Regular Exit ...
(pBar.high > cXConditions.peaksGoldenBuffer[cIDX] &&
(cBar.high < cXConditions.peaksGoldenBuffer[cIDX] ||
cBar.GetDown() < cXConditions.peaksGoldenBuffer[cIDX]))
//
||
//
IsBarBreak(
cXConditions.peaksGoldenBuffer[cIDX],
X_DIRECTION_BEARISH,
cBar //
)
//
||
//
IsBarReject(
cXConditions.peaksGoldenBuffer[cIDX],
X_DIRECTION_BEARISH,
cBar //
)
//
)
//
)
//
&&
//
// Checking other Conditions ...
(
//
// XSAR ...
cXConditions.isSarBearish &&
//
// XSTR ...
cXConditions.isStrSwitchedToBearish &&
//
// // X3MA ...
// // XVWAP ...
// (cXConditions.isX3MaFastUnderMid ||
// cXConditions.isVWapFastUnderMid) &&
//
// XHK ...
cXConditions.isSMHKBearish &&
cXConditions.isRawHKBearish &&
//
// XCHE ...
cXConditions.isCheBearish &&
cXConditions.se1Buffer[cIDX] > cBar.high &&
cXConditions.se2Buffer[cIDX] > cBar.high
//
)
//
;
//
// Filling Requirements ...
result =
isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
box.dir = dir;
box.to = TimeCurrent();
box.symbol = cXConditions.symbol;
box.period = cXConditions.period;
//
int fromIDX = -1;
if (isBullish)
{
//
double vale = cXConditions.valesBuffer[cIDX];
box.lower = vale;
box.upper = cXConditions.valesGoldenBuffer[cIDX];
//
int lowerValeIDX = -1;
double lowerVale = cHelper
.mX121Helper
.xpvHelper
.GetLowerVale(
lowerValeIDX,
vale,
cBar.Index() //
);
//
int higherValeIDX = -1;
double higherVale = cHelper
.mX121Helper
.xpvHelper
.GetHigherVale(
higherValeIDX,
vale,
cBar.Index() //
);
//
if (IsValidIndex(lowerValeIDX) &&
IsValidIndex(higherValeIDX))
{
//
fromIDX =
lowerValeIDX < higherValeIDX
? lowerValeIDX
: higherValeIDX;
}
else if (IsValidIndex(lowerValeIDX) &&
!IsValidIndex(higherValeIDX))
{
//
fromIDX = lowerValeIDX;
}
else if (!IsValidIndex(lowerValeIDX) &&
IsValidIndex(higherValeIDX))
{
//
fromIDX = higherValeIDX;
}
}
else
{
//
double peak = cXConditions.peaksBuffer[cIDX];
box.upper = peak;
//
box.lower = cXConditions.peaksGoldenBuffer[cIDX];
//
int lowerPeakIDX = -1;
double lowerPeak = cHelper
.mX121Helper
.xpvHelper
.GetLowerPeak(
lowerPeakIDX,
peak,
cBar.Index() //
);
//
int higherPeakIDX = -1;
double higherPeak = cHelper
.mX121Helper
.xpvHelper
.GetHigherPeak(
higherPeakIDX,
peak,
cBar.Index() //
);
//
if (IsValidIndex(lowerPeakIDX) &&
IsValidIndex(higherPeakIDX))
{
//
fromIDX =
lowerPeakIDX < higherPeakIDX
? lowerPeakIDX
: higherPeakIDX;
}
else if (IsValidIndex(lowerPeakIDX) &&
!IsValidIndex(higherPeakIDX))
{
//
fromIDX = lowerPeakIDX;
}
else if (!IsValidIndex(lowerPeakIDX) &&
IsValidIndex(higherPeakIDX))
{
//
fromIDX = higherPeakIDX;
}
}
//
if (IsValidIndex(fromIDX))
{
//
box.from = iTime(
zBar.symbol,
zBar.period,
fromIDX //
);
}
else
{
box.from = pBar.time;
}
//
// Detect Holder Box ...
XBoxZone tmpBoxes[];
if (chState.IsValid())
{
//
if (isBullish)
{
//
// Demand Zones ...
XBoxZone tmp[];
ToBox(
chState.demandZones,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bullish Order Blocks ...
ToBox(
chState.bullishOrderBlocks,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bullish Fair Value Gaps ...
ToBox(
chState.bullishFairValueGaps,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
}
else
{
//
// Supply Zones ...
XBoxZone tmp[];
ToBox(
chState.supplyZones,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bearish Order Blocks ...
ToBox(
chState.bearishOrderBlocks,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
//
// Bearish Fair Value Gaps ...
ToBox(
chState.bearishFairValueGaps,
tmp //
);
Copy(
tmp,
tmpBoxes,
false //
);
Clean(tmp);
}
}
//
has = HasChild(tmpBoxes);
if (has)
{
//
while (HasChild(tmpBoxes))
{
//
idx = GetOldest(tmpBoxes);
has = IsValidIndex(idx);
if (!has)
{
break;
}
//
XBoxZone iBox = tmpBoxes[idx];
ArrayRemove(
tmpBoxes,
idx,
1 //
);
//
has = IsBoxInside(
box,
iBox //
);
if (has)
{
//
holderBox = iBox;
holderBox.to = TimeCurrent();
iBox.Clean();
break;
}
//
iBox.Clean();
}
}
//
Clean(tmpBoxes);
//
// Validate Conditions to Force Has Holder Box ...
result =
result &&
holderBox.IsValid();
if (!result)
{
//
isBullish = false;
isBearish = false;
}
}
//
// Check All Conditions ...
result =
box.IsValid() &&
HasDirection(dir) &&
(isBullish ||
isBearish);
//
// Cleanup Resources ...
zBar.Clean();
cBar.Clean();
pBar.Clean();
cState.Clean();
chState.Clean();
ZeroMemory(cHelper);
cConditions.Clean();
cXConditions.Clean();
ZeroMemory(chHelper);
chConditions.Clean();
chXConditions.Clean();
//
return result;
}
//
};