From 2dcbab85ba96515d1314105cb50ed3c13dfbc607 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sat, 29 Jun 2024 20:33:08 +0330 Subject: [PATCH] save last ... --- Classes/x-saherelm.x121.setup.xea.mq5 | 364 +++++++++++++++++++------- Experts/x-saherelm.x121.ea.mq5 | 32 +-- 2 files changed, 292 insertions(+), 104 deletions(-) diff --git a/Classes/x-saherelm.x121.setup.xea.mq5 b/Classes/x-saherelm.x121.setup.xea.mq5 index bf9b4309..d1af22b3 100644 --- a/Classes/x-saherelm.x121.setup.xea.mq5 +++ b/Classes/x-saherelm.x121.setup.xea.mq5 @@ -374,7 +374,20 @@ struct XTradeInfo ToString("Type", ToString(type)) + ToString("Time", time) + ToString("Pushers", pushers) + - (onlySignals ? "" : "-------------" + "\n" + ToString("Volume", volume) + ToString("Profit", profit) + ToString("Commission", commission) + ToString("Swap", swap) + ToString("End Time", endTime) + ToString("Age", age) + ToString("Message", message)) + + (onlySignals + ? "" + : + // + "-------------" + "\n" + + ToString("Volume", volume) + + ToString("Profit", profit) + + ToString("Commission", commission) + + ToString("Swap", swap) + + ToString("End Time", endTime) + + ToString("Age", age) + + ToString("Message", message) + // + ) + "-------------" + "\n" + "Conditions" + "\n" + "-------------" + "\n" + @@ -495,13 +508,19 @@ struct XTradeInfo // double selectedEntry = - gEntry <= 0 ? entry : gEntry; + gEntry <= 0 + ? entry + : gEntry; double selectedVolume = - gVolume <= 0 ? volume : gVolume; + gVolume <= 0 + ? volume + : gVolume; // double nextEntry = - isLong ? selectedEntry - distancePrice : selectedEntry + distancePrice; + isLong + ? selectedEntry - distancePrice + : selectedEntry + distancePrice; double nextVolume = selectedVolume * volumeMultiplier; // @@ -550,7 +569,9 @@ struct XTradeInfo // result = - isLong ? cEntry <= gEntry : cEntry >= gEntry; + isLong + ? cEntry <= gEntry + : cEntry >= gEntry; if (!result) { return result; @@ -665,16 +686,27 @@ struct XTradeInfo // double selectedEntry = - isLong ? rLongEntry <= 0 ? entry : rLongEntry : rShortEntry <= 0 ? entry - : rShortEntry; + isLong + ? rLongEntry <= 0 + ? entry + : rLongEntry + : rShortEntry <= 0 + ? entry + : rShortEntry; double selectedVolume = - rVolume <= 0 ? volume : rVolume; + rVolume <= 0 + ? volume + : rVolume; // double nextLongEntry = - isLong ? selectedEntry : selectedEntry + distancePrice; + isLong + ? selectedEntry + : selectedEntry + distancePrice; double nextShortEntry = - isLong ? selectedEntry - distancePrice : selectedEntry; + isLong + ? selectedEntry - distancePrice + : selectedEntry; // double nextVolume = selectedVolume * volumeMultiplier; @@ -684,11 +716,17 @@ struct XTradeInfo // double zoneUpper = - rZoneUpper > 0 ? rZoneUpper : isLong ? entry + distancePrice - : entry + (distancePrice * 2); + rZoneUpper > 0 + ? rZoneUpper + : isLong + ? entry + distancePrice + : entry + (distancePrice * 2); double zoneLower = - rZoneLower > 0 ? rZoneLower : isLong ? entry + (distancePrice * 2) - : entry - distancePrice; + rZoneLower > 0 + ? rZoneLower + : isLong + ? entry + (distancePrice * 2) + : entry - distancePrice; // SetRecovery( @@ -773,19 +811,27 @@ struct XTradeInfo // ENUM_POSITION_TYPE rType = - hasLongRecovery ? POSITION_TYPE_BUY : POSITION_TYPE_SELL; + hasLongRecovery + ? POSITION_TYPE_BUY + : POSITION_TYPE_SELL; // double rEntry = - hasLongRecovery ? cLongEntry : cShortEntry; + hasLongRecovery + ? cLongEntry + : cShortEntry; // double rTP = - hasLongRecovery ? rZoneUpper : rZoneLower; + hasLongRecovery + ? rZoneUpper + : rZoneLower; // double rSL = - hasLongRecovery ? rZoneLower : rZoneUpper; + hasLongRecovery + ? rZoneLower + : rZoneUpper; // result = signal.Prepare( @@ -2139,7 +2185,10 @@ public: // bool isLong = IsLong(iType); - ENUM_POSITION_TYPE iPType = isLong ? POSITION_TYPE_BUY : POSITION_TYPE_SELL; + ENUM_POSITION_TYPE iPType = + isLong + ? POSITION_TYPE_BUY + : POSITION_TYPE_SELL; // double cEntry = GetEntry( @@ -2169,7 +2218,13 @@ public: // bool isBreaked = - isLong ? isBullish && isBreakUp && cEntry > iEntry : isBearish && isBreakDown && cEntry < iEntry; + isLong + ? isBullish && + isBreakUp && + cEntry > iEntry + : isBearish && + isBreakDown && + cEntry < iEntry; // if (isBreaked) @@ -2497,7 +2552,9 @@ protected: // double usedTrailDiff = - isFirstTrail ? MathMax(firstTrailPoint, firstTrailDistance) : MathMax(nextTrailPoint, nextTrailDistance); + isFirstTrail + ? MathMax(firstTrailPoint, firstTrailDistance) + : MathMax(nextTrailPoint, nextTrailDistance); // double iExit = GetExit( @@ -2551,7 +2608,9 @@ protected: // usedTrailDiff = - isFirstTrail ? MathMin(firstTrailPoint, firstTrailDistance) : MathMin(nextTrailPoint, nextTrailDistance); + isFirstTrail + ? MathMin(firstTrailPoint, firstTrailDistance) + : MathMin(nextTrailPoint, nextTrailDistance); double usedTrailDiffPrice = PointToPrice( usedTrailDiff, iPosition.symbol // @@ -2559,7 +2618,9 @@ protected: // double sl = - isLong ? usedPrice + usedTrailDiffPrice : usedPrice - usedTrailDiffPrice; + isLong + ? usedPrice + usedTrailDiffPrice + : usedPrice - usedTrailDiffPrice; string comment = PrepareSLTrailTag(iPosition.comment); // @@ -2769,7 +2830,9 @@ protected: // // Check Count ... bool isMaxPassed = - maxAllowed <= 0 ? true : data[i].gLevel < maxAllowed; + maxAllowed <= 0 + ? true + : data[i].gLevel < maxAllowed; if (!isMaxPassed) { continue; @@ -2789,7 +2852,9 @@ protected: // // Check Max Volume ... iSignal.volume = - maxAllowedVolume <= 0 ? iSignal.volume : MathMin(iSignal.volume, maxAllowedVolume); + maxAllowedVolume <= 0 + ? iSignal.volume + : MathMin(iSignal.volume, maxAllowedVolume); // AddRef( @@ -2838,7 +2903,9 @@ protected: // // Check Count ... bool isMaxPassed = - maxAllowed <= 0 ? true : data[i].rLevel < maxAllowed; + maxAllowed <= 0 + ? true + : data[i].rLevel < maxAllowed; if (!isMaxPassed) { continue; @@ -2858,7 +2925,9 @@ protected: // // Check Max Volume ... iSignal.volume = - maxAllowedVolume <= 0 ? iSignal.volume : MathMin(iSignal.volume, maxAllowedVolume); + maxAllowedVolume <= 0 + ? iSignal.volume + : MathMin(iSignal.volume, maxAllowedVolume); // AddRef( @@ -3700,6 +3769,27 @@ public: mMinFreeMargingForOpenTrades = value; } + // + double MaxAllowedDrawdownPercent() { + return mMaxAllowedDrawdownPercent; + } + + // + void MaxAllowedDrawdownPercent(double value) { + // + if (value < 0) { + value = 0; + } + + // + if (value > 50) { + value = 50; + } + + // + mMaxAllowedDrawdownPercent = value; + } + // // Hedging ... @@ -3891,9 +3981,28 @@ public: cConditions.Clean(); // - cHasSignal = !useCMarket ? false : mSetups[i].ProcessMarket(cSignal, cConditions, cPusher, cProvider, cTP, cSL, X_MARKET_CYCLE_UNKNOWN, canSupport, allowLong, allowShort, volume, slPoint, ignoreSL, tpPoint, ignoreTP, 0, - 5 // - ); + cHasSignal = + !useCMarket + ? false + : mSetups[i].ProcessMarket( + cSignal, + cConditions, + cPusher, + cProvider, + cTP, + cSL, + X_MARKET_CYCLE_UNKNOWN, + canSupport, + allowLong, + allowShort, + volume, + slPoint, + ignoreSL, + tpPoint, + ignoreTP, + 0, + 5 // + ); // // Short Market ... @@ -3906,9 +4015,28 @@ public: sConditions.Clean(); // - sHasSignal = !useSMarket ? false : mSetups[i].ProcessMarket(sSignal, sConditions, sPusher, sProvider, sTP, sSL, X_MARKET_CYCLE_SHORT, canSupport, allowLong, allowShort, volume, slPoint, ignoreSL, tpPoint, ignoreTP, 0, - 5 // - ); + sHasSignal = + !useSMarket + ? false + : mSetups[i].ProcessMarket( + sSignal, + sConditions, + sPusher, + sProvider, + sTP, + sSL, + X_MARKET_CYCLE_SHORT, + canSupport, + allowLong, + allowShort, + volume, + slPoint, + ignoreSL, + tpPoint, + ignoreTP, + 0, + 5 // + ); // // Medium Market ... @@ -3921,9 +4049,27 @@ public: mConditions.Clean(); // - mHasSignal = !useMMarket ? false : mSetups[i].ProcessMarket(mSignal, mConditions, mPusher, mProvider, mTP, mSL, X_MARKET_CYCLE_MEDIUM, canSupport, allowLong, allowShort, volume, slPoint, ignoreSL, tpPoint, ignoreTP, 0, - 5 // - ); + mHasSignal = !useMMarket + ? false + : mSetups[i].ProcessMarket( + mSignal, + mConditions, + mPusher, + mProvider, + mTP, + mSL, + X_MARKET_CYCLE_MEDIUM, + canSupport, + allowLong, + allowShort, + volume, + slPoint, + ignoreSL, + tpPoint, + ignoreTP, + 0, + 5 // + ); // // Long Market ... @@ -3936,9 +4082,27 @@ public: lConditions.Clean(); // - lHasSignal = !useLMarket ? false : mSetups[i].ProcessMarket(lSignal, lConditions, lPusher, lProvider, lTP, lSL, X_MARKET_CYCLE_LONG, canSupport, allowLong, allowShort, volume, slPoint, ignoreSL, tpPoint, ignoreTP, 0, - 5 // - ); + lHasSignal = !useLMarket + ? false + : mSetups[i].ProcessMarket( + lSignal, + lConditions, + lPusher, + lProvider, + lTP, + lSL, + X_MARKET_CYCLE_LONG, + canSupport, + allowLong, + allowShort, + volume, + slPoint, + ignoreSL, + tpPoint, + ignoreTP, + 0, + 5 // + ); // // Hind Market ... @@ -3951,9 +4115,27 @@ public: hConditions.Clean(); // - hHasSignal = !useHMarket ? false : mSetups[i].ProcessMarket(hSignal, hConditions, hPusher, hProvider, hTP, hSL, X_MARKET_CYCLE_HIND, canSupport, allowLong, allowShort, volume, slPoint, ignoreSL, tpPoint, ignoreTP, 0, - 5 // - ); + hHasSignal = !useHMarket + ? false + : mSetups[i].ProcessMarket( + hSignal, + hConditions, + hPusher, + hProvider, + hTP, + hSL, + X_MARKET_CYCLE_HIND, + canSupport, + allowLong, + allowShort, + volume, + slPoint, + ignoreSL, + tpPoint, + ignoreTP, + 0, + 5 // + ); // // Parse Signals and Add them for Executing ... @@ -3982,14 +4164,6 @@ public: mConditions, otherConditions // ); - // AddRef( - // lConditions, - // otherConditions // - // ); - // AddRef( - // hConditions, - // otherConditions // - // ); } // @@ -4007,14 +4181,6 @@ public: mConditions, otherConditions // ); - // AddRef( - // lConditions, - // otherConditions // - // ); - // AddRef( - // hConditions, - // otherConditions // - // ); } // @@ -4041,10 +4207,6 @@ public: signal = lSignal; // - // AddRef( - // cConditions, - // otherConditions // - // ); AddRef( mConditions, otherConditions // @@ -4095,13 +4257,18 @@ public: bool isValid = // // Handle Pusher Validations ... - (mReuiredSignalVerifications <= 0 ? true : pushers >= mReuiredSignalVerifications) + (mReuiredSignalVerifications <= 0 + ? true + : pushers >= mReuiredSignalVerifications) // && // // Handle Other Conditions Validations ... - (!mGetVerificationFromOtherTimeFrames ? true : isLong ? signalGenerator.HasLongVerifications(otherConditions) - : signalGenerator.HasShortVerifications(otherConditions)) + (!mGetVerificationFromOtherTimeFrames + ? true + : isLong + ? signalGenerator.HasLongVerifications(otherConditions) + : signalGenerator.HasShortVerifications(otherConditions)) // ; @@ -4110,7 +4277,7 @@ public: bool forceState = mForce; // - if (!forceState) + if (isValid && !forceState) { // // Add Signal to Execution Result ... @@ -4272,16 +4439,6 @@ public: } } - // - // TODO: Remove this ... - // isSignalValid = !AllowSupport() - // ? true - // : IsValidSize(ArraySize(iSignal.supports)); - // if (!isSignalValid) - // { - // continue; - // } - // // Filter Signals Based On Max Allowed ... if (maxAllowed > 0) @@ -4289,7 +4446,9 @@ public: // // Here we Get Opposite Signals of Same Symbol Valid ... ENUM_X_POSITION_TYPES iType = - perDirection ? ToPositionType(iSignal.type) : X_POSITION_TYPE_ALL; + perDirection + ? ToPositionType(iSignal.type) + : X_POSITION_TYPE_ALL; XPosition iSymbolsPositions[]; int iSymbolsPositionsCount = mTrader.GetPositions( iSymbolsPositions, @@ -4315,7 +4474,9 @@ public: // isSignalValid = - iSupportsCount <= 0 ? iSymbolsPositionsCount < maxAllowed : iSymbolsPositionsCount - iSupportsCount < maxAllowed; + iSupportsCount <= 0 + ? iSymbolsPositionsCount < maxAllowed + : iSymbolsPositionsCount - iSupportsCount < maxAllowed; if (!isSignalValid) { continue; @@ -4448,7 +4609,9 @@ public: // int multiplier = - iSupportsCount <= 0 ? iSymbolsPositionsCount : iSymbolsPositionsCount - iSupportsCount; + iSupportsCount <= 0 + ? iSymbolsPositionsCount + : iSymbolsPositionsCount - iSupportsCount; if (multiplier <= 0) { multiplier = 1; @@ -4493,6 +4656,9 @@ public: signals // ); + // + Clean(eSignals); + // HandleSignals(signals); } @@ -4646,13 +4812,22 @@ protected: // bool isStartHourPassed = - startHour <= -1 ? true : cTime.hour >= startHour; + startHour <= -1 + ? true + : cTime.hour >= startHour; bool isEndHourPassed = - endHour <= -1 ? true : cTime.hour < endHour; - bool isTimePassed = isTimeRecieved && isStartHourPassed && isEndHourPassed; + endHour <= -1 + ? true + : cTime.hour < endHour; + bool isTimePassed = + isTimeRecieved && + isStartHourPassed && + isEndHourPassed; // - result = isTypePassed && isTimePassed; + result = + isTypePassed && + isTimePassed; // return result; @@ -4665,7 +4840,9 @@ protected: bool result = false; // - result = mCloseOnSpecificTime >= 0 && mCloseOnSpecificTime <= 23; + result = + mCloseOnSpecificTime >= 0 && + mCloseOnSpecificTime <= 23; if (!result) { return result; @@ -4814,7 +4991,9 @@ protected: double minFreeMargingForHandleForce = MinFreeMargingForOpenTrades(); // - bool result = minFreeMargingForHandleForce <= 0 ? true : freeMargin >= minFreeMargingForHandleForce; + bool result = minFreeMargingForHandleForce <= 0 + ? true + : freeMargin >= minFreeMargingForHandleForce; // return result; @@ -4827,11 +5006,13 @@ protected: bool result = false; // - double maxAllowedDrawdownPercent = 5; // MaxAllowedDrawdownPercent(); + double maxAllowedDrawdownPercent = MaxAllowedDrawdownPercent(); double drawdownPercent = GetDrawdownPercent(); // - result = maxAllowedDrawdownPercent <= 0 ? true : drawdownPercent <= maxAllowedDrawdownPercent; + result = maxAllowedDrawdownPercent <= 0 + ? true + : drawdownPercent <= maxAllowedDrawdownPercent; // return result; @@ -5251,6 +5432,7 @@ private: bool mForce; // Determine in Force State or not int mDelayBetweenTwoSignal; // Delay between two same signal double mMinFreeMargingForOpenTrades; // Min Free Margin for Open Trades + double mMaxAllowedDrawdownPercent; // Max Allowed Drawdown for Open Trades // XSCX121SetupCycles *mSetups[]; // Number of Setups @@ -5321,6 +5503,10 @@ private: RecoveryVolumeMultiplier(0.01); MaxAllowedRecoveryVolume(0.08); + // + MaxAllowedDrawdownPercent(5); + MinFreeMargingForOpenTrades(0); + // SaveResults(false); SaveSignalsOnly(true); @@ -5360,7 +5546,9 @@ private: X121SetupInputs iInputs = iSetup.GetInputs(); // - if (iInputs.symbol == symbol && iInputs.period == period) + if ( + iInputs.symbol == symbol && + iInputs.period == period) { // result = i; diff --git a/Experts/x-saherelm.x121.ea.mq5 b/Experts/x-saherelm.x121.ea.mq5 index 074bdf85..f8c7dc52 100644 --- a/Experts/x-saherelm.x121.ea.mq5 +++ b/Experts/x-saherelm.x121.ea.mq5 @@ -47,15 +47,15 @@ input bool x121EAUseAllWatchListSymbols = false; // // Signals ... input group "Signals"; -input bool x121EAAllowLong = true; // Allow Long Trades -input bool x121EAAllowShort = true; // Allow Short Trades -input int x121EAStartSignallingHoure = 3; // Start Signalling at Specific Time -input int x121EAEndSignallingHoure = 22; // End Signalling at Specific Time -input int x121EACloseOnSpecificTime = -1; // Close All Trades in Specific Time -input int x121EADelayBetweenTwoSignal = 10; // Delay Between two Same Signals -input int x121EAReuiredSignalVerifications = 4; // Required Verifications for Signals -input bool x121EAExecuteSignalsOnBreakout = false; // Execute Signals On Breakouts -input bool x121EAGetVerificationFromOtherTimeFrames = true; // Get Verifications from Other Time Frames +input bool x121EAAllowLong = true; // Allow Long Trades +input bool x121EAAllowShort = true; // Allow Short Trades +input int x121EAStartSignallingHoure = 3; // Start Signalling at Specific Time +input int x121EAEndSignallingHoure = 22; // End Signalling at Specific Time +input int x121EACloseOnSpecificTime = -1; // Close All Trades in Specific Time +input int x121EADelayBetweenTwoSignal = 5; // Delay Between two Same Signals +input int x121EAReuiredSignalVerifications = 10; // Required Verifications for Signals +input bool x121EAExecuteSignalsOnBreakout = false; // Execute Signals On Breakouts +input bool x121EAGetVerificationFromOtherTimeFrames = true; // Get Verifications from Other Time Frames // // Risk Management ... @@ -63,19 +63,19 @@ input group "Risk Management"; input double x121EAVolume = 0.01; // Static Volume input double x121EATPPoint = 1000; // TP Point input double x121EASLPoint = 1000; // SL Point -input bool x121EAIgnoreSL = false; // Ignore Calculated SL -input bool x121EAIgnoreTP = false; // Ignore Calculated TP +input bool x121EAIgnoreSL = true; // Ignore Calculated SL +input bool x121EAIgnoreTP = true; // Ignore Calculated TP input bool x121EACloseOnOpposit = false; // Close all Positions on Opposit -input int x121EAMaxAllowedTrades = 2; // Max Allowed Positions Per Symbol +input int x121EAMaxAllowedTrades = 0; // Max Allowed Positions Per Symbol input bool x121EAUseMaxAllowedPerDirection = true; // Use Max Allowed Positions Per Direction -input int x121EAMinFreeMargingForOpenTrades = 900; // Min Margin For Opening Trades +input int x121EAMaxAllowedDrawdownPercent = 5; // Max Allowed Drawdown for Open Trades input bool x121EAIncreaseNextSignalsVolume = true; // Increase Next Signals Volume input double x121EAIncreaseNextSignalsVolumeMultiplier = 1; // Increase Next Signals Volume Multiplier input bool x121EAAcceptNextDirectionalSignalsWhenFirstInProfit = true; // Accept Same Symbol/Type Signal when Last in Profit // input group "Trailling"; -input bool x121EAAllowTrailStop = true; // Enable Trailling Stop Losses +input bool x121EAAllowTrailStop = false; // Enable Trailling Stop Losses input bool x121EADisableTrailingWhenOpposit = true; // Disable Trailling When has Opposite In Drawdown input double x121EAFirstTrailDistance = 100; // Start Trailling Distance input double x121EAFirstTrailPoint = 60; // First Stop Trail @@ -112,7 +112,7 @@ input double x121EAMaxAllowedRecoveryVolume = 0; // Max Allowed Recovery Signals // input group "Hedging"; input int x121EARestingAfterHedge = 1000; // Resting Seconds After Hedge -input double x121EAMinRequiredProfitPerTrade = 0.3; // Minimum Required Profit for Hedging +input double x121EAMinRequiredProfitPerTrade = 2.5; // Minimum Required Profit for Hedging input double x121EAMinRequiredProfitPerVolumeFactor = 0.01; // Minimum Required Profit for Hedging Per Volume // @@ -326,7 +326,7 @@ bool InitialEA() x121EA.MaxAllowedTrades(x121EAMaxAllowedTrades); x121EA.IncreaseNextSignalsVolume(x121EAIncreaseNextSignalsVolume); x121EA.UseMaxAllowedPerDirection(x121EAUseMaxAllowedPerDirection); - x121EA.MinFreeMargingForOpenTrades(x121EAMinFreeMargingForOpenTrades); + x121EA.MaxAllowedDrawdownPercent(x121EAMaxAllowedDrawdownPercent); x121EA.IncreaseNextSignalsVolumeMultiplier(x121EAIncreaseNextSignalsVolumeMultiplier); x121EA.AcceptNextDirectionalSignalsWhenFirstInProfit(x121EAAcceptNextDirectionalSignalsWhenFirstInProfit);