last works ...
This commit is contained in:
@@ -2490,6 +2490,57 @@ class XCPOIDrawer : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CreateOrderBlock(
|
||||||
|
XCOrderBlock &zone,
|
||||||
|
XCBaseObject *&object //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
object = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = zone.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = zone.IsBullish();
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCBullishOrderBlockObject *iObj;
|
||||||
|
result = CreateBullishOrderBlock(
|
||||||
|
zone,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
object = (XCBaseObject *)iObj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCBearishOrderBlockObject *iObj;
|
||||||
|
result = CreateBearishOrderBlock(
|
||||||
|
zone,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
object = (XCBaseObject *)iObj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fair Value Gaps ...
|
// Fair Value Gaps ...
|
||||||
|
|
||||||
@@ -2613,6 +2664,57 @@ class XCPOIDrawer : public XCBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CreateFairValueGap(
|
||||||
|
XCFVG &zone,
|
||||||
|
XCBaseObject *&object //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
object = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = zone.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBullish = zone.IsBullish();
|
||||||
|
if (isBullish)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCBullishFairValueGapObject *iObj;
|
||||||
|
result = CreateBullishFairValueGap(
|
||||||
|
zone,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
object = (XCBaseObject *)iObj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCBearishFairValueGapObject *iObj;
|
||||||
|
result = CreateBearishFairValueGap(
|
||||||
|
zone,
|
||||||
|
iObj //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
object = (XCBaseObject *)iObj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Ticks Zone ...
|
// Ticks Zone ...
|
||||||
|
|
||||||
|
|||||||
@@ -7948,3 +7948,288 @@ int DrawFVGOrderBlock(
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Price Above Specified Zone ...
|
||||||
|
*
|
||||||
|
* @param bar: XOHCL instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsPriceAboveZone(
|
||||||
|
XOHCL &bar,
|
||||||
|
XCZone *zone //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
zone != NULL &&
|
||||||
|
bar.IsValid() &&
|
||||||
|
zone.IsValidBoundary();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
bar.low > zone.Upper()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Price Above Specified Zone ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsPriceAboveZone(
|
||||||
|
double price,
|
||||||
|
XCZone *zone //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
price > 0 &&
|
||||||
|
zone != NULL &&
|
||||||
|
zone.IsValidBoundary();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
price > zone.Upper()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Price Below Specified Zone ...
|
||||||
|
*
|
||||||
|
* @param bar: XOHCL instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsPriceBelowZone(
|
||||||
|
XOHCL &bar,
|
||||||
|
XCZone *zone //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
zone != NULL &&
|
||||||
|
bar.IsValid() &&
|
||||||
|
zone.IsValidBoundary();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
bar.high < zone.Lower()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Price Below Specified Zone ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsPriceBelowZone(
|
||||||
|
double price,
|
||||||
|
XCZone *zone //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
price > 0 &&
|
||||||
|
zone != NULL &&
|
||||||
|
zone.IsValidBoundary();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
price < zone.Lower()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Price Inside Specified Zone ...
|
||||||
|
*
|
||||||
|
* @param bar: XOHCL instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsPriceInsideZone(
|
||||||
|
XOHCL &bar,
|
||||||
|
XCZone *zone //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
zone != NULL &&
|
||||||
|
bar.IsValid() &&
|
||||||
|
zone.IsValidBoundary();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
bar.low <= zone.Upper()
|
||||||
|
//
|
||||||
|
&&
|
||||||
|
//
|
||||||
|
bar.low >= zone.Lower()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bool IsPriceInsideZone(
|
||||||
|
XOHCL &bar,
|
||||||
|
double upper,
|
||||||
|
double lower //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
upper > 0 &&
|
||||||
|
lower > 0 &&
|
||||||
|
upper > lower &&
|
||||||
|
bar.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
bar.low <= upper
|
||||||
|
//
|
||||||
|
&&
|
||||||
|
//
|
||||||
|
bar.low >= lower
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Price Inside Specified Zone ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsPriceInsideZone(
|
||||||
|
double price,
|
||||||
|
XCZone *zone //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
price > 0 &&
|
||||||
|
zone != NULL &&
|
||||||
|
zone.IsValidBoundary();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
price <= zone.Upper()
|
||||||
|
//
|
||||||
|
&&
|
||||||
|
//
|
||||||
|
price >= zone.Lower()
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bool IsPriceInsideZone(
|
||||||
|
double price,
|
||||||
|
double upper,
|
||||||
|
double lower //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
price > 0 &&
|
||||||
|
upper > 0 &&
|
||||||
|
lower > 0 &&
|
||||||
|
upper > lower;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
price <= upper
|
||||||
|
//
|
||||||
|
&&
|
||||||
|
//
|
||||||
|
price >= lower
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
+584
-286
@@ -5010,6 +5010,43 @@ struct XBoxZone
|
|||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Box is Same as another ...
|
||||||
|
*
|
||||||
|
* @param box: XBoxZone instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsSame(XBoxZone &box)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid() &&
|
||||||
|
box.IsValid();
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
dir == box.dir &&
|
||||||
|
from == box.from &&
|
||||||
|
type == box.type &&
|
||||||
|
upper == box.upper &&
|
||||||
|
lower == box.lower &&
|
||||||
|
symbol == box.symbol &&
|
||||||
|
period == box.period
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -5404,292 +5441,6 @@ void CombineStates(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check Price Above Specified Zone ...
|
|
||||||
*
|
|
||||||
* @param bar: XOHCL instance Reference ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool IsPriceAboveZone(
|
|
||||||
XOHCL &bar,
|
|
||||||
XCZone *zone //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
zone != NULL &&
|
|
||||||
bar.IsValid() &&
|
|
||||||
zone.IsValidBoundary();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
bar.low > zone.Upper()
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check Price Above Specified Zone ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool IsPriceAboveZone(
|
|
||||||
double price,
|
|
||||||
XCZone *zone //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
price > 0 &&
|
|
||||||
zone != NULL &&
|
|
||||||
zone.IsValidBoundary();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
price > zone.Upper()
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check Price Below Specified Zone ...
|
|
||||||
*
|
|
||||||
* @param bar: XOHCL instance Reference ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool IsPriceBelowZone(
|
|
||||||
XOHCL &bar,
|
|
||||||
XCZone *zone //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
zone != NULL &&
|
|
||||||
bar.IsValid() &&
|
|
||||||
zone.IsValidBoundary();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
bar.high < zone.Lower()
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check Price Below Specified Zone ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool IsPriceBelowZone(
|
|
||||||
double price,
|
|
||||||
XCZone *zone //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
price > 0 &&
|
|
||||||
zone != NULL &&
|
|
||||||
zone.IsValidBoundary();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
price < zone.Lower()
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check Price Inside Specified Zone ...
|
|
||||||
*
|
|
||||||
* @param bar: XOHCL instance Reference ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool IsPriceInsideZone(
|
|
||||||
XOHCL &bar,
|
|
||||||
XCZone *zone //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
zone != NULL &&
|
|
||||||
bar.IsValid() &&
|
|
||||||
zone.IsValidBoundary();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
bar.low <= zone.Upper()
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
bar.low >= zone.Lower()
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
bool IsPriceInsideZone(
|
|
||||||
XOHCL &bar,
|
|
||||||
double upper,
|
|
||||||
double lower //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
upper > 0 &&
|
|
||||||
lower > 0 &&
|
|
||||||
upper > lower &&
|
|
||||||
bar.IsValid();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
bar.low <= upper
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
bar.low >= lower
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check Price Inside Specified Zone ...
|
|
||||||
*
|
|
||||||
* @return ( bool )
|
|
||||||
*/
|
|
||||||
bool IsPriceInsideZone(
|
|
||||||
double price,
|
|
||||||
XCZone *zone //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
price > 0 &&
|
|
||||||
zone != NULL &&
|
|
||||||
zone.IsValidBoundary();
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
price <= zone.Upper()
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
price >= zone.Lower()
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
bool IsPriceInsideZone(
|
|
||||||
double price,
|
|
||||||
double upper,
|
|
||||||
double lower //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
price > 0 &&
|
|
||||||
upper > 0 &&
|
|
||||||
lower > 0 &&
|
|
||||||
upper > lower;
|
|
||||||
if (!result)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result =
|
|
||||||
//
|
|
||||||
price <= upper
|
|
||||||
//
|
|
||||||
&&
|
|
||||||
//
|
|
||||||
price >= lower
|
|
||||||
//
|
|
||||||
;
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool ToZone(
|
bool ToZone(
|
||||||
T *&source[],
|
T *&source[],
|
||||||
@@ -5791,6 +5542,553 @@ bool ToBox(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
bool IsSame(
|
||||||
|
T *source,
|
||||||
|
T *dest //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = sourceBox.IsSame(destBox);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
bool IsSameDiff(
|
||||||
|
T *source,
|
||||||
|
F *dest //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = sourceBox.IsSame(destBox);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
bool IsBelow(
|
||||||
|
T *source,
|
||||||
|
T *dest,
|
||||||
|
bool ignoreInside = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsBoxBelow(
|
||||||
|
sourceBox,
|
||||||
|
destBox,
|
||||||
|
ignoreInside //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
bool IsBelowDiff(
|
||||||
|
T *source,
|
||||||
|
F *dest,
|
||||||
|
bool ignoreInside = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsBoxBelow(
|
||||||
|
sourceBox,
|
||||||
|
destBox,
|
||||||
|
ignoreInside //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
bool IsAbove(
|
||||||
|
T *source,
|
||||||
|
T *dest,
|
||||||
|
bool ignoreInside = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsBoxAbove(
|
||||||
|
sourceBox,
|
||||||
|
destBox,
|
||||||
|
ignoreInside //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
bool IsAboveDiff(
|
||||||
|
T *source,
|
||||||
|
F *dest,
|
||||||
|
bool ignoreInside = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsBoxAbove(
|
||||||
|
sourceBox,
|
||||||
|
destBox,
|
||||||
|
ignoreInside //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
bool IsInside(
|
||||||
|
T *source,
|
||||||
|
T *dest //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsBoxInside(
|
||||||
|
sourceBox,
|
||||||
|
destBox //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
bool IsInsideDiff(
|
||||||
|
T *source,
|
||||||
|
F *dest //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone sourceBox;
|
||||||
|
result = ToBox(
|
||||||
|
sourceBox,
|
||||||
|
source //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone destBox;
|
||||||
|
result = ToBox(
|
||||||
|
destBox,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsBoxInside(
|
||||||
|
sourceBox,
|
||||||
|
destBox //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
bool FindIndex(
|
||||||
|
int &index,
|
||||||
|
T *item,
|
||||||
|
T *&items[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
index = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone itemBox;
|
||||||
|
result = ToBox(
|
||||||
|
itemBox,
|
||||||
|
item //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XBoxZone itemsBox[];
|
||||||
|
result = ToBox(
|
||||||
|
items,
|
||||||
|
itemsBox //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = FindBoxIndex(
|
||||||
|
index,
|
||||||
|
itemBox,
|
||||||
|
itemsBox //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find Specified Box Index inside a Collection of Boxes ...
|
||||||
|
*
|
||||||
|
* @param box: XBoxZone instance Reference ...
|
||||||
|
* @param boxes: XBoxZone instance Reference Collection ...
|
||||||
|
*
|
||||||
|
* @return ( int )
|
||||||
|
*/
|
||||||
|
bool FindBoxIndex(
|
||||||
|
int &index,
|
||||||
|
XBoxZone &box,
|
||||||
|
XBoxZone &boxes[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
index = -1;
|
||||||
|
|
||||||
|
//
|
||||||
|
int count = ArraySize(boxes);
|
||||||
|
result = box.IsValid() &&
|
||||||
|
IsValidSize(count);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XBoxZone iBox = boxes[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isSame = box.IsSame(iBox);
|
||||||
|
if (isSame)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValidIndex(index);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Source Box is Below Dest ...
|
||||||
|
*
|
||||||
|
* @param source: XBoxZone instance Reference ...
|
||||||
|
* @param dest: XBoxZone instance Reference ...
|
||||||
|
* @param ignoreInside: bool ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsBoxBelow(
|
||||||
|
XBoxZone &source,
|
||||||
|
XBoxZone &dest,
|
||||||
|
bool ignoreInside = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = source.IsValid() &&
|
||||||
|
dest.IsValid() &&
|
||||||
|
!source.IsSame(dest);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!ignoreInside)
|
||||||
|
{
|
||||||
|
result = source.upper < dest.lower;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = (source.upper < dest.lower ||
|
||||||
|
source.upper >= dest.upper) &&
|
||||||
|
source.lower < dest.lower;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Source Box is Above Dest ...
|
||||||
|
*
|
||||||
|
* @param source: XBoxZone instance Reference ...
|
||||||
|
* @param dest: XBoxZone instance Reference ...
|
||||||
|
* @param ignoreInside: bool ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsBoxAbove(
|
||||||
|
XBoxZone &source,
|
||||||
|
XBoxZone &dest,
|
||||||
|
bool ignoreInside = false //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = source.IsValid() &&
|
||||||
|
dest.IsValid() &&
|
||||||
|
!source.IsSame(dest);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!ignoreInside)
|
||||||
|
{
|
||||||
|
result = source.lower > dest.upper;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = (source.lower > dest.upper ||
|
||||||
|
source.lower <= dest.upper) &&
|
||||||
|
source.upper > dest.upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Source Box is Inside Dest ...
|
||||||
|
*
|
||||||
|
* @param source: XBoxZone instance Reference ...
|
||||||
|
* @param dest: XBoxZone instance Reference ...
|
||||||
|
*
|
||||||
|
* @return ( bool )
|
||||||
|
*/
|
||||||
|
bool IsBoxAbove(
|
||||||
|
XBoxZone &source,
|
||||||
|
XBoxZone &dest //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = source.IsValid() &&
|
||||||
|
dest.IsValid() &&
|
||||||
|
!source.IsSame(dest);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = source.lower >= dest.lower &&
|
||||||
|
source.upper <= dest.upper;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a Consolidation Zone ...
|
* Converts a Consolidation Zone ...
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ class XC121SMCCycleHelper : public XCBase
|
|||||||
symbol,
|
symbol,
|
||||||
period //
|
period //
|
||||||
);
|
);
|
||||||
|
mPOIDetector.MaxNumberOfPOIs(requiredPOIS);
|
||||||
mPOIDetector.MaxNumberOfRequiredPOIs(requiredPOIS);
|
mPOIDetector.MaxNumberOfRequiredPOIs(requiredPOIS);
|
||||||
mPOIDetector.Init();
|
mPOIDetector.Init();
|
||||||
|
|
||||||
|
|||||||
@@ -38,10 +38,10 @@ struct XOBTest
|
|||||||
|
|
||||||
//
|
//
|
||||||
XCOrderBlock *ob;
|
XCOrderBlock *ob;
|
||||||
XCFVG *fvg;
|
XCFVG *fvgs[];
|
||||||
|
|
||||||
//
|
//
|
||||||
datetime fvgActivatedAt;
|
datetime fvgBreakedAt;
|
||||||
datetime rewardedAt;
|
datetime rewardedAt;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -62,14 +62,35 @@ struct XOBTest
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
ob = NULL;
|
ob = NULL;
|
||||||
fvg = NULL;
|
|
||||||
symbol = NULL;
|
symbol = NULL;
|
||||||
period = NULL;
|
period = NULL;
|
||||||
rewardedAt = NULL;
|
rewardedAt = NULL;
|
||||||
fvgActivatedAt = NULL;
|
fvgBreakedAt = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
reward = 0;
|
reward = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(fvgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasOB()
|
||||||
|
{
|
||||||
|
return ob != NULL &&
|
||||||
|
ob.IsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int CountFVGs()
|
||||||
|
{
|
||||||
|
return ArraySize(fvgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool HasFVGs()
|
||||||
|
{
|
||||||
|
return IsValidSize(CountFVGs());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -688,22 +709,13 @@ bool DetectX121SMCXOBSSignalSetup(
|
|||||||
if (!isOBTested)
|
if (!isOBTested)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
XOBTest test;
|
|
||||||
bool hasTest = ReTestMarket(
|
bool hasTest = ReTestMarket(
|
||||||
test,
|
|
||||||
conditions.obTests,
|
conditions.obTests,
|
||||||
consolidationState,
|
consolidationState,
|
||||||
analyseState,
|
analyseState,
|
||||||
decisionState,
|
decisionState,
|
||||||
visionCycleHelper.mPOIDrawer //
|
visionCycleHelper.mPOIDrawer //
|
||||||
);
|
);
|
||||||
if (hasTest)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
test,
|
|
||||||
conditions.obTests);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1257,7 +1269,6 @@ int AddX121SMCXOBSConditionsIfNotExists(
|
|||||||
* @return ( bool )
|
* @return ( bool )
|
||||||
*/
|
*/
|
||||||
bool ReTestMarket(
|
bool ReTestMarket(
|
||||||
XOBTest &test,
|
|
||||||
XOBTest &tests[],
|
XOBTest &tests[],
|
||||||
XPOIState &htfState,
|
XPOIState &htfState,
|
||||||
XPOIState &mtfState,
|
XPOIState &mtfState,
|
||||||
@@ -1271,16 +1282,10 @@ bool ReTestMarket(
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
test.Clean();
|
Clean(tests);
|
||||||
|
|
||||||
//
|
//
|
||||||
int testsCount = ArraySize(tests);
|
datetime cTime = TimeCurrent();
|
||||||
bool hasTests = IsValidSize(testsCount);
|
|
||||||
XOBTest lastTest;
|
|
||||||
if (hasTests)
|
|
||||||
{
|
|
||||||
lastTest = tests[testsCount - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Detect Order Blocks ...
|
// Detect Order Blocks ...
|
||||||
@@ -1290,6 +1295,9 @@ bool ReTestMarket(
|
|||||||
// Bullish OBs ...
|
// Bullish OBs ...
|
||||||
XCOrderBlock *bullOBs[];
|
XCOrderBlock *bullOBs[];
|
||||||
bool hasYoungestBullOB = false;
|
bool hasYoungestBullOB = false;
|
||||||
|
XOHCL youngestBullOBStartedBar;
|
||||||
|
bool isYoungestBullOBStarted = false;
|
||||||
|
ENUM_X_DIRECTION youngestBullOBStartedDir;
|
||||||
XCOrderBlock *youngestBullOB = NULL;
|
XCOrderBlock *youngestBullOB = NULL;
|
||||||
int bullOBsCount = ExtractUnActivatedOBs(
|
int bullOBsCount = ExtractUnActivatedOBs(
|
||||||
htfState.bullishOrderBlocks,
|
htfState.bullishOrderBlocks,
|
||||||
@@ -1310,7 +1318,15 @@ bool ReTestMarket(
|
|||||||
hasYoungestBullOB = IsValidIndex(youngestBoxIDX);
|
hasYoungestBullOB = IsValidIndex(youngestBoxIDX);
|
||||||
if (hasYoungestBullOB)
|
if (hasYoungestBullOB)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
youngestBullOB = bullOBs[youngestBoxIDX];
|
youngestBullOB = bullOBs[youngestBoxIDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
isYoungestBullOBStarted = youngestBullOB.IsStarted(
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
youngestBullOBStartedBar,
|
||||||
|
youngestBullOBStartedDir //
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1318,6 +1334,9 @@ bool ReTestMarket(
|
|||||||
// Bearish OBs ...
|
// Bearish OBs ...
|
||||||
XCOrderBlock *bearOBs[];
|
XCOrderBlock *bearOBs[];
|
||||||
bool hasYoungestBearOB = false;
|
bool hasYoungestBearOB = false;
|
||||||
|
XOHCL youngestBearOBStartedBar;
|
||||||
|
bool isYoungestBearOBStarted = false;
|
||||||
|
ENUM_X_DIRECTION youngestBearOBStartedDir;
|
||||||
XCOrderBlock *youngestBearOB = NULL;
|
XCOrderBlock *youngestBearOB = NULL;
|
||||||
int bearOBsCount = ExtractUnActivatedOBs(
|
int bearOBsCount = ExtractUnActivatedOBs(
|
||||||
htfState.bearishOrderBlocks,
|
htfState.bearishOrderBlocks,
|
||||||
@@ -1338,13 +1357,544 @@ bool ReTestMarket(
|
|||||||
hasYoungestBearOB = IsValidIndex(youngestBoxIDX);
|
hasYoungestBearOB = IsValidIndex(youngestBoxIDX);
|
||||||
if (hasYoungestBearOB)
|
if (hasYoungestBearOB)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
youngestBearOB = bearOBs[youngestBoxIDX];
|
youngestBearOB = bearOBs[youngestBoxIDX];
|
||||||
|
|
||||||
|
//
|
||||||
|
isYoungestBearOBStarted = youngestBearOB.IsStarted(
|
||||||
|
X_DIRECTION_BEARISH,
|
||||||
|
youngestBearOBStartedBar,
|
||||||
|
youngestBearOBStartedDir //
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
result = isBullOBsPassed ||
|
bool hasYoungestOB = hasYoungestBullOB ||
|
||||||
isBearOBsPassed;
|
hasYoungestBearOB;
|
||||||
|
result = hasYoungestOB;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Since Youngest Order Blocks is UnActivated ...
|
||||||
|
// here we found Order Flow ...
|
||||||
|
// Order Blocks in consequences of Youngest OB which they
|
||||||
|
// Breaked ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish OB ...
|
||||||
|
int breakedBullOBsCount = 0;
|
||||||
|
XCOrderBlock *breakedBullOBs[];
|
||||||
|
bool hasBreakedBullOBs = false;
|
||||||
|
if (hasYoungestBullOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasOBs = htfState.HasBullishOrderBlocks();
|
||||||
|
int count = htfState.CountBullishOrderBlocks();
|
||||||
|
if (hasOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOB = htfState.bullishOrderBlocks[i];
|
||||||
|
ENUM_X_DIRECTION forDir =
|
||||||
|
iOB.IsBullish()
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_BEARISH;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check iOB isn't Same as Youngest OB ...
|
||||||
|
bool isSameAsYoungest = IsSame(
|
||||||
|
youngestBullOB,
|
||||||
|
iOB //
|
||||||
|
);
|
||||||
|
if (isSameAsYoungest)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Order Blocks must appears Below
|
||||||
|
// Youngest One ...
|
||||||
|
bool isBelow = IsBelow(
|
||||||
|
iOB,
|
||||||
|
youngestBullOB //
|
||||||
|
);
|
||||||
|
if (!isBelow)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL iBreakerBar;
|
||||||
|
ENUM_X_DIRECTION iBreakerDir;
|
||||||
|
bool isIBreaked = iOB.IsBreaked(
|
||||||
|
forDir,
|
||||||
|
iBreakerBar,
|
||||||
|
iBreakerDir //
|
||||||
|
);
|
||||||
|
if (!isIBreaked)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bullish Order Block Must Valid ...
|
||||||
|
// Means Price Must be On Top of it after its breake out ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = false;
|
||||||
|
int fromIndex = iBreakerBar.Index() - 1;
|
||||||
|
for (int i = fromIndex; i >= 0; i--)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL iBar;
|
||||||
|
bool isInited = iBar.Init(
|
||||||
|
iOB.GetSymbol(),
|
||||||
|
iOB.GetPeriod(),
|
||||||
|
i //
|
||||||
|
);
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
isValid = iBar.low > iOB.Upper();
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set OB's To Time to Breaker Bar's Time ...
|
||||||
|
iOB.To(iBreakerBar.time);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Order Block Not Exists ...
|
||||||
|
int iOBIDX = -1;
|
||||||
|
bool isIOBExists = FindIndex(
|
||||||
|
iOBIDX,
|
||||||
|
iOB,
|
||||||
|
breakedBullOBs //
|
||||||
|
);
|
||||||
|
if (isIOBExists)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
iOB,
|
||||||
|
breakedBullOBs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
breakedBullOBsCount = ArraySize(breakedBullOBs);
|
||||||
|
hasBreakedBullOBs = IsValidSize(breakedBullOBsCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish OB ...
|
||||||
|
int breakedBearOBsCount = 0;
|
||||||
|
XCOrderBlock *breakedBearOBs[];
|
||||||
|
bool hasBreakedBearOBs = false;
|
||||||
|
if (hasYoungestBearOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool hasOBs = htfState.HasBearishOrderBlocks();
|
||||||
|
int count = htfState.CountBearishOrderBlocks();
|
||||||
|
if (hasOBs)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOB = htfState.bearishOrderBlocks[i];
|
||||||
|
ENUM_X_DIRECTION forDir =
|
||||||
|
iOB.IsBullish()
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_BEARISH;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check iOB isn't Same as Youngest OB ...
|
||||||
|
bool isSameAsYoungest = IsSame(
|
||||||
|
youngestBearOB,
|
||||||
|
iOB //
|
||||||
|
);
|
||||||
|
if (isSameAsYoungest)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Order Blocks must appears Above
|
||||||
|
// Youngest One ...
|
||||||
|
bool isAbove = IsAbove(
|
||||||
|
iOB,
|
||||||
|
youngestBearOB //
|
||||||
|
);
|
||||||
|
if (!isAbove)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL iBreakerBar;
|
||||||
|
ENUM_X_DIRECTION iBreakerDir;
|
||||||
|
bool isIBreaked = iOB.IsBreaked(
|
||||||
|
forDir,
|
||||||
|
iBreakerBar,
|
||||||
|
iBreakerDir //
|
||||||
|
);
|
||||||
|
if (!isIBreaked)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bearish Order Block Must Valid ...
|
||||||
|
// Means Price Must be On Bottom of it after its breake out ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isValid = false;
|
||||||
|
int fromIndex = iBreakerBar.Index() - 1;
|
||||||
|
for (int i = fromIndex; i >= 0; i--)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOHCL iBar;
|
||||||
|
bool isInited = iBar.Init(
|
||||||
|
iOB.GetSymbol(),
|
||||||
|
iOB.GetPeriod(),
|
||||||
|
i //
|
||||||
|
);
|
||||||
|
if (!isInited)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
isValid = iBar.high < iOB.Lower();
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isValid)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set OB's To Time to Breaker Bar's Time ...
|
||||||
|
iOB.To(iBreakerBar.time);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Order Block Not Exists ...
|
||||||
|
int iOBIDX = -1;
|
||||||
|
bool isIOBExists = FindIndex(
|
||||||
|
iOBIDX,
|
||||||
|
iOB,
|
||||||
|
breakedBearOBs //
|
||||||
|
);
|
||||||
|
if (isIOBExists)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
iOB,
|
||||||
|
breakedBearOBs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
breakedBearOBsCount = ArraySize(breakedBearOBs);
|
||||||
|
hasBreakedBearOBs = IsValidSize(breakedBearOBsCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBreakedOBs = hasBreakedBullOBs ||
|
||||||
|
hasBreakedBearOBs;
|
||||||
|
result = hasBreakedOBs;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update Youngest OB To time ...
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasYoungestBullOB)
|
||||||
|
{
|
||||||
|
youngestBullOB.To(cTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasYoungestBearOB)
|
||||||
|
{
|
||||||
|
youngestBearOB.To(cTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now we Have to Validate Breaked Order Blocks Count in additions to Youngest OB directions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishOrderFlow =
|
||||||
|
//
|
||||||
|
hasYoungestBullOB &&
|
||||||
|
isYoungestBullOBStarted &&
|
||||||
|
//
|
||||||
|
breakedBullOBsCount >= 2
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBearishOrderFlow =
|
||||||
|
//
|
||||||
|
hasYoungestBearOB &&
|
||||||
|
isYoungestBearOBStarted &&
|
||||||
|
//
|
||||||
|
breakedBearOBsCount >= 2
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_X_DIRECTION orderFlowDir = X_DIRECTION_NONE;
|
||||||
|
bool hasOrderFlow = hasBullishOrderFlow ||
|
||||||
|
hasBearishOrderFlow;
|
||||||
|
if (hasOrderFlow)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
orderFlowDir =
|
||||||
|
hasBullishOrderFlow
|
||||||
|
? X_DIRECTION_BULLISH
|
||||||
|
: X_DIRECTION_BEARISH;
|
||||||
|
}
|
||||||
|
result = hasOrderFlow;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// here we have try to detect Fair Value Gaps in Related to OrderFlow ...
|
||||||
|
if (hasBullishOrderFlow)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < breakedBullOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOB = breakedBullOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL iOBBreakerBar;
|
||||||
|
ENUM_X_DIRECTION iOBBreakerDir;
|
||||||
|
bool isIOBBreaked = iOB.IsBreaked(
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
iOBBreakerBar,
|
||||||
|
iOBBreakerDir //
|
||||||
|
);
|
||||||
|
if (!isIOBBreaked)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int fvgsCount = mtfState.CountBullishFairValueGaps();
|
||||||
|
bool hasFVGs = mtfState.HasBullishFairValueGaps();
|
||||||
|
if (!hasFVGs)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XCFVG *iOBFVGs[];
|
||||||
|
for (int j = 0; j < fvgsCount; j++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *jFVG = mtfState.bullishFairValueGaps[j];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isFromPassed = jFVG.From() >= iOB.From();
|
||||||
|
if (!isFromPassed)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isAbovePassed = IsAboveDiff(
|
||||||
|
jFVG,
|
||||||
|
iOB,
|
||||||
|
true // Ignore Inside FVG ...
|
||||||
|
);
|
||||||
|
if (!isAbovePassed)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
jFVG.To(iOB.To());
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
jFVG,
|
||||||
|
iOBFVGs //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Order Block Has FVG or Not ...
|
||||||
|
int iOBFVGsCount = ArraySize(iOBFVGs);
|
||||||
|
bool iOBHasFVG = IsValidSize(iOBFVGsCount);
|
||||||
|
if (iOBHasFVG)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOBTest iTest;
|
||||||
|
|
||||||
|
//
|
||||||
|
iTest.ob = iOB;
|
||||||
|
iTest.symbol = iOB.GetSymbol();
|
||||||
|
iTest.period = iOB.GetPeriod();
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
iOBFVGs,
|
||||||
|
iTest.fvgs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iTest,
|
||||||
|
tests //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
iTest.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (hasBearishOrderFlow)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < breakedBearOBsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCOrderBlock *iOB = breakedBearOBs[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL iOBBreakerBar;
|
||||||
|
ENUM_X_DIRECTION iOBBreakerDir;
|
||||||
|
bool isIOBBreaked = iOB.IsBreaked(
|
||||||
|
X_DIRECTION_BULLISH,
|
||||||
|
iOBBreakerBar,
|
||||||
|
iOBBreakerDir //
|
||||||
|
);
|
||||||
|
if (!isIOBBreaked)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int fvgsCount = mtfState.CountBearishFairValueGaps();
|
||||||
|
bool hasFVGs = mtfState.HasBearishFairValueGaps();
|
||||||
|
if (!hasFVGs)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XCFVG *iOBFVGs[];
|
||||||
|
for (int j = 0; j < fvgsCount; j++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *jFVG = mtfState.bearishFairValueGaps[j];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isFromPassed = jFVG.From() >= iOB.From();
|
||||||
|
if (!isFromPassed)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isBelowPassed = IsBelowDiff(
|
||||||
|
jFVG,
|
||||||
|
iOB,
|
||||||
|
true // Ignore Inside FVG ...
|
||||||
|
);
|
||||||
|
if (!isBelowPassed)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
jFVG.To(iOB.To());
|
||||||
|
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
jFVG,
|
||||||
|
iOBFVGs //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Order Block Has FVG or Not ...
|
||||||
|
int iOBFVGsCount = ArraySize(iOBFVGs);
|
||||||
|
bool iOBHasFVG = IsValidSize(iOBFVGsCount);
|
||||||
|
if (iOBHasFVG)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOBTest iTest;
|
||||||
|
|
||||||
|
//
|
||||||
|
iTest.ob = iOB;
|
||||||
|
iTest.symbol = iOB.GetSymbol();
|
||||||
|
iTest.period = iOB.GetPeriod();
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
iOBFVGs,
|
||||||
|
iTest.fvgs //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iTest,
|
||||||
|
tests //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
iTest.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now we Have to Works On Tests Collection ...
|
||||||
|
|
||||||
|
//
|
||||||
|
int testsCount = ArraySize(tests);
|
||||||
|
bool hasTests = testsCount >= 2;
|
||||||
|
result = hasTests;
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
@@ -1401,6 +1951,130 @@ bool ReTestMarket(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Draw Breaked Bullish OrderBlocks ...
|
||||||
|
// if (hasBreakedBullOBs)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// for (int i = 0; i < breakedBullOBsCount; i++)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCOrderBlock *iOB = breakedBullOBs[i];
|
||||||
|
// // iOB.To(cTime);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// XCBullishOrderBlockObject *iObj;
|
||||||
|
// bool isCreated = drawer
|
||||||
|
// .CreateBullishOrderBlock(
|
||||||
|
// iOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// (XCBaseObject *)iObj,
|
||||||
|
// drawnObjects //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// // Draw Breaked Bearish OrderBlocks ...
|
||||||
|
// if (hasBreakedBearOBs)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// for (int i = 0; i < breakedBearOBsCount; i++)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// XCOrderBlock *iOB = breakedBearOBs[i];
|
||||||
|
// // iOB.To(cTime);
|
||||||
|
|
||||||
|
// //
|
||||||
|
// XCBearishOrderBlockObject *iObj;
|
||||||
|
// bool isCreated = drawer
|
||||||
|
// .CreateBearishOrderBlock(
|
||||||
|
// iOB,
|
||||||
|
// iObj //
|
||||||
|
// );
|
||||||
|
|
||||||
|
// //
|
||||||
|
// if (isCreated)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// Add(
|
||||||
|
// (XCBaseObject *)iObj,
|
||||||
|
// drawnObjects //
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Draw Tests ...
|
||||||
|
if (hasTests)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < testsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOBTest iTest = tests[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasOB = iTest.HasOB();
|
||||||
|
if (hasOB)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isBullish = iTest.ob.IsBullish();
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBaseObject *obObj;
|
||||||
|
bool isCreated = drawer
|
||||||
|
.CreateOrderBlock(
|
||||||
|
iTest.ob,
|
||||||
|
obObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
obObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasFVGs = iTest.HasFVGs();
|
||||||
|
int fvgsCount = iTest.CountFVGs();
|
||||||
|
for (int j = 0; j < fvgsCount; j++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XCFVG *jFVG = iTest.fvgs[j];
|
||||||
|
jFVG.To(iTest.ob.To());
|
||||||
|
|
||||||
|
//
|
||||||
|
XCBaseObject *fvgObj;
|
||||||
|
bool isCreated = drawer
|
||||||
|
.CreateFairValueGap(
|
||||||
|
jFVG,
|
||||||
|
fvgObj //
|
||||||
|
);
|
||||||
|
if (isCreated)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Add(
|
||||||
|
fvgObj,
|
||||||
|
drawnObjects //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// END DRAW ...
|
// END DRAW ...
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -978,15 +978,21 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
x121Inputs.xpvInputs.hcMethod = hcMethod;
|
x121Inputs.xpvInputs.hcMethod = hcMethod;
|
||||||
x121Inputs.xpvInputs.hcPeriod = hcPeriod;
|
x121Inputs.xpvInputs.hcPeriod = hcPeriod;
|
||||||
|
|
||||||
|
//
|
||||||
|
x121Inputs.xhkInputs.xhkIgnoreSmoothingShadows = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
x121Inputs.xatrInputs.atrMultiplier = 1.5;
|
||||||
|
x121Inputs.xatrInputs.atrSmoothingMode = X_MA_MODE_EMA;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XPV ...
|
// XPV ...
|
||||||
x121Inputs.xpvInputs.showSar = showAll || true;
|
x121Inputs.xpvInputs.showSar = showAll || false;
|
||||||
x121Inputs.xpvInputs.showPeaks = showAll || true;
|
x121Inputs.xpvInputs.showPeaks = showAll || false;
|
||||||
x121Inputs.xpvInputs.showVales = showAll || true;
|
x121Inputs.xpvInputs.showVales = showAll || false;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XHK ...
|
// XHK ...
|
||||||
x121Inputs.xhkInputs.xhkIgnoreSmoothingShadows = true;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false;
|
x121Inputs.xhkInputs.drawRawXHKCandles = showAll || false;
|
||||||
@@ -997,10 +1003,6 @@ class XCX121SMCStrategy : public XCX121SMCBaseStrategy
|
|||||||
x121Inputs.xatrInputs.showATRUpper = showAll || false;
|
x121Inputs.xatrInputs.showATRUpper = showAll || false;
|
||||||
x121Inputs.xatrInputs.showATRLower = showAll || false;
|
x121Inputs.xatrInputs.showATRLower = showAll || false;
|
||||||
|
|
||||||
//
|
|
||||||
x121Inputs.xatrInputs.atrMultiplier = 1.5;
|
|
||||||
x121Inputs.xatrInputs.atrSmoothingMode = X_MA_MODE_EMA;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// XSTR ...
|
// XSTR ...
|
||||||
x121Inputs.xstrInputs.showStr = showAll || false;
|
x121Inputs.xstrInputs.showStr = showAll || false;
|
||||||
|
|||||||
Reference in New Issue
Block a user