4034 lines
110 KiB
Plaintext
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;
|
|
}
|
|
|
|
//
|
|
};
|