This commit is contained in:
2025-05-07 23:53:37 +03:30
parent 32f895407f
commit 2ba019e1f0
5 changed files with 746 additions and 49 deletions
+49 -4
View File
@@ -50,6 +50,17 @@ input double eaConstantRiskBalance = 0.0; // Constant Ri
input double eaConstantPercent = 0.5; // Constant Percent of Balance Per Trade input double eaConstantPercent = 0.5; // Constant Percent of Balance Per Trade
input double eaConstantBalance = 0.0; // Constant Balance for Calculations input double eaConstantBalance = 0.0; // Constant Balance for Calculations
//
// Management ...
input group "Management";
input bool eaAllowTrade = true; // Allow Trade on Signals
input bool eaAllowLongs = true; // Allow Long Trades
input bool eaAllowShorts = true; // Allow Short Trades
input int eaMaxAllowedTradesPerDay = 3; // Max Allowed Trades per Day
input int eaMaxAllowedSLsPerDay = 2; // Max Allowed SL(s) per Day
input string eaSessionStartTime = ""; // Trade Start Time
input string eaSessionEndTime = ""; // Trade End Time
// //
// Alert ... // Alert ...
// Here we Provider All Requirements for // Here we Provider All Requirements for
@@ -64,10 +75,14 @@ input bool eaTerminalAlerts = false; // Terminal Alerts
// //
// Time Report ... // Time Report ...
input group "Reports"; input group "Reports";
input bool eaReportNewMonths = false; // Report New Month input bool eaReportNewMonths = false; // Report New Month
input bool eaReportNewWeeks = false; // Report New Weeks input bool eaReportNewWeeks = false; // Report New Weeks
input bool eaReportNewDays = true; // Report New Days input bool eaReportNewDays = true; // Report New Days
input bool eaReportNewHours = false; // Report New Hours input bool eaReportNewHours = false; // Report New Hours
input bool eaReportTrades = true; // Report Trades
input bool eaReportSignals = true; // Report Signals
input bool eaReportProtector = true; // Report Protector Actions
input bool eaReportAfterTradesBalance = true; // Report Balance after a Trade Finished
// //
// Variables, Instances ... // Variables, Instances ...
@@ -327,6 +342,8 @@ void OnTick()
eaSignal.time = eaConditions.time; eaSignal.time = eaConditions.time;
eaSignal.symbol = eaConditions.symbol; eaSignal.symbol = eaConditions.symbol;
eaSignal.period = eaConditions.period; eaSignal.period = eaConditions.period;
eaSignal.partialCloseOnTPLevel = eaConditions.partialCloseOnTPLevel;
eaSignal.partialCloseMultiplier = eaConditions.partialCloseMultiplier;
// //
Copy( Copy(
@@ -627,6 +644,34 @@ void InitRequirements()
eaTradeManager.SetAlertPushAlerts(eaPushAlerts); eaTradeManager.SetAlertPushAlerts(eaPushAlerts);
eaTradeManager.SetAlertTerminalAlerts(eaTerminalAlerts); eaTradeManager.SetAlertTerminalAlerts(eaTerminalAlerts);
//
// Setting Trade Reports ...
eaTradeManager
.SetTradeReports(
eaReportTrades,
eaReportSignals,
eaReportProtector,
eaReportAfterTradesBalance //
);
//
// Setting Trade Permissions ...
eaTradeManager
.SetTradePermissions(
eaAllowTrade,
eaAllowLongs,
eaAllowShorts //
);
//
//
//
//
// eaMaxAllowedTradesPerDay
// eaMaxAllowedSLsPerDay
// eaSessionStartTime
// eaSessionEndTime
// //
// EA Signaller ... // EA Signaller ...
eaSignaller = new XCXCAEASignaller( eaSignaller = new XCXCAEASignaller(
+58 -6
View File
@@ -952,6 +952,32 @@ struct XPosition
} }
} }
//
// Calculate Touched Reward ...
double CalculateTouchedReward()
{
//
double result = 0.0;
//
bool has = IsValid() &&
profit > 0;
if (!has)
{
return result;
}
//
double risk = MathAbs(entry - sl);
double currentReward = MathAbs(price - entry);
//
result = currentReward / risk;
//
return result;
}
// //
// Calculate Age ... // Calculate Age ...
int GetAge( int GetAge(
@@ -1111,6 +1137,7 @@ struct XSignal
// //
// TP ... // TP ...
double fullTPLevel; // Full TP ... double fullTPLevel; // Full TP ...
bool isPartiallyClosed; // Check Partially Closed Before or not ...
double partialCloseMultiplier; // Amount of Partial Close ... double partialCloseMultiplier; // Amount of Partial Close ...
double partialCloseOnTPLevel; // Do Partial Close on TP Level ... double partialCloseOnTPLevel; // Do Partial Close on TP Level ...
@@ -1121,10 +1148,10 @@ struct XSignal
// //
// Traget ... // Traget ...
double targets[]; // Force Risk Free On Targets ... double targets[]; // Force Risk Free On Targets ...
bool isTargetApplied; // Target Applied ... bool isTargetApplied; // Target Applied ...
int appliedTargetIDX; // Last Applied Target Index ... int appliedTargetIDX; // Last Applied Target Index ...
bool ignoreEAVolume; // Ignore EA Volume ... bool ignoreEAVolume; // Ignore EA Volume ...
// //
// SL Trail ... // SL Trail ...
@@ -1697,6 +1724,7 @@ struct XSignal
fullTPLevel = 0; fullTPLevel = 0;
tpLevelForBreakEven = 0; tpLevelForBreakEven = 0;
partialCloseOnTPLevel = 0; partialCloseOnTPLevel = 0;
isPartiallyClosed = false;
partialCloseMultiplier = 0; partialCloseMultiplier = 0;
trailSLStartOnReachTPLevel = 0; trailSLStartOnReachTPLevel = 0;
@@ -1709,7 +1737,8 @@ struct XSignal
// //
// Default Values ... // Default Values ...
void Default() { void Default()
{
// //
entry = 0; entry = 0;
volume = 0; volume = 0;
@@ -1739,6 +1768,7 @@ struct XSignal
// //
fullTPLevel = 0; fullTPLevel = 0;
tpLevelForBreakEven = 0; tpLevelForBreakEven = 0;
isPartiallyClosed = false;
partialCloseOnTPLevel = 0; partialCloseOnTPLevel = 0;
partialCloseMultiplier = 0; partialCloseMultiplier = 0;
trailSLStartOnReachTPLevel = 0; trailSLStartOnReachTPLevel = 0;
@@ -2029,12 +2059,13 @@ struct XSignal
} }
// //
bool IsSameAs(XSignal &item) { bool IsSameAs(XSignal &item)
{
// //
bool result = false; bool result = false;
// //
result = result =
// //
IsValid() && IsValid() &&
item.IsValid() && item.IsValid() &&
@@ -2054,6 +2085,28 @@ struct XSignal
// //
return result; return result;
} }
//
string GetMessage()
{
//
string result = NULL;
//
if (!IsValid())
{
return result;
}
//
result = ToString(type) +
" Signal Provided by: " + provider +
" on (" + symbol + ")" +
" in: " + ToString(period);
//
return result;
}
}; };
// //
@@ -5239,7 +5292,6 @@ bool IsStateFilterPassed(
// //
// //
// //
// Calculate Positions Profit Summary ... // Calculate Positions Profit Summary ...
+278 -4
View File
@@ -319,6 +319,17 @@ class XCXCAEATradeManager : public XCBaseAlert
drawSignal = true; drawSignal = true;
drawer = new XCPOIDrawer(); drawer = new XCPOIDrawer();
//
allowTrade = true;
allowLongs = true;
allowShorts = true;
//
reportTrades = true;
reportSignals = true;
reportProtector = true;
reportAfterTradesBalance = true;
// //
SaveTrades(false); SaveTrades(false);
@@ -362,6 +373,52 @@ class XCXCAEATradeManager : public XCBaseAlert
mSaveTrades = value; mSaveTrades = value;
} }
//
// TODO: Implement this ...
void SetTradeSession(
string start,
string end //
)
{
//
bool has = IsValid(start) ||
IsValid(end);
if (!has)
{
return;
}
//
}
//
void SetTradeReports(
bool _reportTrades,
bool _reportSignals,
bool _reportProtector,
bool _reportAfterTradesBalance //
)
{
//
reportTrades = _reportTrades;
reportSignals = _reportSignals;
reportProtector = _reportProtector;
reportAfterTradesBalance = _reportAfterTradesBalance;
}
//
void SetTradePermissions(
bool _allowTrade,
bool _allowLongs,
bool _allowShorts //
)
{
//
allowTrade = _allowTrade;
allowLongs = _allowLongs;
allowShorts = _allowShorts;
}
// //
// Tools ... // Tools ...
@@ -543,6 +600,7 @@ class XCXCAEATradeManager : public XCBaseAlert
if (iPosition.profit > 0) if (iPosition.profit > 0)
{ {
// //
// Handle Risk Free On Targets ...
double targets[]; double targets[];
Copy( Copy(
trades[idx].signal.targets, trades[idx].signal.targets,
@@ -624,7 +682,55 @@ class XCXCAEATradeManager : public XCBaseAlert
ToString(iPosition.ticket) + ToString(iPosition.ticket) +
" RF On Traget: " + ToString(jTarget) + " RF On Traget: " + ToString(jTarget) +
" Successfully ..."; " Successfully ...";
Alert(message); HandleReportProtector(message);
}
}
}
}
//
// Handle Partial Close on Specified Targets ...
has = !trades[idx].signal.isPartiallyClosed &&
trades[idx].signal.partialCloseOnTPLevel > 0 &&
trades[idx].signal.partialCloseMultiplier > 0;
if (has)
{
//
// Check Reward Touched ...
double iCurrReward = iPosition.CalculateTouchedReward();
has = iCurrReward >= trades[idx].signal.partialCloseOnTPLevel;
if (has)
{
//
// Check Volume Multiplier ...
double volumeMultiplier = trades[idx].signal.partialCloseMultiplier;
has = volumeMultiplier > 0 &&
volumeMultiplier <= 1;
if (has)
{
//
// Do Partial Closing ...
double volume = iPosition.volume * volumeMultiplier;
string comment = "PC On Target ...";
has = trader.ClosePartial(
iPosition.ticket,
volume,
comment //
);
if (has)
{
//
// Update Model ...
trades[idx].signal.isPartiallyClosed = true;
//
string message = prefix +
ToString(iPosition.type) +
" Position: " +
ToString(iPosition.ticket) +
" PC (" + ToString(volume) + ") On Traget: " + ToString(iCurrReward) +
" Successfully ...";
HandleReportProtector(message);
} }
} }
} }
@@ -633,6 +739,93 @@ class XCXCAEATradeManager : public XCBaseAlert
} }
} }
/**
* Check Signal Execution Conditions ...
*
* @param signal: XSignal instance reference ...
* @param executionResult: ENUM_X_SIGNAL_EXECUTION_RESULT member reference ...
*
* @return ( bool )
*/
bool CheckSignal(
XSignal &signal,
ENUM_X_SIGNAL_EXECUTION_RESULT &executionResult //
)
{
//
bool result = false;
//
// Cleanup ...
executionResult = X_SIGNAL_EXECUTION_UNKNOWN;
//
// Validate Signal ...
result = signal.IsValid();
if (!result)
{
return result;
}
//
// Reporting Signal ...
if (reportSignals)
{
//
string message = signal.GetMessage();
Alert(message);
}
//
// Check Trade Permission ...
if (!allowTrade)
{
//
result = false;
executionResult = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED;
//
return result;
}
//
bool isLong = IsLong(signal.type);
bool isShort = IsShort(signal.type);
//
bool isLongAndAllowed =
isLong &&
allowLongs;
//
bool isShortAndAllowed =
isShort &&
allowShorts;
//
result = isLongAndAllowed ||
isShortAndAllowed;
if (!result)
{
//
executionResult = X_SIGNAL_EXECUTION_FAILED_NOT_ALLOWED;
//
return result;
}
//
// TODO: Complete this ...
// Implementing Trade Session Validating ...
//
// TODO: Complete this ...
// Implementing Trade Permissions Based on SL(s) Count ...
//
return result;
}
/** /**
* Execute Specified Signal ... * Execute Specified Signal ...
* *
@@ -670,15 +863,30 @@ class XCXCAEATradeManager : public XCBaseAlert
// //
ENUM_X_SIGNAL_EXECUTION_RESULT executionResult; ENUM_X_SIGNAL_EXECUTION_RESULT executionResult;
result = trader.ExecuteSignal(
//
// Checking Signal For Execution ...
result = CheckSignal(
signal, signal,
executionResult // executionResult //
); );
if (result)
{
//
result = trader.ExecuteSignal(
signal,
executionResult //
);
}
// //
// Alert Signal Execution ... // Alert Signal Execution ...
string executionMessage = ToString(executionResult); if (reportTrades)
Alert(executionMessage); {
//
string executionMessage = ToString(executionResult);
Alert(executionMessage);
}
// //
if (result) if (result)
@@ -762,6 +970,11 @@ class XCXCAEATradeManager : public XCBaseAlert
// Save Trade ... // Save Trade ...
Save(trades[idx]); Save(trades[idx]);
//
// Handle Balance Reporting ...
string prefix = "TP: " + ToString(trades[idx].profit);
HandleReportBalance(prefix);
// //
RemoveTrade(idx); RemoveTrade(idx);
} }
@@ -800,6 +1013,11 @@ class XCXCAEATradeManager : public XCBaseAlert
// Save Trade ... // Save Trade ...
Save(trades[idx]); Save(trades[idx]);
//
// Handle Balance Reporting ...
string prefix = "SL: " + ToString(trades[idx].profit);
HandleReportBalance(prefix);
// //
RemoveTrade(idx); RemoveTrade(idx);
} }
@@ -854,6 +1072,16 @@ class XCXCAEATradeManager : public XCBaseAlert
// Save Trade ... // Save Trade ...
Save(trades[idx]); Save(trades[idx]);
//
// Handle Balance Reporting ...
string prefix = "Force Close " +
(isInProfit
? "Profit"
: "Loss") +
": " +
ToString(trades[idx].profit);
HandleReportBalance(prefix);
// //
RemoveTrade(idx); RemoveTrade(idx);
} }
@@ -1045,6 +1273,41 @@ class XCXCAEATradeManager : public XCBaseAlert
return result; return result;
} }
//
void HandleReportBalance(string prefix = NULL)
{
//
if (!reportAfterTradesBalance)
{
return;
}
//
double balance = trader.mAccount.GetBalance();
string currency = trader.mAccount.GetCurrency();
//
string message =
(IsValid(prefix)
? prefix + "\n"
: "") +
"Account Balance: " + ToString(balance) + currency;
Alert(message);
}
//
void HandleReportProtector(string message = NULL)
{
//
if (!reportProtector)
{
return;
}
//
Alert(message);
}
// //
bool Save( bool Save(
XCAEATrade &trade, XCAEATrade &trade,
@@ -1093,6 +1356,11 @@ class XCXCAEATradeManager : public XCBaseAlert
// //
// Props ... // Props ...
//
bool allowTrade;
bool allowLongs;
bool allowShorts;
// //
bool mSaveTrades; bool mSaveTrades;
@@ -1104,6 +1372,12 @@ class XCXCAEATradeManager : public XCBaseAlert
int managedSLCount; int managedSLCount;
int managedTPCount; int managedTPCount;
//
bool reportTrades;
bool reportSignals;
bool reportProtector;
bool reportAfterTradesBalance;
// //
CArrayObj mObjects; CArrayObj mObjects;
+310 -15
View File
@@ -79,6 +79,10 @@ struct XCAEAStrategyConditions
datetime setupTime; datetime setupTime;
datetime triggerTime; datetime triggerTime;
//
double partialCloseOnTPLevel;
double partialCloseMultiplier;
// //
ENUM_X_DIRECTION dir; ENUM_X_DIRECTION dir;
XBoxZone decisionZone; XBoxZone decisionZone;
@@ -118,6 +122,10 @@ struct XCAEAStrategyConditions
setupTime = NULL; setupTime = NULL;
triggerTime = NULL; triggerTime = NULL;
//
partialCloseOnTPLevel = 0;
partialCloseMultiplier = 0;
// //
Clean(targets); Clean(targets);
@@ -711,6 +719,14 @@ bool DetectDecisionZone(
double p2FastState = conditions.fastStateBuffer[p2IDX]; double p2FastState = conditions.fastStateBuffer[p2IDX];
double p3FastState = conditions.fastStateBuffer[p3IDX]; double p3FastState = conditions.fastStateBuffer[p3IDX];
//
// RSI ...
double zRSI = conditions.rsiBuffer[zIDX];
double cRSI = conditions.rsiBuffer[cIDX];
double pRSI = conditions.rsiBuffer[pIDX];
double p2RSI = conditions.rsiBuffer[p2IDX];
double p3RSI = conditions.rsiBuffer[p3IDX];
// //
// Create Custom Conditions ... // Create Custom Conditions ...
@@ -912,7 +928,19 @@ bool DetectDecisionZone(
bool isSarSwitchedToBearish = bool isSarSwitchedToBearish =
cFastState < 0 && cFastState < 0 &&
isSarSwitchedInFiboStrongBearish; isSarSwitchedInFiboStrongBearish;
;
//
// RSI Conditions ...
//
bool isRSICrossedOverOS =
p3RSI < conditions.rsiOSLevel &&
cRSI > conditions.rsiOSLevel;
//
bool isRSICrossedUnderOB =
p3RSI > conditions.rsiOBLevel &&
cRSI < conditions.rsiOBLevel;
// //
// Testing Conditions ... // Testing Conditions ...
@@ -1047,12 +1075,14 @@ bool DetectDecisionZone(
// //
bool isCond1Bullish = bool isCond1Bullish =
isCIsValePivot && isCIsValePivot &&
isRSICrossedOverOS &&
!isFiboSectionChanged && !isFiboSectionChanged &&
isSarSwitchedToBullish; isSarSwitchedToBullish;
// //
bool isCond1Bearish = bool isCond1Bearish =
isCIsPeakPivot && isCIsPeakPivot &&
isRSICrossedUnderOB &&
!isFiboSectionChanged && !isFiboSectionChanged &&
isSarSwitchedToBearish; isSarSwitchedToBearish;
@@ -1167,18 +1197,12 @@ bool DetectDecisionZone(
} }
// //
bool isCond2 = // bool isCond2 = isFiboSectionChanged;
(cPeak == pPeak && // if (isCond2)
cPeak == cSWH && // {
cPeak == cResistance) && // //
(cVale == pVale && // Print("Decision Zone Full Cond1");
cVale == cSWL && // }
cVale == cSupport);
if (isCond2)
{
//
Print("Decision Zone Full Cond1");
}
// //
// Summarise Result ... // Summarise Result ...
@@ -1232,6 +1256,275 @@ bool DetectDecisionZone(
// //
// Trigger Conditions ... // Trigger Conditions ...
//
// Detect Trigger Based On Decision Zone's
// Volume and Score ...
bool CanTriggerCond0(
XCXCAEAHelper *helper,
XBoxZone &box,
ENUM_X_DIRECTION &dir,
double &sl,
double &tp,
int barIndex = 0,
int loopback = 5,
double scorePassMultiplier = 1 //
)
{
//
bool result = false;
//
// Normalize Args ...
sl = 0;
tp = 0;
dir = X_DIRECTION_NONE;
loopback = NormalizeInt(loopback, 5);
barIndex = NormalizeInt(barIndex, 0);
//
// Validate Decision Box ...
result = box.IsValid() &&
helper != NULL;
if (!result)
{
return result;
}
//
// Define Requirements ...
//
bool isBullish = box.IsBullish();
bool isBearish = box.IsBearish();
//
// Scores ...
double bullScores[];
double bearScores[];
//
// Volumes ...
double bullVolumes[];
double bearVolumes[];
//
// Create a Loop through Loopack ...
XOHCL iBar;
bool has = false;
int start = barIndex;
XCAEAConditions iConditions;
int end = barIndex + loopback;
for (int i = end; i >= start; i--)
{
//
// Retrieve Bar ...
has = iBar.Init(
box.symbol,
box.period,
i //
);
if (!has)
{
//
iBar.Clean();
iConditions.Clean();
//
continue;
}
//
// Retrieve Conditions ...
has = helper.GetConditions(
iConditions,
i //
);
if (!has)
{
//
iBar.Clean();
iConditions.Clean();
//
continue;
}
//
// Retrieve Scores ...
double iBullScore = 0;
double iBearScore = 0;
iConditions
.GenerateScore(
iBullScore,
iBearScore //
);
Add(
iBullScore,
bullScores //
);
Add(
iBearScore,
bearScores //
);
//
// Retrieve Volumes ...
double iBullVolume = 0;
double iBearVolume = 0;
helper
.barAnalyser
.CalculateRangeVolume(
iBar,
iBullVolume,
iBearVolume,
2 // Loopback ...
);
Add(
iBullVolume,
bullVolumes //
);
Add(
iBearVolume,
bearVolumes //
);
//
iBar.Clean();
iConditions.Clean();
}
//
// Calculating Requirements ...
//
// Scores ...
//
// Bullish ...
double bullScore = GetSum(bullScores);
double bullScoreMax = GetMax(bullScores);
double bullScoreMin = GetMin(bullScores);
//
// Bearish ...
double bearScore = GetSum(bearScores);
double bearScoreMax = GetMax(bearScores);
double bearScoreMin = GetMin(bearScores);
//
// Volumes ...
//
// Bullish ...
double bullVolume = GetSum(bullVolumes);
double bullVolumeMax = GetMax(bullVolumes);
double bullVolumeMin = GetMin(bullVolumes);
//
// Bearish ...
double bearVolume = GetSum(bearVolumes);
double bearVolumeMax = GetMax(bearVolumes);
double bearVolumeMin = GetMin(bearVolumes);
//
// Creating Result Conditions ...
//
bool isBullishPassed =
isBullish &&
bullScore >= (scorePassMultiplier * bearScore) &&
bullVolume >= (scorePassMultiplier * bearVolume);
//
bool isBearishPassed =
isBearish &&
bearScore >= (scorePassMultiplier * bullScore) &&
bearVolume >= (scorePassMultiplier * bullVolume);
//
result = isBullishPassed ||
isBearishPassed;
if (!result)
{
//
iBar.Clean();
Clean(bullScores);
Clean(bearScores);
Clean(bullVolumes);
Clean(bearVolumes);
iConditions.Clean();
//
return result;
}
//
// Validating Box to Find a Rejection ...
//
// Validating Box to Has a Gap ...
//
// Validating Box to Has a Block ...
//
bool isPassed =
isBullishPassed ||
isBearishPassed;
if (isPassed)
{
//
// Preparing TP and SL ...
//
sl = isBullishPassed
? box.lower
: box.upper;
//
tp = 0;
}
//
// Summarizing ...
//
bool canTriggerLong =
isBullishPassed;
//
bool canTriggerShort =
isBearishPassed;
//
result = canTriggerLong ||
canTriggerShort;
if (result)
{
//
dir = canTriggerLong
? X_DIRECTION_BULLISH
: X_DIRECTION_BEARISH;
//
Print("Triggered ...");
}
//
// Cleanup Resources ...
//
iBar.Clean();
Clean(bullScores);
Clean(bearScores);
Clean(bullVolumes);
Clean(bearVolumes);
iConditions.Clean();
//
return result;
}
// //
// Detect Trigger Based On Decision Zone's // Detect Trigger Based On Decision Zone's
// Fake Breaked out ... // Fake Breaked out ...
@@ -1258,7 +1551,8 @@ bool CanTriggerCond1(
// //
// Validate Decision Box ... // Validate Decision Box ...
result = box.IsValid(); result = box.IsValid() &&
helper != NULL;
if (!result) if (!result)
{ {
return result; return result;
@@ -1373,7 +1667,8 @@ bool CanTriggerCond2(
// //
// Validate Decision Box ... // Validate Decision Box ...
result = box.IsValid(); result = box.IsValid() &&
helper != NULL;
if (!result) if (!result)
{ {
return result; return result;
+51 -20
View File
@@ -139,8 +139,8 @@ class XCXCAEASignaller : XCBase
inputs.caInputs.showPeaksAndVales = true; inputs.caInputs.showPeaksAndVales = true;
// //
inputs.caInputs.showKI = false; inputs.caInputs.showKI = true;
inputs.caInputs.showTKI = false; inputs.caInputs.showTKI = true;
inputs.caInputs.showVidya = true; inputs.caInputs.showVidya = true;
inputs.caInputs.showTrend = true; inputs.caInputs.showTrend = true;
inputs.caInputs.showPeakAndValeGolden = false; inputs.caInputs.showPeakAndValeGolden = false;
@@ -159,7 +159,7 @@ class XCXCAEASignaller : XCBase
// //
// Oscillators Views ... // Oscillators Views ...
inputs.showRSI = false; inputs.showRSI = true;
inputs.showCCI = false; inputs.showCCI = false;
inputs.showMFI = false; inputs.showMFI = false;
inputs.showRVI = false; inputs.showRVI = false;
@@ -602,29 +602,42 @@ class XCXCAEASignaller : XCBase
// Checking Trigger Conditions ... // Checking Trigger Conditions ...
double sl = 0; double sl = 0;
double tp = 0; double tp = 0;
ENUM_X_DIRECTION triggerDir; ENUM_X_DIRECTION triggerDir = X_DIRECTION_NONE;
//
// Checking Trigger Cond 0 ...
bool canTriggerCond0 = CanTriggerCond0(
helper,
conditions.decisionZone,
triggerDir,
sl,
tp,
barIndex //
);
// //
// Checking Trigger Cond 1 ... // Checking Trigger Cond 1 ...
bool canTriggerCond1 = CanTriggerCond1( bool canTriggerCond1 = false;
helper, // CanTriggerCond1(
conditions.decisionZone, // helper,
triggerDir, // conditions.decisionZone,
sl, // triggerDir,
tp, // sl,
barIndex // // tp,
); // barIndex //
// );
// //
// Checking Trigger Cond 2 ... // Checking Trigger Cond 2 ...
bool canTriggerCond2 = CanTriggerCond2( bool canTriggerCond2 = false;
helper, // CanTriggerCond2(
conditions.decisionZone, // helper,
triggerDir, // conditions.decisionZone,
sl, // triggerDir,
tp, // sl,
barIndex // // tp,
); // barIndex //
// );
// //
// Update Signal Box To ... // Update Signal Box To ...
@@ -645,6 +658,7 @@ class XCXCAEASignaller : XCBase
// //
// Summarizing Result ... // Summarizing Result ...
result = result =
canTriggerCond0 ||
canTriggerCond1 || canTriggerCond1 ||
canTriggerCond2; canTriggerCond2;
@@ -655,6 +669,7 @@ class XCXCAEASignaller : XCBase
IsBearish(triggerDir); IsBearish(triggerDir);
// //
// Configure Conditions for Preparing Signal ...
if (result) if (result)
{ {
// //
@@ -697,6 +712,22 @@ class XCXCAEASignaller : XCBase
conditions.targets // conditions.targets //
); );
//
rfReward = risk * 2.85;
rfPrice =
isBullish
? entry + rfReward
: entry - rfReward;
Add(
rfPrice,
conditions.targets //
);
//
// Handling Partial Close ...
conditions.partialCloseOnTPLevel = 1;
conditions.partialCloseMultiplier = 0.5;
// //
conditions.sl = sl; conditions.sl = sl;
conditions.tp = tp; conditions.tp = tp;