// // 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 // ); } }