last works ...
This commit is contained in:
@@ -1071,7 +1071,8 @@ public:
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
virtual string GenerateSummary(
|
||||
const bool onlySummary = false, // Only Generate Conditions Summary
|
||||
double cMarketMultiplier = 1, // Current Market Score Multiplier
|
||||
double sMarketMultiplier = 1.1, // Short Market Score Multiplier
|
||||
double mMarketMultiplier = 1.2, // Medium Market Score Multiplier
|
||||
@@ -1126,6 +1127,93 @@ public:
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// XZG ...
|
||||
string zigzagStr =
|
||||
//
|
||||
ToString("isZigZagInPeak", isZigZagInPeak, ignoreFalseConditions) +
|
||||
ToString("isZigZagInVale", isZigZagInVale, ignoreFalseConditions) +
|
||||
""
|
||||
//
|
||||
;
|
||||
zigzagStr = SetLabel("XZG: ", zigzagStr, separator);
|
||||
|
||||
//
|
||||
// XDON ...
|
||||
string donStr =
|
||||
//
|
||||
ToString("isDONAttachedMaxLower", isDONAttachedMaxLower, ignoreFalseConditions) +
|
||||
ToString("isDONAttachedMinLower", isDONAttachedMinLower, ignoreFalseConditions) +
|
||||
ToString("isDONCrossedOverMaxLower", isDONCrossedOverMaxLower, ignoreFalseConditions) +
|
||||
ToString("isDONCrossedUnderMaxLower", isDONCrossedUnderMaxLower, ignoreFalseConditions) +
|
||||
ToString("isDONAttachedMaxUpper", isDONAttachedMaxUpper, ignoreFalseConditions) +
|
||||
ToString("isDONAttachedMinUpper", isDONAttachedMinUpper, ignoreFalseConditions) +
|
||||
ToString("isDONCrossedOverMaxUpper", isDONCrossedOverMaxUpper, ignoreFalseConditions) +
|
||||
ToString("isDONCrossedUnderMaxUpper", isDONCrossedUnderMaxUpper, ignoreFalseConditions) +
|
||||
""
|
||||
//
|
||||
;
|
||||
donStr = SetLabel("XDON: ", donStr, separator);
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
string pvStr =
|
||||
//
|
||||
ToString("isPVPeakSameAs", isPVPeakSameAs, ignoreFalseConditions) +
|
||||
ToString("isPVNewPeak", isPVNewPeak, ignoreFalseConditions) +
|
||||
ToString("isPVNewPeakOverLast", isPVNewPeakOverLast, ignoreFalseConditions) +
|
||||
ToString("isPVNewPeakUnderLast", isPVNewPeakUnderLast, ignoreFalseConditions) +
|
||||
ToString("isPVValeSameAs", isPVValeSameAs, ignoreFalseConditions) +
|
||||
ToString("isPVNewVale", isPVNewVale, ignoreFalseConditions) +
|
||||
ToString("isPVNewValeOverLast", isPVNewValeOverLast, ignoreFalseConditions) +
|
||||
ToString("isPVNewValeUnderLast", isPVNewValeUnderLast, ignoreFalseConditions) +
|
||||
ToString("isPVFiboIncreased", isPVFiboIncreased, ignoreFalseConditions) +
|
||||
ToString("isPVFiboDecreased", isPVFiboDecreased, ignoreFalseConditions) +
|
||||
ToString("isPVFiboSectionChanged", isPVFiboSectionChanged, ignoreFalseConditions) +
|
||||
ToString("isPVSCBullish", isPVSCBullish, ignoreFalseConditions) +
|
||||
ToString("isPVSCHHBullish", isPVSCHHBullish, ignoreFalseConditions) +
|
||||
ToString("isPVSCLLBullish", isPVSCLLBullish, ignoreFalseConditions) +
|
||||
ToString("isPVSCSwitchedToBullish", isPVSCSwitchedToBullish, ignoreFalseConditions) +
|
||||
ToString("isPVSCBearish", isPVSCBearish, ignoreFalseConditions) +
|
||||
ToString("isPVSCHHBearish", isPVSCHHBearish, ignoreFalseConditions) +
|
||||
ToString("isPVSCLLBearish", isPVSCLLBearish, ignoreFalseConditions) +
|
||||
ToString("isPVSCSwitchedToBearish", isPVSCSwitchedToBearish, ignoreFalseConditions) +
|
||||
ToString("isPVMCBullish", isPVMCBullish, ignoreFalseConditions) +
|
||||
ToString("isPVMCHHBullish", isPVMCHHBullish, ignoreFalseConditions) +
|
||||
ToString("isPVMCLLBullish", isPVMCLLBullish, ignoreFalseConditions) +
|
||||
ToString("isPVMCSwitchedToBullish", isPVMCSwitchedToBullish, ignoreFalseConditions) +
|
||||
ToString("isPVMCBearish", isPVMCBearish, ignoreFalseConditions) +
|
||||
ToString("isPVMCHHBearish", isPVMCHHBearish, ignoreFalseConditions) +
|
||||
ToString("isPVMCLLBearish", isPVMCLLBearish, ignoreFalseConditions) +
|
||||
ToString("isPVMCSwitchedToBearish", isPVMCSwitchedToBearish, ignoreFalseConditions) +
|
||||
ToString("isPVLCBullish", isPVLCBullish, ignoreFalseConditions) +
|
||||
ToString("isPVLCHHBullish", isPVLCHHBullish, ignoreFalseConditions) +
|
||||
ToString("isPVLCLLBullish", isPVLCLLBullish, ignoreFalseConditions) +
|
||||
ToString("isPVLCSwitchedToBullish", isPVLCSwitchedToBullish, ignoreFalseConditions) +
|
||||
ToString("isPVLCBearish", isPVLCBearish, ignoreFalseConditions) +
|
||||
ToString("isPVLCHHBearish", isPVLCHHBearish, ignoreFalseConditions) +
|
||||
ToString("isPVLCLLBearish", isPVLCLLBearish, ignoreFalseConditions) +
|
||||
ToString("isPVLCSwitchedToBearish", isPVLCSwitchedToBearish, ignoreFalseConditions) +
|
||||
ToString("isPVHCBullish", isPVHCBullish, ignoreFalseConditions) +
|
||||
ToString("isPVHCHHBullish", isPVHCHHBullish, ignoreFalseConditions) +
|
||||
ToString("isPVHCLLBullish", isPVHCLLBullish, ignoreFalseConditions) +
|
||||
ToString("isPVHCSwitchedToBullish", isPVHCSwitchedToBullish, ignoreFalseConditions) +
|
||||
ToString("isPVHCBearish", isPVHCBearish, ignoreFalseConditions) +
|
||||
ToString("isPVHCHHBearish", isPVHCHHBearish, ignoreFalseConditions) +
|
||||
ToString("isPVHCLLBearish", isPVHCLLBearish, ignoreFalseConditions) +
|
||||
ToString("isPVHCSwitchedToBearish", isPVHCSwitchedToBearish, ignoreFalseConditions) +
|
||||
""
|
||||
//
|
||||
;
|
||||
pvStr = SetLabel("XPV: ", pvStr, separator);
|
||||
|
||||
//
|
||||
string cMarketConditionsStr = cMarketConditions.GenerateSummary(onlySummary, cMarketMultiplier);
|
||||
string sMarketConditionsStr = sMarketConditions.GenerateSummary(onlySummary, sMarketMultiplier);
|
||||
string mMarketConditionsStr = mMarketConditions.GenerateSummary(onlySummary, mMarketMultiplier);
|
||||
string lMarketConditionsStr = lMarketConditions.GenerateSummary(onlySummary, lMarketMultiplier);
|
||||
string hMarketConditionsStr = hMarketConditions.GenerateSummary(onlySummary, hMarketMultiplier);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
@@ -1133,6 +1221,18 @@ public:
|
||||
(IsSpecifiedValid(provided) ? provided + separator : "") +
|
||||
"-----------------------------" + separator +
|
||||
commonStr +
|
||||
(!onlySummary
|
||||
? zigzagStr +
|
||||
donStr +
|
||||
pvStr +
|
||||
"======" + separator +
|
||||
cMarketConditionsStr +
|
||||
sMarketConditionsStr +
|
||||
mMarketConditionsStr +
|
||||
lMarketConditionsStr +
|
||||
hMarketConditionsStr +
|
||||
""
|
||||
: "") +
|
||||
""
|
||||
//
|
||||
;
|
||||
@@ -1615,7 +1715,6 @@ public:
|
||||
// Here We Have to Prepare Signal ...
|
||||
|
||||
//
|
||||
// TODO: Make this Configurable ...
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
double tpPoint = 60;
|
||||
@@ -1637,14 +1736,80 @@ public:
|
||||
symbol,
|
||||
type //
|
||||
);
|
||||
double tp = hasLong
|
||||
? entry + tpPrice
|
||||
: entry - tpPrice;
|
||||
double sl = hasLong
|
||||
? entry - slPrice
|
||||
: entry + slPrice;
|
||||
|
||||
//
|
||||
double tp = 0;
|
||||
double sl = 0;
|
||||
|
||||
//
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS action = X_SIGNAL_USE_NOTHING;
|
||||
|
||||
//
|
||||
// TODO: Make Configurable ...
|
||||
double r2r = 2;
|
||||
|
||||
//
|
||||
if (provider == ToString(X786))
|
||||
{
|
||||
//
|
||||
double maxDonUpper = donHelper.GetMaxUpper(0);
|
||||
double minDonUpper = donHelper.GetMinUpper(0);
|
||||
|
||||
//
|
||||
double maxDonLower = donHelper.GetMaxLower(0);
|
||||
double minDonLower = donHelper.GetMinLower(0);
|
||||
|
||||
//
|
||||
double peak = pvHelper.GetPeak(0);
|
||||
double vale = pvHelper.GetVale(0);
|
||||
|
||||
//
|
||||
double hCHELE2 = hMarket.che.GetLongExit2(0);
|
||||
double hCHESE2 = hMarket.che.GetShortExit2(0);
|
||||
|
||||
//
|
||||
double lCHELE2 = lMarket.che.GetLongExit2(0);
|
||||
double lCHESE2 = lMarket.che.GetShortExit2(0);
|
||||
|
||||
//
|
||||
sl = hasLong
|
||||
? lCHELE2
|
||||
: lCHESE2;
|
||||
|
||||
//
|
||||
double risk = MathAbs(entry - sl);
|
||||
|
||||
//
|
||||
double reward = risk * r2r;
|
||||
|
||||
//
|
||||
tp = hasLong
|
||||
? entry + reward
|
||||
: entry - reward;
|
||||
}
|
||||
else if (provider == ToString(X121))
|
||||
{
|
||||
//
|
||||
double peak = pvHelper.GetPeak(0);
|
||||
double vale = pvHelper.GetVale(0);
|
||||
|
||||
//
|
||||
sl = hasLong
|
||||
? vale
|
||||
: peak;
|
||||
|
||||
//
|
||||
double risk = MathAbs(entry - sl);
|
||||
|
||||
//
|
||||
double reward = risk * r2r;
|
||||
|
||||
//
|
||||
tp = hasLong
|
||||
? entry + reward
|
||||
: entry - reward;
|
||||
}
|
||||
|
||||
//
|
||||
result = mSignal.Prepare(
|
||||
symbol,
|
||||
@@ -1680,14 +1845,43 @@ public:
|
||||
}
|
||||
|
||||
//
|
||||
void Draw()
|
||||
// Check for any Guards ...
|
||||
bool HasGuard(XGuard &guards[])
|
||||
{
|
||||
//
|
||||
return;
|
||||
bool result = false;
|
||||
|
||||
// //
|
||||
// XOHCL bar;
|
||||
// bar.Init(
|
||||
// GetSymbol(),
|
||||
// GetPeriod(),
|
||||
// 0 //
|
||||
// );
|
||||
|
||||
// //
|
||||
// double maxDONUppers = donHelper.GetMaxUpper(0);
|
||||
// double minDONUppers = donHelper.GetMinUpper(0);
|
||||
// // double minDONUppers = donHelper.GetMinUpper(1);
|
||||
|
||||
// //
|
||||
// bool isDONUpAttached =
|
||||
// //
|
||||
// bar.high >= maxDONUppers
|
||||
// //
|
||||
// ;
|
||||
// if (isDONUpAttached)
|
||||
// {
|
||||
// Print("Force Close Short X786");
|
||||
// }
|
||||
|
||||
//
|
||||
// ulong chID = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void Draw()
|
||||
{
|
||||
//
|
||||
string symbol = GetSymbol();
|
||||
ENUM_TIMEFRAMES period = GetPeriod();
|
||||
@@ -1865,7 +2059,7 @@ private:
|
||||
if (mIsX121SignalProviderEnable)
|
||||
{
|
||||
//
|
||||
hasX121Signal = XSIHasSpecifiedLongSignal(
|
||||
hasX121Signal = X121HasSpecifiedLongSignal(
|
||||
mConditions //
|
||||
);
|
||||
|
||||
@@ -1888,7 +2082,7 @@ private:
|
||||
if (mIsX110SignalProviderEnable)
|
||||
{
|
||||
//
|
||||
hasX110Signal = XTSFIHasSpecifiedLongSignal(
|
||||
hasX110Signal = X110HasSpecifiedLongSignal(
|
||||
mConditions //
|
||||
);
|
||||
|
||||
@@ -1911,7 +2105,7 @@ private:
|
||||
if (mIsX92SignalProviderEnable)
|
||||
{
|
||||
//
|
||||
hasX92Signal = XOBDLHHasSpecifiedLongSignal(
|
||||
hasX92Signal = X92HasSpecifiedLongSignal(
|
||||
mConditions //
|
||||
);
|
||||
|
||||
@@ -2055,7 +2249,7 @@ private:
|
||||
if (mIsX121SignalProviderEnable)
|
||||
{
|
||||
//
|
||||
hasX121Signal = XSIHasSpecifiedShortSignal(
|
||||
hasX121Signal = X121HasSpecifiedShortSignal(
|
||||
mConditions //
|
||||
);
|
||||
|
||||
@@ -2078,7 +2272,7 @@ private:
|
||||
if (mIsX110SignalProviderEnable)
|
||||
{
|
||||
//
|
||||
hasX110Signal = XTSFIHasSpecifiedShortSignal(
|
||||
hasX110Signal = X110HasSpecifiedShortSignal(
|
||||
mConditions //
|
||||
);
|
||||
|
||||
@@ -2925,12 +3119,146 @@ private:
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Check For Long ...
|
||||
bool isSTRLong =
|
||||
//
|
||||
(mConditions.hMarketConditions.isTrendSwitchedToBullish &&
|
||||
(mConditions.lMarketConditions.isTrendBullish &&
|
||||
mConditions.mMarketConditions.isTrendBullish &&
|
||||
mConditions.sMarketConditions.isTrendBullish &&
|
||||
mConditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.lMarketConditions.isTrendSwitchedToBullish &&
|
||||
(mConditions.hMarketConditions.isTrendBullish &&
|
||||
mConditions.mMarketConditions.isTrendBullish &&
|
||||
mConditions.sMarketConditions.isTrendBullish &&
|
||||
mConditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.mMarketConditions.isTrendSwitchedToBullish &&
|
||||
(mConditions.hMarketConditions.isTrendBullish &&
|
||||
mConditions.lMarketConditions.isTrendBullish &&
|
||||
mConditions.sMarketConditions.isTrendBullish &&
|
||||
mConditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.sMarketConditions.isTrendSwitchedToBullish &&
|
||||
(mConditions.hMarketConditions.isTrendBullish &&
|
||||
mConditions.lMarketConditions.isTrendBullish &&
|
||||
mConditions.mMarketConditions.isTrendBullish &&
|
||||
mConditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.cMarketConditions.isTrendSwitchedToBullish &&
|
||||
(mConditions.hMarketConditions.isTrendBullish &&
|
||||
mConditions.lMarketConditions.isTrendBullish &&
|
||||
mConditions.mMarketConditions.isTrendBullish &&
|
||||
mConditions.sMarketConditions.isTrendBullish))
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isCHELong =
|
||||
//
|
||||
(mConditions.hMarketConditions.isCHESwitchedInStrongLong &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.sMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.mMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.lMarketConditions.isCHEInStrongLong))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.lMarketConditions.isCHESwitchedInStrongLong &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.sMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.mMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.hMarketConditions.isCHEInStrongLong))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.mMarketConditions.isCHESwitchedInStrongLong &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.sMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.lMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.hMarketConditions.isCHEInStrongLong))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.sMarketConditions.isCHESwitchedInStrongLong &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.mMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.lMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.hMarketConditions.isCHEInStrongLong))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.cMarketConditions.isCHESwitchedInStrongLong &&
|
||||
(mConditions.sMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.mMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.lMarketConditions.isCHEInStrongLong &&
|
||||
mConditions.hMarketConditions.isCHEInStrongLong))
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isSTRLong
|
||||
//
|
||||
&&
|
||||
//
|
||||
isCHELong
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool XSIHasSpecifiedLongSignal(
|
||||
bool X121HasSpecifiedLongSignal(
|
||||
X121MarketConditions &mConditions //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isMCLong =
|
||||
//
|
||||
(
|
||||
//
|
||||
(mConditions.cMarketConditions.isSlowOverVerifier &&
|
||||
mConditions.cMarketConditions.isFastCrossedOverVerifier)
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.cMarketConditions.isFastOverVerifier &&
|
||||
mConditions.cMarketConditions.isSlowCrossedOverVerifier)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isMCLong
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool X110HasSpecifiedLongSignal(
|
||||
X121MarketConditions &mConditions //
|
||||
)
|
||||
{
|
||||
@@ -2942,19 +3270,7 @@ private:
|
||||
}
|
||||
|
||||
//
|
||||
bool XTSFIHasSpecifiedLongSignal(
|
||||
X121MarketConditions &mConditions //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool XOBDLHHasSpecifiedLongSignal(
|
||||
bool X92HasSpecifiedLongSignal(
|
||||
X121MarketConditions &mConditions //
|
||||
)
|
||||
{
|
||||
@@ -2997,24 +3313,146 @@ private:
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
// Check For Short ...
|
||||
bool isSTRShort =
|
||||
//
|
||||
(mConditions.hMarketConditions.isTrendSwitchedToBearish &&
|
||||
(mConditions.lMarketConditions.isTrendBearish &&
|
||||
mConditions.mMarketConditions.isTrendBearish &&
|
||||
mConditions.sMarketConditions.isTrendBearish &&
|
||||
mConditions.cMarketConditions.isTrendBearish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.lMarketConditions.isTrendSwitchedToBearish &&
|
||||
(mConditions.hMarketConditions.isTrendBearish &&
|
||||
mConditions.mMarketConditions.isTrendBearish &&
|
||||
mConditions.sMarketConditions.isTrendBearish &&
|
||||
mConditions.cMarketConditions.isTrendBearish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.mMarketConditions.isTrendSwitchedToBearish &&
|
||||
(mConditions.hMarketConditions.isTrendBearish &&
|
||||
mConditions.lMarketConditions.isTrendBearish &&
|
||||
mConditions.sMarketConditions.isTrendBearish &&
|
||||
mConditions.cMarketConditions.isTrendBearish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.sMarketConditions.isTrendSwitchedToBearish &&
|
||||
(mConditions.hMarketConditions.isTrendBearish &&
|
||||
mConditions.lMarketConditions.isTrendBearish &&
|
||||
mConditions.mMarketConditions.isTrendBearish &&
|
||||
mConditions.cMarketConditions.isTrendBearish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.cMarketConditions.isTrendSwitchedToBearish &&
|
||||
(mConditions.hMarketConditions.isTrendBearish &&
|
||||
mConditions.lMarketConditions.isTrendBearish &&
|
||||
mConditions.mMarketConditions.isTrendBearish &&
|
||||
mConditions.sMarketConditions.isTrendBearish))
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isCHEShort =
|
||||
//
|
||||
(mConditions.hMarketConditions.isCHESwitchedInStrongShort &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.sMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.mMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.lMarketConditions.isCHEInStrongShort))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.lMarketConditions.isCHESwitchedInStrongShort &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.sMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.mMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.hMarketConditions.isCHEInStrongShort))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.mMarketConditions.isCHESwitchedInStrongShort &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.sMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.lMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.hMarketConditions.isCHEInStrongShort))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.sMarketConditions.isCHESwitchedInStrongShort &&
|
||||
(mConditions.cMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.mMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.lMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.hMarketConditions.isCHEInStrongShort))
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.cMarketConditions.isCHESwitchedInStrongShort &&
|
||||
(mConditions.sMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.mMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.lMarketConditions.isCHEInStrongShort &&
|
||||
mConditions.hMarketConditions.isCHEInStrongShort))
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isSTRShort
|
||||
//
|
||||
&&
|
||||
//
|
||||
isCHEShort
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool XSIHasSpecifiedShortSignal(
|
||||
bool X121HasSpecifiedShortSignal(
|
||||
X121MarketConditions &mConditions //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
bool isMCShort =
|
||||
//
|
||||
(
|
||||
//
|
||||
(mConditions.cMarketConditions.isSlowUnderVerifier &&
|
||||
mConditions.cMarketConditions.isFastCrossedUnderVerifier)
|
||||
//
|
||||
||
|
||||
//
|
||||
(mConditions.cMarketConditions.isFastUnderVerifier &&
|
||||
mConditions.cMarketConditions.isSlowCrossedUnderVerifier)
|
||||
//
|
||||
)
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
isMCShort
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool XTSFIHasSpecifiedShortSignal(
|
||||
bool X110HasSpecifiedShortSignal(
|
||||
X121MarketConditions &mConditions //
|
||||
)
|
||||
{
|
||||
|
||||
@@ -185,8 +185,44 @@ public:
|
||||
bool CheckForGuard(XGuard &guards[]) override
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
return false;
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
Clean(guards);
|
||||
|
||||
//
|
||||
int descriptorsCount = CountDescriptors();
|
||||
result = descriptorsCount > 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < descriptorsCount; i++)
|
||||
{
|
||||
//
|
||||
X121ProviderDescriptor iDescriptor = mDescriptors[i];
|
||||
|
||||
//
|
||||
XGuard iGuards[];
|
||||
bool iHasGuard = iDescriptor.provider.HasGuard(iGuards);
|
||||
if (iHasGuard)
|
||||
{
|
||||
//
|
||||
Copy(
|
||||
iGuards,
|
||||
guards,
|
||||
false //
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
result = ArraySize(guards) > 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -250,8 +286,193 @@ public:
|
||||
bool HandleStateManagement() override
|
||||
{
|
||||
//
|
||||
// TODO: Implement this ...
|
||||
return false;
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int requiredAgeForSLTrail = 10;
|
||||
int requiredDistanceForSLTrail = 10;
|
||||
|
||||
//
|
||||
XPosition positions[];
|
||||
int positionsCount = mTrader.GetPositions(positions);
|
||||
if (positionsCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Trail Positions Stop ...
|
||||
for (int i = 0; i < positionsCount; i++)
|
||||
{
|
||||
//
|
||||
XPosition iPosition = positions[i];
|
||||
|
||||
//
|
||||
// Position Management for X786 ...
|
||||
if (iPosition.provider == ToString(X786) ||
|
||||
iPosition.provider == ToString(X121))
|
||||
{
|
||||
//
|
||||
// Check Position in Profit or not ...
|
||||
if (iPosition.profit > 0)
|
||||
{
|
||||
//
|
||||
XTrail trail;
|
||||
bool isTrailedBefore = GetTrail(
|
||||
iPosition.ticket,
|
||||
trail //
|
||||
);
|
||||
|
||||
//
|
||||
if (!isTrailedBefore)
|
||||
{
|
||||
//
|
||||
// Add First Time ...
|
||||
|
||||
//
|
||||
// Check Position Age ...
|
||||
int iPositionAge = iPosition.GetAge(iPosition.period);
|
||||
if (iPositionAge < requiredAgeForSLTrail)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Position Profit Distance ...
|
||||
double priceDistanceInPoint = PriceToPoint(iPosition.profit / iPosition.volume, iPosition.symbol);
|
||||
double priceDistance = PointToPrice(priceDistanceInPoint, iPosition.symbol);
|
||||
if (priceDistance < requiredDistanceForSLTrail)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
double slDiff = PointToPrice(priceDistance, iPosition.symbol);
|
||||
|
||||
//
|
||||
double sl =
|
||||
IsLong(iPosition.type)
|
||||
? iPosition.sl + slDiff
|
||||
: iPosition.sl - slDiff;
|
||||
|
||||
//
|
||||
bool isInit = trail.Init(
|
||||
iPosition.ticket,
|
||||
iPosition.type,
|
||||
iPosition.profit,
|
||||
iPosition.sl,
|
||||
sl);
|
||||
if (!isInit)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Update Exists ...
|
||||
|
||||
//
|
||||
// Check Profit ...
|
||||
bool isProfitPassed = iPosition.profit > trail.profit;
|
||||
if (!isProfitPassed)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Age Distance from Last ...
|
||||
int age = iBarShift(
|
||||
iPosition.symbol,
|
||||
iPosition.period,
|
||||
trail.time,
|
||||
false //
|
||||
);
|
||||
if (age < requiredAgeForSLTrail)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
double priceDistanceInPoint = PriceToPoint((iPosition.profit - trail.profit) / iPosition.volume, iPosition.symbol);
|
||||
double priceDistance = PointToPrice(priceDistanceInPoint, iPosition.symbol);
|
||||
if (priceDistance < requiredDistanceForSLTrail)
|
||||
{
|
||||
//
|
||||
// int positionAge = iPosition.GetAge(iPosition.period);
|
||||
if (trail.level >= 3)
|
||||
{
|
||||
//
|
||||
string comment = "EQM Close In Profit ...";
|
||||
bool isClosed = mTrader.Close(
|
||||
iPosition.ticket,
|
||||
comment //
|
||||
);
|
||||
if (isClosed)
|
||||
{
|
||||
//
|
||||
RemoveTrail(iPosition.ticket);
|
||||
|
||||
//
|
||||
string message = "EQM Close (" + ToString(iPosition.ticket) + ") In Profit ...";
|
||||
mAlert.Alert(message);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
double slDiff = PointToPrice(priceDistance, iPosition.symbol);
|
||||
|
||||
//
|
||||
double sl =
|
||||
IsLong(iPosition.type)
|
||||
? iPosition.sl + slDiff
|
||||
: iPosition.sl - slDiff;
|
||||
|
||||
//
|
||||
// Update Trail Values ...
|
||||
bool isUpdated = trail.Update(
|
||||
sl,
|
||||
iPosition.profit //
|
||||
);
|
||||
if (!isUpdated)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (trail.IsValid())
|
||||
{
|
||||
//
|
||||
string comment = trail.GenerateTag();
|
||||
bool isModified = mTrader.Modify(
|
||||
trail.ticket,
|
||||
trail.after,
|
||||
iPosition.tp,
|
||||
comment //
|
||||
);
|
||||
if (isModified)
|
||||
{
|
||||
//
|
||||
RemoveTrail(trail.ticket);
|
||||
|
||||
//
|
||||
AddTrail(trail);
|
||||
|
||||
//
|
||||
string message = "Position (" + ToString(trail.ticket) + ") Trailed SL on Level: " + ToString(trail.level);
|
||||
mAlert.Alert(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Must false ...
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -319,6 +540,117 @@ private:
|
||||
return ArraySize(mDescriptors);
|
||||
}
|
||||
|
||||
//
|
||||
// Trails Holding ...
|
||||
|
||||
//
|
||||
XTrail mTrails[];
|
||||
|
||||
//
|
||||
int CountTrails()
|
||||
{
|
||||
return ArraySize(mTrails);
|
||||
}
|
||||
|
||||
//
|
||||
bool RemoveTrail(ulong ticket)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int idx = FindTrailIndex(ticket);
|
||||
result = idx >= 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
result = ArrayRemove(
|
||||
mTrails,
|
||||
idx,
|
||||
1 //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
int FindTrailIndex(ulong ticket)
|
||||
{
|
||||
//
|
||||
int result = -1;
|
||||
|
||||
//
|
||||
int trailsCount = CountTrails();
|
||||
if (ticket <= 0 || trailsCount <= 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
for (int i = 0; i < trailsCount; i++)
|
||||
{
|
||||
//
|
||||
XTrail iTrail = mTrails[i];
|
||||
|
||||
//
|
||||
if (iTrail.ticket == ticket)
|
||||
{
|
||||
//
|
||||
result = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
bool GetTrail(
|
||||
ulong ticket,
|
||||
XTrail &trail //
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
int idx = FindTrailIndex(ticket);
|
||||
result = idx >= 0;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
trail = mTrails[idx];
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void AddTrail(
|
||||
XTrail &trail //
|
||||
)
|
||||
{
|
||||
//
|
||||
if (!trail.IsValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
AddRef(
|
||||
trail,
|
||||
mTrails //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
};
|
||||
|
||||
@@ -479,6 +479,12 @@ public:
|
||||
bool isCloseUnderSlow;
|
||||
bool isCloseOverVerifier;
|
||||
bool isCloseUnderVerifier;
|
||||
bool isFastCrossedOverSlow;
|
||||
bool isFastCrossedUnderSlow;
|
||||
bool isFastCrossedOverVerifier;
|
||||
bool isFastCrossedUnderVerifier;
|
||||
bool isSlowCrossedOverVerifier;
|
||||
bool isSlowCrossedUnderVerifier;
|
||||
|
||||
//
|
||||
// XSTR ...
|
||||
@@ -491,8 +497,10 @@ public:
|
||||
// XCHE ...
|
||||
bool isCHEInLong;
|
||||
bool isCHEInStrongLong;
|
||||
bool isCHESwitchedInStrongLong;
|
||||
bool isCHEInShort;
|
||||
bool isCHEInStrongShort;
|
||||
bool isCHESwitchedInStrongShort;
|
||||
|
||||
//
|
||||
// XOSC ...
|
||||
@@ -1190,6 +1198,24 @@ public:
|
||||
{
|
||||
bullScore++;
|
||||
}
|
||||
if (isFastCrossedOverSlow)
|
||||
{
|
||||
//
|
||||
bullScore++;
|
||||
bearScore--;
|
||||
}
|
||||
if (isFastCrossedOverVerifier)
|
||||
{
|
||||
//
|
||||
bullScore++;
|
||||
bearScore--;
|
||||
}
|
||||
if (isSlowCrossedOverVerifier)
|
||||
{
|
||||
//
|
||||
bullScore++;
|
||||
bearScore--;
|
||||
}
|
||||
|
||||
//
|
||||
// BEARISH ...
|
||||
@@ -1217,6 +1243,60 @@ public:
|
||||
{
|
||||
bearScore++;
|
||||
}
|
||||
if (isFastCrossedUnderSlow)
|
||||
{
|
||||
//
|
||||
bullScore--;
|
||||
bearScore++;
|
||||
}
|
||||
if (isFastCrossedUnderVerifier)
|
||||
{
|
||||
//
|
||||
bullScore--;
|
||||
bearScore++;
|
||||
}
|
||||
if (isSlowCrossedUnderVerifier)
|
||||
{
|
||||
//
|
||||
bullScore--;
|
||||
bearScore++;
|
||||
}
|
||||
|
||||
//
|
||||
// XCHE ...
|
||||
if (isCHEInLong)
|
||||
{
|
||||
bullScore++;
|
||||
}
|
||||
if (isCHEInStrongLong)
|
||||
{
|
||||
//
|
||||
bullScore++;
|
||||
bearScore--;
|
||||
}
|
||||
if (isCHESwitchedInStrongLong)
|
||||
{
|
||||
//
|
||||
bullScore++;
|
||||
bearScore--;
|
||||
}
|
||||
if (isCHEInShort)
|
||||
{
|
||||
//
|
||||
bearScore++;
|
||||
}
|
||||
if (isCHEInStrongShort)
|
||||
{
|
||||
//
|
||||
bullScore--;
|
||||
bearScore++;
|
||||
}
|
||||
if (isCHESwitchedInStrongShort)
|
||||
{
|
||||
//
|
||||
bullScore--;
|
||||
bearScore++;
|
||||
}
|
||||
|
||||
//
|
||||
// XOSC ...
|
||||
@@ -1563,8 +1643,10 @@ public:
|
||||
//
|
||||
ToString("isCHEInLong", isCHEInLong, ignoreFalseConditions) +
|
||||
ToString("isCHEInStrongLong", isCHEInStrongLong, ignoreFalseConditions) +
|
||||
ToString("isCHESwitchedInStrongLong", isCHESwitchedInStrongLong, ignoreFalseConditions) +
|
||||
ToString("isCHEInShort", isCHEInShort, ignoreFalseConditions) +
|
||||
ToString("isCHEInStrongShort", isCHEInStrongShort, ignoreFalseConditions) +
|
||||
ToString("isCHESwitchedInStrongShort", isCHESwitchedInStrongShort, ignoreFalseConditions) +
|
||||
""
|
||||
//
|
||||
;
|
||||
@@ -1607,6 +1689,12 @@ public:
|
||||
ToString("isCloseUnderSlow", isCloseUnderSlow, ignoreFalseConditions) +
|
||||
ToString("isCloseOverVerifier", isCloseOverVerifier, ignoreFalseConditions) +
|
||||
ToString("isCloseUnderVerifier", isCloseUnderVerifier, ignoreFalseConditions) +
|
||||
ToString("isFastCrossedOverSlow", isFastCrossedOverSlow, ignoreFalseConditions) +
|
||||
ToString("isFastCrossedUnderSlow", isFastCrossedUnderSlow, ignoreFalseConditions) +
|
||||
ToString("isFastCrossedOverVerifier", isFastCrossedOverVerifier, ignoreFalseConditions) +
|
||||
ToString("isFastCrossedUnderVerifier", isFastCrossedUnderVerifier, ignoreFalseConditions) +
|
||||
ToString("isSlowCrossedOverVerifier", isSlowCrossedOverVerifier, ignoreFalseConditions) +
|
||||
ToString("isSlowCrossedUnderVerifier", isSlowCrossedUnderVerifier, ignoreFalseConditions) +
|
||||
""
|
||||
//
|
||||
;
|
||||
@@ -2135,29 +2223,63 @@ public:
|
||||
NotEmpty(che.GetLongExit1(curr))
|
||||
//
|
||||
;
|
||||
bool isCHEInLongPrev =
|
||||
//
|
||||
NotEmpty(che.GetLongExit1(prev))
|
||||
//
|
||||
;
|
||||
bool isCHEInStrongLong =
|
||||
//
|
||||
isCHEInLong &&
|
||||
NotEmpty(che.GetLongExit2(curr))
|
||||
//
|
||||
;
|
||||
bool isCHEInStrongLongPrev =
|
||||
//
|
||||
isCHEInLongPrev &&
|
||||
NotEmpty(che.GetLongExit2(prev))
|
||||
//
|
||||
;
|
||||
bool isCHEInShort =
|
||||
//
|
||||
NotEmpty(che.GetShortExit1(curr))
|
||||
//
|
||||
;
|
||||
bool isCHEInShortPrev =
|
||||
//
|
||||
NotEmpty(che.GetShortExit1(prev))
|
||||
//
|
||||
;
|
||||
bool isCHEInStrongShort =
|
||||
//
|
||||
isCHEInShort &&
|
||||
NotEmpty(che.GetShortExit2(curr))
|
||||
//
|
||||
;
|
||||
bool isCHEInStrongShortPrev =
|
||||
//
|
||||
isCHEInShortPrev &&
|
||||
NotEmpty(che.GetShortExit2(prev))
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
conditions.isCHEInLong = isCHEInLong;
|
||||
conditions.isCHEInShort = isCHEInShort;
|
||||
conditions.isCHEInStrongLong = isCHEInStrongLong;
|
||||
conditions.isCHESwitchedInStrongLong =
|
||||
//
|
||||
isCHEInStrongLong &&
|
||||
!isCHEInStrongLongPrev
|
||||
//
|
||||
;
|
||||
conditions.isCHEInShort = isCHEInShort;
|
||||
conditions.isCHEInStrongShort = isCHEInStrongShort;
|
||||
conditions.isCHESwitchedInStrongShort =
|
||||
//
|
||||
isCHEInStrongShort &&
|
||||
!isCHEInStrongShortPrev
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// XMC ...
|
||||
@@ -2247,6 +2369,54 @@ public:
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isFastCrossedOverSlow =
|
||||
//
|
||||
conditions.mcFasts[curr] > conditions.mcSlows[curr] &&
|
||||
conditions.mcFasts[prev] <= conditions.mcSlows[prev]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isFastCrossedUnderSlow =
|
||||
//
|
||||
conditions.mcFasts[curr] < conditions.mcSlows[curr] &&
|
||||
conditions.mcFasts[prev] >= conditions.mcSlows[prev]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isFastCrossedOverVerifier =
|
||||
//
|
||||
conditions.mcFasts[curr] > conditions.mcVerifiers[curr] &&
|
||||
conditions.mcFasts[prev] <= conditions.mcVerifiers[prev]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isFastCrossedUnderVerifier =
|
||||
//
|
||||
conditions.mcFasts[curr] < conditions.mcVerifiers[curr] &&
|
||||
conditions.mcFasts[prev] >= conditions.mcVerifiers[prev]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isSlowCrossedOverVerifier =
|
||||
//
|
||||
conditions.mcSlows[curr] > conditions.mcVerifiers[curr] &&
|
||||
conditions.mcSlows[prev] <= conditions.mcVerifiers[prev]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
bool isSlowCrossedUnderVerifier =
|
||||
//
|
||||
conditions.mcSlows[curr] < conditions.mcVerifiers[curr] &&
|
||||
conditions.mcSlows[prev] >= conditions.mcVerifiers[prev]
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
conditions.isFastOverSlow = isFastOverSlow;
|
||||
conditions.isFastUnderSlow = isFastUnderSlow;
|
||||
@@ -2260,6 +2430,12 @@ public:
|
||||
conditions.isCloseUnderSlow = isCloseUnderSlow;
|
||||
conditions.isCloseOverVerifier = isCloseOverVerifier;
|
||||
conditions.isCloseUnderVerifier = isCloseUnderVerifier;
|
||||
conditions.isFastCrossedOverSlow = isFastCrossedOverSlow;
|
||||
conditions.isFastCrossedUnderSlow = isFastCrossedUnderSlow;
|
||||
conditions.isFastCrossedOverVerifier = isFastCrossedOverVerifier;
|
||||
conditions.isFastCrossedUnderVerifier = isFastCrossedUnderVerifier;
|
||||
conditions.isSlowCrossedOverVerifier = isSlowCrossedOverVerifier;
|
||||
conditions.isSlowCrossedUnderVerifier = isSlowCrossedUnderVerifier;
|
||||
|
||||
//
|
||||
// XICH ...
|
||||
|
||||
@@ -676,6 +676,18 @@ protected:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Trade Class Instance ...
|
||||
XSCTrade *mTrader;
|
||||
XSCAlert *mAlert;
|
||||
|
||||
//
|
||||
// Check in Test Mode or not ...
|
||||
bool mIsInTestMode;
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Signal Event Listeners ...
|
||||
void NotifyOnSignalEventHandlers(XSignal &signals[])
|
||||
@@ -1244,15 +1256,6 @@ private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Trade Class Instance ...
|
||||
XSCTrade *mTrader;
|
||||
XSCAlert *mAlert;
|
||||
|
||||
//
|
||||
// Check in Test Mode or not ...
|
||||
bool mIsInTestMode;
|
||||
|
||||
//
|
||||
// Signal Event Listeners ...
|
||||
TOnSignal mOnSignalEventHandlers[];
|
||||
|
||||
@@ -578,10 +578,6 @@ public:
|
||||
//
|
||||
// Init On Trade Context ...
|
||||
InitOnTradeContext();
|
||||
|
||||
//
|
||||
// Sync Position Infos ...
|
||||
SyncPositionInfos();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -1116,6 +1112,11 @@ public:
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Prepare Signal Comment ...
|
||||
string mSComment = mSignal.GenerateComment();
|
||||
mSignal.comment += mSComment;
|
||||
|
||||
//
|
||||
// Handle Market Execution ...
|
||||
if (mSignal.mode == X_ORDER_MODE_MARKET)
|
||||
@@ -1739,7 +1740,7 @@ public:
|
||||
|
||||
//
|
||||
// Check Position Open ...
|
||||
result = !IsOpen(ticket);
|
||||
result = IsOpen(ticket);
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
@@ -3240,63 +3241,6 @@ private:
|
||||
//
|
||||
// Position Info Collector ...
|
||||
|
||||
//
|
||||
XSCPositionInfoCollector mPositionInfoCollector; // Position Info Data Collector ...
|
||||
|
||||
//
|
||||
void SyncPositionInfos()
|
||||
{
|
||||
//
|
||||
// TODO: Complete this ...
|
||||
|
||||
//
|
||||
// Read All Stored Positions ...
|
||||
// XPositionInfo infos[];
|
||||
// int infosCount = mPositionInfoCollector.Collect(infos);
|
||||
|
||||
// //
|
||||
// // Clear Store ...
|
||||
// mPositionInfoCollector.Clear();
|
||||
|
||||
// //
|
||||
// XPosition positions[];
|
||||
// int positionsCount = GetPositions(positions);
|
||||
// if (positionsCount <= 0)
|
||||
// {
|
||||
// Clean(infos);
|
||||
// }
|
||||
|
||||
// //
|
||||
// // Now we Have to Find each Position Info inside Positions and Update them ...
|
||||
// XPositionInfo datas[];
|
||||
// for (int i = 0; i < infosCount; i++)
|
||||
// {
|
||||
// //
|
||||
// XPositionInfo iInfo = infos[i];
|
||||
|
||||
// //
|
||||
// // Check Positions Contains Specific ticket or not ...
|
||||
// for (int j = 0; j < positionsCount; j++)
|
||||
// {
|
||||
// //
|
||||
// XPosition jPosition = positions[j];
|
||||
|
||||
// //
|
||||
// if (jPosition.ticket != iInfo.ticket)
|
||||
// {
|
||||
// //
|
||||
// // this is a Position which is not listed in Collector ...
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //
|
||||
// // Now we have a Position which Listed Before in Collector ...
|
||||
// // we Have to Update it ...
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
|
||||
+18
-18
@@ -238,9 +238,9 @@ bool InitialEA()
|
||||
|
||||
//
|
||||
// XMC ...
|
||||
iDescriptor.inputs.mcInputs.showFastMa = false;
|
||||
iDescriptor.inputs.mcInputs.showSlowMa = false;
|
||||
iDescriptor.inputs.mcInputs.showVerifierMa = false;
|
||||
iDescriptor.inputs.mcInputs.showFastMa = true;
|
||||
iDescriptor.inputs.mcInputs.showSlowMa = true;
|
||||
iDescriptor.inputs.mcInputs.showVerifierMa = true;
|
||||
|
||||
//
|
||||
// XICH ...
|
||||
@@ -254,11 +254,11 @@ bool InitialEA()
|
||||
iDescriptor.inputs.ichInputs.showKijunSenNegative = false;
|
||||
|
||||
//
|
||||
// XSTR ...
|
||||
iDescriptor.inputs.cheInputs.showLongExit1Line = false;
|
||||
iDescriptor.inputs.cheInputs.showShortExit1Line = false;
|
||||
iDescriptor.inputs.cheInputs.showLongExit2Line = false;
|
||||
iDescriptor.inputs.cheInputs.showShortExit2Line = false;
|
||||
// XCHE ...
|
||||
iDescriptor.inputs.cheInputs.showLongExit1Line = true;
|
||||
iDescriptor.inputs.cheInputs.showShortExit1Line = true;
|
||||
iDescriptor.inputs.cheInputs.showLongExit2Line = true;
|
||||
iDescriptor.inputs.cheInputs.showShortExit2Line = true;
|
||||
|
||||
//
|
||||
// XPV ...
|
||||
@@ -274,14 +274,14 @@ bool InitialEA()
|
||||
//
|
||||
// XZG ...
|
||||
iDescriptor.inputs.zgInputs.showZigZag = false;
|
||||
iDescriptor.inputs.zgInputs.showPeaksAndVales = false;
|
||||
iDescriptor.inputs.zgInputs.showPeaksAndVales = true;
|
||||
|
||||
//
|
||||
// XDON ...
|
||||
iDescriptor.inputs.donInputs.showOpen = true;
|
||||
iDescriptor.inputs.donInputs.showHigh = true;
|
||||
iDescriptor.inputs.donInputs.showClose = true;
|
||||
iDescriptor.inputs.donInputs.showLow = true;
|
||||
iDescriptor.inputs.donInputs.showOpen = false;
|
||||
iDescriptor.inputs.donInputs.showHigh = false;
|
||||
iDescriptor.inputs.donInputs.showClose = false;
|
||||
iDescriptor.inputs.donInputs.showLow = false;
|
||||
|
||||
//
|
||||
// XSTR ...
|
||||
@@ -313,15 +313,15 @@ bool InitialEA()
|
||||
string fontName = "Arial";
|
||||
ENUM_ANCHOR_POINT fontAnchor = ANCHOR_LEFT_UPPER;
|
||||
|
||||
//
|
||||
//false
|
||||
// Hind Market ...
|
||||
iDescriptor.inputs.hMarketPeriod = NULL;
|
||||
iDescriptor.inputs.hMarketMethod = X_PERIOD_AUTO;
|
||||
iDescriptor.inputs.hMarketInputs.drawLabels = false;
|
||||
iDescriptor.inputs.hMarketInputs.drawCBar = true;
|
||||
iDescriptor.inputs.hMarketInputs.drawPBar = true;
|
||||
iDescriptor.inputs.hMarketInputs.drawCBarMid = true;
|
||||
iDescriptor.inputs.hMarketInputs.drawPBarMid = true;
|
||||
iDescriptor.inputs.hMarketInputs.drawCBar = false;
|
||||
iDescriptor.inputs.hMarketInputs.drawPBar = false;
|
||||
iDescriptor.inputs.hMarketInputs.drawCBarMid = false;
|
||||
iDescriptor.inputs.hMarketInputs.drawPBarMid = false;
|
||||
iDescriptor.inputs.hMarketInputs.cBarDrawSpecs.Default();
|
||||
iDescriptor.inputs.hMarketInputs.pBarDrawSpecs.Default();
|
||||
|
||||
|
||||
+225
-9
@@ -202,7 +202,7 @@ struct X5121ProviderDescriptor
|
||||
result = x5Provider.Init(
|
||||
this.x5Inputs //
|
||||
);
|
||||
if (result)
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
@@ -297,6 +297,125 @@ struct X5121ProviderDescriptor
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateScore(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
double x5BullishScore = 5;
|
||||
double x5BearishScore = 5;
|
||||
|
||||
//
|
||||
GenerateX5Score(
|
||||
x5BullishScore,
|
||||
x5BearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
double x121BullishScore = 5;
|
||||
double x121BearishScore = 5;
|
||||
|
||||
//
|
||||
GenerateX121Score(
|
||||
x121BullishScore,
|
||||
x121BearishScore //
|
||||
);
|
||||
|
||||
//
|
||||
bullishScore = x5BullishScore + x121BullishScore;
|
||||
bearishScore = x5BearishScore + x121BearishScore;
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateX5Score(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
x5Conditions.GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
void GenerateX121Score(
|
||||
double &bullishScore,
|
||||
double &bearishScore //
|
||||
)
|
||||
{
|
||||
//
|
||||
x121Conditions.GenerateScore(
|
||||
bullishScore,
|
||||
bearishScore //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateSummary(
|
||||
const bool onlySummary = false,
|
||||
bool ignoreFalseConditions = true //
|
||||
)
|
||||
{
|
||||
//
|
||||
string x5Str = GenerateX5Summary(
|
||||
onlySummary,
|
||||
ignoreFalseConditions //
|
||||
);
|
||||
|
||||
//
|
||||
string x121Str = GenerateX121Summary(
|
||||
onlySummary,
|
||||
ignoreFalseConditions //
|
||||
);
|
||||
|
||||
//
|
||||
string result =
|
||||
//
|
||||
x5Str + "\n" + x121Str
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateX5Summary(
|
||||
const bool onlySummary = false,
|
||||
bool ignoreFalseConditions = true //
|
||||
)
|
||||
{
|
||||
return x5Conditions.GenerateSummary(
|
||||
onlySummary,
|
||||
1,
|
||||
"\n",
|
||||
ignoreFalseConditions //
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateX121Summary(
|
||||
const bool onlySummary = false,
|
||||
bool ignoreFalseConditions = true //
|
||||
)
|
||||
{
|
||||
return x121Conditions.GenerateSummary(
|
||||
onlySummary,
|
||||
1,
|
||||
1.1,
|
||||
1.2,
|
||||
1.6,
|
||||
1.8,
|
||||
"\n",
|
||||
NULL,
|
||||
ignoreFalseConditions //
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -376,7 +495,7 @@ int OnInit()
|
||||
}
|
||||
|
||||
//
|
||||
TesterHideIndicators(true);
|
||||
// TesterHideIndicators(true);
|
||||
|
||||
//
|
||||
// Init Succeed ...
|
||||
@@ -830,15 +949,112 @@ int RequestForSignal(
|
||||
X5121ProviderDescriptor iDescriptor = x5121EAProviders[i];
|
||||
|
||||
//
|
||||
bool iHasSignal = iDescriptor.HasSignal(0);
|
||||
if (iHasSignal)
|
||||
{
|
||||
iDescriptor.x5Provider.GetMarketConditions(
|
||||
iDescriptor.x5Conditions //
|
||||
);
|
||||
|
||||
//
|
||||
iDescriptor.x121Provider.GetMarketConditions(
|
||||
iDescriptor.x121Conditions //
|
||||
);
|
||||
|
||||
//
|
||||
X5MarketConditions x5Conditions = iDescriptor.x5Conditions;
|
||||
X121MarketConditions x121Conditions = iDescriptor.x121Conditions;
|
||||
|
||||
//
|
||||
// Check For Long ...
|
||||
bool hasLong =
|
||||
//
|
||||
AddRef(
|
||||
iDescriptor.signal,
|
||||
signals //
|
||||
);
|
||||
(x121Conditions.hMarketConditions.isTrendSwitchedToBullish &&
|
||||
(x121Conditions.lMarketConditions.isTrendBullish &&
|
||||
x121Conditions.mMarketConditions.isTrendBullish &&
|
||||
x121Conditions.sMarketConditions.isTrendBullish &&
|
||||
x121Conditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(x121Conditions.lMarketConditions.isTrendSwitchedToBullish &&
|
||||
(x121Conditions.hMarketConditions.isTrendBullish &&
|
||||
x121Conditions.mMarketConditions.isTrendBullish &&
|
||||
x121Conditions.sMarketConditions.isTrendBullish &&
|
||||
x121Conditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(x121Conditions.mMarketConditions.isTrendSwitchedToBullish &&
|
||||
(x121Conditions.hMarketConditions.isTrendBullish &&
|
||||
x121Conditions.lMarketConditions.isTrendBullish &&
|
||||
x121Conditions.sMarketConditions.isTrendBullish &&
|
||||
x121Conditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(x121Conditions.sMarketConditions.isTrendSwitchedToBullish &&
|
||||
(x121Conditions.hMarketConditions.isTrendBullish &&
|
||||
x121Conditions.lMarketConditions.isTrendBullish &&
|
||||
x121Conditions.mMarketConditions.isTrendBullish &&
|
||||
x121Conditions.cMarketConditions.isTrendBullish))
|
||||
//
|
||||
||
|
||||
//
|
||||
(x121Conditions.cMarketConditions.isTrendSwitchedToBullish &&
|
||||
(x121Conditions.hMarketConditions.isTrendBullish &&
|
||||
x121Conditions.lMarketConditions.isTrendBullish &&
|
||||
x121Conditions.mMarketConditions.isTrendBullish &&
|
||||
x121Conditions.sMarketConditions.isTrendBullish))
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
// Check For Short ...
|
||||
bool hasShort =
|
||||
//
|
||||
false
|
||||
//
|
||||
;
|
||||
|
||||
if (hasLong)
|
||||
{
|
||||
Print("");
|
||||
}
|
||||
|
||||
//
|
||||
// bool iHasSignal = iDescriptor.HasSignal(0);
|
||||
// if (iHasSignal)
|
||||
// {
|
||||
// //
|
||||
// AddRef(
|
||||
// iDescriptor.signal,
|
||||
// signals //
|
||||
// );
|
||||
|
||||
// // //
|
||||
// // string conditionsStr = iDescriptor.GenerateSummary();
|
||||
// // Print(conditionsStr);
|
||||
|
||||
// //
|
||||
// double bullScore = 0;
|
||||
// double bearScore = 0;
|
||||
// iDescriptor.GenerateScore(
|
||||
// bullScore,
|
||||
// bearScore //
|
||||
// );
|
||||
|
||||
// //
|
||||
// Print(" ");
|
||||
// Print((IsLong(iDescriptor.signal.type) ? "Long" : "Short"));
|
||||
// Print(iDescriptor.signal.symbol, ",", ToString(iDescriptor.signal.period), ",", iDescriptor.signal.provider);
|
||||
// Print("========================");
|
||||
// Print("bullScore: ", bullScore);
|
||||
// Print("bearScore: ", bearScore);
|
||||
|
||||
// //
|
||||
// Print("");
|
||||
|
||||
// //
|
||||
// Print(iDescriptor.GenerateX121Summary());
|
||||
// }
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -263,7 +263,7 @@ public:
|
||||
|
||||
//
|
||||
// Upper ...
|
||||
|
||||
|
||||
//
|
||||
double GetUpperO(
|
||||
int barIndex // Bar Index
|
||||
@@ -316,7 +316,7 @@ public:
|
||||
|
||||
//
|
||||
// Lower ...
|
||||
|
||||
|
||||
//
|
||||
double GetLowerO(
|
||||
int barIndex // Bar Index
|
||||
@@ -372,7 +372,7 @@ public:
|
||||
|
||||
//
|
||||
// Upper ...
|
||||
|
||||
|
||||
//
|
||||
double GetUpperC(
|
||||
int barIndex // Bar Index
|
||||
@@ -425,7 +425,7 @@ public:
|
||||
|
||||
//
|
||||
// Lower ...
|
||||
|
||||
|
||||
//
|
||||
double GetLowerC(
|
||||
int barIndex // Bar Index
|
||||
@@ -481,7 +481,7 @@ public:
|
||||
|
||||
//
|
||||
// Upper ...
|
||||
|
||||
|
||||
//
|
||||
double GetUpperH(
|
||||
int barIndex // Bar Index
|
||||
@@ -534,7 +534,7 @@ public:
|
||||
|
||||
//
|
||||
// Lower ...
|
||||
|
||||
|
||||
//
|
||||
double GetLowerH(
|
||||
int barIndex // Bar Index
|
||||
@@ -590,7 +590,7 @@ public:
|
||||
|
||||
//
|
||||
// Upper ...
|
||||
|
||||
|
||||
//
|
||||
double GetUpperL(
|
||||
int barIndex // Bar Index
|
||||
@@ -643,7 +643,7 @@ public:
|
||||
|
||||
//
|
||||
// Lower ...
|
||||
|
||||
|
||||
//
|
||||
double GetLowerL(
|
||||
int barIndex // Bar Index
|
||||
@@ -694,6 +694,106 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
void GetUppers(
|
||||
double &result[],
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
Clean(result);
|
||||
|
||||
//
|
||||
double uo = GetUpperO(barIndex);
|
||||
double uc = GetUpperC(barIndex);
|
||||
double uh = GetUpperH(barIndex);
|
||||
double ul = GetUpperL(barIndex);
|
||||
|
||||
//
|
||||
Add(uo, result);
|
||||
Add(uc, result);
|
||||
Add(uh, result);
|
||||
Add(ul, result);
|
||||
}
|
||||
double GetMinUpper(
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
double values[];
|
||||
GetUppers(values);
|
||||
|
||||
//
|
||||
double result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
double GetMaxUpper(
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
double values[];
|
||||
GetUppers(values);
|
||||
|
||||
//
|
||||
double result = GetMax(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
void GetLowers(
|
||||
double &result[],
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
Clean(result);
|
||||
|
||||
//
|
||||
double lo = GetLowerO(barIndex);
|
||||
double lc = GetLowerC(barIndex);
|
||||
double lh = GetLowerH(barIndex);
|
||||
double ll = GetLowerL(barIndex);
|
||||
|
||||
//
|
||||
Add(lo, result);
|
||||
Add(lc, result);
|
||||
Add(lh, result);
|
||||
Add(ll, result);
|
||||
}
|
||||
double GetMinLower(
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
double values[];
|
||||
GetLowers(values);
|
||||
|
||||
//
|
||||
double result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
double GetMaxLower(
|
||||
int barIndex = 0 //
|
||||
)
|
||||
{
|
||||
//
|
||||
double values[];
|
||||
GetLowers(values);
|
||||
|
||||
//
|
||||
double result = GetMin(values);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
|
||||
@@ -2482,7 +2482,6 @@ bool IsSpecifiedValid(string value)
|
||||
return IsValid(value);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Validate a Date ...
|
||||
bool IsValid(datetime value)
|
||||
@@ -4586,6 +4585,12 @@ double GetMax(
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
if (count <= 0)
|
||||
{
|
||||
count = ArraySize(buffer);
|
||||
}
|
||||
|
||||
//
|
||||
T tmp[];
|
||||
int tmpCount = Copy(
|
||||
@@ -4635,6 +4640,12 @@ double GetMin(
|
||||
//
|
||||
double result = 0;
|
||||
|
||||
//
|
||||
if (count <= 0)
|
||||
{
|
||||
count = ArraySize(buffer);
|
||||
}
|
||||
|
||||
//
|
||||
T tmp[];
|
||||
int tmpCount = Copy(
|
||||
|
||||
+151
-423
@@ -311,15 +311,15 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareLong(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -340,15 +340,15 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareShort(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
ENUM_X_ORDER_MODES mMode, // Execution Mode
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -372,14 +372,14 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareMarketLong(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -399,14 +399,14 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareMarketShort(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -429,14 +429,14 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareStopLong(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -456,14 +456,14 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareStopShort(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -486,14 +486,14 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareLimitLong(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -513,14 +513,14 @@ struct XSignal
|
||||
|
||||
//
|
||||
bool PrepareLimitShort(
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
string mSymbol, // Trading Symbol
|
||||
string mProvider, // Signal Provider
|
||||
ENUM_TIMEFRAMES mPeriod, // Trading TimeFrame
|
||||
double mEntry, // Entry Price
|
||||
double mVolume, // Volume
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS mAction = X_SIGNAL_USE_NOTHING, // Signal Management Action
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
double sl = 0, // Stop Loss
|
||||
double tp = 0 // Take Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
@@ -2637,153 +2637,114 @@ struct XPositionPack
|
||||
};
|
||||
|
||||
//
|
||||
// Use for Manage Positions ...
|
||||
struct XPositionInfo
|
||||
// Check Position SL Trails Structure ...
|
||||
struct XTrail
|
||||
{
|
||||
//
|
||||
// Props ...
|
||||
ulong ticket; // Position Ticket
|
||||
|
||||
//
|
||||
|
||||
double tps[]; // Un Touched Tps ( not include regular TP ) / For Managing using XTrade Class ...
|
||||
double sls[]; // Un Touched Sls ( not include regular SL ) / For Managing using XTrade Class ...
|
||||
|
||||
//
|
||||
ENUM_X_SIGNAL_MANAGING_ACTIONS action; // Managing Action
|
||||
double profits[]; // Check Postion profit
|
||||
datetime times[]; // Last Times prfoit Checking
|
||||
ulong ticket; // Position Ticket ...
|
||||
ENUM_POSITION_TYPE type; // Type ...
|
||||
datetime time; // Trail Time ...
|
||||
double before; // SL Value Before Trailing ...
|
||||
double after; // SL Value After Trailing ...
|
||||
int level; // Number of Trails SL ...
|
||||
double profit; // Profit in SL Time ...
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
void XPositionInfo()
|
||||
XTrail()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
//
|
||||
// Fill from a Signal ...
|
||||
// The Signal must Executed ...
|
||||
bool BySignal(
|
||||
XSignal &mSignal // the Signal which need to use
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
Clean();
|
||||
|
||||
//
|
||||
result = mSignal.IsValid() && mSignal.IsExecuted() && mSignal.mode == X_ORDER_MODE_MARKET;
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
ticket = mSignal.positionId;
|
||||
action = mSignal.action;
|
||||
|
||||
//
|
||||
// Select TPS and SLS from signal ...
|
||||
|
||||
//
|
||||
double sl = 0;
|
||||
bool hasRegularSL = mSignal.RegularSL(sl);
|
||||
Copy(
|
||||
mSignal.sls,
|
||||
sls
|
||||
//
|
||||
);
|
||||
if (hasRegularSL)
|
||||
{
|
||||
//
|
||||
Remove(
|
||||
sl,
|
||||
sls
|
||||
//
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
double tp = 0;
|
||||
bool hasRegularTP = mSignal.RegularTP(tp);
|
||||
Copy(
|
||||
mSignal.tps,
|
||||
tps
|
||||
//
|
||||
);
|
||||
if (hasRegularTP)
|
||||
{
|
||||
//
|
||||
Remove(
|
||||
tp,
|
||||
tps
|
||||
//
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Fill from a Position ...
|
||||
bool ByPosition(
|
||||
XPosition &position // the Position which need to use
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
Clean();
|
||||
|
||||
//
|
||||
result = position.IsValid();
|
||||
if (!result)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
ticket = position.ticket;
|
||||
|
||||
//
|
||||
datetime time = TimeCurrent();
|
||||
|
||||
//
|
||||
Add(
|
||||
time,
|
||||
times
|
||||
//
|
||||
);
|
||||
Add(
|
||||
position.profit,
|
||||
profits
|
||||
//
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
bool Init(
|
||||
ulong mTicket, // Ticket
|
||||
ENUM_POSITION_TYPE mType, // Type
|
||||
double mProfit, // Profit
|
||||
double mBefore, // Before
|
||||
double mAfter // After
|
||||
)
|
||||
{
|
||||
//
|
||||
Clean();
|
||||
|
||||
//
|
||||
type = mType;
|
||||
after = mAfter;
|
||||
ticket = mTicket;
|
||||
before = mBefore;
|
||||
profit = mProfit;
|
||||
|
||||
//
|
||||
level++;
|
||||
|
||||
//
|
||||
time = TimeCurrent();
|
||||
|
||||
//
|
||||
return IsValid();
|
||||
}
|
||||
|
||||
//
|
||||
bool Update(
|
||||
double mSl, // new SL ...
|
||||
double mProfit // Profit
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
time = TimeCurrent();
|
||||
|
||||
//
|
||||
double cAfter = after;
|
||||
after = mSl;
|
||||
before = cAfter;
|
||||
profit = mProfit;
|
||||
|
||||
//
|
||||
level++;
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string GenerateTag()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
string ticketLevelStr = ToString(ticket) + "," + ToString(level);
|
||||
|
||||
//
|
||||
result = Surround(
|
||||
XSLTrailToken,
|
||||
ticketLevelStr //
|
||||
);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup ...
|
||||
void Clean()
|
||||
{
|
||||
//
|
||||
ticket = 0;
|
||||
|
||||
//
|
||||
Clean(tps);
|
||||
Clean(sls);
|
||||
Clean(times);
|
||||
Clean(profits);
|
||||
time = 0;
|
||||
before = 0;
|
||||
after = 0;
|
||||
level = 0;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -2793,125 +2754,18 @@ struct XPositionInfo
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result = NotEmpty(ticket) && ticket > 0;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Check this instance is Same os Given instance or not ...
|
||||
bool IsSameAs(
|
||||
const XPositionInfo &value // instance for Compare
|
||||
)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
ticket == value.ticket
|
||||
ticket > 0 &&
|
||||
time > 0 &&
|
||||
level > 0
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Find index in a Collection ...
|
||||
int FindIndex(
|
||||
const XPositionInfo &values[] // Collection to Find
|
||||
)
|
||||
{
|
||||
//
|
||||
return FindIndex(
|
||||
this,
|
||||
values
|
||||
//
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve Token ...
|
||||
string GetToken()
|
||||
{
|
||||
return GetToken(this);
|
||||
}
|
||||
|
||||
//
|
||||
bool IsModelValid()
|
||||
{
|
||||
return IsValid();
|
||||
}
|
||||
|
||||
//
|
||||
// Convert to String Representation
|
||||
string ToModelString()
|
||||
{
|
||||
//
|
||||
string result = NULL;
|
||||
|
||||
//
|
||||
if (!IsValid())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
string ticketStr = Surround(XTicketToken, ticket);
|
||||
string actionStr = Surround(XActionToken, action);
|
||||
//
|
||||
string tpsStr = SurroundArray(XTPToken, tps);
|
||||
string slsStr = SurroundArray(XSLToken, sls);
|
||||
string timesStr = SurroundArray(XTimeToken, times);
|
||||
string profitsStr = SurroundArray(XProfitToken, profits);
|
||||
|
||||
//
|
||||
result =
|
||||
//
|
||||
GetToken() + "[" +
|
||||
//
|
||||
ticketStr +
|
||||
actionStr +
|
||||
tpsStr +
|
||||
slsStr +
|
||||
timesStr +
|
||||
profitsStr +
|
||||
//
|
||||
"]"
|
||||
//
|
||||
;
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Parse and Fill from Given String Representation
|
||||
bool ParseModel(string value)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
ticket = ParseLongSurrounded(value, XTicketToken);
|
||||
action = ((ENUM_X_SIGNAL_MANAGING_ACTIONS)ParseIntSurrounded(value, XActionToken));
|
||||
|
||||
//
|
||||
ParseDoubleArraySurrounded(tps, value, XTPToken);
|
||||
ParseDoubleArraySurrounded(sls, value, XSLToken);
|
||||
ParseDoubleArraySurrounded(profits, value, XProfitToken);
|
||||
ParseTimeArraySurrounded(times, value, XTimeToken);
|
||||
|
||||
//
|
||||
result = IsValid();
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -3120,132 +2974,6 @@ private:
|
||||
// Tools ...
|
||||
};
|
||||
|
||||
//
|
||||
// Create a Position Info Data Collector ...
|
||||
class XSCPositionInfoCollector
|
||||
{
|
||||
//
|
||||
// Public ...
|
||||
public:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Constructor ...
|
||||
void XSCPositionInfoCollector()
|
||||
{
|
||||
//
|
||||
XSCDataCollector<XPositionInfo> mBase;
|
||||
mBase.Clear();
|
||||
}
|
||||
|
||||
//
|
||||
// Deconstructor ...
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Inheritanced Functions ...
|
||||
|
||||
//
|
||||
// Cleaning Store ...
|
||||
void Clear()
|
||||
{
|
||||
//
|
||||
XSCDataCollector<XPositionInfo> mBase;
|
||||
|
||||
//
|
||||
mBase.Clear();
|
||||
}
|
||||
|
||||
//
|
||||
// Collect All Store ...
|
||||
int Collect(XPositionInfo &result[])
|
||||
{
|
||||
//
|
||||
int mResult = 0;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionInfo> mBase;
|
||||
|
||||
//
|
||||
mResult = mBase.Collect(result);
|
||||
|
||||
//
|
||||
return mResult;
|
||||
}
|
||||
|
||||
//
|
||||
// Add Item To Store ...
|
||||
bool Add(XPositionInfo &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionInfo> mBase;
|
||||
|
||||
//
|
||||
result = mBase.Add(item);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Add Item(s) To Store ...
|
||||
int Add(XPositionInfo &items[])
|
||||
{
|
||||
//
|
||||
int result = 0;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionInfo> mBase;
|
||||
|
||||
//
|
||||
result = mBase.Add(items);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Remove an Item from Store ...
|
||||
bool Remove(XPositionInfo &item)
|
||||
{
|
||||
//
|
||||
bool result = false;
|
||||
|
||||
//
|
||||
XSCDataCollector<XPositionInfo> mBase;
|
||||
|
||||
//
|
||||
result = mBase.Remove(item);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Custom Functions ...
|
||||
|
||||
//
|
||||
// Protected ...
|
||||
protected:
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
//
|
||||
// Private ...
|
||||
private:
|
||||
//
|
||||
// Props ...
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
};
|
||||
|
||||
//
|
||||
// Tools ...
|
||||
|
||||
|
||||
Reference in New Issue
Block a user