This commit is contained in:
2025-10-07 18:09:38 +03:30
parent ebfde3cb48
commit 69e155e050
8 changed files with 802 additions and 184 deletions
+39 -9
View File
@@ -26,6 +26,7 @@
#include "../Classes/x-saherelm.x-alert.class.mq5" #include "../Classes/x-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-chart.helper.class.mq5" #include "../Classes/x-saherelm.x-chart.helper.class.mq5"
#include "../Classes/x-saherelm.x-guard.class.mq5" #include "../Classes/x-saherelm.x-guard.class.mq5"
#include "../Classes/x-saherelm.x-position.drawer.class.mq5"
#include "../Classes/x-saherelm.x-signaller.class.mq5" #include "../Classes/x-saherelm.x-signaller.class.mq5"
#include "../Classes/x-saherelm.x-target.class.mq5" #include "../Classes/x-saherelm.x-target.class.mq5"
#include "../Classes/x-saherelm.x-trade-manager.class.mq5" #include "../Classes/x-saherelm.x-trade-manager.class.mq5"
@@ -121,13 +122,14 @@ class XCBaseExpert : public XCBase
// Requirements ... // Requirements ...
// //
XCAlert *eaAlert; // EA Scope Alert Handler ... XCAlert *eaAlert; // EA Scope Alert Handler ...
XCGuard *eaGuard; // EA Scope Guard Handler ... XCGuard *eaGuard; // EA Scope Guard Handler ...
XCTrade *eaTrader; // EA Scope Trade Handler ... XCTrade *eaTrader; // EA Scope Trade Handler ...
XCVolume *eaVolume; // EA Scope Voluem Handler ... XCVolume *eaVolume; // EA Scope Voluem Handler ...
XCTarget *eaTarget; // EA Scope Target Handler ... XCTarget *eaTarget; // EA Scope Target Handler ...
XTimeTracker eaTimeTracker; // EA Scope Time Tracker ... XTimeTracker eaTimeTracker; // EA Scope Time Tracker ...
XCTradeManager *eaTradeManager; // EA Scope Trade Manager Handler ... XCTradeManager *eaTradeManager; // EA Scope Trade Manager Handler ...
XCPositionDrawer *eaPositionDrawer; // EA Scope Position Drawer ...
// //
// Specified Event Handlers ... // Specified Event Handlers ...
@@ -349,6 +351,10 @@ class XCBaseExpert : public XCBase
// Initialize Target Handler ... // Initialize Target Handler ...
eaTarget = new XCTarget(eaTrader, eaAlert); eaTarget = new XCTarget(eaTrader, eaAlert);
//
// Init Position Drawer ...
eaPositionDrawer = new XCPositionDrawer(eaTrader);
// //
// Initialize Trae Manager ... // Initialize Trae Manager ...
eaTradeManager = new XCTradeManager( eaTradeManager = new XCTradeManager(
@@ -452,6 +458,11 @@ class XCBaseExpert : public XCBase
delete eaTradeManager; delete eaTradeManager;
ZeroMemory(eaTradeManager); ZeroMemory(eaTradeManager);
//
eaPositionDrawer.Destroy();
delete eaPositionDrawer;
ZeroMemory(eaPositionDrawer);
// //
eaTimeTracker.Clean(); eaTimeTracker.Clean();
@@ -494,6 +505,10 @@ class XCBaseExpert : public XCBase
// Manage Trades ... // Manage Trades ...
eaTradeManager.Manage(); eaTradeManager.Manage();
//
// Manage Positions Drawings ...
eaPositionDrawer.Update();
// //
int count = ArraySize(eaSignallers); int count = ArraySize(eaSignallers);
bool has = IsValidSize(count); bool has = IsValidSize(count);
@@ -567,6 +582,8 @@ class XCBaseExpert : public XCBase
*/ */
void HandleOnSignalExecuted(XSignal &signal) void HandleOnSignalExecuted(XSignal &signal)
{ {
//
eaPositionDrawer.AddExecutedSignal(signal);
eaTradeManager.target.AddExecutedSignal(signal); eaTradeManager.target.AddExecutedSignal(signal);
} }
@@ -675,6 +692,7 @@ class XCBaseExpert : public XCBase
{ {
// //
eaTradeManager.HandleSL(deal); eaTradeManager.HandleSL(deal);
eaPositionDrawer.HandleStopLossTriggered(deal);
UpdatePanelPositionButtons(); UpdatePanelPositionButtons();
} }
@@ -686,8 +704,9 @@ class XCBaseExpert : public XCBase
void virtual HandleOnTakeProfitTriggered(const XDeal &deal) void virtual HandleOnTakeProfitTriggered(const XDeal &deal)
{ {
// //
eaTradeManager.HandleTP(deal);
UpdatePanelPositionButtons(); UpdatePanelPositionButtons();
eaTradeManager.HandleTP(deal);
eaPositionDrawer.HandleOnTakeProfitTriggered(deal);
} }
/** /**
@@ -704,8 +723,13 @@ class XCBaseExpert : public XCBase
) )
{ {
// //
eaTradeManager.HandleForceClose(position);
UpdatePanelPositionButtons(); UpdatePanelPositionButtons();
eaTradeManager.HandleForceClose(position);
eaPositionDrawer.HandleOnPositionForceClosed(
ticket,
position,
comment //
);
} }
/** /**
@@ -776,6 +800,12 @@ class XCBaseExpert : public XCBase
const string comment // const string comment //
) )
{ {
//
eaPositionDrawer.HandleOnPositionModified(
ticket,
profit,
comment //
);
} }
/** /**
@@ -2025,6 +2025,7 @@ class XCMarketPatternDetector : public XCBase
// Support and Resistance ... // Support and Resistance ...
int supportAndResistanceValidationLength = 21, int supportAndResistanceValidationLength = 21,
int supportAndResistanceLoopbackLength = 50 // int supportAndResistanceLoopbackLength = 50 //
//
) )
{ {
// //
@@ -2394,7 +2395,8 @@ class XCMarketPatternDetector : public XCBase
bool has = ToSupportBox( bool has = ToSupportBox(
iSwing, iSwing,
iZone, iZone,
bar.time // bar.time,
supportAndResistanceValidationLength //
); );
if (has) if (has)
{ {
@@ -2417,7 +2419,7 @@ class XCMarketPatternDetector : public XCBase
supportAndResistanceValidationLength, supportAndResistanceValidationLength,
supportAndResistanceLoopbackLength // supportAndResistanceLoopbackLength //
); );
if (isMomentum) if (isResistance)
{ {
// //
iPattern = X_BAR_PATTERN_RESISTANCE; iPattern = X_BAR_PATTERN_RESISTANCE;
@@ -2426,7 +2428,8 @@ class XCMarketPatternDetector : public XCBase
bool has = ToResistanceBox( bool has = ToResistanceBox(
iSwing, iSwing,
iZone, iZone,
bar.time // bar.time,
supportAndResistanceValidationLength //
); );
if (has) if (has)
{ {
@@ -408,6 +408,10 @@ class XCTradeManager : public XCBase
// Handle Restrictions ... // Handle Restrictions ...
HandleRestrictions(); HandleRestrictions();
//
// Managing Targets ...
target.Manage();
// //
// Check Contains Trades for Managing ... // Check Contains Trades for Managing ...
bool has = HasChild(trades); bool has = HasChild(trades);
@@ -4051,7 +4051,8 @@ bool SpecifiedHasChild(T &buffer[])
template <typename T> template <typename T>
bool Remove( bool Remove(
T item, T item,
T &buffer[]) T &buffer[] //
)
{ {
// //
bool result = false; bool result = false;
+170 -17
View File
@@ -1410,7 +1410,7 @@ struct XPatternAnalysis
bool result = false; bool result = false;
// //
result = HasPattern(X_BAR_PATTERN_HIGH); result = HasPattern(X_BAR_PATTERN_LOW);
// //
return result; return result;
@@ -1637,7 +1637,8 @@ struct XPatternAnalysis
XPivot &_pivot, XPivot &_pivot,
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1659,7 +1660,8 @@ struct XPatternAnalysis
XPivot &_pivot, XPivot &_pivot,
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1681,7 +1683,8 @@ struct XPatternAnalysis
XPivot &_pivot, XPivot &_pivot,
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1703,7 +1706,8 @@ struct XPatternAnalysis
XPivot &_pivot, XPivot &_pivot,
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1726,7 +1730,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1748,7 +1753,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1770,7 +1776,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1792,7 +1799,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1814,7 +1822,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1836,7 +1845,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1858,7 +1868,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1880,7 +1891,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1902,7 +1914,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1924,7 +1937,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -1946,7 +1960,8 @@ struct XPatternAnalysis
XBoxZone &_zone, XBoxZone &_zone,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -2057,6 +2072,7 @@ struct XPatternAnalysis
* @param _patternDir: ENUM_X_DIRECTION, Specified Pattern Direction ... * @param _patternDir: ENUM_X_DIRECTION, Specified Pattern Direction ...
* @param _peakPriceType: ENUM_X_PRICE, Specified Peak Price Type ... * @param _peakPriceType: ENUM_X_PRICE, Specified Peak Price Type ...
* @param _valePriceType: ENUM_X_PRICE, Specified Vale Price Type ... * @param _valePriceType: ENUM_X_PRICE, Specified Vale Price Type ...
* @param _toTime: datetime, Specified Time to Update Pivot and Zones ...
* *
* @return ( bool ) * @return ( bool )
*/ */
@@ -2067,7 +2083,8 @@ struct XPatternAnalysis
ENUM_X_BAR_PATTERN _pattern, ENUM_X_BAR_PATTERN _pattern,
ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE, ENUM_X_DIRECTION _patternDir = X_DIRECTION_NONE,
ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH, ENUM_X_PRICE _peakPriceType = X_PRICE_HIGH,
ENUM_X_PRICE _valePriceType = X_PRICE_LOW // ENUM_X_PRICE _valePriceType = X_PRICE_LOW,
datetime _toTime = NULL //
) )
{ {
// //
@@ -2089,6 +2106,7 @@ struct XPatternAnalysis
{ {
_valePriceType = X_PRICE_LOW; _valePriceType = X_PRICE_LOW;
} }
_toTime = NormalizeTime(_toTime);
// //
// Validate ... // Validate ...
@@ -2131,6 +2149,10 @@ struct XPatternAnalysis
_peakPriceType, _peakPriceType,
_valePriceType // _valePriceType //
); );
if (result)
{
_zone.to = _toTime;
}
// //
// Use Custom Data if Pattern Staisfied ... // Use Custom Data if Pattern Staisfied ...
@@ -2281,4 +2303,135 @@ struct XPatternAnalysis
// //
}; };
struct XPatternAnalysisDrawConfig
{
//
// Props ...
ENUM_X_BAR_PATTERN allowedDraws[]; // Allowed Draw Patterns
ENUM_X_BAR_PATTERN allowedDrawZones[]; // Allowed Draw Pattern Zones
ENUM_X_BAR_PATTERN allowedDrawPivots[]; // Allowed Draw Pattern Pivots
//
// Constructor ...
XPatternAnalysisDrawConfig()
{
Clean();
}
//
// Tools ...
/**
* Cleanup ...
*/
void Clean()
{
//
XClean(allowedDraws);
XClean(allowedDrawZones);
XClean(allowedDrawPivots);
}
/**
* Default Drawing Config ...
*/
void Default()
{
//
FullDraw();
//
// Remove Unused From Zones ...
Remove(X_BAR_PATTERN_PINNED, allowedDrawZones);
Remove(X_BAR_PATTERN_MOMENTUM, allowedDrawZones);
Remove(X_BAR_PATTERN_ENGULFED, allowedDrawZones);
Remove(X_BAR_PATTERN_TRUE_GAPED, allowedDrawZones);
//
// Remove Unused From Pivots ...
Remove(X_BAR_PATTERN_OB, allowedDrawPivots);
Remove(X_BAR_PATTERN_FVG, allowedDrawPivots);
Remove(X_BAR_PATTERN_SUPPORT, allowedDrawPivots);
Remove(X_BAR_PATTERN_RESISTANCE, allowedDrawPivots);
}
/**
* Configure Full Draws ...
*/
void FullDraw()
{
//
GetAllBarPatters(allowedDraws);
GetAllBarPatters(allowedDrawZones);
GetAllBarPatters(allowedDrawPivots);
}
//
// Checkers ...
/**
* Check Can Draw Specified Pattern ...
*
* @param pattern: ENUM_X_BAR_PATTERN, Specified Pattern ...
*
* @return ( bool )
*/
bool CanDraw(ENUM_X_BAR_PATTERN pattern)
{
//
bool result = false;
//
result = HasChild(allowedDraws) &&
Contains(pattern, allowedDraws);
//
return result;
}
/**
* Check Can Draw Specified Pattern's Zone ...
*
* @param pattern: ENUM_X_BAR_PATTERN, Specified Pattern ...
*
* @return ( bool )
*/
bool CanDrawZone(ENUM_X_BAR_PATTERN pattern)
{
//
bool result = false;
//
result =
CanDraw(pattern) &&
HasChild(allowedDrawZones) &&
Contains(pattern, allowedDrawZones);
//
return result;
}
/**
* Check Can Draw Specified Pattern's Pivot ...
*
* @param pattern: ENUM_X_BAR_PATTERN, Specified Pattern ...
*
* @return ( bool )
*/
bool CanDrawPivot(ENUM_X_BAR_PATTERN pattern)
{
//
bool result = false;
//
result =
CanDraw(pattern) &&
HasChild(allowedDrawPivots) &&
Contains(pattern, allowedDrawPivots);
//
return result;
}
};
// //
+73 -8
View File
@@ -4433,32 +4433,64 @@ bool ToFVGBox(
bool ToSupportBox( bool ToSupportBox(
XOHCL &bar, XOHCL &bar,
XBoxZone &box, XBoxZone &box,
datetime toTime = NULL // datetime toTime = NULL,
int validationLength = 0 //
) )
{ {
// //
bool result = false; bool result = false;
// //
// Prepare ...
box.Clean(); box.Clean();
toTime = NormalizeTime(toTime);
// //
// Normalize ...
toTime = NormalizeTime(toTime);
validationLength = NormalizeInt(validationLength, 0);
//
// Validate ...
result = bar.IsValid(); result = bar.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
XOHCL breaker;
result = GetBreakerBar(
bar,
breaker,
X_PRICE_LOW,
X_PRICE_DOWN,
X_DIRECTION_BEARISH,
500 //
);
if (!result)
{
breaker.Clean();
}
// //
box.to = toTime; box.to = toTime;
box.from = bar.time; box.at = bar.time;
box.from =
breaker.IsValid()
? breaker.time
: validationLength <= 0
? bar.time
: GetBarTime(
bar.symbol,
bar.period,
bar.Index() + validationLength //
);
box.lower = bar.low; box.lower = bar.low;
box.symbol = bar.symbol; box.symbol = bar.symbol;
box.period = bar.period; box.period = bar.period;
box.upper = bar.GetDown(); box.upper = bar.GetDown();
box.dir = X_DIRECTION_BULLISH; box.dir = X_DIRECTION_BULLISH;
box.type = "Support"; box.type = ToXString(X_BAR_PATTERN_SUPPORT);
// //
result = box.IsValid(); result = box.IsValid();
@@ -4483,32 +4515,65 @@ bool ToSupportBox(
bool ToResistanceBox( bool ToResistanceBox(
XOHCL &bar, XOHCL &bar,
XBoxZone &box, XBoxZone &box,
datetime toTime = NULL // datetime toTime = NULL,
int validationLength = 0 //
) )
{ {
// //
bool result = false; bool result = false;
// //
// Prepare ...
box.Clean(); box.Clean();
toTime = NormalizeTime(toTime);
// //
// Normalize ...
toTime = NormalizeTime(toTime);
validationLength = NormalizeInt(validationLength, 0);
//
// Validate ...
result = bar.IsValid(); result = bar.IsValid();
if (!result) if (!result)
{ {
return result; return result;
} }
//
XOHCL breaker;
result = GetBreakerBar(
bar,
breaker,
X_PRICE_HIGH,
X_PRICE_UP,
X_DIRECTION_BULLISH,
500 //
);
if (!result)
{
breaker.Clean();
}
// //
box.to = toTime; box.to = toTime;
box.from = bar.time; box.at = bar.time;
box.from =
breaker.IsValid()
? breaker.time
: validationLength <= 0
? bar.time
: GetBarTime(
bar.symbol,
bar.period,
bar.Index() + validationLength //
);
box.upper = bar.high; box.upper = bar.high;
box.symbol = bar.symbol; box.symbol = bar.symbol;
box.period = bar.period; box.period = bar.period;
box.lower = bar.GetUp(); box.lower = bar.GetUp();
box.dir = X_DIRECTION_BEARISH; box.dir = X_DIRECTION_BEARISH;
box.type = "Resistance"; box.type = ToXString(X_BAR_PATTERN_RESISTANCE);
;
// //
result = box.IsValid(); result = box.IsValid();
+33
View File
@@ -252,6 +252,39 @@ ENUM_X_BAR_PATTERN ToBarPattern(string value)
return result; return result;
} }
/**
* Get All Available Valid Bar Patterns ...
*
* @param dest: ENUM_X_BAR_PATTERN, reference collection to fill ...
*
* @return ( int )
*/
int GetAllBarPatters(ENUM_X_BAR_PATTERN &dest[])
{
//
XClean(dest);
//
Add(X_BAR_PATTERN_HIGH, dest);
Add(X_BAR_PATTERN_LOW, dest);
Add(X_BAR_PATTERN_MOMENTUM, dest);
Add(X_BAR_PATTERN_ENGULFED, dest);
Add(X_BAR_PATTERN_TRUE_GAPED, dest);
Add(X_BAR_PATTERN_PINNED, dest);
Add(X_BAR_PATTERN_STAR, dest);
Add(X_BAR_PATTERN_PIERCING, dest);
Add(X_BAR_PATTERN_RISING, dest);
Add(X_BAR_PATTERN_FLAG, dest);
Add(X_BAR_PATTERN_SIGNALKEY, dest);
Add(X_BAR_PATTERN_OB, dest);
Add(X_BAR_PATTERN_FVG, dest);
Add(X_BAR_PATTERN_SUPPORT, dest);
Add(X_BAR_PATTERN_RESISTANCE, dest);
//
return ArraySize(dest);
}
// //
// Structures ... // Structures ...
@@ -585,6 +585,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
// Use Default Config ... // Use Default Config ...
); );
DrawBarPatternAnalysis(iBarAnalysis);
// //
// Disable Signallers ... // Disable Signallers ...
@@ -594,14 +595,14 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
// Strategy 1 ... // Strategy 1 ...
// Works on Support or Resistances Areas ... // Works on Support or Resistances Areas ...
has = Strategy1HasSignal( // has = Strategy1HasSignal(
iBar, // iBar,
iZone, // iZone,
iTargets, // iTargets,
iDir, // iDir,
iFIMAConditions, // iFIMAConditions,
iStructure // // iStructure //
); // );
// //
// Strategy 2 ... // Strategy 2 ...
@@ -1247,7 +1248,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
IsXBullish(_patternDir) IsXBullish(_patternDir)
? ANCHOR_TOP ? ANCHOR_TOP
: ANCHOR_BOTTOM, : ANCHOR_BOTTOM,
_pivot.prefix + "_" + ToXString(TimeToSeconds(_pivot.time)), "Pivot_" + _pivot.prefix + "_" + ToXString(TimeToSeconds(_pivot.time)),
true, // Ignore Bar Tag ... true, // Ignore Bar Tag ...
arrowThreshold // Threshold ... arrowThreshold // Threshold ...
); );
@@ -1270,7 +1271,7 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
_zone, _zone,
iObj, iObj,
ignoreBoxAt, ignoreBoxAt,
_zone.type + "_" + ToXString(TimeToSeconds(_zone.from)) // "Zone_" + _zone.type + "_" + ToXString(TimeToSeconds(_zone.from)) //
); );
if (has) if (has)
{ {
@@ -1319,6 +1320,44 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
return; return;
} }
//
// Configure Draws ...
XPatternAnalysisDrawConfig config;
config.Default();
XClean(config.allowedDraws);
XClean(config.allowedDrawZones);
XClean(config.allowedDrawPivots);
//
// MOMENTUM ...
Add(
X_BAR_PATTERN_MOMENTUM,
config.allowedDraws //
);
Add(
X_BAR_PATTERN_MOMENTUM,
config.allowedDrawZones //
);
Add(
X_BAR_PATTERN_MOMENTUM,
config.allowedDrawPivots //
);
//
// ENGULFED ...
Add(
X_BAR_PATTERN_ENGULFED,
config.allowedDraws //
);
Add(
X_BAR_PATTERN_ENGULFED,
config.allowedDrawZones //
);
Add(
X_BAR_PATTERN_ENGULFED,
config.allowedDrawPivots //
);
// //
// Draw Bar Patterns Analysis ... // Draw Bar Patterns Analysis ...
@@ -1331,6 +1370,11 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
ENUM_X_BAR_PATTERN pattern; ENUM_X_BAR_PATTERN pattern;
ENUM_X_DIRECTION patternDir; ENUM_X_DIRECTION patternDir;
//
bool canDraw;
bool canDrawZone;
bool canDrawPivot;
// //
// Support and Resistance ... // Support and Resistance ...
@@ -1344,23 +1388,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
pattern = X_BAR_PATTERN_SUPPORT; pattern = X_BAR_PATTERN_SUPPORT;
patternDir = X_DIRECTION_BULLISH; patternDir = X_DIRECTION_BULLISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1372,25 +1435,44 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
if (has) if (has)
{ {
// //
pattern = X_BAR_PATTERN_SUPPORT; pattern = X_BAR_PATTERN_RESISTANCE;
patternDir = X_DIRECTION_BEARISH; patternDir = X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1407,23 +1489,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
pattern = X_BAR_PATTERN_LOW; pattern = X_BAR_PATTERN_LOW;
patternDir = X_DIRECTION_BULLISH; patternDir = X_DIRECTION_BULLISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1437,23 +1538,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
// //
pattern = X_BAR_PATTERN_HIGH; pattern = X_BAR_PATTERN_HIGH;
patternDir = X_DIRECTION_BEARISH; patternDir = X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1470,23 +1590,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1503,23 +1642,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1536,23 +1694,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1569,23 +1746,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1602,23 +1798,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1635,23 +1850,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1668,23 +1902,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1701,23 +1954,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1734,23 +2006,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1767,23 +2058,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }
@@ -1800,23 +2110,42 @@ class XCXFIMAStrategy1Signaller : public XCXFIMABaseSignaller
isBullish isBullish
? X_DIRECTION_BULLISH ? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH; : X_DIRECTION_BEARISH;
has = barAnalysis.GetPattern( canDraw = config.CanDraw(pattern);
patternBar, if (canDraw)
patternPivot,
patternBox,
pattern,
patternDir //
);
if (has)
{ {
// //
DrawPattern( has = barAnalysis.GetPattern(
patternBar, patternBar,
patternPivot, patternPivot,
patternBox, patternBox,
pattern, pattern,
patternDir // patternDir //
); );
if (has)
{
//
canDrawZone = config.CanDrawZone(pattern);
if (!canDrawZone)
{
patternBox.Clean();
}
//
canDrawPivot = config.CanDrawPivot(pattern);
if (!canDrawPivot)
{
patternPivot.Clean();
}
//
DrawPattern(
patternBar,
patternPivot,
patternBox,
pattern,
patternDir //
);
}
} }
} }