last ...
This commit is contained in:
@@ -524,18 +524,6 @@ public:
|
|||||||
//
|
//
|
||||||
XSCZonesInput zInputs;
|
XSCZonesInput zInputs;
|
||||||
zInputs.numberOfZones = numberOfZones;
|
zInputs.numberOfZones = numberOfZones;
|
||||||
zInputs.AddLevelColor(
|
|
||||||
0.15,
|
|
||||||
clrYellow //
|
|
||||||
);
|
|
||||||
zInputs.AddLevelColor(
|
|
||||||
0.20,
|
|
||||||
clrOrange //
|
|
||||||
);
|
|
||||||
zInputs.AddLevelColor(
|
|
||||||
0.25,
|
|
||||||
clrRed //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
|||||||
@@ -1042,6 +1042,21 @@ public:
|
|||||||
mSave = value;
|
mSave = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool AllowSupport()
|
||||||
|
{
|
||||||
|
return mAllowSupport;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AllowSupport(bool value)
|
||||||
|
{
|
||||||
|
mAllowSupport = value;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Trailling Stop ...
|
// Trailling Stop ...
|
||||||
|
|
||||||
@@ -1625,6 +1640,15 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Only Trail Positions which they Hasnt any Support ...
|
||||||
|
bool hasSupport = mTrader.HasSupport(iPosition.ticket);
|
||||||
|
result = !hasSupport;
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find Positin Info Index ...
|
// Find Positin Info Index ...
|
||||||
int idx = FindIndex(iPosition.ticket);
|
int idx = FindIndex(iPosition.ticket);
|
||||||
@@ -1715,6 +1739,686 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int RequestForSupport(
|
||||||
|
XSignal &signals[],
|
||||||
|
XSCX121SetupCycles *&setups[] // Number of Setups
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(signals);
|
||||||
|
|
||||||
|
//
|
||||||
|
double supportDistance = 50;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!AllowSupport())
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Validate Setups Count ...
|
||||||
|
int setupsCount = ArraySize(setups);
|
||||||
|
if (!IsValidSize(setupsCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Implement Supporting Mechanism ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Extracting In Drawdown Positions ...
|
||||||
|
XPosition positions[];
|
||||||
|
int positionsCount = mTrader.GetInDrawdownPositions(
|
||||||
|
positions //
|
||||||
|
);
|
||||||
|
if (!IsValidSize(positionsCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
X121SignalGenerator signalGenerator;
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < positionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iPosition = positions[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Position is not Support Position ...
|
||||||
|
bool isSupport = IsSupport(iPosition.comment);
|
||||||
|
if (isSupport)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find Related Setp ...
|
||||||
|
int idx = FindSetupIndex(
|
||||||
|
iPosition.symbol,
|
||||||
|
setups //
|
||||||
|
);
|
||||||
|
if (!IsValidIndex(idx))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check Position must atleast 20 Point in drawdown ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double onePointPrice = PointToPrice(
|
||||||
|
1,
|
||||||
|
iPosition.symbol //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
double iExitPrice = GetExit(
|
||||||
|
iPosition.symbol,
|
||||||
|
iPosition.type //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
double priceDiff = MathAbs(iPosition.entry - iExitPrice);
|
||||||
|
double priceDiffPoints = priceDiff / onePointPrice;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isFarEnough = priceDiffPoints >= supportDistance;
|
||||||
|
if (!isFarEnough)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now Check Position SUpports ...
|
||||||
|
XPosition iSupports[];
|
||||||
|
int iSupportsCount = mTrader.GetSupports(
|
||||||
|
iPosition.ticket,
|
||||||
|
iSupports //
|
||||||
|
);
|
||||||
|
bool isFirst = !IsValidSize(iSupportsCount);
|
||||||
|
bool canSupport = isFirst; // || iSupportsCount < 3;
|
||||||
|
if (!canSupport)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now Check Signals For not Exists ...
|
||||||
|
int signalsCount = ArraySize(signals);
|
||||||
|
if (IsValidSize(signalsCount))
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isInserted = false;
|
||||||
|
for (int j = 0; j < signalsCount; j++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
isInserted = signals[j].positionId == iPosition.ticket;
|
||||||
|
if (isInserted)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isInserted)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// First Try to Get Market State ...
|
||||||
|
|
||||||
|
//
|
||||||
|
double bullishScore = 0;
|
||||||
|
double bearishScore = 0;
|
||||||
|
double tmpBullishScore = 0;
|
||||||
|
double tmpBearishScore = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Max Verifications is 11 ...
|
||||||
|
int reqValidation = 6;
|
||||||
|
int longVerifications = 0;
|
||||||
|
int shortVerifications = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Pushers ...
|
||||||
|
int longPushers = 0;
|
||||||
|
int shortPushers = 0;
|
||||||
|
int tmpLongPushers = 0;
|
||||||
|
int tmpShortPushers = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
string tmpProvider;
|
||||||
|
string longProviders[];
|
||||||
|
string shortProviders[];
|
||||||
|
|
||||||
|
//
|
||||||
|
double volumeOSC = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Current ...
|
||||||
|
X121SetupConditions cConditions;
|
||||||
|
bool cHasConditions = setups[idx].GetConditions(
|
||||||
|
cConditions,
|
||||||
|
X_MARKET_CYCLE_UNKNOWN //
|
||||||
|
);
|
||||||
|
if (!cHasConditions)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
bool isCValidForLong = signalGenerator.IsConditionsValidForLong(
|
||||||
|
cConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isCValidForLong)
|
||||||
|
{
|
||||||
|
longVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool isCValidForShort = signalGenerator.IsConditionsValidForShort(
|
||||||
|
cConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isCValidForShort)
|
||||||
|
{
|
||||||
|
shortVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool cHasLongConditions = signalGenerator.HasLongConditions(
|
||||||
|
cConditions,
|
||||||
|
tmpLongPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (cHasLongConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
longProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
longPushers += tmpLongPushers;
|
||||||
|
}
|
||||||
|
bool cHasShortConditions = signalGenerator.HasShortConditions(
|
||||||
|
cConditions,
|
||||||
|
tmpShortPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (cHasShortConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
shortProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
shortPushers += tmpShortPushers;
|
||||||
|
}
|
||||||
|
volumeOSC += cConditions.vlmConditions.volume[1];
|
||||||
|
cConditions.GenerateScore(
|
||||||
|
tmpBullishScore,
|
||||||
|
tmpBearishScore //
|
||||||
|
);
|
||||||
|
bullishScore += tmpBullishScore;
|
||||||
|
bearishScore += tmpBearishScore;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short ...
|
||||||
|
X121SetupConditions sConditions;
|
||||||
|
bool sHasConditions = setups[idx].GetConditions(
|
||||||
|
sConditions,
|
||||||
|
X_MARKET_CYCLE_SHORT //
|
||||||
|
);
|
||||||
|
if (!sHasConditions)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
bool isSValidForLong = signalGenerator.IsConditionsValidForLong(
|
||||||
|
sConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isSValidForLong)
|
||||||
|
{
|
||||||
|
longVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool isSValidForShort = signalGenerator.IsConditionsValidForShort(
|
||||||
|
sConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isSValidForShort)
|
||||||
|
{
|
||||||
|
shortVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool sHasLongConditions = signalGenerator.HasLongConditions(
|
||||||
|
sConditions,
|
||||||
|
tmpLongPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (sHasLongConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
longProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
longPushers += tmpLongPushers;
|
||||||
|
}
|
||||||
|
bool sHasShortConditions = signalGenerator.HasShortConditions(
|
||||||
|
sConditions,
|
||||||
|
tmpShortPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (sHasShortConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
shortProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
shortPushers += tmpShortPushers;
|
||||||
|
}
|
||||||
|
volumeOSC += sConditions.vlmConditions.volume[1];
|
||||||
|
sConditions.GenerateScore(
|
||||||
|
tmpBullishScore,
|
||||||
|
tmpBearishScore //
|
||||||
|
);
|
||||||
|
bullishScore += tmpBullishScore;
|
||||||
|
bearishScore += tmpBearishScore;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Medium ...
|
||||||
|
X121SetupConditions mConditions;
|
||||||
|
bool mHasConditions = setups[idx].GetConditions(
|
||||||
|
mConditions,
|
||||||
|
X_MARKET_CYCLE_MEDIUM //
|
||||||
|
);
|
||||||
|
if (!mHasConditions)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
XSCZones *mZones = setups[idx].GetZones(
|
||||||
|
X_MARKET_CYCLE_MEDIUM //
|
||||||
|
);
|
||||||
|
bool isMValidForLong = signalGenerator.IsConditionsValidForLong(
|
||||||
|
mConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isMValidForLong)
|
||||||
|
{
|
||||||
|
longVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool isMValidForShort = signalGenerator.IsConditionsValidForShort(
|
||||||
|
mConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isMValidForShort)
|
||||||
|
{
|
||||||
|
shortVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool mHasLongConditions = signalGenerator.HasLongConditions(
|
||||||
|
mConditions,
|
||||||
|
tmpLongPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (mHasLongConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
longProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
longPushers += tmpLongPushers;
|
||||||
|
}
|
||||||
|
bool mHasShortConditions = signalGenerator.HasShortConditions(
|
||||||
|
mConditions,
|
||||||
|
tmpShortPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (mHasShortConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
shortProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
shortPushers += tmpShortPushers;
|
||||||
|
}
|
||||||
|
volumeOSC += mConditions.vlmConditions.volume[1];
|
||||||
|
mConditions.GenerateScore(
|
||||||
|
tmpBullishScore,
|
||||||
|
tmpBearishScore //
|
||||||
|
);
|
||||||
|
bullishScore += tmpBullishScore;
|
||||||
|
bearishScore += tmpBearishScore;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long ...
|
||||||
|
X121SetupConditions lConditions;
|
||||||
|
bool lHasConditions = setups[idx].GetConditions(
|
||||||
|
lConditions,
|
||||||
|
X_MARKET_CYCLE_LONG //
|
||||||
|
);
|
||||||
|
if (!lHasConditions)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
XSCZones *lZones = setups[idx].GetZones(
|
||||||
|
X_MARKET_CYCLE_LONG //
|
||||||
|
);
|
||||||
|
bool isLValidForLong = signalGenerator.IsConditionsValidForLong(
|
||||||
|
lConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isLValidForLong)
|
||||||
|
{
|
||||||
|
longVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool isLValidForShort = signalGenerator.IsConditionsValidForShort(
|
||||||
|
lConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isLValidForShort)
|
||||||
|
{
|
||||||
|
shortVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool lHasLongConditions = signalGenerator.HasLongConditions(
|
||||||
|
lConditions,
|
||||||
|
tmpLongPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (lHasLongConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
longProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
longPushers += tmpLongPushers;
|
||||||
|
}
|
||||||
|
bool lHasShortConditions = signalGenerator.HasShortConditions(
|
||||||
|
lConditions,
|
||||||
|
tmpShortPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (lHasShortConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
shortProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
shortPushers += tmpShortPushers;
|
||||||
|
}
|
||||||
|
volumeOSC += lConditions.vlmConditions.volume[1];
|
||||||
|
lConditions.GenerateScore(
|
||||||
|
tmpBullishScore,
|
||||||
|
tmpBearishScore //
|
||||||
|
);
|
||||||
|
bullishScore += tmpBullishScore;
|
||||||
|
bearishScore += tmpBearishScore;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hind ...
|
||||||
|
X121SetupConditions hConditions;
|
||||||
|
bool hHasConditions = setups[idx].GetConditions(
|
||||||
|
hConditions,
|
||||||
|
X_MARKET_CYCLE_HIND //
|
||||||
|
);
|
||||||
|
if (!hHasConditions)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
XSCZones *hZones = setups[idx].GetZones(
|
||||||
|
X_MARKET_CYCLE_HIND //
|
||||||
|
);
|
||||||
|
bool isHValidForLong = signalGenerator.IsConditionsValidForLong(
|
||||||
|
hConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isHValidForLong)
|
||||||
|
{
|
||||||
|
longVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool isHValidForShort = signalGenerator.IsConditionsValidForShort(
|
||||||
|
hConditions,
|
||||||
|
reqValidation //
|
||||||
|
);
|
||||||
|
if (isHValidForShort)
|
||||||
|
{
|
||||||
|
shortVerifications += reqValidation;
|
||||||
|
}
|
||||||
|
bool hHasLongConditions = signalGenerator.HasLongConditions(
|
||||||
|
hConditions,
|
||||||
|
tmpLongPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (hHasLongConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
longProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
longPushers += tmpLongPushers;
|
||||||
|
}
|
||||||
|
bool hHasShortConditions = signalGenerator.HasShortConditions(
|
||||||
|
hConditions,
|
||||||
|
tmpShortPushers,
|
||||||
|
tmpProvider //
|
||||||
|
);
|
||||||
|
if (hHasShortConditions)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddSpecific(
|
||||||
|
tmpProvider,
|
||||||
|
shortProviders //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
shortPushers += tmpShortPushers;
|
||||||
|
}
|
||||||
|
volumeOSC += hConditions.vlmConditions.volume[1];
|
||||||
|
hConditions.GenerateScore(
|
||||||
|
tmpBullishScore,
|
||||||
|
tmpBearishScore //
|
||||||
|
);
|
||||||
|
bullishScore += tmpBullishScore;
|
||||||
|
bearishScore += tmpBearishScore;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now We Have all required Data to Decide What Supports for
|
||||||
|
// Specified In DrawDown Position ...
|
||||||
|
|
||||||
|
//
|
||||||
|
XSignal tmpSignal;
|
||||||
|
tmpSignal.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
double longEntry = GetEntry(
|
||||||
|
iPosition.symbol,
|
||||||
|
POSITION_TYPE_BUY //
|
||||||
|
);
|
||||||
|
double shortEntry = GetEntry(
|
||||||
|
iPosition.symbol,
|
||||||
|
POSITION_TYPE_SELL //
|
||||||
|
);
|
||||||
|
double mVolume = iPosition.volume * 2;
|
||||||
|
double mSL = 0;
|
||||||
|
double mTP = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isLong = IsLong(iPosition.type);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Long Support ...
|
||||||
|
bool canLongSupport =
|
||||||
|
//
|
||||||
|
volumeOSC > 5 &&
|
||||||
|
bullishScore > bearishScore &&
|
||||||
|
ArraySize(longProviders) >= 2 &&
|
||||||
|
bearishScore < bullishScore / 3.5 &&
|
||||||
|
longVerifications > reqValidation * 3
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (canLongSupport)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isPrepared = tmpSignal.Prepare(
|
||||||
|
iPosition.symbol,
|
||||||
|
iPosition.provider,
|
||||||
|
iPosition.period,
|
||||||
|
POSITION_TYPE_BUY,
|
||||||
|
X_ORDER_MODE_MARKET,
|
||||||
|
longEntry,
|
||||||
|
mVolume //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isPrepared)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
tmpSignal.positionId = iPosition.ticket;
|
||||||
|
string comment = GenerateSupportTag(iPosition.ticket);
|
||||||
|
tmpSignal.comment = comment;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
tmpSignal,
|
||||||
|
signals //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
tmpSignal.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Short Support ...
|
||||||
|
bool canShortSupport =
|
||||||
|
//
|
||||||
|
volumeOSC < -5 &&
|
||||||
|
bearishScore > bullishScore &&
|
||||||
|
ArraySize(shortProviders) >= 2 &&
|
||||||
|
bullishScore < bearishScore / 3.5 &&
|
||||||
|
shortVerifications > reqValidation * 3
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (canShortSupport)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool isPrepared = tmpSignal.Prepare(
|
||||||
|
iPosition.symbol,
|
||||||
|
iPosition.provider,
|
||||||
|
iPosition.period,
|
||||||
|
POSITION_TYPE_SELL,
|
||||||
|
X_ORDER_MODE_MARKET,
|
||||||
|
shortEntry,
|
||||||
|
mVolume //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
if (isPrepared)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
tmpSignal.positionId = iPosition.ticket;
|
||||||
|
string comment = GenerateSupportTag(iPosition.ticket);
|
||||||
|
tmpSignal.comment = comment;
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
tmpSignal,
|
||||||
|
signals //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
tmpSignal.Clean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// If no Support Presents ...
|
||||||
|
if (!canLongSupport && !canShortSupport)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// RemoveDraws("MED");
|
||||||
|
// RemoveDraws("LON");
|
||||||
|
// RemoveDraws("HND");
|
||||||
|
AddHotLevelsToZones(mZones);
|
||||||
|
AddHotLevelsToZones(lZones);
|
||||||
|
AddHotLevelsToZones(hZones);
|
||||||
|
|
||||||
|
//
|
||||||
|
// bool isDrawn = mZones.DrawZones(0, "MED");
|
||||||
|
// if (isDrawn)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isDrawn = false;
|
||||||
|
// RemoveDraws("MED");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isDrawn = lZones.DrawZones(0, "LON");
|
||||||
|
// if (isDrawn)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isDrawn = false;
|
||||||
|
// RemoveDraws("LON");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isDrawn = hZones.DrawZones(0, "HND");
|
||||||
|
// if (isDrawn)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isDrawn = false;
|
||||||
|
// RemoveDraws("HND");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //
|
||||||
|
// isDrawn = mZones.DrawZones(0, "MED");
|
||||||
|
// isDrawn = lZones.DrawZones(0, "LON");
|
||||||
|
// isDrawn = hZones.DrawZones(0, "HND");
|
||||||
|
// if (isDrawn)
|
||||||
|
// {
|
||||||
|
// //
|
||||||
|
// isDrawn = false;
|
||||||
|
// // RemoveDraws("MED");
|
||||||
|
// // RemoveDraws("LON");
|
||||||
|
// // RemoveDraws("HND");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(signals);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
int RequestForGrid(XSignal &signals[])
|
int RequestForGrid(XSignal &signals[])
|
||||||
{
|
{
|
||||||
@@ -1817,51 +2521,6 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
int RequestForProtect(XSignal &signals[])
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Grid ...
|
|
||||||
XSignal grids[];
|
|
||||||
int gridsCount = RequestForGrid(grids);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Recovery ...
|
|
||||||
XSignal recoveries[];
|
|
||||||
int recoveriesCount = RequestForRecovery(recoveries);
|
|
||||||
|
|
||||||
//
|
|
||||||
Clean(signals);
|
|
||||||
|
|
||||||
//
|
|
||||||
if (IsValidSize(gridsCount))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
Copy(
|
|
||||||
grids,
|
|
||||||
signals,
|
|
||||||
false //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (IsValidSize(recoveriesCount))
|
|
||||||
{
|
|
||||||
//
|
|
||||||
Copy(
|
|
||||||
recoveries,
|
|
||||||
signals,
|
|
||||||
false //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
int result = ArraySize(signals);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sync ...
|
// Sync ...
|
||||||
void Sync()
|
void Sync()
|
||||||
@@ -1949,9 +2608,13 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Supports ...
|
||||||
|
bool mAllowSupport; // Allow Support Signals
|
||||||
|
|
||||||
//
|
//
|
||||||
// Stop Trailling ...
|
// Stop Trailling ...
|
||||||
bool mAllowTrailStop; // Enable Trailling Stop Losses
|
bool mAllowTrailStop; // Enable Trailling Stop Losses
|
||||||
double mFirstTrailDistance; // Start Trailling Distance
|
double mFirstTrailDistance; // Start Trailling Distance
|
||||||
double mFirstTrailPoint; // First Stop Trail
|
double mFirstTrailPoint; // First Stop Trail
|
||||||
double mNextTrailDistance; // Next Trailling Distance
|
double mNextTrailDistance; // Next Trailling Distance
|
||||||
@@ -1968,6 +2631,57 @@ protected:
|
|||||||
bool mAllowRecovery; // Use Recovery System to Recovery Positions
|
bool mAllowRecovery; // Use Recovery System to Recovery Positions
|
||||||
double mRecoveryDistance; // Recovery System Distance
|
double mRecoveryDistance; // Recovery System Distance
|
||||||
double mRecoveryVolumeMultiplier; // Recovery System Volume Multiplier
|
double mRecoveryVolumeMultiplier; // Recovery System Volume Multiplier
|
||||||
|
|
||||||
|
//
|
||||||
|
int FindSetupIndex(
|
||||||
|
string symbol,
|
||||||
|
XSCX121SetupCycles *&setups[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
if (!IsValid(symbol))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < ArraySize(setups); i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
if (setups[i].GetSymbol() == symbol)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
result = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void AddHotLevelsToZones(
|
||||||
|
XSCZones *zones //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
zones.AddLevelColor(
|
||||||
|
0.25,
|
||||||
|
clrRed //
|
||||||
|
);
|
||||||
|
zones.AddLevelColor(
|
||||||
|
0.20,
|
||||||
|
clrOrange //
|
||||||
|
);
|
||||||
|
zones.AddLevelColor(
|
||||||
|
0.15,
|
||||||
|
clrYellow //
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2249,15 +2963,18 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
bool UseSupport()
|
// Support ...
|
||||||
|
|
||||||
|
//
|
||||||
|
bool AllowSupport()
|
||||||
{
|
{
|
||||||
return mUseSupport;
|
return mTradeInfoHandler.AllowSupport();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
void UseSupport(bool value)
|
void AllowSupport(bool value)
|
||||||
{
|
{
|
||||||
mUseSupport = value;
|
mTradeInfoHandler.AllowSupport(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3465,7 +4182,7 @@ private:
|
|||||||
//
|
//
|
||||||
bool EnableProtection()
|
bool EnableProtection()
|
||||||
{
|
{
|
||||||
return EnableGrid() || EnableRecovery() || EnableTrailling();
|
return EnableGrid() || EnableRecovery() || EnableTrailling() || AllowSupport();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3708,7 +4425,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Handle Trailling ...
|
// Trailling ...
|
||||||
if (EnableTrailling())
|
if (EnableTrailling())
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -3724,14 +4441,63 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
XSignal signals[];
|
// Support ...
|
||||||
int signalsCount = mTradeInfoHandler
|
if (AllowSupport())
|
||||||
.RequestForProtect(signals);
|
{
|
||||||
if (!IsValidSize(signalsCount))
|
//
|
||||||
|
XSignal supports[];
|
||||||
|
int supportsCount = mTradeInfoHandler.RequestForSupport(
|
||||||
|
supports,
|
||||||
|
mSetups //
|
||||||
|
);
|
||||||
|
if (IsValidSize(supportsCount))
|
||||||
|
{
|
||||||
|
EQMExecuteSignals(supports);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Grid ...
|
||||||
|
if (EnableGrid())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XSignal signals[];
|
||||||
|
int signalsCount = mTradeInfoHandler
|
||||||
|
.RequestForGrid(signals);
|
||||||
|
if (IsValidSize(signalsCount))
|
||||||
|
{
|
||||||
|
EQMExecuteSignals(signals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Recovery ...
|
||||||
|
if (EnableRecovery())
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XSignal signals[];
|
||||||
|
int signalsCount = mTradeInfoHandler
|
||||||
|
.RequestForRecovery(signals);
|
||||||
|
if (IsValidSize(signalsCount))
|
||||||
|
{
|
||||||
|
EQMExecuteSignals(signals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void EQMExecuteSignals(
|
||||||
|
XSignal &signals[] //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int signalsCount = ArraySize(signals);
|
||||||
|
if (!IsValidSize(signals))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
//
|
//
|
||||||
// Execute Supports ...
|
// Execute Supports ...
|
||||||
ENUM_X_SIGNAL_EXECUTION_RESULT states[];
|
ENUM_X_SIGNAL_EXECUTION_RESULT states[];
|
||||||
@@ -3742,7 +4508,9 @@ private:
|
|||||||
);
|
);
|
||||||
if (executed != signalsCount)
|
if (executed != signalsCount)
|
||||||
{
|
{
|
||||||
Print("Error On Executing Support Signal ...");
|
//
|
||||||
|
// TODO: Dow What We Want ...
|
||||||
|
// Print("Error On Executing Support Signal ...");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -286,6 +286,20 @@ public:
|
|||||||
return Init(inputs);
|
return Init(inputs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Add Specified Level/Color ...
|
||||||
|
void AddLevelColor(
|
||||||
|
double level,
|
||||||
|
color clr //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
mInputs.AddLevelColor(
|
||||||
|
level,
|
||||||
|
clr //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
void Calculate()
|
void Calculate()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1093,7 +1093,7 @@ protected:
|
|||||||
//
|
//
|
||||||
// Check At Least One Support Positions Open For Hedging ...
|
// Check At Least One Support Positions Open For Hedging ...
|
||||||
XPosition supports[];
|
XPosition supports[];
|
||||||
int supportsCount = ExtractSupportPositions(
|
int supportsCount = ExtractSupports(
|
||||||
positions,
|
positions,
|
||||||
supports //
|
supports //
|
||||||
);
|
);
|
||||||
|
|||||||
+211
-317
@@ -2919,332 +2919,257 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XPosition Pack ...
|
// Support Functions ...
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extract specific Positions Pack ...
|
// Check a Position has Support or not ...
|
||||||
// in this senario there is no need to Position exists itself ...
|
bool HasSupport(
|
||||||
bool GetPositionPack(
|
ulong ticket,
|
||||||
ulong ticket, // Specified Positions Ticket
|
bool forceOpen = true //
|
||||||
string symbol, // Specified Position Symbol
|
|
||||||
ENUM_TIMEFRAMES period, // Specified Position Period
|
|
||||||
XPositionPack &pack // Hold Result
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
//
|
//
|
||||||
pack.Clean();
|
result = ticket > 0;
|
||||||
|
|
||||||
//
|
|
||||||
XPosition position;
|
|
||||||
bool hasPosition = GetPosition(
|
|
||||||
ticket,
|
|
||||||
position
|
|
||||||
//
|
|
||||||
);
|
|
||||||
if (hasPosition)
|
|
||||||
{
|
|
||||||
pack.position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
XOrder supportOrders[];
|
|
||||||
XPosition supportPositions[];
|
|
||||||
|
|
||||||
//
|
|
||||||
XOrder orders[];
|
|
||||||
GetOrders(
|
|
||||||
orders,
|
|
||||||
symbol, // Specified Symbol
|
|
||||||
NULL, // All Providers
|
|
||||||
period, // Specified Period
|
|
||||||
NULL, // All Types
|
|
||||||
ORDER_STATE_PLACED, // Just UnTriggered Orders
|
|
||||||
true // Filter by Magic
|
|
||||||
);
|
|
||||||
int ordersCount = ArraySize(orders);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Select Orders ...
|
|
||||||
if (ordersCount > 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
for (int i = 0; i < ordersCount; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XOrder iOrder = orders[i];
|
|
||||||
|
|
||||||
//
|
|
||||||
// Retrieve Order Supported Ticket ...
|
|
||||||
ulong parentTicket = ExtractSupportedTicket(iOrder.comment);
|
|
||||||
if (NotEmpty(parentTicket) && parentTicket == ticket)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
iOrder,
|
|
||||||
supportOrders
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
int supportOrdersCount = ArraySize(supportOrders);
|
|
||||||
if (supportOrdersCount > 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
pack.supportOrdersCount = supportOrdersCount;
|
|
||||||
|
|
||||||
//
|
|
||||||
Copy(
|
|
||||||
supportOrders,
|
|
||||||
pack.supportOrders);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
XPosition positions[];
|
|
||||||
GetPositions(
|
|
||||||
positions,
|
|
||||||
symbol, // Specified Symbol ...
|
|
||||||
NULL, // All Providers ...
|
|
||||||
period // Specified Period ...
|
|
||||||
);
|
|
||||||
int positionsCount = ArraySize(positions);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Select Positions ...
|
|
||||||
if (positionsCount > 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
for (int i = 0; i < positionsCount; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XPosition iPosition = positions[i];
|
|
||||||
|
|
||||||
//
|
|
||||||
ulong parentTicket = ExtractSupportedTicket(iPosition.comment);
|
|
||||||
if (NotEmpty(parentTicket) && parentTicket == ticket)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
iPosition,
|
|
||||||
supportPositions
|
|
||||||
//
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
int supportPositionsCount = ArraySize(supportPositions);
|
|
||||||
if (supportPositionsCount > 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
pack.supportPositionsCount = supportPositionsCount;
|
|
||||||
|
|
||||||
//
|
|
||||||
Copy(
|
|
||||||
supportPositions,
|
|
||||||
pack.supportPositions);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result = pack.IsValid();
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Close Position Pack ...
|
|
||||||
bool ClosePositionPack(
|
|
||||||
XPositionPack &pack, // Specified Position Pack
|
|
||||||
string comment, // Specified Close Comment
|
|
||||||
bool inProfit = false, // if it's true only close Pack if in profit
|
|
||||||
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
|
||||||
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
ulong ticket = pack.ticket;
|
|
||||||
|
|
||||||
//
|
|
||||||
XPosition positions[];
|
|
||||||
|
|
||||||
//
|
|
||||||
XPosition pPosition;
|
|
||||||
result = GetPosition(
|
|
||||||
ticket,
|
|
||||||
pPosition //
|
|
||||||
);
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
pPosition,
|
|
||||||
positions //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
if (pack.supportPositionsCount > 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
for (int i = 0; i < pack.supportPositionsCount; i++)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
XPosition iPosition = pack.supportPositions[i];
|
|
||||||
|
|
||||||
//
|
|
||||||
AddRef(
|
|
||||||
iPosition,
|
|
||||||
positions //
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Force Close ...
|
|
||||||
if (!inProfit)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
int closed = Close(
|
|
||||||
positions,
|
|
||||||
comment //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
int cancelled = 0;
|
|
||||||
if (pack.supportOrdersCount > 0)
|
|
||||||
{
|
|
||||||
cancelled = CancelOrders(pack.supportOrders);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result = (closed + cancelled) == (pack.supportPositionsCount + pack.supportOrdersCount + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool canHedge = SpecifiedIsPositionsReadyForHedge(
|
|
||||||
positions,
|
|
||||||
minProfitPerTrade,
|
|
||||||
minProfitPerVolumeFactor //
|
|
||||||
);
|
|
||||||
if (canHedge)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
int closed = Close(
|
|
||||||
positions,
|
|
||||||
comment //
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
int cancelled = 0;
|
|
||||||
if (pack.supportOrdersCount > 0)
|
|
||||||
{
|
|
||||||
cancelled = CancelOrders(pack.supportOrders);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
result = (closed + cancelled) == (pack.supportPositionsCount + pack.supportOrdersCount + 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
bool ClosePositionPack(
|
|
||||||
ulong ticket, // Specified Position Pack
|
|
||||||
string symbol, // Specified Position Symbol
|
|
||||||
ENUM_TIMEFRAMES period, // Specified Position Period
|
|
||||||
string comment, // Specified Close Comment
|
|
||||||
bool inProfit = false, // if it's true only close Pack if in profit
|
|
||||||
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
|
||||||
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
XPositionPack pack;
|
|
||||||
result = GetPositionPack(
|
|
||||||
ticket,
|
|
||||||
symbol,
|
|
||||||
period,
|
|
||||||
pack //
|
|
||||||
);
|
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
result = ClosePositionPack(
|
if (forceOpen)
|
||||||
pack,
|
{
|
||||||
comment,
|
//
|
||||||
inProfit,
|
result = IsOpen(ticket);
|
||||||
minProfitPerTrade,
|
if (!result)
|
||||||
minProfitPerVolumeFactor //
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XPosition positions[];
|
||||||
|
int positionsCount = GetPositions(positions);
|
||||||
|
result = IsValidSize(positionsCount);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Extract Support Positions ...
|
||||||
|
XPosition supports[];
|
||||||
|
int supportsCount = ExtractSupports(
|
||||||
|
positions,
|
||||||
|
supports //
|
||||||
);
|
);
|
||||||
|
result = IsValidSize(supportsCount);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Loop Through Supports ...
|
||||||
|
for (int i = 0; i < supportsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iSupport = supports[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
ulong supportedTicket = ExtractSupportedTicket(iSupport.comment);
|
||||||
|
ulong eqmSupportedTicket = ExtractEQMSupportedTicket(iSupport.comment);
|
||||||
|
|
||||||
|
//
|
||||||
|
result =
|
||||||
|
//
|
||||||
|
(supportedTicket > 0 && ticket == supportedTicket)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
(eqmSupportedTicket > 0 && ticket == eqmSupportedTicket)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Close Positions Pack ...
|
// Retrieve Specific Position's Supports ...
|
||||||
int ClosePositionsPack(
|
int GetSupports(
|
||||||
XPosition &positions[], // Positions ...
|
ulong ticket,
|
||||||
string comment, // Specified Close Comment
|
XPosition &dest[], // Result ...
|
||||||
bool inProfit = false, // if it's true only close Pack if in profit
|
bool forceOpen = true //
|
||||||
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
|
||||||
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
int positionsCount = ArraySize(positions);
|
Clean(dest);
|
||||||
if (positionsCount <= 0)
|
|
||||||
|
//
|
||||||
|
bool hasSupport = HasSupport(
|
||||||
|
ticket,
|
||||||
|
forceOpen //
|
||||||
|
);
|
||||||
|
if (!hasSupport)
|
||||||
{
|
{
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
for (int i = 0; i < positionsCount; i++)
|
XPosition positions[];
|
||||||
|
int positionsCount = GetPositions(positions);
|
||||||
|
if (!IsValidSize(positionsCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Extract Support Positions ...
|
||||||
|
XPosition supports[];
|
||||||
|
int supportsCount = ExtractSupports(
|
||||||
|
positions,
|
||||||
|
supports //
|
||||||
|
);
|
||||||
|
if (!IsValidSize(supportsCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Loop Through Supports ...
|
||||||
|
for (int i = 0; i < supportsCount; i++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
XPosition iPosition = positions[i];
|
XPosition iSupport = supports[i];
|
||||||
|
|
||||||
//
|
//
|
||||||
bool isClosed = ClosePositionPack(
|
ulong supportedTicket = ExtractSupportedTicket(iSupport.comment);
|
||||||
iPosition.ticket,
|
ulong eqmSupportedTicket = ExtractEQMSupportedTicket(iSupport.comment);
|
||||||
iPosition.symbol,
|
|
||||||
iPosition.period,
|
//
|
||||||
comment,
|
bool isOwn =
|
||||||
inProfit,
|
//
|
||||||
minProfitPerTrade,
|
(supportedTicket > 0 && ticket == supportedTicket)
|
||||||
minProfitPerVolumeFactor //
|
//
|
||||||
);
|
||
|
||||||
if (isClosed)
|
//
|
||||||
|
(eqmSupportedTicket > 0 && ticket == eqmSupportedTicket)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (isOwn)
|
||||||
{
|
{
|
||||||
result++;
|
//
|
||||||
|
AddRef(
|
||||||
|
iSupport,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(dest);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Specific Position's Supports ...
|
||||||
|
int GetSupports(
|
||||||
|
ulong ticket,
|
||||||
|
XOrder &dest[], // Result ...
|
||||||
|
bool forceOpen = true //
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
Clean(dest);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool hasSupport = HasSupport(
|
||||||
|
ticket,
|
||||||
|
forceOpen //
|
||||||
|
);
|
||||||
|
if (!hasSupport)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOrder orders[];
|
||||||
|
int ordersCount = GetOrders(
|
||||||
|
orders,
|
||||||
|
NULL, // All Symbols ...
|
||||||
|
NULL, // All Providers ...
|
||||||
|
NULL, // All Periods ...
|
||||||
|
X_POSITION_TYPE_ALL, // All Types ...
|
||||||
|
ORDER_STATE_PLACED, // Untriggere Orders ...
|
||||||
|
true //
|
||||||
|
);
|
||||||
|
if (!IsValidSize(ordersCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Extract Support Positions ...
|
||||||
|
XOrder supports[];
|
||||||
|
int supportsCount = ExtractSupports(
|
||||||
|
orders,
|
||||||
|
supports //
|
||||||
|
);
|
||||||
|
if (!IsValidSize(supportsCount))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Loop Through Supports ...
|
||||||
|
for (int i = 0; i < supportsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOrder iSupport = supports[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
ulong supportedTicket = ExtractSupportedTicket(iSupport.comment);
|
||||||
|
ulong eqmSupportedTicket = ExtractEQMSupportedTicket(iSupport.comment);
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isOwn =
|
||||||
|
//
|
||||||
|
(supportedTicket > 0 && ticket == supportedTicket)
|
||||||
|
//
|
||||||
|
||
|
||||||
|
//
|
||||||
|
(eqmSupportedTicket > 0 && ticket == eqmSupportedTicket)
|
||||||
|
//
|
||||||
|
;
|
||||||
|
if (isOwn)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iSupport,
|
||||||
|
dest //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ArraySize(dest);
|
||||||
|
|
||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -3536,37 +3461,6 @@ protected:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Extract Specific Deals Position's Pack ...
|
|
||||||
// this used when a Position SL or TP triggered and we want to close
|
|
||||||
// all it's Supported Packs ...
|
|
||||||
bool GetDealPack(
|
|
||||||
XDeal &deal,
|
|
||||||
XPositionPack &pack //
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
//
|
|
||||||
ulong ticket = deal.positionId;
|
|
||||||
ENUM_TIMEFRAMES dealPeriod = GetDealPeriod(deal);
|
|
||||||
string dealSymbol = deal.symbol;
|
|
||||||
|
|
||||||
//
|
|
||||||
// So We Have to Get Positions Pack ...
|
|
||||||
result = GetPositionPack(
|
|
||||||
ticket,
|
|
||||||
dealSymbol,
|
|
||||||
dealPeriod,
|
|
||||||
pack
|
|
||||||
//
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
ENUM_TIMEFRAMES GetDealPeriod(XDeal &deal)
|
ENUM_TIMEFRAMES GetDealPeriod(XDeal &deal)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -138,3 +138,338 @@
|
|||||||
//
|
//
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// XPosition Pack ...
|
||||||
|
|
||||||
|
//
|
||||||
|
// Extract specific Positions Pack ...
|
||||||
|
// in this senario there is no need to Position exists itself ...
|
||||||
|
bool GetPositionPack(
|
||||||
|
ulong ticket, // Specified Positions Ticket
|
||||||
|
string symbol, // Specified Position Symbol
|
||||||
|
ENUM_TIMEFRAMES period, // Specified Position Period
|
||||||
|
XPositionPack &pack // Hold Result
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
pack.Clean();
|
||||||
|
|
||||||
|
//
|
||||||
|
XPosition position;
|
||||||
|
bool hasPosition = GetPosition(
|
||||||
|
ticket,
|
||||||
|
position
|
||||||
|
//
|
||||||
|
);
|
||||||
|
if (hasPosition)
|
||||||
|
{
|
||||||
|
pack.position = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XOrder supportOrders[];
|
||||||
|
XPosition supportPositions[];
|
||||||
|
|
||||||
|
//
|
||||||
|
XOrder orders[];
|
||||||
|
GetOrders(
|
||||||
|
orders,
|
||||||
|
symbol, // Specified Symbol
|
||||||
|
NULL, // All Providers
|
||||||
|
period, // Specified Period
|
||||||
|
NULL, // All Types
|
||||||
|
ORDER_STATE_PLACED, // Just UnTriggered Orders
|
||||||
|
true // Filter by Magic
|
||||||
|
);
|
||||||
|
int ordersCount = ArraySize(orders);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Select Orders ...
|
||||||
|
if (ordersCount > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < ordersCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XOrder iOrder = orders[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Retrieve Order Supported Ticket ...
|
||||||
|
ulong parentTicket = ExtractSupportedTicket(iOrder.comment);
|
||||||
|
if (NotEmpty(parentTicket) && parentTicket == ticket)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iOrder,
|
||||||
|
supportOrders
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int supportOrdersCount = ArraySize(supportOrders);
|
||||||
|
if (supportOrdersCount > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
pack.supportOrdersCount = supportOrdersCount;
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
supportOrders,
|
||||||
|
pack.supportOrders);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
XPosition positions[];
|
||||||
|
GetPositions(
|
||||||
|
positions,
|
||||||
|
symbol, // Specified Symbol ...
|
||||||
|
NULL, // All Providers ...
|
||||||
|
period // Specified Period ...
|
||||||
|
);
|
||||||
|
int positionsCount = ArraySize(positions);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Select Positions ...
|
||||||
|
if (positionsCount > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < positionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iPosition = positions[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
ulong parentTicket = ExtractSupportedTicket(iPosition.comment);
|
||||||
|
if (NotEmpty(parentTicket) && parentTicket == ticket)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iPosition,
|
||||||
|
supportPositions
|
||||||
|
//
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int supportPositionsCount = ArraySize(supportPositions);
|
||||||
|
if (supportPositionsCount > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
pack.supportPositionsCount = supportPositionsCount;
|
||||||
|
|
||||||
|
//
|
||||||
|
Copy(
|
||||||
|
supportPositions,
|
||||||
|
pack.supportPositions);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = pack.IsValid();
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close Position Pack ...
|
||||||
|
bool ClosePositionPack(
|
||||||
|
XPositionPack &pack, // Specified Position Pack
|
||||||
|
string comment, // Specified Close Comment
|
||||||
|
bool inProfit = false, // if it's true only close Pack if in profit
|
||||||
|
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
||||||
|
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
ulong ticket = pack.ticket;
|
||||||
|
|
||||||
|
//
|
||||||
|
XPosition positions[];
|
||||||
|
|
||||||
|
//
|
||||||
|
XPosition pPosition;
|
||||||
|
result = GetPosition(
|
||||||
|
ticket,
|
||||||
|
pPosition //
|
||||||
|
);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
pPosition,
|
||||||
|
positions //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
if (pack.supportPositionsCount > 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
for (int i = 0; i < pack.supportPositionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iPosition = pack.supportPositions[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
AddRef(
|
||||||
|
iPosition,
|
||||||
|
positions //
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Force Close ...
|
||||||
|
if (!inProfit)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int closed = Close(
|
||||||
|
positions,
|
||||||
|
comment //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int cancelled = 0;
|
||||||
|
if (pack.supportOrdersCount > 0)
|
||||||
|
{
|
||||||
|
cancelled = CancelOrders(pack.supportOrders);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = (closed + cancelled) == (pack.supportPositionsCount + pack.supportOrdersCount + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool canHedge = SpecifiedIsPositionsReadyForHedge(
|
||||||
|
positions,
|
||||||
|
minProfitPerTrade,
|
||||||
|
minProfitPerVolumeFactor //
|
||||||
|
);
|
||||||
|
if (canHedge)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int closed = Close(
|
||||||
|
positions,
|
||||||
|
comment //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
int cancelled = 0;
|
||||||
|
if (pack.supportOrdersCount > 0)
|
||||||
|
{
|
||||||
|
cancelled = CancelOrders(pack.supportOrders);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = (closed + cancelled) == (pack.supportPositionsCount + pack.supportOrdersCount + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bool ClosePositionPack(
|
||||||
|
ulong ticket, // Specified Position Pack
|
||||||
|
string symbol, // Specified Position Symbol
|
||||||
|
ENUM_TIMEFRAMES period, // Specified Position Period
|
||||||
|
string comment, // Specified Close Comment
|
||||||
|
bool inProfit = false, // if it's true only close Pack if in profit
|
||||||
|
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
||||||
|
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
//
|
||||||
|
XPositionPack pack;
|
||||||
|
result = GetPositionPack(
|
||||||
|
ticket,
|
||||||
|
symbol,
|
||||||
|
period,
|
||||||
|
pack //
|
||||||
|
);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
result = ClosePositionPack(
|
||||||
|
pack,
|
||||||
|
comment,
|
||||||
|
inProfit,
|
||||||
|
minProfitPerTrade,
|
||||||
|
minProfitPerVolumeFactor //
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Close Positions Pack ...
|
||||||
|
int ClosePositionsPack(
|
||||||
|
XPosition &positions[], // Positions ...
|
||||||
|
string comment, // Specified Close Comment
|
||||||
|
bool inProfit = false, // if it's true only close Pack if in profit
|
||||||
|
double minProfitPerTrade = 0, // Min Profit based On Volume Factor ...
|
||||||
|
double minProfitPerVolumeFactor = 0 // Min Volume Factor ...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
//
|
||||||
|
int positionsCount = ArraySize(positions);
|
||||||
|
if (positionsCount <= 0)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
for (int i = 0; i < positionsCount; i++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
XPosition iPosition = positions[i];
|
||||||
|
|
||||||
|
//
|
||||||
|
bool isClosed = ClosePositionPack(
|
||||||
|
iPosition.ticket,
|
||||||
|
iPosition.symbol,
|
||||||
|
iPosition.period,
|
||||||
|
comment,
|
||||||
|
inProfit,
|
||||||
|
minProfitPerTrade,
|
||||||
|
minProfitPerVolumeFactor //
|
||||||
|
);
|
||||||
|
if (isClosed)
|
||||||
|
{
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
@@ -49,17 +49,17 @@ input bool x121EAGetVerificationFromOtherTimeFrames = true; // Get Verifications
|
|||||||
// Risk Management ...
|
// Risk Management ...
|
||||||
input group "Risk Management";
|
input group "Risk Management";
|
||||||
input double x121EAVolume = 0.01; // Static Volume
|
input double x121EAVolume = 0.01; // Static Volume
|
||||||
input double x121EATPPoint = 200; // TP Point
|
input double x121EATPPoint = 500; // TP Point
|
||||||
input double x121EASLPoint = 200; // SL Point
|
input double x121EASLPoint = 500; // SL Point
|
||||||
input int x121EAMaxAllowedTrades = 1; // Max Allowed Positions
|
input int x121EAMaxAllowedTrades = 1; // Max Allowed Positions
|
||||||
input bool x121EAIgnoreSL = false; // Ignore Calculated SL
|
input bool x121EAIgnoreSL = false; // Ignore Calculated SL
|
||||||
input bool x121EAIgnoreTP = false; // Ignore Calculated TP
|
input bool x121EAIgnoreTP = false; // Ignore Calculated TP
|
||||||
input bool x121EAAllowTrailStop = true; // Enable Trailling Stop Losses
|
input bool x121EAAllowTrailStop = true; // Enable Trailling Stop Losses
|
||||||
input double x121EAFirstTrailDistance = 60; // Start Trailling Distance
|
input double x121EAFirstTrailDistance = 60; // Start Trailling Distance
|
||||||
input double x121EAFirstTrailPoint = 50; // First Stop Trail
|
input double x121EAFirstTrailPoint = 50; // First Stop Trail
|
||||||
input double x121EANextTrailDistance = 10; // Next Trailling Distance
|
input double x121EANextTrailDistance = 25; // Next Trailling Distance
|
||||||
input double x121EANextTrailPoint = 5; // Next Trailling Step
|
input double x121EANextTrailPoint = 10; // Next Trailling Step
|
||||||
input bool x121EAUseSupport = false; // Use Support Signals
|
input bool x121EAAllowSupport = false; // Allow Support Signals
|
||||||
input bool x121EAAllowGrid = false; // Allow Grid Signals
|
input bool x121EAAllowGrid = false; // Allow Grid Signals
|
||||||
input double x121EAGridDistance = 100; // Grid Distance
|
input double x121EAGridDistance = 100; // Grid Distance
|
||||||
input double x121EAGridVolumeMultiplier = 2; // Grid Volume Multiplier
|
input double x121EAGridVolumeMultiplier = 2; // Grid Volume Multiplier
|
||||||
@@ -195,7 +195,7 @@ bool InitialEA()
|
|||||||
x121EA.GetVerificationFromOtherTimeFrames(x121EAGetVerificationFromOtherTimeFrames);
|
x121EA.GetVerificationFromOtherTimeFrames(x121EAGetVerificationFromOtherTimeFrames);
|
||||||
|
|
||||||
//
|
//
|
||||||
x121EA.UseSupport(x121EAUseSupport);
|
x121EA.AllowSupport(x121EAAllowSupport);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grid System ...
|
// Grid System ...
|
||||||
|
|||||||
@@ -4086,10 +4086,11 @@ ulong ExtractSupportedTicket(string value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extract Support Positions ...
|
// Extract Support ...
|
||||||
int ExtractSupportPositions(
|
template <typename T>
|
||||||
XPosition &source[],
|
int ExtractSupports(
|
||||||
XPosition &dest[] // Result ...
|
T &source[],
|
||||||
|
T &dest[] // Result ...
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -4109,7 +4110,7 @@ int ExtractSupportPositions(
|
|||||||
for (int i = 0; i < sourceCount; i++)
|
for (int i = 0; i < sourceCount; i++)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
XPosition iSource = source[i];
|
T iSource = source[i];
|
||||||
|
|
||||||
//
|
//
|
||||||
ulong isSupport = ExtractSupportedTicket(iSource.comment) > 0;
|
ulong isSupport = ExtractSupportedTicket(iSource.comment) > 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user