complete XCA Indicator, implements it's Helper and Add all Conditions, and also rename XSTRCCI tProject o XCAEA and only use XCA and XOSC inside it ...

This commit is contained in:
2025-04-15 04:31:43 +03:30
parent ab6ddf0b43
commit d912210e68
11 changed files with 6725 additions and 1445 deletions
+365
View File
@@ -1801,6 +1801,371 @@ bool IsFVGBoxValid(
}
/////////////////////////////////////////////////////////
//
bool DetectXCAEAConditions(
XCAEAConditions &conditions,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
XCXCAEAHelper *helper,
int barIndex = 0,
int loopback = 10 //
)
{
//
bool result = false;
//
box.Clean();
conditions.Clean();
dir = X_DIRECTION_NONE;
//
if (barIndex < 0)
{
barIndex = 0;
}
loopback = NormalizeInt(loopback, 5);
//
string symbol = helper.GetSymbol();
ENUM_TIMEFRAMES period = helper.GetPeriod();
//
result = helper.GetConditions(
conditions,
barIndex,
loopback //
);
if (!result)
{
//
conditions.Clean();
return result;
}
//
int zIDX = barIndex;
int cIDX = zIDX + 1;
int pIDX = cIDX + 1;
int ppIDX = pIDX + 1;
int p3IDX = ppIDX + 1;
int p4IDX = p3IDX + 1;
//
XOHCL zBar;
XOHCL cBar;
XOHCL pBar;
XOHCL ppBar;
XOHCL p3Bar;
XOHCL p4Bar;
result = zBar.Init(
symbol,
period,
zIDX //
);
result =
result &&
zBar.GetPreviousBar(cBar);
result =
result &&
cBar.GetPreviousBar(pBar);
result =
result &&
pBar.GetPreviousBar(ppBar);
result =
result &&
ppBar.GetPreviousBar(p3Bar);
result =
result &&
p3Bar.GetPreviousBar(p4Bar);
if (!result)
{
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
box.Clean();
conditions.Clean();
//
return result;
}
//
// Bars Conditions ...
//
ENUM_X_DIRECTION cBarDir;
//
// Hammer ...
bool isCBarHammer = helper
.barAnalyser
.IsHammer(
cBar,
cBarDir //
);
bool isCBarBullishHammer =
isCBarHammer &&
IsBullish(cBarDir);
bool isCBarBearishHammer =
isCBarHammer &&
IsBearish(cBarDir);
//
// Rejected ...
bool isCBarRejected = helper
.barAnalyser
.IsRejected(
cBar,
cBarDir,
false, // Force Type ...
true // Force Fibo Pressure ...
);
bool isCBarBullishRejected =
isCBarRejected &&
IsBullish(cBarDir);
bool isCBarBearishRejected =
isCBarRejected &&
IsBearish(cBarDir);
//
// Engulfed ...
bool isCBarEngulfed = helper
.barAnalyser
.IsEngulfed(
cBar,
cBarDir //
);
bool isCBarBullishEngulfed =
isCBarEngulfed &&
IsBullish(cBarDir);
bool isCBarBearishEngulfed =
isCBarEngulfed &&
IsBearish(cBarDir);
//
// Momentum ...
bool isCBarMomentum = helper
.barAnalyser
.IsMomentum(
cBar,
cBarDir,
1 //
);
bool isCBarBullishMomentum =
isCBarMomentum &&
IsBullish(cBarDir);
bool isCBarBearishMomentum =
isCBarMomentum &&
IsBearish(cBarDir);
//
// Bar Sumarise ...
//
bool isCBarValidForBullish =
(isCBarBullishHammer ||
isCBarBullishRejected ||
isCBarBullishMomentum ||
isCBarBullishEngulfed);
//
bool isCBarValidForBearish =
(isCBarBearishHammer ||
isCBarBearishRejected ||
isCBarBearishMomentum ||
isCBarBearishEngulfed);
//
// Conditions ...
//
bool isLowsUnderValesGolden =
//
pBar.low < conditions.valesGoldenBuffer[pIDX] &&
ppBar.low < conditions.valesGoldenBuffer[ppIDX] &&
p3Bar.low < conditions.valesGoldenBuffer[p3IDX] &&
p4Bar.low < conditions.valesGoldenBuffer[p4IDX]
//
;
//
bool isHighsOverPeaksGolden =
//
pBar.high > conditions.peaksGoldenBuffer[pIDX] &&
ppBar.high > conditions.peaksGoldenBuffer[ppIDX] &&
p3Bar.high > conditions.peaksGoldenBuffer[p3IDX] &&
p4Bar.high > conditions.peaksGoldenBuffer[p4IDX]
//
;
//
bool isSwingLowSameAsVale =
conditions.swingLowsBuffer[p4IDX] == conditions.valesBuffer[p4IDX];
//
bool isSwingHighSameAsPeak =
conditions.swingHighsBuffer[p4IDX] == conditions.peaksBuffer[p4IDX];
//
bool isStrSame = conditions.strBuffer[cIDX] == conditions.strBuffer[pIDX] &&
conditions.strBuffer[pIDX] == conditions.strBuffer[ppIDX];
//
bool isSameStrBreakedUp =
isStrSame &&
conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX];
//
bool isSameStrBreakedDown =
isStrSame &&
conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX];
//
bool isStrBullishVPattern =
//
conditions.strStateBuffer[zIDX] > 0 &&
conditions.strStateBuffer[cIDX] > 0 &&
conditions.strStateBuffer[pIDX] > 0 &&
conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[cIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[zIDX] &&
conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX]
//
;
//
bool isStrBearishVPattern =
//
conditions.strStateBuffer[zIDX] < 0 &&
conditions.strStateBuffer[cIDX] < 0 &&
conditions.strStateBuffer[pIDX] < 0 &&
conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[cIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[zIDX] &&
conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX]
//
;
//
bool isCBarLowInTKZone =
//
cBar.low < conditions.tenkanSenBuffer[cIDX] &&
cBar.low > conditions.kijunSenBuffer[cIDX]
//
;
//
bool isCBarHighInTKZone =
//
cBar.high > conditions.tenkanSenBuffer[cIDX] &&
cBar.high < conditions.kijunSenBuffer[cIDX]
//
;
//
// Summarise Conditions ...
//
bool isBullish =
//
isCBarLowInTKZone &&
isCBarBullishRejected &&
isCBarValidForBullish &&
conditions.isX3MaSlowBullish &&
conditions.isTenkanSenOverKijunSen &&
conditions.kijunSenBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX]
//
;
//
bool isBearish =
//
isCBarHighInTKZone &&
isCBarBearishRejected &&
isCBarValidForBearish &&
conditions.isX3MaSlowBearish &&
conditions.isTenkanSenUnderKijunSen &&
conditions.kijunSenBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX]
//
;
//
result = isBullish ||
isBearish;
if (result)
{
//
dir =
isBullish
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
double entry = GetEntry(
conditions.symbol,
dir //
);
double sl = conditions.kijunSenBuffer[cIDX];
//
box.dir = dir;
box.symbol = conditions.symbol;
box.period = conditions.period;
//
box.upper =
isBullish
? entry
: sl;
//
box.lower =
isBullish
? sl
: entry;
//
box.to = zBar.time;
box.from = p4Bar.time;
//
box.type = ToString(dir) + "_Signal_" + conditions.symbol + "_" + ToString(conditions.period);
}
//
result = box.IsValid() &&
HasDirection(dir);
//
// Cleanup Resources ...
//
if (!result)
{
//
box.Clean();
conditions.Clean();
}
//
zBar.Clean();
cBar.Clean();
pBar.Clean();
ppBar.Clean();
p3Bar.Clean();
p4Bar.Clean();
//
return result;
}
/////////////////////////////////////////////////////////
@@ -2,7 +2,7 @@
//
// SaherElm IT Center XTest MQL5 Expert Advisor
// -------------------------------------------------
// Name: XSTRCCIEA
// Name: XCAEA
// Description: an Exper Advisor which used Panels
//
// Maintainer:
@@ -15,7 +15,7 @@
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm XSTRCCIEA"
#property description "SaherElm XCAEA EA"
#property strict
//
@@ -23,11 +23,11 @@
#include "../Classes/x-saherelm.x-alert.class.mq5"
#include "../Classes/x-saherelm.x-trade.class.mq5"
#include "../Classes/x-saherelm.x-volume.class.mq5"
#include "../XSTRCCI/Classes/xstrcci.x-trade.manager.class.mq5"
#include "../XSTRCCI/Signals/xstrcci.signaller.class.mq5"
#include "../XCAEA/Classes/xcaea.x-trade.manager.class.mq5"
#include "../XCAEA/Signals/xcaea.signaller.class.mq5"
//
#define ShortName "XSTRCCIEA"
#define ShortName "XCAEAEA"
//
// Inputs ...
@@ -73,13 +73,11 @@ input bool eaReportNewHours = false; // Report New Hours
// Variables, Instances ...
XCAlert *eaAlert;
XCTrade *eaTrade;
XCVolume *eaVolume;
XCXSTRCCITradeManager *eaTradeManager;
//
XSignal eaSignal;
XCXSTRCCISignaller *eaSignaller;
XSTRCCIStrategyConditions eaConditions;
XCVolume *eaVolume;
XCXCAEASignaller *eaSignaller;
XCXCAEATradeManager *eaTradeManager;
XCAEAStrategyConditions eaConditions;
//
int eaMaxAllowedPositions = 5;
@@ -176,7 +174,7 @@ void OnTick()
//
double r2r = 5;
string provider = "XSTRCCI";
string provider = "XCAEA";
ENUM_POSITION_TYPE type = POSITION_TYPE_BUY;
ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET;
@@ -603,7 +601,7 @@ void InitRequirements()
//
// EA Trae Manager ...
eaTradeManager = new XCXSTRCCITradeManager(
eaTradeManager = new XCXCAEATradeManager(
eaTrade //
);
eaTradeManager.SetAlertEnableAlerts(eaEnableAlerts);
@@ -615,7 +613,7 @@ void InitRequirements()
//
// EA Signaller ...
eaSignaller = new XCXSTRCCISignaller(
eaSignaller = new XCXCAEASignaller(
_Symbol,
_Period //
);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+22
View File
@@ -568,6 +568,8 @@ enum ENUM_X_FIBO_LEVELS
X_FIBO_LEVEL_382, // 0.382
X_FIBO_LEVEL_500, // 0.5
X_FIBO_LEVEL_618, // 0.618
X_FIBO_LEVEL_730, // 0.730
X_FIBO_LEVEL_764, // 0.764
X_FIBO_LEVEL_786, // 0.786
};
@@ -614,6 +616,16 @@ string ToString(ENUM_X_FIBO_LEVELS value)
result = "0.618";
break;
//
case X_FIBO_LEVEL_730:
result = "0.730";
break;
//
case X_FIBO_LEVEL_764:
result = "0.764";
break;
//
case X_FIBO_LEVEL_786:
result = "0.786";
@@ -664,6 +676,16 @@ double GetFiboLevelValue(ENUM_X_FIBO_LEVELS value)
result = 0.618;
break;
//
case X_FIBO_LEVEL_730:
result = 0.730;
break;
//
case X_FIBO_LEVEL_764:
result = 0.764;
break;
//
case X_FIBO_LEVEL_786:
result = 0.786;
+40
View File
@@ -1049,6 +1049,46 @@ struct XOHCL
return result;
}
//
bool IsBreaked(
double price,
ENUM_X_DIRECTION forDir //
)
{
//
bool result = false;
//
result = IsValid() &&
price > 0 &&
HasDirection(forDir);
if (!result)
{
return result;
}
//
bool isBullish =
IsBullish() &&
IsBullish(forDir) &&
close > price &&
open < price;
//
bool isBearish =
IsBearish() &&
IsBearish(forDir) &&
close < price &&
open > price;
//
result = isBullish ||
isBearish;
//
return result;
}
//
// Find Highest Bar Index ...
int FindHighestIndex(
@@ -2,7 +2,7 @@
//
// SaherElm IT Center MQL5 Class Library
// --------------------------------------
// Name: XCXSTRCCITradeManager
// Name: XCXCAEATradeManager
// Description: provides all Requirements for Managing Trades ...
//
//
@@ -24,23 +24,23 @@
#include "../../Classes/x-saherelm.x-alert.class.mq5"
#include "../../Classes/x-saherelm.x-poi.drawer.class.mq5"
#include "../../Classes/x-saherelm.x-trade.class.mq5"
#include "../Libraries/xstrcci.signaller.lib.mq5"
#include "../Libraries/xcaea.signaller.lib.mq5"
//
// Definitions ...
//
enum ENUM_XSTRCCI_TRADE_FINALIZATION
enum ENUM_XCAEA_TRADE_FINALIZATION
{
XSTRCCI_TRADE_FINAL_NONE,
XSTRCCI_TRADE_FINAL_TP,
XSTRCCI_TRADE_FINAL_SL,
XSTRCCI_TRADE_FINAL_CLOSE_IN_PROFIT,
XSTRCCI_TRADE_FINAL_CLOSE_IN_LOSE,
XCAEA_TRADE_FINAL_NONE,
XCAEA_TRADE_FINAL_TP,
XCAEA_TRADE_FINAL_SL,
XCAEA_TRADE_FINAL_CLOSE_IN_PROFIT,
XCAEA_TRADE_FINAL_CLOSE_IN_LOSE,
};
//
struct XSTRCCITrade
struct XCAEATrade
{
//
// Props ...
@@ -49,12 +49,12 @@ struct XSTRCCITrade
XSignal signal;
ulong positionID;
double commission;
XSTRCCIStrategyConditions conditions;
ENUM_XSTRCCI_TRADE_FINALIZATION finalize;
XCAEAStrategyConditions conditions;
ENUM_XCAEA_TRADE_FINALIZATION finalize;
//
// Constructor ...
XSTRCCITrade()
XCAEATrade()
{
Clean();
}
@@ -74,7 +74,7 @@ struct XSTRCCITrade
commission = 0;
positionID = 0;
conditions.Clean();
finalize = XSTRCCI_TRADE_FINAL_NONE;
finalize = XCAEA_TRADE_FINAL_NONE;
//
ZeroMemory(this);
@@ -127,7 +127,7 @@ struct XSTRCCITrade
//
result = HasSignal() &&
IsExecuted() &&
finalize != XSTRCCI_TRADE_FINAL_NONE;
finalize != XCAEA_TRADE_FINAL_NONE;
//
return result;
@@ -136,7 +136,7 @@ struct XSTRCCITrade
//
// Implementations ...
class XCXSTRCCITradeManager : public XCBaseAlert
class XCXCAEATradeManager : public XCBaseAlert
{
//
// Public ...
@@ -149,7 +149,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
//
// Constructors ...
XCXSTRCCITradeManager(XCTrade *&_trader)
XCXCAEATradeManager(XCTrade *&_trader)
{
//
trader = _trader;
@@ -159,7 +159,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
//
// De Constructors ...
~XCXSTRCCITradeManager()
~XCXCAEATradeManager()
{
//
ZeroMemory(trader);
@@ -220,6 +220,10 @@ class XCXSTRCCITradeManager : public XCBaseAlert
*/
void Protect()
{
//
string prefix = "Protector: ";
int targetDistance = 5;
//
bool has = HasChild(trades);
if (!has)
@@ -324,9 +328,94 @@ class XCXSTRCCITradeManager : public XCBaseAlert
//
// Select Position ...
XPosition iPosition = ownPosition[i];
int idx = -1;
has = HasTrade(
idx,
iPosition.ticket //
);
if (!has)
{
continue;
}
//
// Handle RF ...
bool isLong = IsLong(iPosition.type);
double points = GetPoints(iPosition.symbol);
//
// Handle RF On Targets ...
if (iPosition.profit > 0)
{
//
double targets[];
Copy(
trades[idx].signal.targets,
targets //
);
int targetsCount = ArraySize(targets);
has = IsValidSize(targetsCount);
if (has)
{
//
for (int j = 0; j < targetsCount; j++)
{
//
double jTarget = targets[j];
//
// Check Traget Validation ...
has =
iPosition.sl == 0
? true
: isLong
? iPosition.sl < jTarget
: iPosition.sl > jTarget;
if (!has)
{
continue;
}
//
double targetDelta = isLong
? jTarget + (targetDistance * points)
: jTarget - (targetDistance * points);
//
// Can Risk Free ...
bool canRF = jTarget > 0 &&
(isLong
? jTarget > iPosition.entry
: jTarget < iPosition.entry) &&
(isLong
? iPosition.price > targetDelta
: iPosition.price < targetDelta);
if (canRF)
{
//
double sl = jTarget;
double tp = iPosition.tp;
string comment = "RF On Target ...";
bool isModified = trader.Modify(
iPosition.ticket,
sl,
tp,
comment //
);
if (isModified)
{
//
string message = prefix +
ToString(iPosition.type) +
" Position: " +
ToString(iPosition.ticket) +
" RF On Traget: " + ToString(jTarget) +
" Successfully ...";
Alert(message);
}
}
}
}
}
}
}
@@ -334,13 +423,13 @@ class XCXSTRCCITradeManager : public XCBaseAlert
* Execute Specified Signal ...
*
* @param signal: XSignal instance reference ...
* @param conditions: XSTRCCIStrategyConditions instance reference ...
* @param conditions: XCAEAStrategyConditions instance reference ...
*
* @return ( bool )
*/
bool Execute(
XSignal &signal,
XSTRCCIStrategyConditions &conditions //
XCAEAStrategyConditions &conditions //
)
{
//
@@ -400,7 +489,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
}
//
XSTRCCITrade iTrade;
XCAEATrade iTrade;
//
ulong positionID = trader.GetLastOpenPositionTicket();
@@ -447,7 +536,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
trades[idx].swap = deal.swap;
trades[idx].profit = deal.profit;
trades[idx].commission = deal.commission;
trades[idx].finalize = XSTRCCI_TRADE_FINAL_TP;
trades[idx].finalize = XCAEA_TRADE_FINAL_TP;
//
tpCount++;
@@ -480,7 +569,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
trades[idx].swap = deal.swap;
trades[idx].profit = deal.profit;
trades[idx].commission = deal.commission;
trades[idx].finalize = XSTRCCI_TRADE_FINAL_SL;
trades[idx].finalize = XCAEA_TRADE_FINAL_SL;
//
slCount++;
@@ -517,8 +606,8 @@ class XCXSTRCCITradeManager : public XCBaseAlert
trades[idx].profit = position.profit;
trades[idx].commission = position.commission;
trades[idx].finalize = isInProfit
? XSTRCCI_TRADE_FINAL_CLOSE_IN_PROFIT
: XSTRCCI_TRADE_FINAL_CLOSE_IN_LOSE;
? XCAEA_TRADE_FINAL_CLOSE_IN_PROFIT
: XCAEA_TRADE_FINAL_CLOSE_IN_LOSE;
//
if (isInProfit)
@@ -576,7 +665,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
for (int i = 0; i < count; i++)
{
//
XSTRCCITrade iTrade = trades[i];
XCAEATrade iTrade = trades[i];
//
result =
@@ -636,7 +725,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
for (int i = 0; i < count; i++)
{
//
XSTRCCITrade iTrade = trades[i];
XCAEATrade iTrade = trades[i];
//
result =
@@ -687,7 +776,7 @@ class XCXSTRCCITradeManager : public XCBaseAlert
CArrayObj mObjects;
//
XSTRCCITrade trades[];
XCAEATrade trades[];
};
//
File diff suppressed because it is too large Load Diff
@@ -2,8 +2,8 @@
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: XSTRCCISignaller Lib
// Description: Library for XSTRCCI Signaller ...
// Name: XCAEASignaller Lib
// Description: Library for XCAEA Signaller ...
//
//
// Maintainer:
@@ -16,7 +16,7 @@
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm Library for XSTRCCI Signaller"
#property description "SaherElm Library for XCAEA Signaller"
#property strict
//
@@ -24,7 +24,7 @@
#include "../../Libraries/x-saherelm.common.lib.mq5"
#include "../../Libraries/x-saherelm.x-poi.lib.mq5"
#include "../../Libraries/x-saherelm.x-trade.lib.mq5"
#include "../Helpers/xstrcci.helper.mq5"
#include "../Helpers/xcaea.helper.mq5"
//
// Enumeration ...
@@ -49,7 +49,7 @@ enum ENUM_GUARD_ACTIONS
//
// Conditions Struct ...
struct XSTRCCIStrategyConditions
struct XCAEAStrategyConditions
{
//
// Props ...
@@ -78,11 +78,11 @@ struct XSTRCCIStrategyConditions
XBoxZone signalBox;
ENUM_X_DIRECTION dir;
ENUM_X_POSITION_TYPES type;
XSTRCCIConditions conditions;
XCAEAConditions conditions;
//
// Constructor ...
XSTRCCIStrategyConditions()
XCAEAStrategyConditions()
{
Clean();
}
@@ -286,7 +286,7 @@ struct XSTRCCIStrategyConditions
//
// Model a Guard Action ...
struct XSTRCCIGuard
struct XCAEAGuard
{
//
// Props ...
@@ -315,7 +315,7 @@ struct XSTRCCIGuard
//
// Constructor ...
XSTRCCIGuard()
XCAEAGuard()
{
Clean();
}
@@ -385,14 +385,14 @@ struct XSTRCCIGuard
/**
* Add Guard to Collection ...
*
* @param guard: XSTRCCIGuard instance ...
* @param guards: XSTRCCIGuard instance Collection ...
* @param guard: XCAEAGuard instance ...
* @param guards: XCAEAGuard instance Collection ...
*
* @return ( int )
*/
int AddGuard(
XSTRCCIGuard &guard,
XSTRCCIGuard &guards[] //
XCAEAGuard &guard,
XCAEAGuard &guards[] //
)
{
//
@@ -418,11 +418,11 @@ int AddGuard(
}
//
bool DetectXSTRCCIConditions(
XSTRCCIConditions &conditions,
bool DetectXCAEAConditions(
XCAEAConditions &conditions,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
XCXSTRCCIHelper *helper,
XCXCAEAHelper *helper,
int barIndex = 0,
int loopback = 10 //
)
@@ -601,114 +601,20 @@ bool DetectXSTRCCIConditions(
//
// Conditions ...
//
bool isLowsUnderValesGolden =
//
pBar.low < conditions.valesGoldenBuffer[pIDX] &&
ppBar.low < conditions.valesGoldenBuffer[ppIDX] &&
p3Bar.low < conditions.valesGoldenBuffer[p3IDX] &&
p4Bar.low < conditions.valesGoldenBuffer[p4IDX]
//
;
//
bool isHighsOverPeaksGolden =
//
pBar.high > conditions.peaksGoldenBuffer[pIDX] &&
ppBar.high > conditions.peaksGoldenBuffer[ppIDX] &&
p3Bar.high > conditions.peaksGoldenBuffer[p3IDX] &&
p4Bar.high > conditions.peaksGoldenBuffer[p4IDX]
//
;
//
bool isSwingLowSameAsVale =
conditions.swingLowsBuffer[p4IDX] == conditions.valesBuffer[p4IDX];
//
bool isSwingHighSameAsPeak =
conditions.swingHighsBuffer[p4IDX] == conditions.peaksBuffer[p4IDX];
//
bool isStrSame = conditions.strBuffer[cIDX] == conditions.strBuffer[pIDX] &&
conditions.strBuffer[pIDX] == conditions.strBuffer[ppIDX];
//
bool isSameStrBreakedUp =
isStrSame &&
conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX];
//
bool isSameStrBreakedDown =
isStrSame &&
conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX];
//
bool isStrBullishVPattern =
//
conditions.strStateBuffer[zIDX] > 0 &&
conditions.strStateBuffer[cIDX] > 0 &&
conditions.strStateBuffer[pIDX] > 0 &&
conditions.strBuffer[pIDX] < conditions.strBuffer[ppIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[cIDX] &&
conditions.strBuffer[pIDX] < conditions.strBuffer[zIDX] &&
conditions.strBuffer[zIDX] > conditions.strBuffer[cIDX]
//
;
//
bool isStrBearishVPattern =
//
conditions.strStateBuffer[zIDX] < 0 &&
conditions.strStateBuffer[cIDX] < 0 &&
conditions.strStateBuffer[pIDX] < 0 &&
conditions.strBuffer[pIDX] > conditions.strBuffer[ppIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[cIDX] &&
conditions.strBuffer[pIDX] > conditions.strBuffer[zIDX] &&
conditions.strBuffer[zIDX] < conditions.strBuffer[cIDX]
//
;
//
bool isCBarLowInTKZone =
//
cBar.low < conditions.tenkanSenBuffer[cIDX] &&
cBar.low > conditions.kijunSenBuffer[cIDX]
//
;
//
bool isCBarHighInTKZone =
//
cBar.high > conditions.tenkanSenBuffer[cIDX] &&
cBar.high < conditions.kijunSenBuffer[cIDX]
//
;
//
// Summarise Conditions ...
//
bool isBullish =
//
isCBarLowInTKZone &&
isCBarBullishRejected &&
isCBarValidForBullish &&
conditions.isX3MaSlowBullish &&
conditions.isTenkanSenOverKijunSen &&
conditions.kijunSenBuffer[cIDX] > conditions.x3maSlowBuffer[cIDX]
false
//
;
//
bool isBearish =
//
isCBarHighInTKZone &&
isCBarBearishRejected &&
isCBarValidForBearish &&
conditions.isX3MaSlowBearish &&
conditions.isTenkanSenUnderKijunSen &&
conditions.kijunSenBuffer[cIDX] < conditions.x3maSlowBuffer[cIDX]
false
//
;
@@ -728,7 +634,7 @@ bool DetectXSTRCCIConditions(
conditions.symbol,
dir //
);
double sl = conditions.kijunSenBuffer[cIDX];
double sl = 0; // conditions.kijunSenBuffer[cIDX];
//
box.dir = dir;
@@ -2,8 +2,8 @@
//
// SaherElm IT Center MQL5 Indicator
// -------------------------------------------------
// Name: XCXSTRCCISignaller ...
// Description: Class for XSTRCCI Signaller ...
// Name: XCXCAEASignaller ...
// Description: Class for XCAEA Signaller ...
//
//
// Maintainer:
@@ -16,20 +16,20 @@
#property copyright "Copyright 2023, SaherElm IT Center"
#property link "https://saherelm.ir"
#property version "1.00"
#property description "SaherElm Class for XSTRCCI Signaller"
#property description "SaherElm Class for XCAEA Signaller"
#property strict
//
// Imports ...
#include "../../Classes/x-saherelm.base.class.mq5"
#include "../../Classes/x-saherelm.x-cobject.class.mq5"
#include "../Helpers/xstrcci.helper.mq5"
#include "../Libraries/xstrcci.signaller.lib.mq5"
#include "../Helpers/xcaea.helper.mq5"
#include "../Libraries/xcaea.signaller.lib.mq5"
//
// Definitions ...
class XCXSTRCCISignaller : XCBase
class XCXCAEASignaller : XCBase
{
//
// Public ...
@@ -37,16 +37,16 @@ class XCXSTRCCISignaller : XCBase
//
// Props ...
bool useGuards;
XSTRCCIInputs inputs;
XCAEAInputs inputs;
XBarTracker barTraker;
XCXSTRCCIHelper *helper;
XCXCAEAHelper *helper;
bool continuesRFTillTarget;
XSTRCCIStrategyConditions mConditions;
XSTRCCIStrategyConditions mConditionsCollection[];
XCAEAStrategyConditions mConditions;
XCAEAStrategyConditions mConditionsCollection[];
//
// Constructor ...
XCXSTRCCISignaller(
XCXCAEASignaller(
string _symbol,
ENUM_TIMEFRAMES _period //
)
@@ -59,7 +59,7 @@ class XCXSTRCCISignaller : XCBase
//
// Deconstructor ...
~XCXSTRCCISignaller()
~XCXCAEASignaller()
{
DeInit();
}
@@ -89,7 +89,7 @@ class XCXSTRCCISignaller : XCBase
*/
bool DetectSignalSetup(
double tpReward = 3,
double maxAllowedSLDistanceInPoint = 300 //
double maxAllowedSLDistanceInPoint = 100 //
)
{
//
@@ -162,8 +162,8 @@ class XCXSTRCCISignaller : XCBase
// Checking Conditions ...
//
XSTRCCIConditions conditions;
hasSignalBox = DetectXSTRCCIConditions(
XCAEAConditions conditions;
hasSignalBox = DetectXCAEAConditions(
conditions,
signalBox,
signalBoxDir,
@@ -232,6 +232,17 @@ class XCXSTRCCISignaller : XCBase
? entry - sl
: sl - entry;
risk += spread;
if (risk >= maxAllowedSLDistanceInPoint * points) {
//
// Fix Risk in Big Distances ...
double hh5 = zBar.FindHighest(5, MODE_HIGH);
double ll5 = zBar.FindLowest(5, MODE_LOW);
//
double hhll5Delta = hh5 - ll5;
double riskDelta = hhll5Delta / 2;
risk = riskDelta;
}
//
double rewardTP = risk * tpReward;
@@ -255,7 +266,7 @@ class XCXSTRCCISignaller : XCBase
? entry
: sl;
mConditions.dir = signalBoxDir;
mConditions.provider = "XSTRCCI";
mConditions.provider = "XCAEA";
mConditions.signalBox = signalBox;
mConditions.setupTime = zBar.time;
mConditions.conditions = conditions;
@@ -307,13 +318,13 @@ class XCXSTRCCISignaller : XCBase
/**
* Detect Trigger Conditions for Specified Signal ...
*
* @param conditions: XSTRCCIStrategyConditions instance Reference, Specified Signal Conditions ...
* @param conditions: XCAEAStrategyConditions instance Reference, Specified Signal Conditions ...
* @param maxAllowedSetupAge: specified Setup Age for Expiration (if bigger than Zero) ...
*
* @return ( bool )
*/
bool DetectSignalTrigger(
XSTRCCIStrategyConditions &conditions,
XCAEAStrategyConditions &conditions,
int maxAllowedSetupAge = 60 //
)
{
@@ -381,14 +392,14 @@ class XCXSTRCCISignaller : XCBase
/**
* Detect Guards bsed on Signalling Class ...
*
* @param guards: XSTRCCIGuard instance Collection, Holds Provided Guards ...
* @param guards: XCAEAGuard instance Collection, Holds Provided Guards ...
* @param positions: XPosition instance Collection, Provides Signalling Based Positions for Apply Guards on them ...
* @param provider: X121SMCStrategySignalProviderData instance Reference, Specified Data for Cycles ...
*
* @return ( bool )
*/
bool DetectGuards(
XSTRCCIGuard &guards[],
XCAEAGuard &guards[],
const XPosition &positions[] //
)
{
@@ -427,7 +438,7 @@ class XCXSTRCCISignaller : XCBase
{
//
// Copy Original Items ...
XSTRCCIStrategyConditions tmpItems[];
XCAEAStrategyConditions tmpItems[];
Copy(
mConditionsCollection,
tmpItems //
@@ -441,7 +452,7 @@ class XCXSTRCCISignaller : XCBase
for (int i = 0; i < count; i++)
{
//
XSTRCCIStrategyConditions iItem = tmpItems[i];
XCAEAStrategyConditions iItem = tmpItems[i];
//
bool canRemove = mConditions.dir == iItem.dir &&
@@ -526,40 +537,27 @@ class XCXSTRCCISignaller : XCBase
inputs.ctInputs.showCandleTime = true;
//
// XPV ...
inputs.pvInputs.showSar = false;
inputs.pvInputs.showPeaks = false;
inputs.pvInputs.showVales = false;
inputs.pvInputs.showTrend = false;
inputs.pvInputs.showSwingLows = false;
inputs.pvInputs.showSwingHighs = false;
inputs.pvInputs.showGoldenZones = false;
inputs.pvInputs.showSupports = false;
inputs.pvInputs.showResistances = false;
// XCA ...
//
// XSTR ...
inputs.strInputs.showStr = false;
inputs.strInputs.showVidya = false;
inputs.strInputs.showStrUpper = false;
inputs.strInputs.showStrLower = false;
inputs.strInputs.showStrSMLow = false;
inputs.strInputs.showStrSMHigh = false;
inputs.caInputs.supResSmoothingLength = 7;
inputs.caInputs.supResSmoothingMode = X_MA_MODE_NONE;
//
// X3MA ...
inputs.ma3Inputs.showX3MaFast = false;
inputs.ma3Inputs.showX3MaMid = false;
inputs.ma3Inputs.showX3MaSlow = true;
//
// XICH ...
inputs.ichInputs.showKumo = false;
inputs.ichInputs.showKijunSen = true;
inputs.ichInputs.showTenkanSen = true;
inputs.ichInputs.showChikouSpan = false;
inputs.ichInputs.showSenkouSpanA = false;
inputs.ichInputs.showSenkouSpanB = false;
inputs.caInputs.showKI = true;
inputs.caInputs.showSar = true;
inputs.caInputs.showTrend = true;
inputs.caInputs.showSwings = false;
inputs.caInputs.showLongCycle = false;
inputs.caInputs.showHindCycle = false;
inputs.caInputs.showFiboLevel1 = false;
inputs.caInputs.showFiboLevel2 = false;
inputs.caInputs.showFiboLevel3 = false;
inputs.caInputs.showShortCycle = false;
inputs.caInputs.showMediumCycle = false;
inputs.caInputs.showPeaksAndVales = true;
inputs.caInputs.showPeakAndValeGolden = true;
inputs.caInputs.showSupportAndResistance = true;
//
// XOSCS ...
@@ -577,8 +575,8 @@ class XCXSTRCCISignaller : XCBase
inputs.showMACD = false;
//
// XSTRCCI Helper ...
helper = new XCXSTRCCIHelper();
// XCAEA Helper ...
helper = new XCXCAEAHelper();
helper.Init(
symbol,
period,
+1
View File
@@ -18,6 +18,7 @@ async function handleCleanup() {
"Parsers", // Strategies Filters based on Conditions
"Strategies", // Strategies Classes which Provides Signals
"X121SMCEA", // X121SMC EA Projects ...
"XCAEA", // XCAEA Projects ...
];
//