From e7f32ac322f4c558c003f450d24639e4c762616d Mon Sep 17 00:00:00 2001 From: Bell Date: Tue, 10 Mar 2026 21:37:02 +0700 Subject: [PATCH] Separate swingranges cho each TF --- Experts/EA_ICT_CL/Config.mqh | 3 ++- Experts/EA_ICT_CL/Swing.mqh | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Experts/EA_ICT_CL/Config.mqh b/Experts/EA_ICT_CL/Config.mqh index 95cb69a..eb0d04a 100644 --- a/Experts/EA_ICT_CL/Config.mqh +++ b/Experts/EA_ICT_CL/Config.mqh @@ -14,7 +14,8 @@ input int InpLondonEndHour = 17; input int InpNYStartHour = 13; input int InpNYEndHour = 22; -input int InpSwingRange = 2; +input int InpMiddleTfSwingRange = 3; +input int InpTriggerTfSwingRange = 3; input int InpSwingLookback = 50; input int InpTriggerSwingLookback = 30; diff --git a/Experts/EA_ICT_CL/Swing.mqh b/Experts/EA_ICT_CL/Swing.mqh index 820668a..16b0179 100644 --- a/Experts/EA_ICT_CL/Swing.mqh +++ b/Experts/EA_ICT_CL/Swing.mqh @@ -17,20 +17,30 @@ inline int MyBarShift(string symbol, ENUM_TIMEFRAMES tf, datetime time, bool exa return exact ? -1 : copiedCount - 1; } -/** True if bar at index i is a swing high (InpSwingRange bars each side lower). */ +/** Returns swing range (number of bars each side) per timeframe. */ +inline int GetSwingRangeForTf(ENUM_TIMEFRAMES tf) +{ + if (tf == InpMiddleTF) return InpMiddleTfSwingRange; + if (tf == InpTriggerTF) return InpTriggerTfSwingRange; + return InpMiddleTfSwingRange; +} + +/** True if bar at index i is a swing high (swingRange bars each side lower). */ inline bool IsSwingHighAt(ENUM_TIMEFRAMES tf, int barIndex) { + int swingRange = GetSwingRangeForTf(tf); double highAtBar = iHigh(_Symbol, tf, barIndex); - for (int k = 1; k <= InpSwingRange; k++) + for (int k = 1; k <= swingRange; k++) if (iHigh(_Symbol, tf, barIndex - k) >= highAtBar || iHigh(_Symbol, tf, barIndex + k) >= highAtBar) return false; return true; } -/** True if bar at index i is a swing low (InpSwingRange bars each side higher). */ +/** True if bar at index i is a swing low (swingRange bars each side higher). */ inline bool IsSwingLowAt(ENUM_TIMEFRAMES tf, int barIndex) { + int swingRange = GetSwingRangeForTf(tf); double lowAtBar = iLow(_Symbol, tf, barIndex); - for (int k = 1; k <= InpSwingRange; k++) + for (int k = 1; k <= swingRange; k++) if (iLow(_Symbol, tf, barIndex - k) <= lowAtBar || iLow(_Symbol, tf, barIndex + k) <= lowAtBar) return false; return true; } @@ -41,11 +51,12 @@ inline bool ScanSwingStructure( double &h0, double &h1, int &idxH0, int &idxH1, double &l0, double &l1, int &idxL0, int &idxL1) { - int maxBar = MathMin(lookback, Bars(_Symbol, tf) - InpSwingRange - 2); + int swingRange = GetSwingRangeForTf(tf); + int maxBar = MathMin(lookback, Bars(_Symbol, tf) - swingRange - 2); double highs[2]; int hiIdx[2]; int highCount = 0; double lows [2]; int loIdx[2]; int lowCount = 0; - for (int i = InpSwingRange + 1; i <= maxBar; i++) + for (int i = swingRange + 1; i <= maxBar; i++) { if (highCount < 2 && IsSwingHighAt(tf, i)) { highs[highCount] = iHigh(_Symbol, tf, i); hiIdx[highCount] = i; highCount++; } if (lowCount < 2 && IsSwingLowAt (tf, i)) { lows [lowCount] = iLow (_Symbol, tf, i); loIdx[lowCount] = i; lowCount++; }