last ...
This commit is contained in:
@@ -0,0 +1,830 @@
|
||||
//
|
||||
bool HasSenario1Conditions(
|
||||
ENUM_X_CYCLES cycle,
|
||||
XBoxZone &box,
|
||||
XBoxZone &holderBox,
|
||||
ENUM_X_DIRECTION &dir,
|
||||
XBoxZone &waitingBoxes[],
|
||||
X121SMCStrategySignalProviderData &provider,
|
||||
ENUM_X_CYCLES holderCycle = X_CYCLE_NONE,
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Fil Selected Data ...
|
||||
XPOIState cState;
|
||||
X121Conditions cXConditions;
|
||||
XPOIStateEvents cStateEvents;
|
||||
XC121SMCCycleHelper *cHelper;
|
||||
X121SMCCycleConditions cConditions;
|
||||
result = provider.SelectCycle(
|
||||
cycle,
|
||||
cState,
|
||||
cStateEvents,
|
||||
cXConditions,
|
||||
cHelper,
|
||||
cConditions //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
cState.Clean();
|
||||
ZeroMemory(cHelper);
|
||||
cConditions.Clean();
|
||||
cXConditions.Clean();
|
||||
cStateEvents.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
Parse(cXConditions);
|
||||
|
||||
//
|
||||
// Fil Selected Data ...
|
||||
XPOIState chState;
|
||||
X121Conditions chXConditions;
|
||||
XPOIStateEvents chStateEvents;
|
||||
XC121SMCCycleHelper *chHelper;
|
||||
X121SMCCycleConditions chConditions;
|
||||
if (holderCycle != X_CYCLE_NONE)
|
||||
{
|
||||
//
|
||||
result = provider.SelectCycle(
|
||||
holderCycle,
|
||||
chState,
|
||||
chStateEvents,
|
||||
chXConditions,
|
||||
chHelper,
|
||||
chConditions //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
chState.Clean();
|
||||
ZeroMemory(chHelper);
|
||||
chConditions.Clean();
|
||||
chXConditions.Clean();
|
||||
chStateEvents.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
Parse(chXConditions);
|
||||
}
|
||||
|
||||
//
|
||||
// Checking Waiting Baoxes Exists ...
|
||||
result = HasChild(waitingBoxes);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
XCPOIDrawer *drawer = provider
|
||||
.visionCycleHelper
|
||||
.mPOIDrawer;
|
||||
|
||||
//
|
||||
// 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;
|
||||
int ppIDX = pIDX + 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;
|
||||
}
|
||||
|
||||
//
|
||||
// Detect Inside Box ...
|
||||
XBoxZone insideBox;
|
||||
count = ArraySize(waitingBoxes);
|
||||
has = IsValidSize(count);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
//
|
||||
XBoxZone iBox = waitingBoxes[i];
|
||||
bool isBullish = iBox.IsBullish();
|
||||
double iMid = iBox.lower + ((iBox.upper - iBox.lower) / 2);
|
||||
|
||||
//
|
||||
has =
|
||||
//
|
||||
isBullish
|
||||
? cBar.low < iMid &&
|
||||
cBar.low > iBox.lower
|
||||
: cBar.high > iMid &&
|
||||
cBar.high < iBox.upper
|
||||
//
|
||||
;
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
insideBox = iBox;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
has = insideBox.IsValid();
|
||||
|
||||
//
|
||||
ENUM_X_DIRECTION iBarPosDir;
|
||||
bool isBarValidForDir = cHelper
|
||||
.mBarAnalyser
|
||||
.IsValidForPosition(
|
||||
cBar,
|
||||
iBarPosDir //
|
||||
);
|
||||
bool isBarValidForBullish =
|
||||
isBarValidForDir &&
|
||||
IsBullish(iBarPosDir);
|
||||
bool isBarValidForBearish =
|
||||
isBarValidForDir &&
|
||||
IsBearish(iBarPosDir);
|
||||
|
||||
//
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
XCBoxObject *iObj;
|
||||
has = drawer.DrawBox(
|
||||
insideBox,
|
||||
iObj //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
Print("Dec Scores:");
|
||||
Print("-------------");
|
||||
Print("Bull: ", provider.decisionBullishScore);
|
||||
Print("Bear: ", provider.decisionBearishScore);
|
||||
Print("-------------");
|
||||
Print("Anal Scores:");
|
||||
Print("-------------");
|
||||
Print("Bull: ", provider.analyseBullishScore);
|
||||
Print("Bear: ", provider.analyseBearishScore);
|
||||
Print("-------------");
|
||||
Print("Bar Valid For: " + ToString(iBarPosDir));
|
||||
Print("-------------");
|
||||
Print(ToString(insideBox.dir), " Inside ...");
|
||||
Print("-------------");
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = has;
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
zBar.Clean();
|
||||
cBar.Clean();
|
||||
pBar.Clean();
|
||||
cState.Clean();
|
||||
chState.Clean();
|
||||
insideBox.Clean();
|
||||
ZeroMemory(cHelper);
|
||||
cConditions.Clean();
|
||||
cXConditions.Clean();
|
||||
ZeroMemory(chHelper);
|
||||
chConditions.Clean();
|
||||
chXConditions.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Detecting Signal Conditions ...
|
||||
|
||||
//
|
||||
// Bullish Conditions ...
|
||||
isBullish =
|
||||
//
|
||||
// Base Condition ...
|
||||
(
|
||||
//
|
||||
insideBox.IsBullish() &&
|
||||
isBarValidForBullish
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Bearish Conditions ...
|
||||
isBearish =
|
||||
//
|
||||
// Base Condition ...
|
||||
(
|
||||
//
|
||||
insideBox.IsBearish() &&
|
||||
isBarValidForBearish
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Filling Requirements ...
|
||||
result =
|
||||
isBullish ||
|
||||
isBearish;
|
||||
if (result)
|
||||
{
|
||||
//
|
||||
dir =
|
||||
isBullish
|
||||
? X_DIRECTION_BULLISH
|
||||
: X_DIRECTION_BEARISH;
|
||||
|
||||
//
|
||||
box.dir = dir;
|
||||
box.to = TimeCurrent();
|
||||
box.from = insideBox.from;
|
||||
box.upper = insideBox.upper;
|
||||
box.lower = insideBox.lower;
|
||||
box.symbol = cXConditions.symbol;
|
||||
box.period = cXConditions.period;
|
||||
}
|
||||
|
||||
//
|
||||
// Check All Conditions ...
|
||||
result =
|
||||
box.IsValid() &&
|
||||
HasDirection(dir) &&
|
||||
(isBullish ||
|
||||
isBearish);
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
zBar.Clean();
|
||||
cBar.Clean();
|
||||
pBar.Clean();
|
||||
cState.Clean();
|
||||
chState.Clean();
|
||||
insideBox.Clean();
|
||||
ZeroMemory(cHelper);
|
||||
cConditions.Clean();
|
||||
cStateEvents.Clean();
|
||||
cXConditions.Clean();
|
||||
ZeroMemory(chHelper);
|
||||
chConditions.Clean();
|
||||
chStateEvents.Clean();
|
||||
chXConditions.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* Checking a Box Exists in Collections or not ...
|
||||
*
|
||||
* @param box: XBoxZone instance reference ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool IsExists(XBoxZone &box)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Check Validation ...
|
||||
result = box.IsValid() &&
|
||||
(HasWaitingBoxes() ||
|
||||
HasBreakedBoxes() ||
|
||||
HasUnavailableBoxes());
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int idx = -1;
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
// Check Index in Waiting Boxes ...
|
||||
has = HasWaitingBoxes();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
idx = FindIndex(
|
||||
box,
|
||||
waitingBoxes //
|
||||
);
|
||||
result = IsValidIndex(idx);
|
||||
if (result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check Index in Breaked Boxes ...
|
||||
has = HasBreakedBoxes();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
idx = FindIndex(
|
||||
box,
|
||||
breakedBoxes //
|
||||
);
|
||||
result = IsValidIndex(idx);
|
||||
if (result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check Index in Unavailable Boxes ...
|
||||
has = HasUnavailableBoxes();
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
idx = FindIndex(
|
||||
box,
|
||||
unavailableBoxes //
|
||||
);
|
||||
result = IsValidIndex(idx);
|
||||
if (result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect Signal Boxes ...
|
||||
*
|
||||
* @param cycle: ENUM_X_CYCLES member ...
|
||||
* @param provider: X121SMCStrategySignalProviderData instance reference ...
|
||||
* @param barIndex: int ...
|
||||
*
|
||||
* @return ( bool )
|
||||
*/
|
||||
bool DetectSignalBoxes(
|
||||
ENUM_X_CYCLES cycle,
|
||||
X121SMCStrategySignalProviderData &provider,
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int idx = -1;
|
||||
int count = 0;
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
if (barIndex < 0)
|
||||
{
|
||||
barIndex = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Select Cycle ...
|
||||
XPOIState cState;
|
||||
XPOIStateEvents cStateEvents;
|
||||
X121Conditions cXConditions;
|
||||
XC121SMCCycleHelper *cHelper;
|
||||
X121SMCCycleConditions cConditions;
|
||||
result = provider.SelectCycle(
|
||||
cycle,
|
||||
cState,
|
||||
cStateEvents,
|
||||
cXConditions,
|
||||
cHelper,
|
||||
cConditions //
|
||||
);
|
||||
if (!result)
|
||||
{
|
||||
//
|
||||
cState.Clean();
|
||||
ZeroMemory(cHelper);
|
||||
cConditions.Clean();
|
||||
cStateEvents.Clean();
|
||||
cXConditions.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Select Rejection Boxes ...
|
||||
|
||||
// //
|
||||
// // Select Validate Rejection Boxes ...
|
||||
// XBoxZone rejections[];
|
||||
// int count = cHelper
|
||||
// .DetectRejections(
|
||||
// rejections,
|
||||
// barIndex //
|
||||
// );
|
||||
|
||||
// //
|
||||
// result = IsValidSize(count);
|
||||
// if (result)
|
||||
// {
|
||||
// //
|
||||
// for (int i = 0; i < count; i++)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(rejections[i]);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// rejections[i],
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// //
|
||||
// // Select Order Blocks ...
|
||||
// if (cStateEvents.hasNewOrderBlock)
|
||||
// {
|
||||
// //
|
||||
// idx = GetYoungest(cState.orderBlocks);
|
||||
// has = IsValidIndex(idx);
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// XCOrderBlock *iOB = cState.orderBlocks[idx];
|
||||
|
||||
// //
|
||||
// XBoxZone iBox;
|
||||
// has = ToBox(
|
||||
// iBox,
|
||||
// iOB //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(iBox);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iBox,
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
// Select Fair Value Gaps ...
|
||||
// if (cStateEvents.hasNewFairValueGap)
|
||||
// {
|
||||
// //
|
||||
// idx = GetYoungest(cState.fairValueGaps);
|
||||
// has = IsValidIndex(idx);
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// XCFVG *iOB = cState.fairValueGaps[idx];
|
||||
|
||||
// //
|
||||
// XBoxZone iBox;
|
||||
// has = ToBox(
|
||||
// iBox,
|
||||
// iOB //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(iBox);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iBox,
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
// Select Supply/Demand Zones ...
|
||||
// if (cStateEvents.hasNewSupplyZone)
|
||||
// {
|
||||
// //
|
||||
// idx = GetYoungest(cState.supplyZones);
|
||||
// has = IsValidIndex(idx);
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// XCSupplyZone *iSupply = cState.supplyZones[idx];
|
||||
|
||||
// //
|
||||
// XBoxZone iBox;
|
||||
// has = ToBox(
|
||||
// iBox,
|
||||
// iSupply //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(iBox);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iBox,
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if (cStateEvents.hasNewDemandZone)
|
||||
// {
|
||||
// //
|
||||
// idx = GetYoungest(cState.demandZones);
|
||||
// has = IsValidIndex(idx);
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// XCDemandZone *iDemand = cState.demandZones[idx];
|
||||
|
||||
// //
|
||||
// XBoxZone iBox;
|
||||
// has = ToBox(
|
||||
// iBox,
|
||||
// iDemand //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(iBox);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iBox,
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
// Select Support/Resistance Zones ...
|
||||
// if (cStateEvents.hasNewSupportZone)
|
||||
// {
|
||||
// //
|
||||
// idx = GetYoungest(cState.supportZones);
|
||||
// has = IsValidIndex(idx);
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// XCSupportZone *iSupport = cState.supportZones[idx];
|
||||
|
||||
// //
|
||||
// XBoxZone iBox;
|
||||
// has = ToBox(
|
||||
// iBox,
|
||||
// iSupport //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(iBox);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iBox,
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if (cStateEvents.hasNewResistanceZone)
|
||||
// {
|
||||
// //
|
||||
// idx = GetYoungest(cState.resistanceZones);
|
||||
// has = IsValidIndex(idx);
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// XCResistanceZone *iResistance = cState.resistanceZones[idx];
|
||||
|
||||
// //
|
||||
// XBoxZone iBox;
|
||||
// has = ToBox(
|
||||
// iBox,
|
||||
// iResistance //
|
||||
// );
|
||||
// if (has)
|
||||
// {
|
||||
// //
|
||||
// has = IsExists(iBox);
|
||||
// if (!has)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iBox,
|
||||
// waitingBoxes //
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
count = CountWaitingBoxes();
|
||||
result = IsValidSize(count);
|
||||
|
||||
//
|
||||
// Cleanup Resources ...
|
||||
|
||||
//
|
||||
cState.Clean();
|
||||
ZeroMemory(cHelper);
|
||||
cConditions.Clean();
|
||||
cXConditions.Clean();
|
||||
cStateEvents.Clean();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validating Waiting Boxes and Detect Breaked Boxes ...
|
||||
*
|
||||
* @param barIndex: int ...
|
||||
*
|
||||
* @return ( int )
|
||||
*/
|
||||
int ValidateWaitingBoxes(
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
bool has = false;
|
||||
|
||||
//
|
||||
if (barIndex < 0)
|
||||
{
|
||||
barIndex = 0;
|
||||
}
|
||||
|
||||
//
|
||||
if (barIndex == 0)
|
||||
{
|
||||
barIndex = 1;
|
||||
}
|
||||
|
||||
//
|
||||
has = HasWaitingBoxes();
|
||||
if (!has)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int removeIDX[];
|
||||
result = CountWaitingBoxes();
|
||||
for (int i = 0; i < result; i++)
|
||||
{
|
||||
//
|
||||
XOHCL iBar;
|
||||
XBoxZone iBox = waitingBoxes[i];
|
||||
bool isInite = iBar
|
||||
.Init(
|
||||
iBox.symbol,
|
||||
iBox.period,
|
||||
iBox.from //
|
||||
);
|
||||
|
||||
//
|
||||
has = isInite &&
|
||||
IsBoxBreaked(
|
||||
iBox,
|
||||
iBar.Index() - 1,
|
||||
barIndex,
|
||||
period //
|
||||
);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
Add(
|
||||
i,
|
||||
removeIDX //
|
||||
);
|
||||
|
||||
//
|
||||
AddRef(
|
||||
iBox,
|
||||
breakedBoxes //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
iBox.Clean();
|
||||
iBar.Clean();
|
||||
}
|
||||
|
||||
//
|
||||
has = HasChild(removeIDX);
|
||||
if (has)
|
||||
{
|
||||
//
|
||||
CleanupArray(
|
||||
removeIDX,
|
||||
waitingBoxes //
|
||||
);
|
||||
}
|
||||
Clean(removeIDX);
|
||||
|
||||
//
|
||||
result = CountWaitingBoxes();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user