Files
xMQL5/MQLTestWorkspace/BKPS/eqm.tools.mq5
T
2024-05-08 19:17:52 +03:30

1380 lines
32 KiB
Plaintext

//
// POSITIONPACK ...
//
// Check a Position Pack is Ready for Hedging ...
bool IsReadyForEQMHedge(XPositionPack &pack)
{
//
bool result = false;
//
if (mMinProfitPerTrade <= 0 ||
mMinProfitPerVolumeFactor <= 0)
{
return result;
}
//
if (pack.supportPositionsCount <= 0)
{
return result;
}
//
double profit = pack.position.profit;
double requiredProfit =
((pack.position.volume / mMinProfitPerVolumeFactor) *
mMinProfitPerTrade) +
(-1 * pack.position.swap);
//
for (int i = 0; i < pack.supportPositionsCount; i++)
{
//
XPosition iPosition = pack.supportPositions[i];
//
profit += iPosition.profit;
requiredProfit +=
((iPosition.volume / mMinProfitPerVolumeFactor) *
mMinProfitPerTrade) +
(-1 * iPosition.swap);
}
//
result = profit >= requiredProfit;
//
return result;
}
//
// POSITIONMANAGEMENT ...
//
//
// Manage Positions ...
void HandlePositionManagement()
{
//
// HandleHedgePositionPacks();
//
// HandleHedgePositions();
//
// HandleCloseOrTrailStopMinProfitPositions();
}
//
void HandleHedgePositions()
{
//
bool isReady = IsPositionsReadyForEQMHedge();
if (!isReady)
{
return;
}
//
XPosition positions[];
int positionsCount = GetPositions(positions);
//
string comment = "EQM Hedge Positions ...";
//
int closed = mTrader.ClosePositions(
positions,
comment);
bool isClosed = closed == positionsCount;
if (isClosed)
{
//
LogMessage(comment);
}
}
//
// Close a Position Pack Wen Reached to Specific Profit ...
void HandleHedgePositionPacks()
{
//
XPosition positions[];
int positionsCount = GetPositions(positions);
if (positionsCount <= 0)
{
return;
}
//
for (int i = 0; i < positionsCount; i++)
{
//
XPosition iPosition = positions[i];
//
XPositionPack iPack;
bool hasPack = mTrader.GetPositionPack(
iPosition.ticket,
iPosition.symbol,
iPosition.period,
iPack);
if (!hasPack)
{
continue;
}
//
// Check Pack for Open Positions ...
bool isValidPack = iPack.supportPositionsCount > 0;
if (!isValidPack)
{
continue;
}
//
// we sure a Position has Support and it's support open ...
bool isReady = IsReadyForEQMHedge(iPack);
if (!isReady)
{
continue;
}
//
bool isClosed = HandleClosePack(iPack);
}
}
//
// Try to Trail StopLoss or Close Posititons
// when reached Min Profit ...
void HandleCloseOrTrailStopMinProfitPositions()
{
//
// Retrieve In Profit Positions ...
XPosition positions[];
int positionsCount = GetInProfitPositions(positions);
if (positionsCount <= 0)
{
return;
}
//
for (int i = 0; i < positionsCount; i++)
{
//
XPosition iPosition = positions[i];
//
// Now we have to Calculate min Profit ...
double requiredProfit =
((iPosition.volume / mMinProfitPerVolumeFactor) *
mMinProfitPerTrade) +
(-1 * iPosition.swap);
//
// Now we Have to Check if Trailed Before or not ...
int trailLevel = ExtractSLTrailLevel(iPosition.comment);
if (trailLevel > 0)
{
requiredProfit *= (trailLevel + 1);
}
//
// Check Can Trail or Close on Min Profit ...
bool conditionsPassed = iPosition.profit >= requiredProfit;
if (!conditionsPassed)
{
continue;
}
//
// Now we have Sure iPosition is Ready for Trailing Stop or Close on Min Profit ...
bool isLong = IsLong(iPosition.type);
//
// CASE A try to Trail Stop ...
double sl = 0;
double distance = 0;
if ((isLong && (iPosition.price > iPosition.entry &&
iPosition.entry > iPosition.sl)) ||
(!isLong && (iPosition.price < iPosition.entry &&
iPosition.entry < iPosition.sl)))
{
//
// First Trail ...
//
distance = isLong
? iPosition.price - iPosition.entry
: iPosition.entry - iPosition.price;
//
sl = iPosition.entry;
}
else if ((isLong && (iPosition.price > iPosition.sl &&
iPosition.entry <= iPosition.sl)) ||
(!isLong && (iPosition.price < iPosition.sl &&
iPosition.entry >= iPosition.sl)))
{
//
// Trailed Before ...
//
distance = isLong
? iPosition.price - iPosition.entry
: iPosition.entry - iPosition.price;
//
sl = isLong
? iPosition.sl + distance
: iPosition.sl - distance;
}
//
// Check Main Selected Position is Support of another Position or not ...
string params[];
bool isSupport = ExtractSupportParams(
iPosition.comment,
params);
//
bool isTrailed = false;
bool canTrail = !isSupport && sl > 0 && distance > 0;
if (canTrail)
{
//
string comment = PrepareSLTrailComment(iPosition.comment);
//
isTrailed = mTrader.Modify(
iPosition.ticket,
sl,
iPosition.tp);
}
if (isTrailed)
{
//
string message = "EQM Trail Position(" + ToString(iPosition.ticket) + ")'s Stop Loss ...";
//
LogMessage(message);
//
continue;
}
//
// CASE B if not Trail, Close it in Min Profit ...
string comment = "EQM Close Min Profit ...";
//
// Check Position has Pack Or Not ...
// if has Pack must Close Pack ...
// if not, Close position itself ...
XPositionPack iPack;
bool hasPack = mTrader.GetPositionPack(
iPosition.ticket,
iPosition.symbol,
iPosition.period,
iPack);
if (hasPack)
{
//
HandleClosePack(iPack);
}
else
{
//
if (!isSupport)
{
//
bool isClosed = mTrader.Close(
iPosition.ticket,
comment);
if (isClosed)
{
//
string message = "EQM Close Position(" + ToString(iPosition.ticket) + ") In Min Profit: " + ToString(iPosition.profit);
//
LogMessage(message);
}
}
}
}
}
//
// Check Positions is Ready fro Hedging ...
bool IsPositionsReadyForEQMHedge()
{
//
bool result = false;
//
if (mMinProfitPerTrade <= 0 ||
mMinProfitPerVolumeFactor <= 0)
{
return result;
}
//
double profit = 0;
double requiredProfit = 0;
//
XPosition positions[];
int positionsCount = GetPositions(positions);
if (positionsCount <= 1)
{
return result;
}
//
profit = CalculatePositionsProfit(positions);
requiredProfit = CalculateRequiredProfitForHedge(positions);
//
result = profit >= requiredProfit;
//
return result;
}
//
// Check Account is Ready for EQM Hedge or not ...
bool IsReadyForEQMHedge()
{
//
bool result = false;
//
// Check required Inputs ...
if (mMinProfitPerTrade <= 0 ||
mMinProfitPerVolumeFactor <= 0)
{
return result;
}
//
// Check at least One EQM Support Position must be Open ...
XPosition eqmPositions[];
int eqmPositionsCount = GetEQMPositions(eqmPositions);
if (eqmPositionsCount <= 0)
{
return result;
}
//
// Get All Open Positions for Calculate Account Profit ...
XPosition positions[];
int positionsCount = GetPositions(
positions);
if (positionsCount <= 0)
{
return result;
}
//
// Define Factor Variables ...
double profit = 0;
double requiredProfit = 0;
//
// Calculate Account Profit Factors ...
for (int i = 0; i < positionsCount; i++)
{
//
XPosition iPosition = positions[i];
//
profit += iPosition.profit;
requiredProfit +=
((iPosition.volume / mMinProfitPerVolumeFactor) *
mMinProfitPerTrade) +
(-1 * iPosition.swap);
}
//
// Calculate the result ...
result = profit >= requiredProfit;
//
return result;
}
//
if (isLongSupport)
{
//
if (!onlyGoldenZone && isPriceUnderFib5)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? vale : 0;
signal.entry = fib5;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib5 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
// Since Price is Under Fib 5
// this so Important to Handle also Vale Breakouts ...
//
signal.sl = placeSL ? fib5 : 0;
signal.entry = vale;
signal.tp = placeTP ? 0 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone && isPriceUnderFib4)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib5 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
}
else if (isPriceUnderFib3)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone && isPriceUnderFib2)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone && isPriceUnderFib1)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib1 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.volume = volume;
signal.period = period;
signal.symbol = conditions.symbol;
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib1 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? peak : 0;
signal.entry = fib1;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
}
}
else
{
//
if (!onlyGoldenZone && isPriceOverFib1)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? peak : 0;
signal.entry = fib1;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib1 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
// Since Price is Over Fib 1
// this so Important to Handle also Peak Breakouts ...
//
signal.sl = placeSL ? fib1 : 0;
signal.entry = peak;
signal.tp = placeTP ? 0 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone && isPriceOverFib2)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
// In Direction Positions ...
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib1 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
}
else if (isPriceOverFib3)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone && isPriceOverFib4)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib5 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone && isPriceOverFib5)
{
//
// Price between Fib 1 and Peak ...
XSignal signal;
Clean(signal);
//
signal.type = type;
signal.volume = volume;
signal.period = period;
signal.mode = X_ORDER_MODE_STOP;
signal.symbol = conditions.symbol;
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib5;
signal.tp = placeTP ? vale : 0;
//
Add(
signal,
supports //
);
//
// Diection Positions ...
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib5 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
}
else if (!onlyGoldenZone)
{
//
// Diection Positions ...
XSignal signal;
Clean(signal);
//
signal.volume = volume;
signal.period = period;
signal.symbol = conditions.symbol;
//
signal.mode = X_ORDER_MODE_STOP;
signal.type = inDPosition.type;
//
signal.sl = placeSL ? fib2 : 0;
signal.entry = fib1;
signal.tp = placeTP ? peak : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib3 : 0;
signal.entry = fib2;
signal.tp = placeTP ? fib1 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib4 : 0;
signal.entry = fib3;
signal.tp = placeTP ? fib2 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? fib5 : 0;
signal.entry = fib4;
signal.tp = placeTP ? fib3 : 0;
//
Add(
signal,
supports //
);
//
signal.sl = placeSL ? vale : 0;
signal.entry = fib5;
signal.tp = placeTP ? fib4 : 0;
//
Add(
signal,
supports //
);
}
}