From a146b1389cb88aa180aa62da74cd4b507d3b45e5 Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Wed, 28 Jan 2026 17:00:14 +0100 Subject: [PATCH] Optimizing and Refactoring HmaClusterBot & -Indicator --- Settings/HmaClusterBot, GER40 m5.cbotset | 24 +++ Sources/Robots/HmaClusterBot.algo | Bin 23495 -> 23511 bytes .../HmaClusterBot/HmaClusterBot.cs | 162 +++++++++++------- 3 files changed, 120 insertions(+), 66 deletions(-) create mode 100644 Settings/HmaClusterBot, GER40 m5.cbotset diff --git a/Settings/HmaClusterBot, GER40 m5.cbotset b/Settings/HmaClusterBot, GER40 m5.cbotset new file mode 100644 index 0000000..049bdc5 --- /dev/null +++ b/Settings/HmaClusterBot, GER40 m5.cbotset @@ -0,0 +1,24 @@ +{ + "Chart": { + "Symbol": "GER40", + "Period": "m5" + }, + "Parameters": { + "SymbolsCsv": "", + "RiskPercent": 1.0, + "EntrySigThreshold": 15.0, + "SlSigThreshold": 5.0, + "SmaBiasPeriod": 250, + "HmaBiasPeriod": 225, + "UseBiasDeviationFilter": true, + "BiasDeviationAvgPeriod": 100, + "UseDynamicPositionManagement": true, + "CloseProfitOnBiasFlip": false, + "HmaClusterPeriod": 25, + "MaxPoints": 2000, + "DecayPeriod": 1000, + "SendTelegramOnly": false, + "TelegramBotToken": "8569913524:AAE9RGsvkBPa0yhTFCKBjVeST0fuzdOx5w0", + "TelegramChatId": "5171721381" + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot.algo b/Sources/Robots/HmaClusterBot.algo index 31e5eef6a36fa2b1df3b8b85c82a303c600a713b..9f4af564fed17fdfcddca95fed2ee519a10d0866 100644 GIT binary patch literal 23511 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

-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 WZD|u{9+1VeMd1eIWrWZTvhQD$(9$XZ literal 23495 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

R59rEB3US3}=4+^) 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 GhU$me1{J~p diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs b/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs index 449fd6e..f6c0153 100644 --- a/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; -using Myc; // Referenz auf die extrahierte Cluster-Logik +using Myc; // Referencing external cluster logic namespace cAlgo.Robots { @@ -130,8 +130,6 @@ namespace cAlgo.Robots { Print(message); - // WICHTIG: Im Backtest NIEMALS Netzwerk-Calls machen, auch nicht bei Fehlern. - // Das führt bei vielen Fehlern zum Stillstand der Simulation. if (IsBacktesting) return; if (!string.IsNullOrWhiteSpace(TelegramBotToken) && !string.IsNullOrWhiteSpace(TelegramChatId)) @@ -272,7 +270,6 @@ namespace cAlgo.Robots private bool _deviationConditionMetInCurrentCycle; private bool _isTradingAllowedBasedOnPrevCycle; - // --- OPTIMIERUNG: Nutzt Calculator statt Liste --- private readonly Myc.ClusterCalculator _clusterCalculator; private readonly List _amplitudes = new(); @@ -305,7 +302,6 @@ namespace cAlgo.Robots _chatId = chatId; _errorCallback = errorCallback; - // Calculator mit Reserve initialisieren _clusterCalculator = new Myc.ClusterCalculator(); } @@ -470,57 +466,25 @@ namespace cAlgo.Robots ClusterLevel? newSl = null; ClusterLevel? newTp = null; + // For logic: Find nearest strong cluster behind entry (SL) and nearest strong cluster ahead (TP) + double highestSlPrice = double.MinValue; // Buy SL: Highest below price + double lowestTpPrice = double.MaxValue; // Buy TP: Lowest above price + + double lowestSlPrice = double.MaxValue; // Sell SL: Lowest above price + double highestTpPrice = double.MinValue; // Sell TP: Highest below price + if (pos.TradeType == TradeType.Buy) { - double highestSlPrice = double.MinValue; - double highestTpPrice = double.MinValue; - foreach (var c in clusters) { - if (c.Price < pNow && c.Significance < _config.SlSigThreshold && c.Price > highestSlPrice) + // SL: Strong clusters BELOW price -> Nearest one (Highest Price) + if (c.Price < pNow && c.Significance >= _config.SlSigThreshold && c.Price > highestSlPrice) { newSl = c; highestSlPrice = c.Price; } - if (c.Price > pNow && c.Significance >= _config.EntrySigThreshold && c.Price > highestTpPrice) - { - newTp = c; - highestTpPrice = c.Price; - } - } - - double proposedSl = (newSl.HasValue) ? newSl.Value.Price : (pos.StopLoss ?? 0); - double proposedTp = (newTp.HasValue) ? newTp.Value.Price : (pos.TakeProfit ?? 0); - - bool modifySl = pos.StopLoss.HasValue && (proposedSl > pos.StopLoss.Value + _symbol.TickSize); - if (!pos.StopLoss.HasValue && newSl.HasValue) modifySl = true; - - bool modifyTp = newTp.HasValue && Math.Abs(proposedTp - (pos.TakeProfit ?? 0)) > _symbol.TickSize; - - if (modifySl || modifyTp) - { - double finalSl = modifySl ? proposedSl : pos.StopLoss ?? 0; - double finalTp = modifyTp ? proposedTp : pos.TakeProfit ?? 0; - - if (finalSl < _symbol.Bid && (finalTp == 0 || finalTp > _symbol.Bid)) - { - _robot.ModifyPosition(pos, finalSl, finalTp, ProtectionType.Absolute); - } - } - } - else - { - double lowestSlPrice = double.MaxValue; - double lowestTpPrice = double.MaxValue; - - foreach (var c in clusters) - { - if (c.Price > pNow && c.Significance < _config.SlSigThreshold && c.Price < lowestSlPrice) - { - newSl = c; - lowestSlPrice = c.Price; - } - if (c.Price < pNow && c.Significance >= _config.EntrySigThreshold && c.Price < lowestTpPrice) + // TP: Strong clusters ABOVE price -> Nearest one (Lowest Price) + if (c.Price > pNow && c.Significance >= _config.EntrySigThreshold && c.Price < lowestTpPrice) { newTp = c; lowestTpPrice = c.Price; @@ -530,6 +494,47 @@ namespace cAlgo.Robots double proposedSl = (newSl.HasValue) ? newSl.Value.Price : (pos.StopLoss ?? 0); double proposedTp = (newTp.HasValue) ? newTp.Value.Price : (pos.TakeProfit ?? 0); + // Move SL up only (trailing) + bool modifySl = pos.StopLoss.HasValue && (proposedSl > pos.StopLoss.Value + _symbol.TickSize); + if (!pos.StopLoss.HasValue && newSl.HasValue) modifySl = true; + + // Update TP if it changes significantly + bool modifyTp = newTp.HasValue && Math.Abs(proposedTp - (pos.TakeProfit ?? 0)) > _symbol.TickSize; + + if (modifySl || modifyTp) + { + double finalSl = modifySl ? proposedSl : pos.StopLoss ?? 0; + double finalTp = modifyTp ? proposedTp : pos.TakeProfit ?? 0; + + // SL < Bid, TP > Bid (or 0) + if (finalSl < _symbol.Bid && (finalTp == 0 || finalTp > _symbol.Bid)) + { + _robot.ModifyPosition(pos, finalSl, finalTp, ProtectionType.Absolute); + } + } + } + else // Sell + { + foreach (var c in clusters) + { + // SL: Strong clusters ABOVE price -> Nearest one (Lowest Price) + if (c.Price > pNow && c.Significance >= _config.SlSigThreshold && c.Price < lowestSlPrice) + { + newSl = c; + lowestSlPrice = c.Price; + } + // TP: Strong clusters BELOW price -> Nearest one (Highest Price) + if (c.Price < pNow && c.Significance >= _config.EntrySigThreshold && c.Price > highestTpPrice) + { + newTp = c; + highestTpPrice = c.Price; + } + } + + double proposedSl = (newSl.HasValue) ? newSl.Value.Price : (pos.StopLoss ?? 0); + double proposedTp = (newTp.HasValue) ? newTp.Value.Price : (pos.TakeProfit ?? 0); + + // Move SL down only (trailing) bool modifySl = pos.StopLoss.HasValue && (proposedSl < pos.StopLoss.Value - _symbol.TickSize); if (!pos.StopLoss.HasValue && newSl.HasValue) modifySl = true; @@ -540,6 +545,7 @@ namespace cAlgo.Robots double finalSl = modifySl ? proposedSl : pos.StopLoss ?? 0; double finalTp = modifyTp ? proposedTp : pos.TakeProfit ?? 0; + // SL > Ask, TP < Ask (or 0) if (finalSl > _symbol.Ask && (finalTp == 0 || finalTp < _symbol.Ask)) { _robot.ModifyPosition(pos, finalSl, finalTp, ProtectionType.Absolute); @@ -619,20 +625,32 @@ namespace cAlgo.Robots ClusterLevel? sl = null; ClusterLevel? tp = null; - double highestEntryPrice = double.MinValue; - double lowestSlPrice = double.MaxValue; - double lowestTpPrice = double.MaxValue; + double highestEntryPrice = double.MinValue; // Entry: Deepest fade (Highest Price) + double lowestSlPrice = double.MaxValue; // SL: Nearest strong resistance above Entry (Lowest Price > Entry) + double highestTpPrice = double.MinValue; // TP: Nearest strong support below Entry (Highest Price < Entry) + // 1. Find Entry (Above Price) foreach (var c in clusters) { if (c.Price > pNow) { + // Aggressive fade: Pick highest price available if ((c.Significance >= _config.EntrySigThreshold) && (c.Price > highestEntryPrice)) { entry = c; highestEntryPrice = c.Price; } - if ((c.Significance < _config.SlSigThreshold) && (c.Price < lowestSlPrice)) + } + } + + if (entry == null) return; + + // 2. Find SL relative to Entry (Strong Cluster, Nearest Above) + foreach (var c in clusters) + { + if (c.Price > entry.Value.Price) + { + if (c.Significance >= _config.SlSigThreshold && c.Price < lowestSlPrice) { sl = c; lowestSlPrice = c.Price; @@ -640,16 +658,17 @@ namespace cAlgo.Robots } } - if (entry == null || sl == null) return; + if (sl == null) return; + // 3. Find TP relative to Entry (Strong Cluster, Nearest Below) foreach (var c in clusters) { - if ((c.Price < entry.Value.Price) && (c.Significance >= _config.EntrySigThreshold)) + if (c.Price < entry.Value.Price) { - if (c.Price < lowestTpPrice) + if (c.Significance >= _config.EntrySigThreshold && c.Price > highestTpPrice) { tp = c; - lowestTpPrice = c.Price; + highestTpPrice = c.Price; } } } @@ -670,20 +689,32 @@ namespace cAlgo.Robots ClusterLevel? sl = null; ClusterLevel? tp = null; - double lowestEntryPrice = double.MaxValue; - double highestSlPrice = double.MinValue; - double highestTpPrice = double.MinValue; + double lowestEntryPrice = double.MaxValue; // Entry: Deepest fade (Lowest Price) + double highestSlPrice = double.MinValue; // SL: Nearest strong support below Entry (Highest Price < Entry) + double lowestTpPrice = double.MaxValue; // TP: Nearest strong resistance above Entry (Lowest Price > Entry) + // 1. Find Entry (Below Price) foreach (var c in clusters) { if (c.Price < pNow) { + // Aggressive fade: Pick lowest price available if ((c.Significance >= _config.EntrySigThreshold) && (c.Price < lowestEntryPrice)) { entry = c; lowestEntryPrice = c.Price; } - if ((c.Significance < _config.SlSigThreshold) && (c.Price > highestSlPrice)) + } + } + + if (entry == null) return; + + // 2. Find SL relative to Entry (Strong Cluster, Nearest Below) + foreach (var c in clusters) + { + if (c.Price < entry.Value.Price) + { + if (c.Significance >= _config.SlSigThreshold && c.Price > highestSlPrice) { sl = c; highestSlPrice = c.Price; @@ -691,16 +722,17 @@ namespace cAlgo.Robots } } - if (entry == null || sl == null) return; + if (sl == null) return; + // 3. Find TP relative to Entry (Strong Cluster, Nearest Above) foreach (var c in clusters) { - if ((c.Price > entry.Value.Price) && (c.Significance >= _config.EntrySigThreshold)) + if (c.Price > entry.Value.Price) { - if (c.Price > highestTpPrice) + if (c.Significance >= _config.EntrySigThreshold && c.Price < lowestTpPrice) { tp = c; - highestTpPrice = c.Price; + lowestTpPrice = c.Price; } } } @@ -760,7 +792,6 @@ namespace cAlgo.Robots var result = _robot.ModifyPendingOrder(existingOrder, entry, sl, tp, ProtectionType.Absolute, null, volume); if (!result.IsSuccessful) { - // Falls Modifikation fehlschlägt (z.B. Spread), löschen wir die Order, um keine veralteten Levels zu handeln _robot.CancelPendingOrder(existingOrder); } } @@ -820,7 +851,6 @@ namespace cAlgo.Robots if (_currentDynamicRange < _symbol.PipSize) _currentDynamicRange = _symbol.PipSize; } - // Neuen Punkt in den optimierten Calculator einspeisen _clusterCalculator.AddPoint(new Myc.ExtremumPoint { Price = _trendExtremum,