This commit is contained in:
2025-09-29 16:22:30 +03:30
parent 57be148292
commit fd82d07995
5 changed files with 4238 additions and 215 deletions
File diff suppressed because it is too large Load Diff
+16 -6
View File
@@ -453,11 +453,15 @@ void OnTick()
}
//
// fima1Signaller.OnTick();
fima2Signaller.OnTick();
// Bar Index ...
int barIndex = 1;
//
AnalyseMarket(1);
// fima1Signaller.OnTick(barIndex);
fima2Signaller.OnTick(barIndex);
//
// AnalyseMarket(barIndex);
}
//
@@ -613,7 +617,7 @@ void OnSignalTriggered(XSignal &signal)
//
// TODO: Fix this ...
return;
// return;
//
// Draw Signal on Chart ...
@@ -627,6 +631,12 @@ void OnSignalTriggered(XSignal &signal)
//
if (has)
{
//
ENUM_X_SIGNAL_EXECUTION_RESULT result;
eaExpert.eaTrader.ExecuteSignal(
signal,
result //
);
Print("Signal Issued: ", signal.GetObjectID());
}
@@ -923,8 +933,8 @@ void AnalyseMarket(int barIndex = 0)
);
//
// XFIMASIgballer2First(bar);
HandleLookupSignal(bar);
XFIMASIgballer2First(bar);
// HandleLookupSignal(bar);
//
bar.Clean();
@@ -83,6 +83,10 @@ bool IsValid(string value)
//
return result;
}
bool IsXValid(string value)
{
return IsValid(value);
}
bool IsSpecifiedValid(string value)
{
return IsValid(value);
@@ -106,6 +110,10 @@ bool IsValid(datetime value)
//
return result;
}
bool IsXValid(datetime value)
{
return IsValid(value);
}
bool IsSpecifiedValid(datetime value)
{
return IsValid(value);
@@ -133,6 +141,11 @@ bool IsValid(ENUM_TIMEFRAMES value)
//
return result;
}
bool IsXValid(ENUM_TIMEFRAMES value)
{
//
return IsValid(value);
}
bool IsSpecifiedValid(ENUM_TIMEFRAMES value)
{
//
@@ -171,6 +184,16 @@ bool IsValid(
//
return result;
}
bool IsXValid(
ENUM_X_PERIOD_METHOD mMethod,
ENUM_TIMEFRAMES mPeriod //
)
{
return IsValid(
mMethod,
mPeriod //
);
}
bool IsSpecifiedValid(
ENUM_X_PERIOD_METHOD mMethod,
ENUM_TIMEFRAMES mPeriod //
+34
View File
@@ -346,6 +346,10 @@ bool IsValid(ENUM_X_BOUNDARY_PRICE value)
//
return result;
}
bool IsXValid(ENUM_X_BOUNDARY_PRICE value)
{
return IsValid(value);
}
bool IsSpecifiedValid(ENUM_X_BOUNDARY_PRICE value)
{
return IsValid(value);
@@ -417,6 +421,10 @@ bool IsValid(ENUM_X_DIRECTION value)
//
return result;
}
bool IsXValid(ENUM_X_DIRECTION value)
{
return IsValid(value);
}
bool IsSpecifiedValid(ENUM_X_DIRECTION value)
{
return IsValid(value);
@@ -460,6 +468,17 @@ bool IsBullish(ENUM_X_DIRECTION value)
//
return result;
}
bool IsXBullish(ENUM_X_DIRECTION value)
{
//
bool result = false;
//
result = value == X_DIRECTION_BULLISH;
//
return result;
}
bool IsSpecifiedBullish(ENUM_X_DIRECTION value)
{
//
@@ -490,6 +509,17 @@ bool IsBearish(ENUM_X_DIRECTION value)
//
return result;
}
bool IsXBearish(ENUM_X_DIRECTION value)
{
//
bool result = false;
//
result = value == X_DIRECTION_BEARISH;
//
return result;
}
bool IsSpecifiedBearish(ENUM_X_DIRECTION value)
{
//
@@ -943,6 +973,10 @@ bool IsValid(ENUM_X_MARKET_CYCLES value)
//
return result;
}
bool IsXValid(ENUM_X_MARKET_CYCLES value)
{
return IsValid(value);
}
bool IsSpecifiedValid(ENUM_X_MARKET_CYCLES value)
{
return IsValid(value);
@@ -617,7 +617,7 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
XBoxZone iZone;
int count = 0;
bool has = false;
int cIdx = barIndex + 1;
int cIdx = 0;
int pIdx = cIdx + 1;
string iName = NULL;
XBoxZone supports[];
@@ -625,10 +625,12 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
bool isBullish = false;
bool isBearish = false;
double iPrice = EMPTY_VALUE;
double iPriceEdge = EMPTY_VALUE;
XFIMAMarketStructure structure;
XFIMAConditions fimaConditions;
ENUM_X_PRICE iPriceType = X_PRICE_NONE;
ENUM_X_DIRECTION iDir = X_DIRECTION_NONE;
ENUM_X_PRICE iPriceEdgeType = X_PRICE_NONE;
//
XPivot pvPivots[];
@@ -647,7 +649,7 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
has = bar.Init(
symbol,
period,
cIdx //
barIndex //
);
if (!has)
{
@@ -681,118 +683,6 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
analyserConfig //
);
//
// Check Required Pattern Exists ...
bool hasPinnedBar = HasDirection(structure.pinnedDir);
bool hasEngulfedBar = HasDirection(structure.engulfedDir);
bool hasFlagPattern = HasDirection(structure.flagPatternDir);
bool hasStarPattern = HasDirection(structure.starPatternDir);
bool hasRisingPattern = HasDirection(structure.risingPatternDir);
bool hasPiercingPattern = HasDirection(structure.piercingPatternDir);
bool hasSignalKeyBar = HasDirection(structure.signalKeyBarPatternDir);
//
// Check Bar Pattern Exists ...
has = hasPinnedBar ||
hasEngulfedBar ||
hasFlagPattern ||
hasStarPattern ||
hasSignalKeyBar ||
hasRisingPattern ||
hasPiercingPattern;
//
// Select Pattern Direction and Price and Price Type ...
if (has)
{
//
if (hasPinnedBar)
{
//
iDir = structure.pinnedDir;
iName = "XPinned_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasEngulfedBar)
{
//
iDir = structure.engulfedDir;
iName = "XEngulfed_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasFlagPattern)
{
//
iDir = structure.flagPatternDir;
iName = "XFlag_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasStarPattern)
{
//
iDir = structure.starPatternDir;
iName = "XStar_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasSignalKeyBar)
{
//
iDir = structure.risingPatternDir;
iName = "XRising_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasRisingPattern)
{
//
iDir = structure.piercingPatternDir;
iName = "XPiercing_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasPiercingPattern)
{
//
iDir = structure.signalKeyBarPatternDir;
iName = "XSignalKey_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
//
isBullish = IsSpecifiedBullish(iDir);
isBearish = IsSpecifiedBearish(iDir);
//
// Retrieve Price Type for Validate ...
iPriceType = isBullish
? X_PRICE_LOW
: X_PRICE_HIGH;
iPrice = bar.GetPrice(iPriceType);
//
has = HasDirection(iDir);
}
//
// Chekc Bullish or Bearish Starter Conditions Exists ...
has =
isBullish ||
isBearish;
if (has)
{
//
// Do Conditions Validating ...
//
// Retrieve MA Band for Validation ...
double iMABandUpper = fimaHelper.GetMABandUpper(barIndex);
double iMABandLower = fimaHelper.GetMABandLower(barIndex);
//
// Validate ...
has = isBullish
? iPrice < iMABandLower
: iPrice > iMABandUpper;
if (!has)
{
//
isBullish = false;
isBearish = false;
iDir = X_DIRECTION_NONE;
}
}
//
// Collect Support and Resistance Zones and Validate by them ...
@@ -813,26 +703,6 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
supportBox,
supports //
);
// has = poiDrawer.DrawBox(
// supportBox,
// iSupportObj,
// true, // Ignore At ...
// supportBox.type // Name ...
// );
// if (has)
// {
// //
// XPOIStyle iStyle;
// poiDrawer.GetBoxStyle(
// iStyle,
// supportBox.dir //
// );
// poiDrawer.ApplyBoxStyle(
// iSupportObj,
// iStyle //
// );
// iStyle.Clean();
// }
}
//
@@ -847,26 +717,6 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
resistanceBox,
supports //
);
// has = poiDrawer.DrawBox(
// resistanceBox,
// iResistanceObj,
// true, // Ignore At ...
// resistanceBox.type // Name ...
// );
// if (has)
// {
// //
// XPOIStyle iStyle;
// poiDrawer.GetBoxStyle(
// iStyle,
// resistanceBox.dir //
// );
// poiDrawer.ApplyBoxStyle(
// iResistanceObj,
// iStyle //
// );
// iStyle.Clean();
// }
}
//
@@ -1296,15 +1146,6 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
structure.support,
supports //
);
// //
// XCBoxObject *iObj;
// has = fima2Signaller.poiDrawer.DrawBox(
// structure.support,
// iObj);
// if (has)
// {
// }
}
//
@@ -1317,53 +1158,99 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
structure.resistance,
resistances //
);
// //
// XCBoxObject *iObj;
// has = fima2Signaller.poiDrawer.DrawBox(
// structure.resistance,
// iObj);
// if (has)
// {
// }
}
//
// Validate Positions Support and Resistance Zone ...
int insideZoneIDX = -1;
has = has &&
(isBullish
? HasInside(
insideZoneIDX,
bar,
supports //
)
: HasInside(
insideZoneIDX,
bar,
resistances //
));
// Check Required Pattern Exists ...
bool hasPinnedBar = HasDirection(structure.pinnedDir);
bool hasEngulfedBar = HasDirection(structure.engulfedDir);
bool hasFlagPattern = HasDirection(structure.flagPatternDir);
bool hasStarPattern = HasDirection(structure.starPatternDir);
bool hasRisingPattern = HasDirection(structure.risingPatternDir);
bool hasPiercingPattern = HasDirection(structure.piercingPatternDir);
bool hasSignalKeyBar = HasDirection(structure.signalKeyBarPatternDir);
//
// Validate Selected Inside Zone ...
// whith Bars Edge ...
has = IsValidIndex(insideZoneIDX);
// Check Bar Pattern Exists ...
// and Select Pattern Direction and Price and Price Type ...
has = hasPinnedBar ||
hasEngulfedBar ||
hasFlagPattern ||
hasStarPattern ||
hasSignalKeyBar ||
hasRisingPattern ||
hasPiercingPattern;
if (has)
{
//
if (isBullish)
if (hasPinnedBar)
{
iZone = supports[insideZoneIDX];
//
iDir = structure.pinnedDir;
iName = "XPinned_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else
else if (hasEngulfedBar)
{
iZone = resistances[insideZoneIDX];
//
iDir = structure.engulfedDir;
iName = "XEngulfed_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasFlagPattern)
{
//
iDir = structure.flagPatternDir;
iName = "XFlag_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasStarPattern)
{
//
iDir = structure.starPatternDir;
iName = "XStar_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasSignalKeyBar)
{
//
iDir = structure.risingPatternDir;
iName = "XRising_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasRisingPattern)
{
//
iDir = structure.piercingPatternDir;
iName = "XPiercing_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
else if (hasPiercingPattern)
{
//
iDir = structure.signalKeyBarPatternDir;
iName = "XSignalKey_" + ToXString(iDir) + ToXString(TimeToSeconds(bar.time));
}
//
has = isBullish
? bar.high > supports[insideZoneIDX].upper
: bar.low < resistances[insideZoneIDX].lower;
isBullish = IsSpecifiedBullish(iDir);
isBearish = IsSpecifiedBearish(iDir);
//
// Retrieve Price Type for Validate ...
iPriceType = isBullish
? X_PRICE_DOWN
: X_PRICE_UP;
iPriceEdgeType = isBullish
? X_PRICE_LOW
: X_PRICE_HIGH;
//
iPrice = bar.GetPrice(iPriceType);
iPriceEdge = bar.GetPrice(iPriceEdgeType);
//
// Validate Calculations ...
has = HasDirection(iDir) &&
(isBullish ||
isBearish) &&
NotEmptyZero(iPrice) &&
NotEmptyZero(iPriceEdge) &&
iPrice != iPriceEdge;
if (!has)
{
//
@@ -1372,21 +1259,24 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
iDir = X_DIRECTION_NONE;
}
}
else
{
//
isBullish = false;
isBearish = false;
iDir = X_DIRECTION_NONE;
}
//
// Checking Liquidities ...
// Strategy 1 ...
has = Strategy1HasSignal(
bar,
iZone,
iName,
supports,
resistances,
iDir,
structure,
fimaConditions //
);
//
// Do all Draws Here ...
bool canDraw = false;
if (canDraw)
bool canDraw = true;
if (canDraw && has)
{
//
int iWidth = 2;
@@ -1548,7 +1438,7 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
has = poiDrawer.DrawBarArrow(
bar,
iPatternObj,
iPriceType,
iPriceEdgeType,
iCode,
iClr,
iWidth,
@@ -1561,8 +1451,6 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
}
//
// Check Signal Founded ...
has = HasDirection(iDir);
if (has)
{
//
@@ -1638,6 +1526,270 @@ class XCXFIMAStrategy2Signaller : public XCXFIMABaseSignaller
//
// Props ...
//
// Implementing Strategies ...
/**
* Validate a Pattern based on MA Band ...
*
* @param bar: XOHCL, reference to Pattern Bar ...
* @param patternName: string, detected pattern's name ...
* @param patternDir: ENUM_X_DIRECTION, detected pattern's direction ...
* @param fimaConditions: XFIMAConditions, reference to Bar Specified XFIMA Conditions ...
*
* @return ( bool )
*/
bool ValidatePatternBasedOnMABand(
XOHCL &bar,
string patternName,
ENUM_X_DIRECTION patternDir,
XFIMAConditions &fimaConditions //
)
{
//
bool result = false;
//
// Validate ...
result = bar.IsValid() &&
IsXValid(patternName) &&
HasDirection(patternDir);
if (!result)
{
return result;
}
//
// Define Requirements ...
bool isBullish = false;
bool isBearish = false;
double iPrice = EMPTY_VALUE;
double iPriceEdge = EMPTY_VALUE;
ENUM_X_PRICE iPriceType = X_PRICE_NONE;
ENUM_X_PRICE iPriceEdgeType = X_PRICE_NONE;
//
// Calculating Price and Price Types ...
//
isBullish = IsXBullish(patternDir);
isBearish = IsXBearish(patternDir);
//
iPriceType = isBullish
? X_PRICE_DOWN
: X_PRICE_UP;
//
iPriceEdgeType = isBullish
? X_PRICE_LOW
: X_PRICE_HIGH;
//
iPrice = bar.GetPrice(iPriceType);
iPriceEdge = bar.GetPrice(iPriceEdgeType);
//
// Validate ...
result =
NotEmptyZero(iPrice) &&
IsXValid(iPriceType) &&
NotEmptyZero(iPriceEdge) &&
IsXValid(iPriceEdgeType) &&
((isBullish && !isBearish) ||
(isBearish && !isBullish));
if (!result)
{
return result;
}
//
// Validate Pattern based on MA Band ...
//
// Retrieve MA Band for Validation ...
double iMABandUpper = fimaConditions.maBandUpperBuffer[0];
double iMABandLower = fimaConditions.maBandLowerBuffer[0];
//
// Validate by Edge Price ...
result =
NotEmptyZero(iMABandUpper) &&
NotEmptyZero(iMABandLower) &&
(isBullish
? iPriceEdge < iMABandLower
: iPriceEdge > iMABandUpper);
if (!result)
{
return result;
}
//
return result;
}
/**
* Check Pattern Has Signal Based on Strategy 1 ...
*
* @param bar: XOHCL, reference to Pattern Bar ...
* @param iZone: XBoxZone, reference to holds affected zone ...
* @param patternName: string, detected pattern's name ...
* @param supports: XBoxZone, array reference to Provide Exists Supports ...
* @param resistances: XBoxZone, array reference to Provide Exists Resistances ...
* @param patternDir: ENUM_X_DIRECTION, detected pattern's direction ...
* @param structure: XFIMAMarketStructure, refrence to Provides Market Structure ...
* @param fimaConditions: XFIMAConditions, reference to Bar Specified XFIMA Conditions ...
*
* @return ( bool )
*/
bool Strategy1HasSignal(
XOHCL &bar,
XBoxZone &iZone,
string patternName,
XBoxZone &supports[],
XBoxZone &resistances[],
ENUM_X_DIRECTION patternDir,
XFIMAMarketStructure &structure,
XFIMAConditions &fimaConditions //
)
{
//
bool result = false;
//
// Prepare ...
iZone.Clean();
//
// Validate ...
result = bar.IsValid() &&
IsXValid(patternName) &&
HasDirection(patternDir);
if (!result)
{
return result;
}
//
// Validate Pattern Based on MA Band ...
result = ValidatePatternBasedOnMABand(
bar,
patternName,
patternDir,
fimaConditions //
);
if (!result)
{
return result;
}
//
// Check Affected Zone ...
// Select a Support or Resistance ...
int insideZoneIDX = -1;
result =
(IsXBullish(patternDir)
? HasInside(
insideZoneIDX,
bar,
supports //
)
: IsXBearish(patternDir)
? HasInside(
insideZoneIDX,
bar,
resistances //
)
: false //
);
if (!result)
{
return result;
}
//
// Filling Affected Zone ...
// and Validate it ...
if (IsXBullish(patternDir))
{
iZone = supports[insideZoneIDX];
}
else if (IsXBearish(patternDir))
{
iZone = resistances[insideZoneIDX];
}
result = iZone.IsValid();
if (!result)
{
return result;
}
//
// Validate affected Zone based on Pattern's Bar ...
result = IsXBullish(patternDir)
? bar.high > iZone.upper
: IsXBearish(patternDir)
? bar.low < iZone.lower
: false;
//
// Cleanup Resources ...
if (!result)
{
iZone.Clean();
}
//
return result;
}
/**
* Check Pattern Has Signal Based on Strategy 1 ...
*
* @param bar: XOHCL, reference to Pattern Bar ...
* @param iZone: XBoxZone, reference to holds affected zone ...
* @param patternName: string, detected pattern's name ...
* @param supports: XBoxZone, array reference to Provide Exists Supports ...
* @param resistances: XBoxZone, array reference to Provide Exists Resistances ...
* @param patternDir: ENUM_X_DIRECTION, detected pattern's direction ...
* @param fimaConditions: XFIMAConditions, reference to Bar Specified XFIMA Conditions ...
* @param fimaMarketStructure: XFIMAMarketStructure, refrence to Provides Market Structure ...
*
* @return ( bool )
*/
bool Strategy2HasSignal(
XOHCL &bar,
XBoxZone &iZone,
string patternName,
XBoxZone &supports[],
XBoxZone &resistances[],
ENUM_X_DIRECTION patternDir,
XFIMAMarketStructure &structure,
XFIMAConditions &fimaConditions,
XFIMAMarketStructure &fimaMarketStructure //
)
{
//
bool result = false;
//
// Prepare ...
//
// Validate ...
//
// Do Detection ...
//
// Validate result ...
//
// Cleanup Resources ...
//
return result;
}
//
};