update tasks and add multi asset ...
This commit is contained in:
Vendored
+99
-88
@@ -1,102 +1,21 @@
|
|||||||
{
|
{
|
||||||
"todo": [
|
"todo": [],
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-17T19:53:39.860Z",
|
|
||||||
"description": {
|
|
||||||
"content": "- use it for supportings",
|
|
||||||
"mime": "text/markdown"
|
|
||||||
},
|
|
||||||
"id": "82",
|
|
||||||
"references": [],
|
|
||||||
"title": "add trend line class and test it"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"in-progress": [
|
"in-progress": [
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
},
|
},
|
||||||
"creation_time": "2024-06-26T18:27:39.722Z",
|
"creation_time": "2024-07-28T22:48:10.644Z",
|
||||||
"description": {
|
"details": {
|
||||||
"content": "- [] Linear Regression Line 9 and 18;\n- [] Linear Regression Value;\n\nadd all those into 1 Indicator for Recieveing Verification for Signals;",
|
"content": "[] Add Recovery Options when try to Synchronize Positions Using Trade Handler ...\n[] Add Do not Trail Support or Recovery Positions in Trade Handler ...\n[] Add a TP and SL to Recovery Position ...\n[] Made Multi Asset ...\n[] Add Pressure Based Trailling ...\n[] Add Support for Pressures in Recovery ...\n[] Add OB / FVG and Other things Like XPV Signalling ...\n[] Create XCHCHE Insicator and it's Helper class ...\n",
|
||||||
"mime": "text/markdown"
|
"mime": "text/markdown"
|
||||||
},
|
},
|
||||||
"id": "85",
|
"id": "86",
|
||||||
"references": [],
|
"references": [],
|
||||||
"title": "Converts Linear Regression Line and Value indicator"
|
"title": "TODOs"
|
||||||
},
|
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-17T19:53:56.463Z",
|
|
||||||
"id": "83",
|
|
||||||
"references": [],
|
|
||||||
"title": "run a multi currency test"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-17T19:54:13.659Z",
|
|
||||||
"id": "84",
|
|
||||||
"references": [],
|
|
||||||
"title": "try to implement machine learning and neural network"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"testing": [
|
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-16T23:57:54.021Z",
|
|
||||||
"id": "78",
|
|
||||||
"references": [],
|
|
||||||
"title": "add Max Allowe Signals per Symbol"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-16T23:59:52.125Z",
|
|
||||||
"description": {
|
|
||||||
"content": "- Start Time;\n- End Time;\n- Close On Specific;\n- Close On Opposite;",
|
|
||||||
"mime": "text/markdown"
|
|
||||||
},
|
|
||||||
"id": "80",
|
|
||||||
"references": [],
|
|
||||||
"title": "Complete Signalling COntrols ..."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-17T00:01:04.987Z",
|
|
||||||
"description": {
|
|
||||||
"content": "- Max Number;\n- Voluem Multiplier;\n- Max Volume;\n- Support on Distance;",
|
|
||||||
"mime": "text/markdown"
|
|
||||||
},
|
|
||||||
"id": "81",
|
|
||||||
"references": [],
|
|
||||||
"title": "Fix Allow Supports ..."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"assignedTo": {
|
|
||||||
"name": "Hadi Khazaee Asl"
|
|
||||||
},
|
|
||||||
"creation_time": "2024-06-16T23:58:59.163Z",
|
|
||||||
"description": {
|
|
||||||
"content": "Fix Open Signals When Support Signals only Open\nMax Allowed Trades Handler ...",
|
|
||||||
"mime": "text/markdown"
|
|
||||||
},
|
|
||||||
"id": "79",
|
|
||||||
"references": [],
|
|
||||||
"title": "Fix Max Allowed Trade on Only SUpport Signals"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"testing": [],
|
||||||
"done": [
|
"done": [
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
@@ -136,6 +55,15 @@
|
|||||||
"references": [],
|
"references": [],
|
||||||
"title": "add handlers for TakeProfit or LoseProfit Events"
|
"title": "add handlers for TakeProfit or LoseProfit Events"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-16T23:57:54.021Z",
|
||||||
|
"id": "78",
|
||||||
|
"references": [],
|
||||||
|
"title": "add Max Allowe Signals per Symbol"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
@@ -323,6 +251,19 @@
|
|||||||
"references": [],
|
"references": [],
|
||||||
"title": "add supports to plot trend arrow in tdma indicator"
|
"title": "add supports to plot trend arrow in tdma indicator"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-17T19:53:39.860Z",
|
||||||
|
"description": {
|
||||||
|
"content": "- use it for supportings",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "82",
|
||||||
|
"references": [],
|
||||||
|
"title": "add trend line class and test it"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
@@ -442,6 +383,32 @@
|
|||||||
"references": [],
|
"references": [],
|
||||||
"title": "Complete Remained Short Signals"
|
"title": "Complete Remained Short Signals"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-16T23:59:52.125Z",
|
||||||
|
"description": {
|
||||||
|
"content": "- Start Time;\n- End Time;\n- Close On Specific;\n- Close On Opposite;",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "80",
|
||||||
|
"references": [],
|
||||||
|
"title": "Complete Signalling COntrols ..."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-26T18:27:39.722Z",
|
||||||
|
"description": {
|
||||||
|
"content": "- [] Linear Regression Line 9 and 18;\n- [] Linear Regression Value;\n\nadd all those into 1 Indicator for Recieveing Verification for Signals;",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "85",
|
||||||
|
"references": [],
|
||||||
|
"title": "Converts Linear Regression Line and Value indicator"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
@@ -702,6 +669,19 @@
|
|||||||
"references": [],
|
"references": [],
|
||||||
"title": "extends new section based indicators"
|
"title": "extends new section based indicators"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-17T00:01:04.987Z",
|
||||||
|
"description": {
|
||||||
|
"content": "- Max Number;\n- Voluem Multiplier;\n- Max Volume;\n- Support on Distance;",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "81",
|
||||||
|
"references": [],
|
||||||
|
"title": "Fix Allow Supports ..."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
@@ -712,6 +692,19 @@
|
|||||||
"references": [],
|
"references": [],
|
||||||
"title": "fix cc and ct indicator issues ..."
|
"title": "fix cc and ct indicator issues ..."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-16T23:58:59.163Z",
|
||||||
|
"description": {
|
||||||
|
"content": "Fix Open Signals When Support Signals only Open\nMax Allowed Trades Handler ...",
|
||||||
|
"mime": "text/markdown"
|
||||||
|
},
|
||||||
|
"id": "79",
|
||||||
|
"references": [],
|
||||||
|
"title": "Fix Max Allowed Trade on Only SUpport Signals"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
@@ -994,6 +987,15 @@
|
|||||||
"references": [],
|
"references": [],
|
||||||
"title": "resolve InvalidStop on Partial Closing"
|
"title": "resolve InvalidStop on Partial Closing"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-17T19:53:56.463Z",
|
||||||
|
"id": "83",
|
||||||
|
"references": [],
|
||||||
|
"title": "run a multi currency test"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"assignedTo": {
|
"assignedTo": {
|
||||||
"name": "Hadi Khazaee Asl"
|
"name": "Hadi Khazaee Asl"
|
||||||
@@ -1052,6 +1054,15 @@
|
|||||||
"content": "do a refactor on all brokers, higgh priority criterias ...",
|
"content": "do a refactor on all brokers, higgh priority criterias ...",
|
||||||
"mime": "text/markdown"
|
"mime": "text/markdown"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"assignedTo": {
|
||||||
|
"name": "Hadi Khazaee Asl"
|
||||||
|
},
|
||||||
|
"creation_time": "2024-06-17T19:54:13.659Z",
|
||||||
|
"id": "84",
|
||||||
|
"references": [],
|
||||||
|
"title": "try to implement machine learning and neural network"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -4305,6 +4305,25 @@ public:
|
|||||||
mMaxAllowedRecover = value;
|
mMaxAllowedRecover = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double MaxAllowedRecoveryVolume()
|
||||||
|
{
|
||||||
|
return mMaxAllowedRecoveryVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void MaxAllowedRecoveryVolume(double value)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (value < 0)
|
||||||
|
{
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
mMaxAllowedRecoveryVolume = value;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
double RecoveryVolumeMultiplier()
|
double RecoveryVolumeMultiplier()
|
||||||
{
|
{
|
||||||
@@ -4324,6 +4343,18 @@ public:
|
|||||||
mRecoveryVolumeMultiplier = value;
|
mRecoveryVolumeMultiplier = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool ForcePressuresInRecovery()
|
||||||
|
{
|
||||||
|
return mForcePressuresInRecovery;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void ForcePressuresInRecovery(bool value)
|
||||||
|
{
|
||||||
|
mForcePressuresInRecovery = value;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Hedging ...
|
// Hedging ...
|
||||||
|
|
||||||
@@ -4409,6 +4440,11 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Signal Support or Recovery ...
|
||||||
|
bool isSupport = IsSupport(signal.comment);
|
||||||
|
bool isRecovery = ExtractRecoveredTicket(signal.comment) > 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
XTradeData item;
|
XTradeData item;
|
||||||
bool isFilled = item.Fill(signal);
|
bool isFilled = item.Fill(signal);
|
||||||
@@ -4429,7 +4465,10 @@ public:
|
|||||||
if (mAllowTrailStops || forceTrail)
|
if (mAllowTrailStops || forceTrail)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
item.allowTrailStop = true;
|
if (!isSupport && !isRecovery)
|
||||||
|
{
|
||||||
|
item.allowTrailStop = true;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
item.ignoreTPOnTrail = mIgnoreTPOnTrail;
|
item.ignoreTPOnTrail = mIgnoreTPOnTrail;
|
||||||
@@ -4447,7 +4486,10 @@ public:
|
|||||||
if (mAllowRecover || forceRecover)
|
if (mAllowRecover || forceRecover)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
item.allowRecover = true;
|
if (!isSupport && !isRecovery)
|
||||||
|
{
|
||||||
|
item.allowRecover = true;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
item.recoveryTPPoint = mRecoveryTPPoint;
|
item.recoveryTPPoint = mRecoveryTPPoint;
|
||||||
@@ -4800,31 +4842,50 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
double requiredProfitPoints = (mData[i].recoveryLevel + 1) * recoveryTPPoint;
|
// Summary Calculations ...
|
||||||
|
|
||||||
//
|
|
||||||
double rSwap = mData[i].swap;
|
|
||||||
double rVolume = volume;
|
double rVolume = volume;
|
||||||
double rProfit = profit;
|
double rProfit = profit;
|
||||||
|
bool hasMaxVolume = false;
|
||||||
|
double rSwap = mData[i].swap;
|
||||||
double rCommission = mData[i].commission;
|
double rCommission = mData[i].commission;
|
||||||
for (int i = 0; i < recoveriesCount; i++)
|
for (int j = 0; j < recoveriesCount; j++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
rSwap += recoveries[i].swap;
|
rSwap += recoveries[j].swap;
|
||||||
rProfit += recoveries[i].profit;
|
rProfit += recoveries[j].profit;
|
||||||
rVolume += recoveries[i].volume;
|
rVolume += recoveries[j].volume;
|
||||||
rCommission += mTrader.GetPositionCommission(recoveries[i].ticket);
|
rCommission += mTrader.GetPositionCommission(recoveries[j].ticket);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!hasMaxVolume &&
|
||||||
|
mMaxAllowedRecoveryVolume > 0 &&
|
||||||
|
recoveries[j].volume >= mMaxAllowedRecoveryVolume)
|
||||||
|
{
|
||||||
|
hasMaxVolume = true;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
AddRef(
|
AddRef(
|
||||||
recoveries[i],
|
recoveries[j],
|
||||||
mustClose //
|
mustClose //
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
double profitSummary =
|
double profitSummary =
|
||||||
rProfit + (-1 * rSwap) - MathAbs(rCommission);
|
rProfit + (-1 * rSwap) - MathAbs(rCommission);
|
||||||
|
|
||||||
|
//
|
||||||
|
double requiredProfitPoints = recoveriesCount * recoveryTPPoint;
|
||||||
|
// if (mData[i].recoveryLevel >= 2)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// requiredProfitPoints /= mData[i].recoveryLevel;
|
||||||
|
// if (requiredProfitPoints < recoveryTPPoint)
|
||||||
|
// {
|
||||||
|
// requiredProfitPoints = recoveryTPPoint;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
if (profitSummary > 0)
|
if (profitSummary > 0)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -4856,12 +4917,12 @@ public:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
Clean(mustClose);
|
|
||||||
Clean(positions);
|
|
||||||
Clean(recoveries);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(mustClose);
|
||||||
|
Clean(positions);
|
||||||
|
Clean(recoveries);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4897,12 +4958,13 @@ public:
|
|||||||
tmpLSW,
|
tmpLSW,
|
||||||
true //
|
true //
|
||||||
);
|
);
|
||||||
bool isBullishSigns =
|
bool hasBullishSigns =
|
||||||
//
|
//
|
||||||
isBullishTrend &&
|
// isBullishTrend &&
|
||||||
hasBullishPower &&
|
cBar.IsBullish() &&
|
||||||
hasBullishPattern &&
|
hasBullishPattern &&
|
||||||
hasBullishPressure
|
(hasBullishPower &&
|
||||||
|
hasBullishPressure)
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -4916,12 +4978,13 @@ public:
|
|||||||
tmpLSW,
|
tmpLSW,
|
||||||
true //
|
true //
|
||||||
);
|
);
|
||||||
bool isBearishSigns =
|
bool hasBearishSigns =
|
||||||
//
|
//
|
||||||
isBearishTrend &&
|
// isBearishTrend &&
|
||||||
hasBearishPower &&
|
cBar.IsBearish() &&
|
||||||
hasBearishPattern &&
|
hasBearishPressure &&
|
||||||
hasBearishPressure
|
(hasBearishPower &&
|
||||||
|
hasBearishPattern)
|
||||||
//
|
//
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -5103,7 +5166,35 @@ public:
|
|||||||
// Do Recovery ...
|
// Do Recovery ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// Profit Must be Negative ...
|
// Check Looking for Direction ...
|
||||||
|
ENUM_X_POSITION_TYPES recoveryLookingType = mData[i].recoveryLookingType;
|
||||||
|
if (recoveryLookingType == X_POSITION_TYPE_ALL ||
|
||||||
|
recoveryLookingType == X_POSITION_TYPE_NONE)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isDirectional = recoveryLookingType == mData[i].type;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasPressure =
|
||||||
|
!mForcePressuresInRecovery
|
||||||
|
? true
|
||||||
|
: isDirectional
|
||||||
|
//
|
||||||
|
// Looking For Directional Pressure ...
|
||||||
|
? isLong
|
||||||
|
? hasBullishSigns
|
||||||
|
: hasBearishSigns
|
||||||
|
//
|
||||||
|
// Looking For InDirectional Pressure ...
|
||||||
|
: isLong
|
||||||
|
? hasBearishSigns
|
||||||
|
: hasBullishSigns;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Required Properties Validation ...
|
||||||
if (
|
if (
|
||||||
recoveryTPPoint > 0 &&
|
recoveryTPPoint > 0 &&
|
||||||
recoverySLPoint > 0 &&
|
recoverySLPoint > 0 &&
|
||||||
@@ -5112,78 +5203,45 @@ public:
|
|||||||
: mData[i].recoveryLevel < maxAllowedRecover))
|
: mData[i].recoveryLevel < maxAllowedRecover))
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Current Profit ...
|
// Calculate requirements ...
|
||||||
double distanceInPoints = (MathAbs(profit) / volume);
|
double distanceInPoints = (MathAbs(profit) / volume);
|
||||||
double _volumeMultiplier = ((mData[i].recoveryLevel + 1) * recoveryVolumeMultiplier);
|
// double _volumeMultiplier = ((mData[i].recoveryLevel + 1) * recoveryVolumeMultiplier);
|
||||||
double _volume = volume * (_volumeMultiplier <= 0 ? 1 : _volumeMultiplier);
|
// double _volume =
|
||||||
|
// volume * (_volumeMultiplier <= 0 ? 1 : _volumeMultiplier);
|
||||||
|
double _volume =
|
||||||
|
mData[i].recoveryVolume <= 0
|
||||||
|
? volume * recoveryVolumeMultiplier
|
||||||
|
: mData[i].recoveryVolume;
|
||||||
|
if (mMaxAllowedRecoveryVolume > 0 && _volume > mMaxAllowedRecoveryVolume)
|
||||||
|
{
|
||||||
|
_volume = mMaxAllowedRecoveryVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
string _comment = GenerateRecoveryTag(ticket);
|
string _comment = GenerateRecoveryTag(ticket);
|
||||||
|
|
||||||
//
|
//
|
||||||
if (profit < 0)
|
XSignal rSignal;
|
||||||
|
bool isPrepared = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (profit < 0 &&
|
||||||
|
hasPressure &&
|
||||||
|
!isDirectional &&
|
||||||
|
distanceInPoints >= recoverySLPoint)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
bool canRecover =
|
FixRecoveredPositionTPSL(iPosition);
|
||||||
distanceInPoints >= recoverySLPoint &&
|
|
||||||
(mData[i].recoveryLevel == 0 ||
|
|
||||||
(mData[i].recoveryLevel >= 2 &&
|
|
||||||
mData[i].recoveryLevel / 2 == 0));
|
|
||||||
if (canRecover)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
RemovePositionTPSL(iPosition);
|
|
||||||
|
|
||||||
//
|
|
||||||
ENUM_POSITION_TYPE _type =
|
|
||||||
isLong
|
|
||||||
? POSITION_TYPE_SELL
|
|
||||||
: POSITION_TYPE_BUY;
|
|
||||||
double _entry = GetEntry(symbol, _type);
|
|
||||||
|
|
||||||
//
|
|
||||||
XSignal rSignal;
|
|
||||||
bool isPrepared = rSignal.Prepare(
|
|
||||||
symbol,
|
|
||||||
provider,
|
|
||||||
period,
|
|
||||||
_type,
|
|
||||||
X_ORDER_MODE_MARKET,
|
|
||||||
_entry,
|
|
||||||
_volume,
|
|
||||||
0,
|
|
||||||
0 //
|
|
||||||
);
|
|
||||||
if (isPrepared)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
rSignal.comment = _comment;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool isExecuted = ExecuteRecoverySignal(rSignal);
|
|
||||||
if (isExecuted)
|
|
||||||
{
|
|
||||||
mData[i].recoveryLevel++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (profit >= 0 &&
|
|
||||||
(mData[i].recoveryLevel == 1 ||
|
|
||||||
(mData[i].recoveryLevel >= 2 &&
|
|
||||||
mData[i].recoveryLevel / 2 == 1)))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
RemovePositionTPSL(iPosition);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
ENUM_POSITION_TYPE _type =
|
ENUM_POSITION_TYPE _type =
|
||||||
isLong
|
isLong
|
||||||
? POSITION_TYPE_BUY
|
? POSITION_TYPE_SELL
|
||||||
: POSITION_TYPE_SELL;
|
: POSITION_TYPE_BUY;
|
||||||
double _entry = GetEntry(symbol, _type);
|
double _entry = GetEntry(symbol, _type);
|
||||||
|
|
||||||
//
|
//
|
||||||
XSignal rSignal;
|
isPrepared = rSignal.Prepare(
|
||||||
bool isPrepared = rSignal.Prepare(
|
|
||||||
symbol,
|
symbol,
|
||||||
provider,
|
provider,
|
||||||
period,
|
period,
|
||||||
@@ -5194,16 +5252,63 @@ public:
|
|||||||
0,
|
0,
|
||||||
0 //
|
0 //
|
||||||
);
|
);
|
||||||
if (isPrepared)
|
}
|
||||||
|
else if (profit >= 0 &&
|
||||||
|
hasPressure &&
|
||||||
|
isDirectional)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
FixRecoveredPositionTPSL(iPosition);
|
||||||
|
|
||||||
|
//
|
||||||
|
ENUM_POSITION_TYPE _type =
|
||||||
|
isLong
|
||||||
|
? POSITION_TYPE_BUY
|
||||||
|
: POSITION_TYPE_SELL;
|
||||||
|
double _entry = GetEntry(symbol, _type);
|
||||||
|
|
||||||
|
//
|
||||||
|
isPrepared = rSignal.Prepare(
|
||||||
|
symbol,
|
||||||
|
provider,
|
||||||
|
period,
|
||||||
|
_type,
|
||||||
|
X_ORDER_MODE_MARKET,
|
||||||
|
_entry,
|
||||||
|
_volume,
|
||||||
|
0,
|
||||||
|
0 //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isPrepared && rSignal.IsValid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Attach Recovery Tag ...
|
||||||
|
rSignal.comment = _comment;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Execute Recovery Signal ...
|
||||||
|
bool isExecuted = ExecuteRecoverySignal(rSignal);
|
||||||
|
if (isExecuted)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
rSignal.comment = _comment;
|
// Increase Recovery Level ...
|
||||||
|
mData[i].recoveryLevel++;
|
||||||
|
mData[i].recoveryVolume = _volume * recoveryVolumeMultiplier;
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isExecuted = ExecuteRecoverySignal(rSignal);
|
// Try to Reverse Looking for Next Recovery
|
||||||
if (isExecuted)
|
// Position Type ...
|
||||||
|
ENUM_POSITION_TYPE _type;
|
||||||
|
bool isConverted = ToPositionType(
|
||||||
|
_type,
|
||||||
|
recoveryLookingType //
|
||||||
|
);
|
||||||
|
if (isConverted)
|
||||||
{
|
{
|
||||||
mData[i].recoveryLevel++;
|
mData[i].recoveryLookingType = GetOppositPositionType(_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5265,7 +5370,9 @@ protected:
|
|||||||
int mMaxAllowedRecover; // Max Allowed Recovery
|
int mMaxAllowedRecover; // Max Allowed Recovery
|
||||||
double mRecoveryTPPoint; // Recovery TP in Points
|
double mRecoveryTPPoint; // Recovery TP in Points
|
||||||
double mRecoverySLPoint; // Recovery SL in Points
|
double mRecoverySLPoint; // Recovery SL in Points
|
||||||
|
bool mForcePressuresInRecovery; // Use Direction Pressures In Recovery
|
||||||
double mRecoveryVolumeMultiplier; // Recovery Volume Multiplier
|
double mRecoveryVolumeMultiplier; // Recovery Volume Multiplier
|
||||||
|
double mMaxAllowedRecoveryVolume; // Max Allowed Recovery Volume
|
||||||
|
|
||||||
//
|
//
|
||||||
// Hedging ...
|
// Hedging ...
|
||||||
@@ -5533,7 +5640,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
bool RemovePositionTPSL(XPosition &osition)
|
bool FixRecoveredPositionTPSL(XPosition &osition)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|||||||
@@ -8018,3 +8018,125 @@ void HandleStrategiesOnTick()
|
|||||||
// sl = pvConditions.fib4s[cIndex];
|
// sl = pvConditions.fib4s[cIndex];
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
XSymbolParser symbolParser;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool useEURUSD = false;
|
||||||
|
bool useUSDCHF = false;
|
||||||
|
bool useUSDJPY = false;
|
||||||
|
bool useGBPUSD = false;
|
||||||
|
bool useXAUUSD = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool useXTest = false;
|
||||||
|
bool useXDTD = false;
|
||||||
|
bool useXCHKM = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// EURUSD ...
|
||||||
|
string eurusdSymbol = "EURUSDb"; // symbolParser.GetEURUSDSymbol();
|
||||||
|
if (useEURUSD && IsValid(eurusdSymbol))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// MAGIC NUMBER ...
|
||||||
|
long magicNumber = eaMagicNumber + 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
// XDTD ...
|
||||||
|
if (useXDTD)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XSCXDTDStrategy *eurusdXTDTStrategy;
|
||||||
|
eurusdXTDTStrategy = new XSCXDTDStrategy(
|
||||||
|
eurusdSymbol,
|
||||||
|
PERIOD_M15,
|
||||||
|
eaVolume,
|
||||||
|
eaR2R, // R2R ...
|
||||||
|
eaSlippage,
|
||||||
|
magicNumber,
|
||||||
|
true, // Ignore Signal Execution
|
||||||
|
true, // Use TP SL Point
|
||||||
|
false, // Use Max
|
||||||
|
eaTPPoint, // TP
|
||||||
|
eaSLPoint, // SL
|
||||||
|
eaIgnoreTP,
|
||||||
|
false, // eaIgnoreSL,
|
||||||
|
eaAllowLong,
|
||||||
|
eaAllowShort,
|
||||||
|
eaMaxAllowedLongs, // Max Longs
|
||||||
|
eaMaxAllowedShorts // Max Shorts
|
||||||
|
);
|
||||||
|
eurusdXTDTStrategy.SetAlertLogAlerts(true);
|
||||||
|
eurusdXTDTStrategy.SetAlertEnableAlerts(true);
|
||||||
|
eurusdXTDTStrategy.AddSignalEventHandler(OnSignalRecieved);
|
||||||
|
RegisterStrategy(eurusdXTDTStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XTest ...
|
||||||
|
if (useXTest)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XSCXTestStrategy *eurusdTestStrategy;
|
||||||
|
eurusdTestStrategy = new XSCXTestStrategy(
|
||||||
|
eurusdSymbol,
|
||||||
|
PERIOD_M15,
|
||||||
|
eaVolume,
|
||||||
|
eaR2R, // R2R ...
|
||||||
|
eaSlippage,
|
||||||
|
magicNumber,
|
||||||
|
true, // Ignore Signal Execution
|
||||||
|
true, // Use TP SL Point
|
||||||
|
false, // Use Max
|
||||||
|
eaTPPoint, // TP
|
||||||
|
eaSLPoint, // SL
|
||||||
|
eaIgnoreTP,
|
||||||
|
eaIgnoreSL,
|
||||||
|
eaAllowLong,
|
||||||
|
eaAllowShort,
|
||||||
|
eaMaxAllowedLongs, // Max Longs
|
||||||
|
eaMaxAllowedShorts // Max Shorts
|
||||||
|
);
|
||||||
|
eurusdTestStrategy.SetAlertLogAlerts(true);
|
||||||
|
eurusdTestStrategy.SetAlertEnableAlerts(true);
|
||||||
|
eurusdTestStrategy.AddSignalEventHandler(OnSignalRecieved);
|
||||||
|
RegisterStrategy(eurusdTestStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// XCHKM ...
|
||||||
|
if (useXCHKM)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XSCXCHKMStrategy *eurusdXCHKMStrategy;
|
||||||
|
eurusdXCHKMStrategy = new XSCXCHKMStrategy(
|
||||||
|
eurusdSymbol,
|
||||||
|
PERIOD_M5,
|
||||||
|
PERIOD_H1, // Analyzing Period
|
||||||
|
eaVolume,
|
||||||
|
eaR2R, // R2R ...
|
||||||
|
eaSlippage,
|
||||||
|
magicNumber,
|
||||||
|
true, // Ignore Signal Execution
|
||||||
|
false, // Use TP SL Point
|
||||||
|
false, // Use Max
|
||||||
|
eaTPPoint, // TP
|
||||||
|
eaSLPoint, // SL
|
||||||
|
eaIgnoreTP,
|
||||||
|
false, // eaIgnoreSL,
|
||||||
|
eaAllowLong,
|
||||||
|
eaAllowShort,
|
||||||
|
eaMaxAllowedLongs, // Max Longs
|
||||||
|
eaMaxAllowedShorts // Max Shorts
|
||||||
|
);
|
||||||
|
eurusdXCHKMStrategy.SetAlertLogAlerts(true);
|
||||||
|
eurusdXCHKMStrategy.SetAlertEnableAlerts(true);
|
||||||
|
eurusdXCHKMStrategy.AddSignalEventHandler(OnSignalRecieved);
|
||||||
|
RegisterStrategy(eurusdXCHKMStrategy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ bool eaIgnoreSL = false; // Ignore SL
|
|||||||
//
|
//
|
||||||
double eaR2R = 1.5; // Risk to Reward Ratio
|
double eaR2R = 1.5; // Risk to Reward Ratio
|
||||||
|
|
||||||
|
//
|
||||||
|
bool eaMultiSymbol = true; // Use Multi Symbol
|
||||||
|
string eaSymbols = "EURUSDb,USDJPYb,USDCHFb,GBPUSDb,XAUUSDb,XAGUSDb";
|
||||||
|
|
||||||
//
|
//
|
||||||
// Variables ...
|
// Variables ...
|
||||||
|
|
||||||
@@ -281,161 +285,99 @@ bool InitialEA()
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Configure Recovery ...
|
// Configure Recovery ...
|
||||||
eaTradeHandler.AllowRecover(true);
|
eaTradeHandler.AllowRecover(false);
|
||||||
eaTradeHandler.MaxAllowedRecover(0);
|
|
||||||
eaTradeHandler.RecoveryTPPoint(50);
|
eaTradeHandler.RecoveryTPPoint(50);
|
||||||
eaTradeHandler.RecoverySLPoint(eaSLPoint);
|
eaTradeHandler.MaxAllowedRecover(3);
|
||||||
|
eaTradeHandler.MaxAllowedRecoveryVolume(0.1);
|
||||||
|
eaTradeHandler.RecoverySLPoint(200);
|
||||||
eaTradeHandler.RecoveryVolumeMultiplier(2);
|
eaTradeHandler.RecoveryVolumeMultiplier(2);
|
||||||
|
eaTradeHandler.ForcePressuresInRecovery(false);
|
||||||
|
|
||||||
//
|
//
|
||||||
XSymbolParser symbolParser;
|
// Single Symbol ...
|
||||||
|
if (!eaMultiSymbol)
|
||||||
//
|
|
||||||
bool drawAreas = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool useEURUSD = false;
|
|
||||||
bool useUSDCHF = false;
|
|
||||||
bool useUSDJPY = false;
|
|
||||||
bool useGBPUSD = false;
|
|
||||||
bool useXAUUSD = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
bool useXTest = false;
|
|
||||||
bool useXDTD = false;
|
|
||||||
bool useXCHKM = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
// EURUSD ...
|
|
||||||
string eurusdSymbol = "EURUSDb"; // symbolParser.GetEURUSDSymbol();
|
|
||||||
if (useEURUSD && IsValid(eurusdSymbol))
|
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// MAGIC NUMBER ...
|
XSCXCHKMStrategy *xchmStrategy;
|
||||||
long magicNumber = eaMagicNumber + 1;
|
xchmStrategy = new XSCXCHKMStrategy(
|
||||||
|
_Symbol,
|
||||||
|
_Period,
|
||||||
|
PERIOD_H1, // Analyzing Period
|
||||||
|
eaVolume,
|
||||||
|
eaR2R, // R2R ...
|
||||||
|
eaSlippage,
|
||||||
|
eaMagicNumber,
|
||||||
|
true, // Ignore Signal Execution
|
||||||
|
true, // Use TP SL Point
|
||||||
|
false, // Use Max
|
||||||
|
eaTPPoint, // TP
|
||||||
|
eaSLPoint, // SL
|
||||||
|
eaIgnoreTP,
|
||||||
|
true, // eaIgnoreSL,
|
||||||
|
eaAllowLong,
|
||||||
|
eaAllowShort,
|
||||||
|
eaMaxAllowedLongs, // Max Longs
|
||||||
|
eaMaxAllowedShorts // Max Shorts
|
||||||
|
);
|
||||||
|
xchmStrategy.SetAlertLogAlerts(true);
|
||||||
|
xchmStrategy.SetAlertEnableAlerts(true);
|
||||||
|
xchmStrategy.AddSignalEventHandler(OnSignalRecieved);
|
||||||
|
RegisterStrategy(xchmStrategy);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Multi Symbol ...
|
||||||
|
else
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// XDTD ...
|
// Parse Symbols ...
|
||||||
if (useXDTD)
|
string symbols[];
|
||||||
|
int symbolsCount = SplitContent(
|
||||||
|
symbols,
|
||||||
|
eaSymbols //
|
||||||
|
);
|
||||||
|
result = IsValidSize(symbolsCount);
|
||||||
|
if (!result)
|
||||||
{
|
{
|
||||||
//
|
return result;
|
||||||
XSCXDTDStrategy *eurusdXTDTStrategy;
|
|
||||||
eurusdXTDTStrategy = new XSCXDTDStrategy(
|
|
||||||
eurusdSymbol,
|
|
||||||
PERIOD_M15,
|
|
||||||
eaVolume,
|
|
||||||
eaR2R, // R2R ...
|
|
||||||
eaSlippage,
|
|
||||||
magicNumber,
|
|
||||||
true, // Ignore Signal Execution
|
|
||||||
true, // Use TP SL Point
|
|
||||||
false, // Use Max
|
|
||||||
eaTPPoint, // TP
|
|
||||||
eaSLPoint, // SL
|
|
||||||
eaIgnoreTP,
|
|
||||||
false, // eaIgnoreSL,
|
|
||||||
eaAllowLong,
|
|
||||||
eaAllowShort,
|
|
||||||
eaMaxAllowedLongs, // Max Longs
|
|
||||||
eaMaxAllowedShorts // Max Shorts
|
|
||||||
);
|
|
||||||
eurusdXTDTStrategy.SetAlertLogAlerts(true);
|
|
||||||
eurusdXTDTStrategy.SetAlertEnableAlerts(true);
|
|
||||||
eurusdXTDTStrategy.AddSignalEventHandler(OnSignalRecieved);
|
|
||||||
RegisterStrategy(eurusdXTDTStrategy);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XTest ...
|
for (int i = 0; i < symbolsCount; i++)
|
||||||
if (useXTest)
|
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
XSCXTestStrategy *eurusdTestStrategy;
|
string iSymbol = symbols[i];
|
||||||
eurusdTestStrategy = new XSCXTestStrategy(
|
|
||||||
eurusdSymbol,
|
|
||||||
PERIOD_M15,
|
|
||||||
eaVolume,
|
|
||||||
eaR2R, // R2R ...
|
|
||||||
eaSlippage,
|
|
||||||
magicNumber,
|
|
||||||
true, // Ignore Signal Execution
|
|
||||||
true, // Use TP SL Point
|
|
||||||
false, // Use Max
|
|
||||||
eaTPPoint, // TP
|
|
||||||
eaSLPoint, // SL
|
|
||||||
eaIgnoreTP,
|
|
||||||
eaIgnoreSL,
|
|
||||||
eaAllowLong,
|
|
||||||
eaAllowShort,
|
|
||||||
eaMaxAllowedLongs, // Max Longs
|
|
||||||
eaMaxAllowedShorts // Max Shorts
|
|
||||||
);
|
|
||||||
eurusdTestStrategy.SetAlertLogAlerts(true);
|
|
||||||
eurusdTestStrategy.SetAlertEnableAlerts(true);
|
|
||||||
eurusdTestStrategy.AddSignalEventHandler(OnSignalRecieved);
|
|
||||||
RegisterStrategy(eurusdTestStrategy);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// XCHKM ...
|
|
||||||
if (useXCHKM)
|
|
||||||
{
|
|
||||||
//
|
//
|
||||||
XSCXCHKMStrategy *eurusdXCHKMStrategy;
|
XSCXCHKMStrategy *iStrategy;
|
||||||
eurusdXCHKMStrategy = new XSCXCHKMStrategy(
|
iStrategy = new XSCXCHKMStrategy(
|
||||||
eurusdSymbol,
|
iSymbol,
|
||||||
PERIOD_M5,
|
_Period,
|
||||||
PERIOD_H1, // Analyzing Period
|
PERIOD_H1, // Analyzing Period
|
||||||
eaVolume,
|
eaVolume,
|
||||||
eaR2R, // R2R ...
|
eaR2R, // R2R ...
|
||||||
eaSlippage,
|
eaSlippage,
|
||||||
magicNumber,
|
eaMagicNumber,
|
||||||
true, // Ignore Signal Execution
|
true, // Ignore Signal Execution
|
||||||
false, // Use TP SL Point
|
true, // Use TP SL Point
|
||||||
false, // Use Max
|
false, // Use Max
|
||||||
eaTPPoint, // TP
|
eaTPPoint, // TP
|
||||||
eaSLPoint, // SL
|
eaSLPoint, // SL
|
||||||
eaIgnoreTP,
|
eaIgnoreTP,
|
||||||
false, // eaIgnoreSL,
|
true, // eaIgnoreSL,
|
||||||
eaAllowLong,
|
eaAllowLong,
|
||||||
eaAllowShort,
|
eaAllowShort,
|
||||||
eaMaxAllowedLongs, // Max Longs
|
eaMaxAllowedLongs, // Max Longs
|
||||||
eaMaxAllowedShorts // Max Shorts
|
eaMaxAllowedShorts // Max Shorts
|
||||||
);
|
);
|
||||||
eurusdXCHKMStrategy.SetAlertLogAlerts(true);
|
iStrategy.SetAlertLogAlerts(true);
|
||||||
eurusdXCHKMStrategy.SetAlertEnableAlerts(true);
|
iStrategy.SetAlertEnableAlerts(true);
|
||||||
eurusdXCHKMStrategy.AddSignalEventHandler(OnSignalRecieved);
|
iStrategy.AddSignalEventHandler(OnSignalRecieved);
|
||||||
RegisterStrategy(eurusdXCHKMStrategy);
|
|
||||||
|
//
|
||||||
|
RegisterStrategy(iStrategy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
XSCXCHKMStrategy *xchmStrategy;
|
|
||||||
xchmStrategy = new XSCXCHKMStrategy(
|
|
||||||
_Symbol,
|
|
||||||
_Period,
|
|
||||||
PERIOD_H1, // Analyzing Period
|
|
||||||
eaVolume,
|
|
||||||
eaR2R, // R2R ...
|
|
||||||
eaSlippage,
|
|
||||||
eaMagicNumber,
|
|
||||||
true, // Ignore Signal Execution
|
|
||||||
true, // Use TP SL Point
|
|
||||||
false, // Use Max
|
|
||||||
eaTPPoint, // TP
|
|
||||||
eaSLPoint, // SL
|
|
||||||
eaIgnoreTP,
|
|
||||||
true, // eaIgnoreSL,
|
|
||||||
eaAllowLong,
|
|
||||||
eaAllowShort,
|
|
||||||
eaMaxAllowedLongs, // Max Longs
|
|
||||||
eaMaxAllowedShorts // Max Shorts
|
|
||||||
);
|
|
||||||
xchmStrategy.SetAlertLogAlerts(true);
|
|
||||||
xchmStrategy.SetAlertEnableAlerts(true);
|
|
||||||
xchmStrategy.AddSignalEventHandler(OnSignalRecieved);
|
|
||||||
RegisterStrategy(xchmStrategy);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,956 @@
|
|||||||
|
///////////////////////////////////////////////////////
|
||||||
|
// SaherElm IT Center MQL5 Indicator
|
||||||
|
// -------------------------------------------
|
||||||
|
// Name: XCHCHE
|
||||||
|
// Description: XCHE Cycles ...
|
||||||
|
//
|
||||||
|
// Maintainer:
|
||||||
|
// ------------
|
||||||
|
// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com)
|
||||||
|
//
|
||||||
|
//////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Global Properties ...
|
||||||
|
#property copyright "Copyright 2023, SaherElm IT Center"
|
||||||
|
#property link "https://saherelm.ir"
|
||||||
|
#property version "1.00"
|
||||||
|
#property description "SaherElm XCHCHE Indicator"
|
||||||
|
#property strict
|
||||||
|
|
||||||
|
//
|
||||||
|
#define ShortName "XCHCHE"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Includes Common Library ...
|
||||||
|
#include <MovingAverages.mqh>
|
||||||
|
#include "../Libraries/x-saherelm.common.lib.mq5"
|
||||||
|
|
||||||
|
//
|
||||||
|
// Inputs ...
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Market";
|
||||||
|
input int length = 35; // Length
|
||||||
|
input int loopback = 26; // Loopback
|
||||||
|
input double multiplier1 = 3.0; // 1st Multiplier
|
||||||
|
input double multiplier2 = 3.5; // 2nd Multiplier
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Calculation";
|
||||||
|
input ENUM_APPLIED_PRICE upAppliedTo = PRICE_HIGH; // Up Zone Applied to
|
||||||
|
input ENUM_APPLIED_PRICE downAppliedTo = PRICE_LOW; // Down Zone Applied to
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Cycles";
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Short";
|
||||||
|
input ENUM_X_PERIOD_METHOD scMethod = X_PERIOD_AUTO; // How to Find Period
|
||||||
|
input ENUM_TIMEFRAMES scPeriod = NULL; // Time Period
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Medium";
|
||||||
|
input ENUM_X_PERIOD_METHOD mcMethod = X_PERIOD_AUTO; // How to Find Period
|
||||||
|
input ENUM_TIMEFRAMES mcPeriod = NULL; // Time Period
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Long";
|
||||||
|
input ENUM_X_PERIOD_METHOD lcMethod = X_PERIOD_AUTO; // How to Find Period
|
||||||
|
input ENUM_TIMEFRAMES lcPeriod = NULL; // Time Period
|
||||||
|
|
||||||
|
//
|
||||||
|
input group "Hind";
|
||||||
|
input ENUM_X_PERIOD_METHOD hcMethod = X_PERIOD_AUTO; // How to Find Period
|
||||||
|
input ENUM_TIMEFRAMES hcPeriod = NULL; // Time Period
|
||||||
|
|
||||||
|
//
|
||||||
|
// Presentation ...
|
||||||
|
input group "Presentation";
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current ...
|
||||||
|
input bool showCurrentLE1 = true; // Show Current Cycle Long Exit 1
|
||||||
|
input bool showCurrentLE2 = true; // Show Current Cycle Long Exit 2
|
||||||
|
input bool showCurrentSE1 = true; // Show Current Cycle Short Exit 1
|
||||||
|
input bool showCurrentSE2 = true; // Show Current Cycle Short Exit 2
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short ...
|
||||||
|
input bool showShortLE1 = true; // Show Short Cycle Long Exit 1
|
||||||
|
input bool showShortLE2 = true; // Show Short Cycle Long Exit 2
|
||||||
|
input bool showShortSE1 = true; // Show Short Cycle Short Exit 1
|
||||||
|
input bool showShortSE2 = true; // Show Short Cycle Short Exit 2
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium ...
|
||||||
|
input bool showMediumLE1 = true; // Show Medium Cycle Long Exit 1
|
||||||
|
input bool showMediumLE2 = true; // Show Medium Cycle Long Exit 2
|
||||||
|
input bool showMediumSE1 = true; // Show Medium Cycle Short Exit 1
|
||||||
|
input bool showMediumSE2 = true; // Show Medium Cycle Short Exit 2
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long ...
|
||||||
|
input bool showLongLE1 = true; // Show Long Cycle Long Exit 1
|
||||||
|
input bool showLongLE2 = true; // Show Long Cycle Long Exit 2
|
||||||
|
input bool showLongSE1 = true; // Show Long Cycle Short Exit 1
|
||||||
|
input bool showLongSE2 = true; // Show Long Cycle Short Exit 2
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind ...
|
||||||
|
input bool showHindLE1 = true; // Show Hind Cycle Long Exit 1
|
||||||
|
input bool showHindLE2 = true; // Show Hind Cycle Long Exit 2
|
||||||
|
input bool showHindSE1 = true; // Show Hind Cycle Short Exit 1
|
||||||
|
input bool showHindSE2 = true; // Show Hind Cycle Short Exit 2
|
||||||
|
|
||||||
|
//
|
||||||
|
// Buffers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
#define hideColorIDX 0
|
||||||
|
#define bullishColorIDX 1
|
||||||
|
#define bearishColorIDX 2
|
||||||
|
|
||||||
|
//
|
||||||
|
#property indicator_chart_window
|
||||||
|
|
||||||
|
//
|
||||||
|
#property indicator_buffers 40
|
||||||
|
#property indicator_plots 40
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current ...
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short ...
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium ...
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long ...
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Variables, Properties and etc ...
|
||||||
|
|
||||||
|
//
|
||||||
|
int maxLength;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current ...
|
||||||
|
int mCSMLength = cSmoothingLength;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short ...
|
||||||
|
int mSCLength = 0;
|
||||||
|
int mSSMLength = 0;
|
||||||
|
ENUM_TIMEFRAMES mSCPeriod = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium ...
|
||||||
|
int mMCLength = 0;
|
||||||
|
int mMSMLength = 0;
|
||||||
|
ENUM_TIMEFRAMES mMCPeriod = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long ...
|
||||||
|
int mLCLength = 0;
|
||||||
|
int mLSMLength = 0;
|
||||||
|
ENUM_TIMEFRAMES mLCPeriod = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind ...
|
||||||
|
int mHCLength = 0;
|
||||||
|
int mHSMLength = 0;
|
||||||
|
ENUM_TIMEFRAMES mHCPeriod = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Event Handlers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialization ...
|
||||||
|
int OnInit()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Validate Inputs ...
|
||||||
|
if (!ValidateInputs())
|
||||||
|
{
|
||||||
|
return INIT_PARAMETERS_INCORRECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!InitMarketCycles())
|
||||||
|
{
|
||||||
|
return INIT_PARAMETERS_INCORRECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// because in some cases we may have more than one input for
|
||||||
|
// calculation and we must prevent any calculation
|
||||||
|
// untill we pass the biggest input length, here we get max Input length
|
||||||
|
// and then wait until pass it ...
|
||||||
|
maxLength = ExtractMaxLengthOfInputs();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Index Buffers ...
|
||||||
|
DefineBuffers();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Indicator ShortName ...
|
||||||
|
SetIndicatorName();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Init Succeed ...
|
||||||
|
return INIT_SUCCEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// DeInitialization ...
|
||||||
|
void OnDeinit(const int reason)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function
|
||||||
|
// REASON_REMOVE 1 Program removed from a chart
|
||||||
|
// REASON_RECOMPILE 2 Program recompiled
|
||||||
|
// REASON_CHARTCHANGE 3 A symbol or a chart period is changed
|
||||||
|
// REASON_CHARTCLOSE 4 Chart closed
|
||||||
|
// REASON_PARAMETERS 5 Inputs changed by a user
|
||||||
|
// REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings
|
||||||
|
// REASON_TEMPLATE 7 Another chart template applied
|
||||||
|
// REASON_INITFAILED 8 The OnInit() handler returned a non-zero value
|
||||||
|
// REASON_CLOSE 9 Terminal closed
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculating what we want ...
|
||||||
|
int OnCalculate(
|
||||||
|
const int rates_total, // Total Bars on Chart ...
|
||||||
|
const int prev_calculated, // Total Calculated Bars on Charts ...
|
||||||
|
const datetime &time[], // History of Open Time ...
|
||||||
|
const double &open[], // History of Open Price ...
|
||||||
|
const double &high[], // History of High Price ...
|
||||||
|
const double &low[], // History of Low Price ...
|
||||||
|
const double &close[], // History of Close Price ...
|
||||||
|
const long &tick_volume[], // History of Tick Volumes on Bar ...
|
||||||
|
const long &volume[], // History of Trade Volumes ...
|
||||||
|
const int &spread[] // History of Spread Price ...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Prepare Buffers ...
|
||||||
|
ArraySetAsSeries(time, true);
|
||||||
|
ArraySetAsSeries(open, true);
|
||||||
|
ArraySetAsSeries(high, true);
|
||||||
|
ArraySetAsSeries(low, true);
|
||||||
|
ArraySetAsSeries(close, true);
|
||||||
|
ArraySetAsSeries(tick_volume, true);
|
||||||
|
ArraySetAsSeries(volume, true);
|
||||||
|
ArraySetAsSeries(spread, true);
|
||||||
|
|
||||||
|
//
|
||||||
|
// this counts Available Bars ...
|
||||||
|
int limit;
|
||||||
|
|
||||||
|
//
|
||||||
|
limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Main Loop ...
|
||||||
|
for (int i = limit - 1; i >= 0 && !IsStopped(); i--)
|
||||||
|
{
|
||||||
|
CalculateHK(i, prev_calculated, rates_total, open, high, close, low);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
CalculateCycles(rates_total, prev_calculated);
|
||||||
|
|
||||||
|
//
|
||||||
|
return rates_total;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Functions ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Input Args for Initialization ...
|
||||||
|
bool ValidateInputs()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
cSmoothingLength > 2 &&
|
||||||
|
//
|
||||||
|
(IsValid(scMethod, scPeriod) &&
|
||||||
|
IsValid(mcMethod, mcPeriod) &&
|
||||||
|
IsValid(lcMethod, lcPeriod) &&
|
||||||
|
IsValid(hcMethod, hcPeriod))
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize Market Cycles ...
|
||||||
|
bool InitMarketCycles()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current Cycle Initialization ...
|
||||||
|
|
||||||
|
//
|
||||||
|
int cPeriodSeconds = PeriodSeconds(_Period);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short Cycle Initialization ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Cycle Period ...
|
||||||
|
if (scMethod == X_PERIOD_AUTO)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Select Period ...
|
||||||
|
mSCPeriod = GetCyclePeriod(
|
||||||
|
X_MARKET_CYCLE_SHORT,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mSCPeriod = scPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mSCPeriod);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
mSCLength = PeriodSeconds(mSCPeriod) / cPeriodSeconds;
|
||||||
|
mSSMLength = mSCLength * mCSMLength;
|
||||||
|
result = mSCLength > 0;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium Cycle Initialization ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Cycle Period ...
|
||||||
|
if (mcMethod == X_PERIOD_AUTO)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Select Period ...
|
||||||
|
mMCPeriod = GetCyclePeriod(
|
||||||
|
X_MARKET_CYCLE_MEDIUM,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mMCPeriod = mcPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mMCPeriod);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
mMCLength = PeriodSeconds(mMCPeriod) / cPeriodSeconds;
|
||||||
|
mMSMLength = mMCLength * mCSMLength;
|
||||||
|
result = mMCLength > 0;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long Cycle Initialization ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Cycle Period ...
|
||||||
|
if (lcMethod == X_PERIOD_AUTO)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Select Period ...
|
||||||
|
mLCPeriod = GetCyclePeriod(
|
||||||
|
X_MARKET_CYCLE_LONG,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mLCPeriod = lcPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mLCPeriod);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
mLCLength = PeriodSeconds(mLCPeriod) / cPeriodSeconds;
|
||||||
|
mLSMLength = mLCLength * mCSMLength;
|
||||||
|
result = mLCLength > 0;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind Cycle Initialization ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Cycle Period ...
|
||||||
|
if (hcMethod == X_PERIOD_AUTO)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Select Period ...
|
||||||
|
mHCPeriod = GetCyclePeriod(
|
||||||
|
X_MARKET_CYCLE_HIND,
|
||||||
|
_Period //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mHCPeriod = hcPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = IsValid(mHCPeriod);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
mHCLength = PeriodSeconds(mHCPeriod) / cPeriodSeconds;
|
||||||
|
mHSMLength = mHCLength * mCSMLength;
|
||||||
|
result = mHCLength > 0;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve all Exists Input Max Length ...
|
||||||
|
// use for Start Of Drawing ...
|
||||||
|
int ExtractMaxLengthOfInputs()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
result = MathMax(mCSMLength, mSSMLength);
|
||||||
|
result = MathMax(result, mMSMLength);
|
||||||
|
result = MathMax(result, mLSMLength);
|
||||||
|
result = MathMax(result, mHSMLength);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define Indexes and Styles ...
|
||||||
|
void DefineBuffers()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Data Buffers ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
ArraySetAsSeries(openBuffer, true);
|
||||||
|
SetIndexBuffer(openBufferIndex, openBuffer, INDICATOR_CALCULATIONS);
|
||||||
|
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
ArraySetAsSeries(highBuffer, true);
|
||||||
|
SetIndexBuffer(highBufferIndex, highBuffer, INDICATOR_CALCULATIONS);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
ArraySetAsSeries(lowBuffer, true);
|
||||||
|
SetIndexBuffer(lowBufferIndex, lowBuffer, INDICATOR_CALCULATIONS);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
ArraySetAsSeries(closeBuffer, true);
|
||||||
|
SetIndexBuffer(closeBufferIndex, closeBuffer, INDICATOR_CALCULATIONS);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Color ...
|
||||||
|
ArraySetAsSeries(cColorBuffer, true);
|
||||||
|
SetIndexBuffer(cColorBufferIndex, cColorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set EMPTY_VALUE on Bar Buffer ...
|
||||||
|
PlotIndexSetDouble(cBufferIndex, PLOT_EMPTY_VALUE, 0.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
PlotIndexSetInteger(cBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
PlotIndexSetInteger(cColorBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
ArraySetAsSeries(cOpenBuffer, true);
|
||||||
|
PlotIndexSetInteger(cOpenBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(cOpenBufferIndex, cOpenBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
ArraySetAsSeries(cHighBuffer, true);
|
||||||
|
PlotIndexSetInteger(cHighBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(cHighBufferIndex, cHighBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
ArraySetAsSeries(cCloseBuffer, true);
|
||||||
|
PlotIndexSetInteger(cCloseBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(cCloseBufferIndex, cCloseBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
ArraySetAsSeries(cLowBuffer, true);
|
||||||
|
PlotIndexSetInteger(cLowBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(cLowBufferIndex, cLowBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Color ...
|
||||||
|
ArraySetAsSeries(sColorBuffer, true);
|
||||||
|
SetIndexBuffer(sColorBufferIndex, sColorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set EMPTY_VALUE on Bar Buffer ...
|
||||||
|
PlotIndexSetDouble(sBufferIndex, PLOT_EMPTY_VALUE, 0.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
PlotIndexSetInteger(sBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
PlotIndexSetInteger(sColorBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
ArraySetAsSeries(sOpenBuffer, true);
|
||||||
|
PlotIndexSetInteger(sOpenBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(sOpenBufferIndex, sOpenBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
ArraySetAsSeries(sHighBuffer, true);
|
||||||
|
PlotIndexSetInteger(sHighBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(sHighBufferIndex, sHighBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
ArraySetAsSeries(sCloseBuffer, true);
|
||||||
|
PlotIndexSetInteger(sCloseBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(sCloseBufferIndex, sCloseBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
ArraySetAsSeries(sLowBuffer, true);
|
||||||
|
PlotIndexSetInteger(sLowBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(sLowBufferIndex, sLowBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Color ...
|
||||||
|
ArraySetAsSeries(mColorBuffer, true);
|
||||||
|
SetIndexBuffer(mColorBufferIndex, mColorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set EMPTY_VALUE on Bar Buffer ...
|
||||||
|
PlotIndexSetDouble(mBufferIndex, PLOT_EMPTY_VALUE, 0.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
PlotIndexSetInteger(mBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
PlotIndexSetInteger(mColorBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
ArraySetAsSeries(mOpenBuffer, true);
|
||||||
|
PlotIndexSetInteger(mOpenBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(mOpenBufferIndex, mOpenBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
ArraySetAsSeries(mHighBuffer, true);
|
||||||
|
PlotIndexSetInteger(mHighBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(mHighBufferIndex, mHighBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
ArraySetAsSeries(mCloseBuffer, true);
|
||||||
|
PlotIndexSetInteger(mCloseBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(mCloseBufferIndex, mCloseBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
ArraySetAsSeries(mLowBuffer, true);
|
||||||
|
PlotIndexSetInteger(mLowBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(mLowBufferIndex, mLowBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Color ...
|
||||||
|
ArraySetAsSeries(lColorBuffer, true);
|
||||||
|
SetIndexBuffer(lColorBufferIndex, lColorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set EMPTY_VALUE on Bar Buffer ...
|
||||||
|
PlotIndexSetDouble(lBufferIndex, PLOT_EMPTY_VALUE, 0.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
PlotIndexSetInteger(lBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
PlotIndexSetInteger(lColorBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
ArraySetAsSeries(lOpenBuffer, true);
|
||||||
|
PlotIndexSetInteger(lOpenBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(lOpenBufferIndex, lOpenBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
ArraySetAsSeries(lHighBuffer, true);
|
||||||
|
PlotIndexSetInteger(lHighBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(lHighBufferIndex, lHighBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
ArraySetAsSeries(lCloseBuffer, true);
|
||||||
|
PlotIndexSetInteger(lCloseBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(lCloseBufferIndex, lCloseBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
ArraySetAsSeries(lLowBuffer, true);
|
||||||
|
PlotIndexSetInteger(lLowBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(lLowBufferIndex, lLowBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Color ...
|
||||||
|
ArraySetAsSeries(hColorBuffer, true);
|
||||||
|
SetIndexBuffer(hColorBufferIndex, hColorBuffer, INDICATOR_COLOR_INDEX);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set EMPTY_VALUE on Bar Buffer ...
|
||||||
|
PlotIndexSetDouble(hBufferIndex, PLOT_EMPTY_VALUE, 0.0);
|
||||||
|
|
||||||
|
//
|
||||||
|
PlotIndexSetInteger(hBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
PlotIndexSetInteger(hColorBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
ArraySetAsSeries(hOpenBuffer, true);
|
||||||
|
PlotIndexSetInteger(hOpenBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(hOpenBufferIndex, hOpenBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
ArraySetAsSeries(hHighBuffer, true);
|
||||||
|
PlotIndexSetInteger(hHighBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(hHighBufferIndex, hHighBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
ArraySetAsSeries(hCloseBuffer, true);
|
||||||
|
PlotIndexSetInteger(hCloseBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(hCloseBufferIndex, hCloseBuffer, INDICATOR_DATA);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
ArraySetAsSeries(hLowBuffer, true);
|
||||||
|
PlotIndexSetInteger(hLowBufferIndex, PLOT_SHOW_DATA, false);
|
||||||
|
SetIndexBuffer(hLowBufferIndex, hLowBuffer, INDICATOR_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set Indicator Short Name and also we can define Buffers Labels ...
|
||||||
|
void SetIndicatorName()
|
||||||
|
{
|
||||||
|
IndicatorSetString(INDICATOR_SHORTNAME, ShortName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculations ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate Hiken Ashi ...
|
||||||
|
void CalculateHK(
|
||||||
|
int bar_index, // Selected Bar Index
|
||||||
|
const int prevCalculated,
|
||||||
|
const int ratesTotal,
|
||||||
|
const double &open[],
|
||||||
|
const double &high[],
|
||||||
|
const double &close[],
|
||||||
|
const double &low[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double mPrevHKOpenValue;
|
||||||
|
double mPrevHKCloseValue;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (ArraySize(open) <= bar_index + 1)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
mPrevHKOpenValue = 0;
|
||||||
|
mPrevHKCloseValue = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
mPrevHKOpenValue = openBuffer[bar_index + 1];
|
||||||
|
mPrevHKCloseValue = closeBuffer[bar_index + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
double mHKOpenValue = (mPrevHKOpenValue + mPrevHKCloseValue) / 2;
|
||||||
|
double mHKCloseValue = (open[bar_index] + high[bar_index] + close[bar_index] + low[bar_index]) / 4;
|
||||||
|
double mHKHighValue = MathMax(high[bar_index], MathMax(mHKOpenValue, mHKCloseValue));
|
||||||
|
double mHKLowValue = MathMin(low[bar_index], MathMin(mHKOpenValue, mHKCloseValue));
|
||||||
|
|
||||||
|
//
|
||||||
|
openBuffer[bar_index] = mHKOpenValue;
|
||||||
|
highBuffer[bar_index] = mHKHighValue;
|
||||||
|
lowBuffer[bar_index] = mHKLowValue;
|
||||||
|
closeBuffer[bar_index] = mHKCloseValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void CalculateCycles(
|
||||||
|
int ratesTotal, // Total Bars
|
||||||
|
int prevCalculated // Calculated Bars
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Current ...
|
||||||
|
CalculateCycle(
|
||||||
|
cOpenBuffer,
|
||||||
|
cHighBuffer,
|
||||||
|
cLowBuffer,
|
||||||
|
cCloseBuffer,
|
||||||
|
cColorBuffer,
|
||||||
|
mCSMLength,
|
||||||
|
showCurrent,
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short ...
|
||||||
|
CalculateCycle(
|
||||||
|
sOpenBuffer,
|
||||||
|
sHighBuffer,
|
||||||
|
sLowBuffer,
|
||||||
|
sCloseBuffer,
|
||||||
|
sColorBuffer,
|
||||||
|
mSSMLength,
|
||||||
|
showShort,
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium ...
|
||||||
|
CalculateCycle(
|
||||||
|
mOpenBuffer,
|
||||||
|
mHighBuffer,
|
||||||
|
mLowBuffer,
|
||||||
|
mCloseBuffer,
|
||||||
|
mColorBuffer,
|
||||||
|
mMSMLength,
|
||||||
|
showMedium,
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long ...
|
||||||
|
CalculateCycle(
|
||||||
|
lOpenBuffer,
|
||||||
|
lHighBuffer,
|
||||||
|
lLowBuffer,
|
||||||
|
lCloseBuffer,
|
||||||
|
lColorBuffer,
|
||||||
|
mLSMLength,
|
||||||
|
showLong,
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind ...
|
||||||
|
CalculateCycle(
|
||||||
|
hOpenBuffer,
|
||||||
|
hHighBuffer,
|
||||||
|
hLowBuffer,
|
||||||
|
hCloseBuffer,
|
||||||
|
hColorBuffer,
|
||||||
|
mHSMLength,
|
||||||
|
showHind,
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void CalculateCycle(
|
||||||
|
double &open[],
|
||||||
|
double &high[],
|
||||||
|
double &low[],
|
||||||
|
double &close[],
|
||||||
|
double &clr[], // Color Index Buffer
|
||||||
|
int length, // Calculation Length
|
||||||
|
bool show, // Show or not
|
||||||
|
int ratesTotal, // Total Bars
|
||||||
|
int prevCalculated // Calculated Bars
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Open ...
|
||||||
|
int calculatedSMOpens = ExponentialMAOnBuffer(
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated,
|
||||||
|
0,
|
||||||
|
length,
|
||||||
|
openBuffer,
|
||||||
|
open //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close ...
|
||||||
|
int calculatedSMCloses = ExponentialMAOnBuffer(
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated,
|
||||||
|
0,
|
||||||
|
length,
|
||||||
|
closeBuffer,
|
||||||
|
close //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int calculatedSMLows = 0;
|
||||||
|
int calculatedSMHighs = 0;
|
||||||
|
if (!ignoreShadows)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
calculatedSMHighs = ExponentialMAOnBuffer(
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated,
|
||||||
|
0,
|
||||||
|
length,
|
||||||
|
highBuffer,
|
||||||
|
high //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
calculatedSMLows = ExponentialMAOnBuffer(
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated,
|
||||||
|
0,
|
||||||
|
length,
|
||||||
|
lowBuffer,
|
||||||
|
low //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// High ...
|
||||||
|
calculatedSMHighs = ExponentialMAOnBuffer(
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated,
|
||||||
|
0,
|
||||||
|
length,
|
||||||
|
openBuffer,
|
||||||
|
high //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Low ...
|
||||||
|
calculatedSMLows = ExponentialMAOnBuffer(
|
||||||
|
ratesTotal,
|
||||||
|
prevCalculated,
|
||||||
|
0,
|
||||||
|
length,
|
||||||
|
closeBuffer,
|
||||||
|
low //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Calculated Items for Colors Calculations ...
|
||||||
|
int mNumberOfItems = MathMin(calculatedSMOpens, calculatedSMHighs);
|
||||||
|
mNumberOfItems = MathMin(mNumberOfItems, calculatedSMLows);
|
||||||
|
mNumberOfItems = MathMin(mNumberOfItems, calculatedSMCloses);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create a Loop for Color of Candles ...
|
||||||
|
for (int i = 0; i < mNumberOfItems; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isBearish =
|
||||||
|
//
|
||||||
|
open[i] > close[i]
|
||||||
|
//
|
||||||
|
;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (show)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
clr[i] = isBearish
|
||||||
|
? bearishColorIDX
|
||||||
|
: bullishColorIDX;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
clr[i] = hideColorIDX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
@@ -3791,6 +3791,7 @@ struct XTradeData
|
|||||||
int maxAllowedRecover; // Max Allowed Recovery
|
int maxAllowedRecover; // Max Allowed Recovery
|
||||||
int recoveryLevel; // Number of Recovery Signals
|
int recoveryLevel; // Number of Recovery Signals
|
||||||
double recoveryVolumeMultiplier; // Recovery Volume Multiplier
|
double recoveryVolumeMultiplier; // Recovery Volume Multiplier
|
||||||
|
double recoveryVolume; // Next Recovery Positioin Volume
|
||||||
ENUM_X_POSITION_TYPES recoveryLookingType; // Looking for Next Recovery Type
|
ENUM_X_POSITION_TYPES recoveryLookingType; // Looking for Next Recovery Type
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3799,6 +3800,7 @@ struct XTradeData
|
|||||||
//
|
//
|
||||||
allowRecover = false;
|
allowRecover = false;
|
||||||
recoveryLevel = 0;
|
recoveryLevel = 0;
|
||||||
|
recoveryVolume = 0;
|
||||||
recoveryTPPoint = 0;
|
recoveryTPPoint = 0;
|
||||||
recoverySLPoint = 0;
|
recoverySLPoint = 0;
|
||||||
recoveryVolumeMultiplier = 0;
|
recoveryVolumeMultiplier = 0;
|
||||||
|
|||||||
@@ -186,6 +186,229 @@ public:
|
|||||||
mEnableXCHSTR = value;
|
mEnableXCHSTR = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Important Areas Getters ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetSupport(
|
||||||
|
XOHCL &bar //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = support.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
bar = support;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetResistance(
|
||||||
|
XOHCL &bar //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = resistance.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
bar = resistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetBullishOB(
|
||||||
|
XOHCL &bar //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bullishOB.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
bar = bullishOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetBearishOB(
|
||||||
|
XOHCL &bar //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bearishOB.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
bar = bearishOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetBullishFVG(
|
||||||
|
XOHCL &bar,
|
||||||
|
double upper,
|
||||||
|
double lower //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
upper = 0;
|
||||||
|
lower = 0;
|
||||||
|
bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bullishFVG.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bar = bullishFVG;
|
||||||
|
upper = bullishFVGUpper;
|
||||||
|
lower = bullishFVGLower;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetBearishFVG(
|
||||||
|
XOHCL &bar,
|
||||||
|
double upper,
|
||||||
|
double lower //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
upper = 0;
|
||||||
|
lower = 0;
|
||||||
|
bar.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bearishFVG.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bar = bearishFVG;
|
||||||
|
upper = bearishFVGUpper;
|
||||||
|
lower = bearishFVGLower;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetBullishTrend(
|
||||||
|
XOHCL &bar,
|
||||||
|
XOHCL &swingHighs[],
|
||||||
|
XOHCL &swingLows[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bar.Clean();
|
||||||
|
Clean(swingHighs);
|
||||||
|
Clean(swingLows);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bullishTrend.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bar = bullishTrend;
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
bullishTrendSwingHighs,
|
||||||
|
swingHighs //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
bullishTrendSwingLows,
|
||||||
|
swingLows //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool GetBearishTrend(
|
||||||
|
XOHCL &bar,
|
||||||
|
XOHCL &swingHighs[],
|
||||||
|
XOHCL &swingLows[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
bar.Clean();
|
||||||
|
Clean(swingHighs);
|
||||||
|
Clean(swingLows);
|
||||||
|
|
||||||
|
//
|
||||||
|
result = bearishTrend.IsValid();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bar = bearishTrend;
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
bearishTrendSwingHighs,
|
||||||
|
swingHighs //
|
||||||
|
);
|
||||||
|
Copy(
|
||||||
|
bearishTrendSwingLows,
|
||||||
|
swingLows //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Overrides ...
|
// Overrides ...
|
||||||
|
|
||||||
@@ -566,6 +789,71 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// TREND ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBullishTrend = bullishTrend.IsValid();
|
||||||
|
if (!hasBullishTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hasBullishTrend = aBar.HasBullishTrend(
|
||||||
|
bullishTrendSwingHighs,
|
||||||
|
bullishTrendSwingLows,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBullishTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bullishTrend = aBar;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (mDrawImportantAreas)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
DrawBullishTrend(
|
||||||
|
bullishTrend,
|
||||||
|
bullishTrendSwingHighs,
|
||||||
|
bullishTrendSwingLows,
|
||||||
|
ChartID() //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasBearishTrend = bearishTrend.IsValid();
|
||||||
|
if (!hasBearishTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
hasBearishTrend = aBar.HasBearishTrend(
|
||||||
|
bearishTrendSwingHighs,
|
||||||
|
bearishTrendSwingLows,
|
||||||
|
false //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bearishTrend = aBar;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (mDrawImportantAreas)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
DrawBearishTrend(
|
||||||
|
bearishTrend,
|
||||||
|
bearishTrendSwingHighs,
|
||||||
|
bearishTrendSwingLows,
|
||||||
|
ChartID() //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// For Trend ...
|
// For Trend ...
|
||||||
XOHCL tmpHSW[];
|
XOHCL tmpHSW[];
|
||||||
@@ -1007,6 +1295,10 @@ public:
|
|||||||
CheckBullishFVGValidation();
|
CheckBullishFVGValidation();
|
||||||
CheckBearishFVgValidation();
|
CheckBearishFVgValidation();
|
||||||
|
|
||||||
|
//
|
||||||
|
CheckBullishTrendValidation();
|
||||||
|
CheckBearishTrendValidation();
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1071,6 +1363,22 @@ public:
|
|||||||
bearishFVG.Clean();
|
bearishFVG.Clean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBullishTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
RemoveBullishTrend(bullishTrend);
|
||||||
|
bullishTrend.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (hasBearishTrend)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
RemoveBearishTrend(bearishTrend);
|
||||||
|
bearishTrend.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Retrieve Entry Price based on Position Type ...
|
// Retrieve Entry Price based on Position Type ...
|
||||||
entry = GetEntry(mSymbol, type);
|
entry = GetEntry(mSymbol, type);
|
||||||
@@ -1159,6 +1467,16 @@ protected:
|
|||||||
double bearishFVGLower;
|
double bearishFVGLower;
|
||||||
XOHCL bearishFVG;
|
XOHCL bearishFVG;
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL bullishTrendSwingHighs[];
|
||||||
|
XOHCL bullishTrendSwingLows[];
|
||||||
|
XOHCL bullishTrend;
|
||||||
|
|
||||||
|
//
|
||||||
|
XOHCL bearishTrendSwingHighs[];
|
||||||
|
XOHCL bearishTrendSwingLows[];
|
||||||
|
XOHCL bearishTrend;
|
||||||
|
|
||||||
//
|
//
|
||||||
// XPV ...
|
// XPV ...
|
||||||
XPVInputs pvInputs;
|
XPVInputs pvInputs;
|
||||||
@@ -1594,6 +1912,20 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void CheckBullishTrendValidation()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// TODO: Complete this ...
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void CheckBearishTrendValidation()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// TODO: Complete this ...
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XCHE Custom Data ...
|
// XCHE Custom Data ...
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user