From a1d2e96f8a1e227271526c17d04fc585fe15775e Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Wed, 28 Jan 2026 09:10:52 +0100 Subject: [PATCH] Initial commit --- .gitignore | 4 + .../DAX open breakout, GER40 m15 long.cbotset | 22 + ...DAX open breakout, GER40 m15 short.cbotset | 22 + Settings/DAX open breakout, GER40 m15.cbotset | 21 + .../DAX open breakout, GER40 m30 long.cbotset | 22 + ...DAX open breakout, GER40 m30 short.cbotset | 22 + Sources/Common/MSLib.sln | 22 + Sources/Common/MSLib/LowPassFilter.cs | 450 +++++++++ Sources/Common/MSLib/MSLib.csproj | 9 + Sources/Common/MSLib/ZorroBinaryFiles.cs | 286 ++++++ .../MSLib/bin/Debug/net6.0/MSLib.deps.json | 23 + .../Common/MSLib/bin/Debug/net6.0/MSLib.dll | Bin 0 -> 15360 bytes .../Common/MSLib/bin/Debug/net6.0/MSLib.pdb | Bin 0 -> 15424 bytes ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../obj/Debug/net6.0/MSLib.AssemblyInfo.cs | 22 + .../net6.0/MSLib.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../obj/Debug/net6.0/MSLib.GlobalUsings.g.cs | 8 + .../MSLib/obj/Debug/net6.0/MSLib.assets.cache | Bin 0 -> 142 bytes .../MSLib.csproj.AssemblyReference.cache | Bin 0 -> 73349 bytes .../MSLib.csproj.CoreCompileInputs.cache | 1 + .../net6.0/MSLib.csproj.FileListAbsolute.txt | 12 + .../Common/MSLib/obj/Debug/net6.0/MSLib.dll | Bin 0 -> 15360 bytes .../Common/MSLib/obj/Debug/net6.0/MSLib.pdb | Bin 0 -> 15424 bytes .../MSLib/obj/Debug/net6.0/ref/MSLib.dll | Bin 0 -> 8192 bytes .../MSLib/obj/Debug/net6.0/refint/MSLib.dll | Bin 0 -> 8192 bytes .../MSLib/obj/MSLib.csproj.nuget.dgspec.json | 60 ++ .../MSLib/obj/MSLib.csproj.nuget.g.props | 15 + .../MSLib/obj/MSLib.csproj.nuget.g.targets | 2 + Sources/Common/MSLib/obj/project.assets.json | 65 ++ Sources/Common/MSLib/obj/project.nuget.cache | 8 + Sources/Indicators/Bar times.algo | Bin 0 -> 2899 bytes Sources/Indicators/Bar times/Bar times.sln | 20 + .../Bar times/Bar times/Bar times.cs | 47 + .../Bar times/Bar times/Bar times.csproj | 24 + .../Bar times/Properties/AssemblyInfo.cs | 20 + Sources/Indicators/BarCloseAlert.algo | Bin 0 -> 3098 bytes .../BarCloseAlert/BarCloseAlert.sln | 22 + .../BarCloseAlert/BarCloseAlert.cs | 72 ++ .../BarCloseAlert/BarCloseAlert.csproj | 9 + .../Indicators/Candlestick Patterns DEMO.algo | Bin 0 -> 16389 bytes .../Candlestick Patterns DEMO.sln | 20 + .../Candlestick Patterns DEMO.cs | 504 ++++++++++ .../Candlestick Patterns DEMO.csproj | 58 ++ .../Properties/AssemblyInfo.cs | 16 + .../Correlation with angle v1.1.algo | Bin 0 -> 7374 bytes .../Correlation with angle v1.1.sln | 22 + .../Correlation with angle v1.1.cs | 249 +++++ .../Correlation with angle v1.1.csproj | 9 + .../msAngle of MultiSymbol.cs | 182 ++++ .../msAngle of MultiSymbol.csproj | 9 + Sources/Indicators/Difference.algo | Bin 0 -> 2793 bytes Sources/Indicators/Difference/Difference.sln | 22 + .../Difference/Difference/Difference.cs | 32 + .../Difference/Difference/Difference.csproj | 9 + .../Indicators/Economic Events On Chart.algo | Bin 0 -> 303336 bytes .../Economic Events On Chart/.gitattributes | 63 ++ .../Economic Events On Chart/.gitignore | 363 +++++++ .../Economic Events On Chart.sln | 20 + .../Economic Events On Chart.cs | 345 +++++++ .../Economic Events On Chart.csproj | 60 ++ .../Properties/AssemblyInfo.cs | 20 + Sources/Indicators/HmaClusterDisplay.algo | Bin 0 -> 4032 bytes .../HmaClusterDisplay/.vscode/tasks.json | 1 + .../HmaClusterDisplay/HmaClusterDisplay.sln | 22 + .../HmaClusterDisplay/HmaClusterDisplay.cs | 135 +++ .../HmaClusterDisplay.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/HmaClusterDisplay.AssemblyInfo.cs | 22 + ...HmaClusterDisplay.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/HmaClusterDisplay.assets.cache | Bin 0 -> 571 bytes ...sterDisplay.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...HmaClusterDisplay.csproj.nuget.dgspec.json | 66 ++ .../HmaClusterDisplay.csproj.nuget.g.props | 21 + .../HmaClusterDisplay.csproj.nuget.g.targets | 6 + .../HmaClusterDisplay/obj/project.assets.json | 139 +++ .../HmaClusterDisplay/obj/project.nuget.cache | 10 + Sources/Indicators/HmaClusterSR.algo | Bin 0 -> 6761 bytes .../Indicators/HmaClusterSR/HmaClusterSR.sln | 22 + .../HmaClusterSR/HmaClusterSR/HmaClusterSR.cs | 875 ++++++++++++++++ .../HmaClusterSR/HmaClusterSR.csproj | 9 + .../HmaMitigationCount/HmaMitigationCount.sln | 22 + .../HmaMitigationCount/HmaMitigationCount.cs | 162 +++ .../HmaMitigationCount.csproj | 9 + Sources/Indicators/HmaMitigationSignals.algo | Bin 0 -> 4144 bytes .../HmaMitigationSignals/.vscode/tasks.json | 1 + .../HmaMitigationSignals.sln | 22 + .../HmaMitigationSignals.cs | 204 ++++ .../HmaMitigationSignals.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../HmaMitigationSignals.AssemblyInfo.cs | 22 + ...MitigationSignals.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/HmaMitigationSignals.assets.cache | Bin 0 -> 571 bytes ...tionSignals.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...MitigationSignals.csproj.nuget.dgspec.json | 66 ++ .../HmaMitigationSignals.csproj.nuget.g.props | 21 + ...maMitigationSignals.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Indicators/HmaSmaCrossoverSignal.algo | Bin 0 -> 3424 bytes .../HmaSmaCrossoverSignal.sln | 22 + .../HmaSmaCrossoverSignal.cs | 101 ++ .../HmaSmaCrossoverSignal.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../HmaSmaCrossoverSignal.AssemblyInfo.cs | 22 + ...maCrossoverSignal.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/HmaSmaCrossoverSignal.assets.cache | Bin 0 -> 571 bytes ...soverSignal.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...maCrossoverSignal.csproj.nuget.dgspec.json | 66 ++ ...HmaSmaCrossoverSignal.csproj.nuget.g.props | 21 + ...aSmaCrossoverSignal.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Indicators/ImbalanceAlert.algo | Bin 0 -> 4873 bytes .../ImbalanceAlert/ImbalanceAlert.sln | 22 + .../ImbalanceAlert/ImbalanceAlert.cs | 170 ++++ .../ImbalanceAlert/ImbalanceAlert.csproj | 9 + Sources/Indicators/Kairi Relative Index.algo | Bin 0 -> 6123 bytes .../Kairi Relative Index.sln | 20 + .../Kairi Relative Index.cs | 33 + .../Kairi Relative Index.csproj | 60 ++ .../Properties/AssemblyInfo.cs | 20 + Sources/Indicators/MACD Crossover (7).algo | Bin 0 -> 3441 bytes .../MACD Crossover (7)/MACD Crossover (7).sln | 20 + .../MACD Crossover (7)/MACD Crossover (7).cs | 155 +++ .../MACD Crossover (7).csproj | 24 + .../MACD Crossover (7).csproj.backup | 64 ++ .../Properties/AssemblyInfo.cs | 20 + .../Release/net6.0/MACD Crossover (7).algo | Bin 0 -> 4907 bytes .../net6.0/MACD Crossover (7).algo.metadata | 132 +++ .../net6.0/MACD Crossover (7).deps.json | 41 + .../bin/Release/net6.0/MACD Crossover (7).dll | Bin 0 -> 8704 bytes .../bin/Release/net6.0/MACD Crossover (7).pdb | Bin 0 -> 10912 bytes .../publish/MACD Crossover (7).deps.json | 41 + .../net6.0/publish/MACD Crossover (7).dll | Bin 0 -> 8704 bytes .../net6.0/publish/MACD Crossover (7).pdb | Bin 0 -> 10912 bytes .../bin/Release/net6.0/publish/cAlgo.API.dll | Bin 0 -> 314368 bytes ...ACD Crossover (7).csproj.nuget.dgspec.json | 66 ++ .../MACD Crossover (7).csproj.nuget.g.props | 21 + .../MACD Crossover (7).csproj.nuget.g.targets | 6 + ... Crossover (7).csproj.FileListAbsolute.txt | 0 ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/MACD Crossover (7).assets.cache | Bin 0 -> 568 bytes ...ossover (7).csproj.AssemblyReference.cache | Bin 0 -> 73771 bytes ...ossover (7).csproj.CoreCompileInputs.cache | 1 + ... Crossover (7).csproj.FileListAbsolute.txt | 10 + .../obj/Release/net6.0/MACD Crossover (7).dll | Bin 0 -> 8704 bytes .../obj/Release/net6.0/MACD Crossover (7).pdb | Bin 0 -> 10912 bytes .../net6.0/PublishOutputs.d8d4e7c099.txt | 4 + .../Release/net6.0/ref/MACD Crossover (7).dll | Bin 0 -> 7680 bytes .../net6.0/refint/MACD Crossover (7).dll | Bin 0 -> 7680 bytes .../obj/project.assets.json | 136 +++ .../obj/project.nuget.cache | 10 + Sources/Indicators/MS_LowPassFilterDemo.algo | Bin 0 -> 9162 bytes .../MS_LowPassFilterDemo/.vscode/tasks.json | 1 + .../MS_LowPassFilterDemo.sln | 22 + .../MS_LowPassFilterDemo.cs | 205 ++++ .../MS_LowPassFilterDemo.csproj | 14 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../MS_LowPassFilterDemo.AssemblyInfo.cs | 22 + ...LowPassFilterDemo.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/MS_LowPassFilterDemo.assets.cache | Bin 0 -> 571 bytes ...sFilterDemo.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...LowPassFilterDemo.csproj.nuget.dgspec.json | 66 ++ .../MS_LowPassFilterDemo.csproj.nuget.g.props | 21 + ...S_LowPassFilterDemo.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Indicators/MS_MMI-Gemini.algo | Bin 0 -> 7146 bytes .../MS_MMI-Gemini/.vscode/tasks.json | 1 + .../MS_MMI-Gemini/MS_MMI-Gemini.sln | 22 + .../MS_MMI-Gemini/MS_MMI-Gemini.cs | 39 + .../MS_MMI-Gemini/MS_MMI-Gemini.csproj | 14 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/MS_MMI-Gemini.AssemblyInfo.cs | 22 + .../MS_MMI-Gemini.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../Debug/net6.0/MS_MMI-Gemini.assets.cache | Bin 0 -> 571 bytes ..._MMI-Gemini.csproj.AssemblyReference.cache | Bin 0 -> 74006 bytes .../MS_MMI-Gemini.csproj.nuget.dgspec.json | 66 ++ .../obj/MS_MMI-Gemini.csproj.nuget.g.props | 21 + .../obj/MS_MMI-Gemini.csproj.nuget.g.targets | 6 + .../MS_MMI-Gemini/obj/project.assets.json | 139 +++ .../MS_MMI-Gemini/obj/project.nuget.cache | 10 + Sources/Indicators/MS_Trend_BlackBook.algo | Bin 0 -> 9169 bytes .../MultiTimeframeSignalAggregator.algo | Bin 0 -> 6193 bytes .../.vscode/tasks.json | 1 + .../MultiTimeframeSignalAggregator.sln | 25 + .../MultiTimeframeSignalAggregator.cs | 156 +++ .../MultiTimeframeSignalAggregator.csproj | 12 + ...oreApp,Version=v10.0.AssemblyAttributes.cs | 4 + ...iTimeframeSignalAggregator.AssemblyInfo.cs | 22 + ...eSignalAggregator.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + ...imeframeSignalAggregator.GlobalUsings.g.cs | 8 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + ...iTimeframeSignalAggregator.AssemblyInfo.cs | 22 + ...eSignalAggregator.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + ...ultiTimeframeSignalAggregator.assets.cache | Bin 0 -> 571 bytes ...lAggregator.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...eSignalAggregator.csproj.nuget.dgspec.json | 128 +++ ...frameSignalAggregator.csproj.nuget.g.props | 21 + ...ameSignalAggregator.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 162 +++ .../obj/project.nuget.cache | 10 + Sources/Indicators/Parabolic Stop.algo | Bin 0 -> 3415 bytes .../Parabolic Stop/Parabolic Stop.sln | 22 + .../Parabolic Stop/Parabolic Stop.cs | 74 ++ .../Parabolic Stop/Parabolic Stop.csproj | 9 + Sources/Indicators/Sample Alligator.algo | Bin 0 -> 4304 bytes .../Sample Alligator/Sample Alligator.sln | 25 + .../Sample Alligator/Sample Alligator.cs | 63 ++ .../Sample Alligator/Sample Alligator.csproj | 9 + Sources/Indicators/Sample Bears Power.algo | Bin 0 -> 4040 bytes .../Sample Bears Power/Sample Bears Power.sln | 25 + .../Sample Bears Power/Sample Bears Power.cs | 42 + .../Sample Bears Power.csproj | 9 + Sources/Indicators/Sample Bulls Power.algo | Bin 0 -> 4043 bytes .../Sample Bulls Power/Sample Bulls Power.sln | 25 + .../Sample Bulls Power/Sample Bulls Power.cs | 42 + .../Sample Bulls Power.csproj | 9 + Sources/Indicators/Sample DeMarker.algo | Bin 0 -> 3790 bytes .../Sample DeMarker/Sample DeMarker.sln | 25 + .../Sample DeMarker/Sample DeMarker.cs | 49 + .../Sample DeMarker/Sample DeMarker.csproj | 9 + Sources/Indicators/Sample EMA.algo | Bin 0 -> 2499 bytes Sources/Indicators/Sample EMA/Sample EMA.sln | 25 + .../Sample EMA/Sample EMA/Sample EMA.cs | 43 + .../Sample EMA/Sample EMA/Sample EMA.csproj | 9 + .../Indicators/Sample Envelopes Cloud.algo | Bin 0 -> 4115 bytes .../Sample Envelopes Cloud.sln | 25 + .../Sample Envelopes Cloud.cs | 39 + .../Sample Envelopes Cloud.csproj | 9 + Sources/Indicators/Sample Price Channels.algo | Bin 0 -> 3861 bytes .../Sample Price Channels.sln | 25 + .../Sample Price Channels.cs | 46 + .../Sample Price Channels.csproj | 9 + Sources/Indicators/Sample Reference SMA.algo | Bin 0 -> 6052 bytes .../Sample Reference SMA.sln | 25 + .../Sample Reference SMA.cs | 38 + .../Sample Reference SMA.csproj | 13 + Sources/Indicators/Sample SMA.algo | Bin 0 -> 3604 bytes Sources/Indicators/Sample SMA/Sample SMA.sln | 25 + .../Sample SMA/Sample SMA/Sample SMA.cs | 36 + .../Sample SMA/Sample SMA/Sample SMA.csproj | 9 + .../Indicators/Sample Standard Deviation.algo | Bin 0 -> 4104 bytes .../Sample Standard Deviation.sln | 25 + .../Sample Standard Deviation.cs | 49 + .../Sample Standard Deviation.csproj | 9 + Sources/Indicators/SmaHmaCrossoverAlert.algo | Bin 0 -> 3571 bytes .../SmaHmaCrossoverAlert.sln | 22 + .../SmaHmaCrossoverAlert.cs | 118 +++ .../SmaHmaCrossoverAlert.csproj | 9 + Sources/Plugins/MS_StartAllBots.algo | Bin 0 -> 2688 bytes .../MS_StartAllBots/MS_StartAllBots.sln | 22 + .../MS_StartAllBots/MS_StartAllBots.cs | 67 ++ .../MS_StartAllBots/MS_StartAllBots.csproj | 9 + Sources/Plugins/Webhook.algo | Bin 0 -> 5759 bytes Sources/Plugins/Webhook/Webhook.sln | 22 + Sources/Plugins/Webhook/Webhook/Webhook.cs | 308 ++++++ .../Plugins/Webhook/Webhook/Webhook.csproj | 9 + Sources/Robots/HMACrossBot.algo | Bin 0 -> 4245 bytes Sources/Robots/HMACrossBot/.vscode/tasks.json | 1 + Sources/Robots/HMACrossBot/HMACrossBot.sln | 22 + .../HMACrossBot/HMACrossBot/HMACrossBot.cs | 148 +++ .../HMACrossBot/HMACrossBot.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../Debug/net6.0/HMACrossBot.AssemblyInfo.cs | 22 + .../HMACrossBot.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../obj/Debug/net6.0/HMACrossBot.assets.cache | Bin 0 -> 571 bytes ...HMACrossBot.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../obj/HMACrossBot.csproj.nuget.dgspec.json | 66 ++ .../obj/HMACrossBot.csproj.nuget.g.props | 21 + .../obj/HMACrossBot.csproj.nuget.g.targets | 6 + .../HMACrossBot/obj/project.assets.json | 139 +++ .../HMACrossBot/obj/project.nuget.cache | 10 + Sources/Robots/Hma20CandleStartegy_V1.algo | Bin 0 -> 3829 bytes .../Hma20CandleStartegy_V1/.vscode/tasks.json | 1 + .../Hma20CandleStartegy_V1.sln | 22 + .../Hma20CandleStartegy_V1.cs | 130 +++ .../Hma20CandleStartegy_V1.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../Hma20CandleStartegy_V1.AssemblyInfo.cs | 22 + ...CandleStartegy_V1.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../Hma20CandleStartegy_V1.assets.cache | Bin 0 -> 571 bytes ...Startegy_V1.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...CandleStartegy_V1.csproj.nuget.dgspec.json | 66 ++ ...ma20CandleStartegy_V1.csproj.nuget.g.props | 21 + ...20CandleStartegy_V1.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Robots/HmaClusterBot.algo | Bin 0 -> 13784 bytes .../Robots/HmaClusterBot/.vscode/tasks.json | 1 + .../Robots/HmaClusterBot/HmaClusterBot.sln | 22 + .../HmaClusterBot/HmaClusterBot.cs | 936 ++++++++++++++++++ .../HmaClusterBot/HmaClusterBot.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/HmaClusterBot.AssemblyInfo.cs | 22 + .../HmaClusterBot.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../Debug/net6.0/HmaClusterBot.assets.cache | Bin 0 -> 571 bytes ...aClusterBot.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../HmaClusterBot.csproj.nuget.dgspec.json | 66 ++ .../obj/HmaClusterBot.csproj.nuget.g.props | 21 + .../obj/HmaClusterBot.csproj.nuget.g.targets | 6 + .../HmaClusterBot/obj/project.assets.json | 139 +++ .../HmaClusterBot/obj/project.nuget.cache | 10 + Sources/Robots/HmaClusterSR.algo | Bin 0 -> 14977 bytes Sources/Robots/HmaKcBot.algo | Bin 0 -> 3822 bytes Sources/Robots/HmaKcBot/.vscode/tasks.json | 1 + Sources/Robots/HmaKcBot/HmaKcBot.sln | 22 + Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.cs | 114 +++ .../Robots/HmaKcBot/HmaKcBot/HmaKcBot.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../obj/Debug/net6.0/HmaKcBot.AssemblyInfo.cs | 22 + .../net6.0/HmaKcBot.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../obj/Debug/net6.0/HmaKcBot.assets.cache | Bin 0 -> 571 bytes .../HmaKcBot.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../obj/HmaKcBot.csproj.nuget.dgspec.json | 66 ++ .../obj/HmaKcBot.csproj.nuget.g.props | 21 + .../obj/HmaKcBot.csproj.nuget.g.targets | 6 + .../HmaKcBot/HmaKcBot/obj/project.assets.json | 139 +++ .../HmaKcBot/HmaKcBot/obj/project.nuget.cache | 10 + Sources/Robots/HmaSmaCrossoverBot.algo | Bin 0 -> 4698 bytes .../HmaSmaCrossoverBot/.vscode/tasks.json | 1 + .../HmaSmaCrossoverBot/HmaSmaCrossoverBot.sln | 22 + .../HmaSmaCrossoverBot/HmaSmaCrossoverBot.cs | 198 ++++ .../HmaSmaCrossoverBot.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/HmaSmaCrossoverBot.AssemblyInfo.cs | 22 + ...maSmaCrossoverBot.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/HmaSmaCrossoverBot.assets.cache | Bin 0 -> 571 bytes ...rossoverBot.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...maSmaCrossoverBot.csproj.nuget.dgspec.json | 66 ++ .../HmaSmaCrossoverBot.csproj.nuget.g.props | 21 + .../HmaSmaCrossoverBot.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Robots/HmaStructureBot.algo | Bin 0 -> 4374 bytes .../Robots/HmaStructureBot/.vscode/tasks.json | 1 + .../HmaStructureBot/HmaStructureBot.sln | 22 + .../HmaStructureBot/HmaStructureBot.cs | 227 +++++ .../HmaStructureBot/HmaStructureBot.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/HmaStructureBot.AssemblyInfo.cs | 22 + .../HmaStructureBot.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../Debug/net6.0/HmaStructureBot.assets.cache | Bin 0 -> 571 bytes ...tructureBot.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../HmaStructureBot.csproj.nuget.dgspec.json | 66 ++ .../obj/HmaStructureBot.csproj.nuget.g.props | 21 + .../HmaStructureBot.csproj.nuget.g.targets | 6 + .../HmaStructureBot/obj/project.assets.json | 139 +++ .../HmaStructureBot/obj/project.nuget.cache | 10 + Sources/Robots/HmaTrendTrader.algo | Bin 0 -> 8829 bytes .../Robots/HmaTrendTrader/.vscode/tasks.json | 1 + .../Robots/HmaTrendTrader/HmaTrendTrader.sln | 22 + .../HmaTrendTrader/HmaTrendTrader.cs | 513 ++++++++++ .../HmaTrendTrader/HmaTrendTrader.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/HmaTrendTrader.AssemblyInfo.cs | 22 + .../HmaTrendTrader.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../Debug/net6.0/HmaTrendTrader.assets.cache | Bin 0 -> 571 bytes ...TrendTrader.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../HmaTrendTrader.csproj.nuget.dgspec.json | 66 ++ .../obj/HmaTrendTrader.csproj.nuget.g.props | 21 + .../obj/HmaTrendTrader.csproj.nuget.g.targets | 6 + .../HmaTrendTrader/obj/project.assets.json | 139 +++ .../HmaTrendTrader/obj/project.nuget.cache | 10 + Sources/Robots/MS_ExportM1.algo | Bin 0 -> 4826 bytes Sources/Robots/MS_ExportM1/.vscode/tasks.json | 1 + Sources/Robots/MS_ExportM1/MS_ExportM1.sln | 22 + .../MS_ExportM1/MS_ExportM1/MS_ExportM1.cs | 193 ++++ .../MS_ExportM1/MS_ExportM1.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../Debug/net6.0/MS_ExportM1.AssemblyInfo.cs | 22 + .../MS_ExportM1.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../obj/Debug/net6.0/MS_ExportM1.assets.cache | Bin 0 -> 571 bytes ...MS_ExportM1.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../obj/MS_ExportM1.csproj.nuget.dgspec.json | 66 ++ .../obj/MS_ExportM1.csproj.nuget.g.props | 21 + .../obj/MS_ExportM1.csproj.nuget.g.targets | 6 + .../MS_ExportM1/obj/project.assets.json | 139 +++ .../MS_ExportM1/obj/project.nuget.cache | 10 + Sources/Robots/MS_ExportTickData.algo | Bin 0 -> 18815 bytes .../MS_ExportTickData/.vscode/tasks.json | 1 + .../MS_ExportTickData/MS_ExportTickData.sln | 22 + .../MS_ExportTickData/MS_ExportTickData.cs | 446 +++++++++ .../MS_ExportTickData.csproj | 14 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/MS_ExportTickData.AssemblyInfo.cs | 22 + ...MS_ExportTickData.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/MS_ExportTickData.assets.cache | Bin 0 -> 571 bytes ...ortTickData.csproj.AssemblyReference.cache | Bin 0 -> 74006 bytes ...MS_ExportTickData.csproj.nuget.dgspec.json | 66 ++ .../MS_ExportTickData.csproj.nuget.g.props | 21 + .../MS_ExportTickData.csproj.nuget.g.targets | 6 + .../MS_ExportTickData/obj/project.assets.json | 139 +++ .../MS_ExportTickData/obj/project.nuget.cache | 10 + Sources/Robots/MS_HistoryToZorro.algo | Bin 0 -> 11694 bytes .../MS_HistoryToZorro/.vscode/tasks.json | 1 + .../MS_HistoryToZorro/MS_HistoryToZorro.sln | 22 + .../MS_HistoryToZorro/MS_HistoryToZorro.cs | 174 ++++ .../MS_HistoryToZorro.csproj | 14 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../net6.0/MS_HistoryToZorro.AssemblyInfo.cs | 22 + ...MS_HistoryToZorro.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/MS_HistoryToZorro.assets.cache | Bin 0 -> 571 bytes ...toryToZorro.csproj.AssemblyReference.cache | Bin 0 -> 74006 bytes ...MS_HistoryToZorro.csproj.nuget.dgspec.json | 66 ++ .../MS_HistoryToZorro.csproj.nuget.g.props | 21 + .../MS_HistoryToZorro.csproj.nuget.g.targets | 6 + .../MS_HistoryToZorro/obj/project.assets.json | 139 +++ .../MS_HistoryToZorro/obj/project.nuget.cache | 10 + Sources/Robots/MS_IncrementalExport.algo | Bin 0 -> 3735 bytes .../MS_IncrementalExport/.vscode/tasks.json | 1 + .../MS_IncrementalExport.sln | 22 + .../MS_IncrementalExport.cs | 186 ++++ .../MS_IncrementalExport.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../MS_IncrementalExport.AssemblyInfo.cs | 22 + ...IncrementalExport.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/MS_IncrementalExport.assets.cache | Bin 0 -> 571 bytes ...entalExport.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...IncrementalExport.csproj.nuget.dgspec.json | 66 ++ .../MS_IncrementalExport.csproj.nuget.g.props | 21 + ...S_IncrementalExport.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Robots/MS_SimpleExport.algo | Bin 0 -> 3974 bytes .../MS_SimpleExport/MS_SimpleExport.sln | 22 + .../MS_SimpleExport/MS_SimpleExport.cs | 108 ++ .../MS_SimpleExport/MS_SimpleExport.csproj | 9 + Sources/Robots/Multi-MA-Bot.algo | Bin 0 -> 5415 bytes .../Robots/Multi-MA-Bot/.vscode/tasks.json | 1 + Sources/Robots/Multi-MA-Bot/Multi-MA-Bot.sln | 22 + .../Multi-MA-Bot/Multi-MA-Bot/Multi-MA-Bot.cs | 208 ++++ .../Multi-MA-Bot/Multi-MA-Bot.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../Debug/net6.0/Multi-MA-Bot.AssemblyInfo.cs | 22 + .../Multi-MA-Bot.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../Debug/net6.0/Multi-MA-Bot.assets.cache | Bin 0 -> 571 bytes ...ulti-MA-Bot.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes .../obj/Multi-MA-Bot.csproj.nuget.dgspec.json | 66 ++ .../obj/Multi-MA-Bot.csproj.nuget.g.props | 21 + .../obj/Multi-MA-Bot.csproj.nuget.g.targets | 6 + .../Multi-MA-Bot/obj/project.assets.json | 139 +++ .../Multi-MA-Bot/obj/project.nuget.cache | 10 + Sources/Robots/MultiSmaHmaNotify.algo | Bin 0 -> 7445 bytes .../MultiSmaHmaNotify/MultiSmaHmaNotify.sln | 22 + .../MultiSmaHmaNotify/MultiSmaHmaNotify.cs | 305 ++++++ .../MultiSmaHmaNotify.csproj | 9 + .../Robots/MultiTimeframeIndicatorBot_v1.algo | Bin 0 -> 9148 bytes .../.vscode/tasks.json | 1 + .../MultiTimeframeIndicatorBot_v1.sln | 22 + .../MultiTimeframeIndicatorBot_v1.cs | 392 ++++++++ .../MultiTimeframeIndicatorBot_v1.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + ...tiTimeframeIndicatorBot_v1.AssemblyInfo.cs | 22 + ...meIndicatorBot_v1.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + ...MultiTimeframeIndicatorBot_v1.assets.cache | Bin 0 -> 571 bytes ...catorBot_v1.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...meIndicatorBot_v1.csproj.nuget.dgspec.json | 66 ++ ...eframeIndicatorBot_v1.csproj.nuget.g.props | 21 + ...rameIndicatorBot_v1.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Robots/RoundNumberBreakout.algo | Bin 0 -> 4806 bytes .../RoundNumberBreakout/.vscode/tasks.json | 1 + .../RoundNumberBreakout.sln | 22 + .../RoundNumberBreakout.cs | 209 ++++ .../RoundNumberBreakout.csproj | 9 + ...CoreApp,Version=v6.0.AssemblyAttributes.cs | 4 + .../RoundNumberBreakout.AssemblyInfo.cs | 22 + ...undNumberBreakout.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 10 + .../net6.0/RoundNumberBreakout.assets.cache | Bin 0 -> 571 bytes ...berBreakout.csproj.AssemblyReference.cache | Bin 0 -> 73772 bytes ...undNumberBreakout.csproj.nuget.dgspec.json | 66 ++ .../RoundNumberBreakout.csproj.nuget.g.props | 21 + ...RoundNumberBreakout.csproj.nuget.g.targets | 6 + .../obj/project.assets.json | 139 +++ .../obj/project.nuget.cache | 10 + Sources/Robots/SL-Manager.algo | Bin 0 -> 3866 bytes Sources/Robots/SL-Manager/SL-Manager.sln | 22 + .../SL-Manager/SL-Manager/SL-Manager.cs | 149 +++ .../SL-Manager/SL-Manager/SL-Manager.csproj | 9 + Sources/Robots/SmaHmaBot.algo | Bin 0 -> 7405 bytes Sources/Robots/SmaHmaBot/SmaHmaBot.sln | 22 + .../Robots/SmaHmaBot/SmaHmaBot/SmaHmaBot.cs | 259 +++++ .../SmaHmaBot/SmaHmaBot/SmaHmaBot.csproj | 9 + Sources/Robots/SmaHmaNotification.algo | Bin 0 -> 6414 bytes .../SmaHmaNotification/SmaHmaNotification.sln | 22 + .../SmaHmaNotification/SmaHmaNotification.cs | 230 +++++ .../SmaHmaNotification.csproj | 9 + Sources/Robots/Web Sockets Sample.algo | Bin 0 -> 2393 bytes 513 files changed, 19503 insertions(+) create mode 100644 .gitignore create mode 100644 Settings/DAX open breakout, GER40 m15 long.cbotset create mode 100644 Settings/DAX open breakout, GER40 m15 short.cbotset create mode 100644 Settings/DAX open breakout, GER40 m15.cbotset create mode 100644 Settings/DAX open breakout, GER40 m30 long.cbotset create mode 100644 Settings/DAX open breakout, GER40 m30 short.cbotset create mode 100644 Sources/Common/MSLib.sln create mode 100644 Sources/Common/MSLib/LowPassFilter.cs create mode 100644 Sources/Common/MSLib/MSLib.csproj create mode 100644 Sources/Common/MSLib/ZorroBinaryFiles.cs create mode 100644 Sources/Common/MSLib/bin/Debug/net6.0/MSLib.deps.json create mode 100644 Sources/Common/MSLib/bin/Debug/net6.0/MSLib.dll create mode 100644 Sources/Common/MSLib/bin/Debug/net6.0/MSLib.pdb create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfo.cs create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfoInputs.cache create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GlobalUsings.g.cs create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.assets.cache create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.AssemblyReference.cache create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.CoreCompileInputs.cache create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.FileListAbsolute.txt create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.dll create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/MSLib.pdb create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/ref/MSLib.dll create mode 100644 Sources/Common/MSLib/obj/Debug/net6.0/refint/MSLib.dll create mode 100644 Sources/Common/MSLib/obj/MSLib.csproj.nuget.dgspec.json create mode 100644 Sources/Common/MSLib/obj/MSLib.csproj.nuget.g.props create mode 100644 Sources/Common/MSLib/obj/MSLib.csproj.nuget.g.targets create mode 100644 Sources/Common/MSLib/obj/project.assets.json create mode 100644 Sources/Common/MSLib/obj/project.nuget.cache create mode 100644 Sources/Indicators/Bar times.algo create mode 100644 Sources/Indicators/Bar times/Bar times.sln create mode 100644 Sources/Indicators/Bar times/Bar times/Bar times.cs create mode 100644 Sources/Indicators/Bar times/Bar times/Bar times.csproj create mode 100644 Sources/Indicators/Bar times/Bar times/Properties/AssemblyInfo.cs create mode 100644 Sources/Indicators/BarCloseAlert.algo create mode 100644 Sources/Indicators/BarCloseAlert/BarCloseAlert.sln create mode 100644 Sources/Indicators/BarCloseAlert/BarCloseAlert/BarCloseAlert.cs create mode 100644 Sources/Indicators/BarCloseAlert/BarCloseAlert/BarCloseAlert.csproj create mode 100644 Sources/Indicators/Candlestick Patterns DEMO.algo create mode 100644 Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO.sln create mode 100644 Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.cs create mode 100644 Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.csproj create mode 100644 Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Properties/AssemblyInfo.cs create mode 100644 Sources/Indicators/Correlation with angle v1.1.algo create mode 100644 Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1.sln create mode 100644 Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.cs create mode 100644 Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.csproj create mode 100644 Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.cs create mode 100644 Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.csproj create mode 100644 Sources/Indicators/Difference.algo create mode 100644 Sources/Indicators/Difference/Difference.sln create mode 100644 Sources/Indicators/Difference/Difference/Difference.cs create mode 100644 Sources/Indicators/Difference/Difference/Difference.csproj create mode 100644 Sources/Indicators/Economic Events On Chart.algo create mode 100644 Sources/Indicators/Economic Events On Chart/.gitattributes create mode 100644 Sources/Indicators/Economic Events On Chart/.gitignore create mode 100644 Sources/Indicators/Economic Events On Chart/Economic Events On Chart.sln create mode 100644 Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.cs create mode 100644 Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.csproj create mode 100644 Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Properties/AssemblyInfo.cs create mode 100644 Sources/Indicators/HmaClusterDisplay.algo create mode 100644 Sources/Indicators/HmaClusterDisplay/.vscode/tasks.json create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay.sln create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/HmaClusterDisplay.cs create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/HmaClusterDisplay.csproj create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfo.cs create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.assets.cache create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.props create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.targets create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.assets.json create mode 100644 Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.nuget.cache create mode 100644 Sources/Indicators/HmaClusterSR.algo create mode 100644 Sources/Indicators/HmaClusterSR/HmaClusterSR.sln create mode 100644 Sources/Indicators/HmaClusterSR/HmaClusterSR/HmaClusterSR.cs create mode 100644 Sources/Indicators/HmaClusterSR/HmaClusterSR/HmaClusterSR.csproj create mode 100644 Sources/Indicators/HmaMitigationCount/HmaMitigationCount.sln create mode 100644 Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.cs create mode 100644 Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.csproj create mode 100644 Sources/Indicators/HmaMitigationSignals.algo create mode 100644 Sources/Indicators/HmaMitigationSignals/.vscode/tasks.json create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals.sln create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/HmaMitigationSignals.cs create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/HmaMitigationSignals.csproj create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfo.cs create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.assets.cache create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.props create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.targets create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.assets.json create mode 100644 Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.nuget.cache create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal.algo create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.sln create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.cs create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.csproj create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfo.cs create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.assets.cache create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.props create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.targets create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.assets.json create mode 100644 Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.nuget.cache create mode 100644 Sources/Indicators/ImbalanceAlert.algo create mode 100644 Sources/Indicators/ImbalanceAlert/ImbalanceAlert.sln create mode 100644 Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.cs create mode 100644 Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.csproj create mode 100644 Sources/Indicators/Kairi Relative Index.algo create mode 100644 Sources/Indicators/Kairi Relative Index/Kairi Relative Index.sln create mode 100644 Sources/Indicators/Kairi Relative Index/Kairi Relative Index/Kairi Relative Index.cs create mode 100644 Sources/Indicators/Kairi Relative Index/Kairi Relative Index/Kairi Relative Index.csproj create mode 100644 Sources/Indicators/Kairi Relative Index/Kairi Relative Index/Properties/AssemblyInfo.cs create mode 100644 Sources/Indicators/MACD Crossover (7).algo create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7).sln create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).cs create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj.backup create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/Properties/AssemblyInfo.cs create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).algo create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).algo.metadata create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).deps.json create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).dll create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).pdb create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).deps.json create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).dll create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).pdb create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/cAlgo.API.dll create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.props create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.targets create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/MACD Crossover (7).csproj.FileListAbsolute.txt create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).assets.cache create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.CoreCompileInputs.cache create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.FileListAbsolute.txt create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).dll create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).pdb create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/PublishOutputs.d8d4e7c099.txt create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/ref/MACD Crossover (7).dll create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/refint/MACD Crossover (7).dll create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.assets.json create mode 100644 Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.nuget.cache create mode 100644 Sources/Indicators/MS_LowPassFilterDemo.algo create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/.vscode/tasks.json create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo.sln create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/MS_LowPassFilterDemo.cs create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/MS_LowPassFilterDemo.csproj create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfo.cs create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.assets.cache create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.props create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.targets create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.assets.json create mode 100644 Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.nuget.cache create mode 100644 Sources/Indicators/MS_MMI-Gemini.algo create mode 100644 Sources/Indicators/MS_MMI-Gemini/.vscode/tasks.json create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini.sln create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.cs create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.csproj create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfo.cs create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.assets.cache create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.props create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.targets create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.assets.json create mode 100644 Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.nuget.cache create mode 100644 Sources/Indicators/MS_Trend_BlackBook.algo create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator.algo create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/.vscode/tasks.json create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.sln create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.cs create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.csproj create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GlobalUsings.g.cs create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.assets.cache create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.csproj.AssemblyReference.cache create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.dgspec.json create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.props create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.targets create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.assets.json create mode 100644 Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.nuget.cache create mode 100644 Sources/Indicators/Parabolic Stop.algo create mode 100644 Sources/Indicators/Parabolic Stop/Parabolic Stop.sln create mode 100644 Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.cs create mode 100644 Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.csproj create mode 100644 Sources/Indicators/Sample Alligator.algo create mode 100644 Sources/Indicators/Sample Alligator/Sample Alligator.sln create mode 100644 Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.cs create mode 100644 Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.csproj create mode 100644 Sources/Indicators/Sample Bears Power.algo create mode 100644 Sources/Indicators/Sample Bears Power/Sample Bears Power.sln create mode 100644 Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.cs create mode 100644 Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.csproj create mode 100644 Sources/Indicators/Sample Bulls Power.algo create mode 100644 Sources/Indicators/Sample Bulls Power/Sample Bulls Power.sln create mode 100644 Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.cs create mode 100644 Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.csproj create mode 100644 Sources/Indicators/Sample DeMarker.algo create mode 100644 Sources/Indicators/Sample DeMarker/Sample DeMarker.sln create mode 100644 Sources/Indicators/Sample DeMarker/Sample DeMarker/Sample DeMarker.cs create mode 100644 Sources/Indicators/Sample DeMarker/Sample DeMarker/Sample DeMarker.csproj create mode 100644 Sources/Indicators/Sample EMA.algo create mode 100644 Sources/Indicators/Sample EMA/Sample EMA.sln create mode 100644 Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.cs create mode 100644 Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.csproj create mode 100644 Sources/Indicators/Sample Envelopes Cloud.algo create mode 100644 Sources/Indicators/Sample Envelopes Cloud/Sample Envelopes Cloud.sln create mode 100644 Sources/Indicators/Sample Envelopes Cloud/Sample Envelopes Cloud/Sample Envelopes Cloud.cs create mode 100644 Sources/Indicators/Sample Envelopes Cloud/Sample Envelopes Cloud/Sample Envelopes Cloud.csproj create mode 100644 Sources/Indicators/Sample Price Channels.algo create mode 100644 Sources/Indicators/Sample Price Channels/Sample Price Channels.sln create mode 100644 Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.cs create mode 100644 Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.csproj create mode 100644 Sources/Indicators/Sample Reference SMA.algo create mode 100644 Sources/Indicators/Sample Reference SMA/Sample Reference SMA.sln create mode 100644 Sources/Indicators/Sample Reference SMA/Sample Reference SMA/Sample Reference SMA.cs create mode 100644 Sources/Indicators/Sample Reference SMA/Sample Reference SMA/Sample Reference SMA.csproj create mode 100644 Sources/Indicators/Sample SMA.algo create mode 100644 Sources/Indicators/Sample SMA/Sample SMA.sln create mode 100644 Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.cs create mode 100644 Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.csproj create mode 100644 Sources/Indicators/Sample Standard Deviation.algo create mode 100644 Sources/Indicators/Sample Standard Deviation/Sample Standard Deviation.sln create mode 100644 Sources/Indicators/Sample Standard Deviation/Sample Standard Deviation/Sample Standard Deviation.cs create mode 100644 Sources/Indicators/Sample Standard Deviation/Sample Standard Deviation/Sample Standard Deviation.csproj create mode 100644 Sources/Indicators/SmaHmaCrossoverAlert.algo create mode 100644 Sources/Indicators/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert.sln create mode 100644 Sources/Indicators/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert.cs create mode 100644 Sources/Indicators/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert.csproj create mode 100644 Sources/Plugins/MS_StartAllBots.algo create mode 100644 Sources/Plugins/MS_StartAllBots/MS_StartAllBots.sln create mode 100644 Sources/Plugins/MS_StartAllBots/MS_StartAllBots/MS_StartAllBots.cs create mode 100644 Sources/Plugins/MS_StartAllBots/MS_StartAllBots/MS_StartAllBots.csproj create mode 100644 Sources/Plugins/Webhook.algo create mode 100644 Sources/Plugins/Webhook/Webhook.sln create mode 100644 Sources/Plugins/Webhook/Webhook/Webhook.cs create mode 100644 Sources/Plugins/Webhook/Webhook/Webhook.csproj create mode 100644 Sources/Robots/HMACrossBot.algo create mode 100644 Sources/Robots/HMACrossBot/.vscode/tasks.json create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot.sln create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/HMACrossBot.cs create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/HMACrossBot.csproj create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfo.cs create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.assets.cache create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.props create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.targets create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/project.assets.json create mode 100644 Sources/Robots/HMACrossBot/HMACrossBot/obj/project.nuget.cache create mode 100644 Sources/Robots/Hma20CandleStartegy_V1.algo create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/.vscode/tasks.json create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.sln create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.cs create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.csproj create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfo.cs create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.assets.cache create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Hma20CandleStartegy_V1.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Hma20CandleStartegy_V1.csproj.nuget.g.props create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Hma20CandleStartegy_V1.csproj.nuget.g.targets create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.assets.json create mode 100644 Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.nuget.cache create mode 100644 Sources/Robots/HmaClusterBot.algo create mode 100644 Sources/Robots/HmaClusterBot/.vscode/tasks.json create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot.sln create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.csproj create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfo.cs create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.assets.cache create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.props create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.targets create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.assets.json create mode 100644 Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.nuget.cache create mode 100644 Sources/Robots/HmaClusterSR.algo create mode 100644 Sources/Robots/HmaKcBot.algo create mode 100644 Sources/Robots/HmaKcBot/.vscode/tasks.json create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot.sln create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.cs create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.csproj create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfo.cs create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.assets.cache create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.props create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.targets create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/project.assets.json create mode 100644 Sources/Robots/HmaKcBot/HmaKcBot/obj/project.nuget.cache create mode 100644 Sources/Robots/HmaSmaCrossoverBot.algo create mode 100644 Sources/Robots/HmaSmaCrossoverBot/.vscode/tasks.json create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot.sln create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.cs create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.csproj create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfo.cs create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.assets.cache create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.props create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.targets create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.assets.json create mode 100644 Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.nuget.cache create mode 100644 Sources/Robots/HmaStructureBot.algo create mode 100644 Sources/Robots/HmaStructureBot/.vscode/tasks.json create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot.sln create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.cs create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.csproj create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfo.cs create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.assets.cache create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.props create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.targets create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.assets.json create mode 100644 Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.nuget.cache create mode 100644 Sources/Robots/HmaTrendTrader.algo create mode 100644 Sources/Robots/HmaTrendTrader/.vscode/tasks.json create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader.sln create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/HmaTrendTrader.cs create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/HmaTrendTrader.csproj create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfo.cs create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.assets.cache create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.props create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.targets create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.assets.json create mode 100644 Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.nuget.cache create mode 100644 Sources/Robots/MS_ExportM1.algo create mode 100644 Sources/Robots/MS_ExportM1/.vscode/tasks.json create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1.sln create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/MS_ExportM1.cs create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/MS_ExportM1.csproj create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfo.cs create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.assets.cache create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.props create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.targets create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.assets.json create mode 100644 Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.nuget.cache create mode 100644 Sources/Robots/MS_ExportTickData.algo create mode 100644 Sources/Robots/MS_ExportTickData/.vscode/tasks.json create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData.sln create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/MS_ExportTickData.cs create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/MS_ExportTickData.csproj create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfo.cs create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.assets.cache create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.props create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.targets create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.assets.json create mode 100644 Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.nuget.cache create mode 100644 Sources/Robots/MS_HistoryToZorro.algo create mode 100644 Sources/Robots/MS_HistoryToZorro/.vscode/tasks.json create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro.sln create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.cs create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.csproj create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfo.cs create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.assets.cache create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/MS_HistoryToZorro.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/MS_HistoryToZorro.csproj.nuget.g.props create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/MS_HistoryToZorro.csproj.nuget.g.targets create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.assets.json create mode 100644 Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.nuget.cache create mode 100644 Sources/Robots/MS_IncrementalExport.algo create mode 100644 Sources/Robots/MS_IncrementalExport/.vscode/tasks.json create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport.sln create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.cs create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.csproj create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfo.cs create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.assets.cache create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.props create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.targets create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.assets.json create mode 100644 Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.nuget.cache create mode 100644 Sources/Robots/MS_SimpleExport.algo create mode 100644 Sources/Robots/MS_SimpleExport/MS_SimpleExport.sln create mode 100644 Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.cs create mode 100644 Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.csproj create mode 100644 Sources/Robots/Multi-MA-Bot.algo create mode 100644 Sources/Robots/Multi-MA-Bot/.vscode/tasks.json create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot.sln create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/Multi-MA-Bot.cs create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/Multi-MA-Bot.csproj create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfo.cs create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.assets.cache create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.props create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.targets create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.assets.json create mode 100644 Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.nuget.cache create mode 100644 Sources/Robots/MultiSmaHmaNotify.algo create mode 100644 Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify.sln create mode 100644 Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.cs create mode 100644 Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.csproj create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1.algo create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/.vscode/tasks.json create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.sln create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.cs create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.csproj create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfo.cs create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.assets.cache create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/MultiTimeframeIndicatorBot_v1.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/MultiTimeframeIndicatorBot_v1.csproj.nuget.g.props create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/MultiTimeframeIndicatorBot_v1.csproj.nuget.g.targets create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.assets.json create mode 100644 Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.nuget.cache create mode 100644 Sources/Robots/RoundNumberBreakout.algo create mode 100644 Sources/Robots/RoundNumberBreakout/.vscode/tasks.json create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout.sln create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.cs create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.csproj create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfo.cs create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfoInputs.cache create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.assets.cache create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.csproj.AssemblyReference.cache create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.dgspec.json create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.props create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.targets create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.assets.json create mode 100644 Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.nuget.cache create mode 100644 Sources/Robots/SL-Manager.algo create mode 100644 Sources/Robots/SL-Manager/SL-Manager.sln create mode 100644 Sources/Robots/SL-Manager/SL-Manager/SL-Manager.cs create mode 100644 Sources/Robots/SL-Manager/SL-Manager/SL-Manager.csproj create mode 100644 Sources/Robots/SmaHmaBot.algo create mode 100644 Sources/Robots/SmaHmaBot/SmaHmaBot.sln create mode 100644 Sources/Robots/SmaHmaBot/SmaHmaBot/SmaHmaBot.cs create mode 100644 Sources/Robots/SmaHmaBot/SmaHmaBot/SmaHmaBot.csproj create mode 100644 Sources/Robots/SmaHmaNotification.algo create mode 100644 Sources/Robots/SmaHmaNotification/SmaHmaNotification.sln create mode 100644 Sources/Robots/SmaHmaNotification/SmaHmaNotification/SmaHmaNotification.cs create mode 100644 Sources/Robots/SmaHmaNotification/SmaHmaNotification/SmaHmaNotification.csproj create mode 100644 Sources/Robots/Web Sockets Sample.algo diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b13ca30 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +API +CloudJournal +Data +Export diff --git a/Settings/DAX open breakout, GER40 m15 long.cbotset b/Settings/DAX open breakout, GER40 m15 long.cbotset new file mode 100644 index 0000000..008255b --- /dev/null +++ b/Settings/DAX open breakout, GER40 m15 long.cbotset @@ -0,0 +1,22 @@ +{ + "Chart": { + "Symbol": "GER40", + "Period": "m15" + }, + "Parameters": { + "direction": "1", + "entryhour": "9", + "entryminute": "0", + "cancelhour": "14", + "closehour": "18", + "kclen": "14", + "kcmult": "1", + "atrmult": "3.3", + "slmult": "2.8000000000000003", + "tpmult": "2.8000000000000003", + "filtertrend": "True", + "malength": "240", + "compounding": "False", + "risk": "2" + } +} \ No newline at end of file diff --git a/Settings/DAX open breakout, GER40 m15 short.cbotset b/Settings/DAX open breakout, GER40 m15 short.cbotset new file mode 100644 index 0000000..567bbab --- /dev/null +++ b/Settings/DAX open breakout, GER40 m15 short.cbotset @@ -0,0 +1,22 @@ +{ + "Chart": { + "Symbol": "GER40", + "Period": "m15" + }, + "Parameters": { + "direction": "-1", + "entryhour": "9", + "entryminute": "0", + "cancelhour": "14", + "closehour": "18", + "kclen": "14", + "kcmult": "1", + "atrmult": "3.2", + "slmult": "2.7", + "tpmult": "2.1", + "filtertrend": "True", + "malength": "220", + "compounding": "False", + "risk": "2" + } +} \ No newline at end of file diff --git a/Settings/DAX open breakout, GER40 m15.cbotset b/Settings/DAX open breakout, GER40 m15.cbotset new file mode 100644 index 0000000..f4c7f01 --- /dev/null +++ b/Settings/DAX open breakout, GER40 m15.cbotset @@ -0,0 +1,21 @@ +{ + "Chart": { + "Symbol": "GER40", + "Period": "m15" + }, + "Parameters": { + "entryhour": 9, + "entryminute": 0, + "cancelhour": 14, + "closehour": 18, + "kclen": 14, + "kcmult": 1.0, + "atrmult": 3.2, + "slmult": 2.8, + "tpmult": 2.5, + "filtertrend": true, + "malength": 230, + "compounding": false, + "risk": 2 + } +} \ No newline at end of file diff --git a/Settings/DAX open breakout, GER40 m30 long.cbotset b/Settings/DAX open breakout, GER40 m30 long.cbotset new file mode 100644 index 0000000..6a21948 --- /dev/null +++ b/Settings/DAX open breakout, GER40 m30 long.cbotset @@ -0,0 +1,22 @@ +{ + "Chart": { + "Symbol": "GER40", + "Period": "m30" + }, + "Parameters": { + "direction": "1", + "entryhour": "9", + "entryminute": "0", + "cancelhour": "14", + "closehour": "18", + "kclen": "10", + "kcmult": "0.8", + "atrmult": "2.5", + "slmult": "2.5", + "tpmult": "2.6", + "filtertrend": "True", + "malength": "260", + "compounding": "False", + "risk": "2" + } +} \ No newline at end of file diff --git a/Settings/DAX open breakout, GER40 m30 short.cbotset b/Settings/DAX open breakout, GER40 m30 short.cbotset new file mode 100644 index 0000000..e64d8ed --- /dev/null +++ b/Settings/DAX open breakout, GER40 m30 short.cbotset @@ -0,0 +1,22 @@ +{ + "Chart": { + "Symbol": "GER40", + "Period": "m30" + }, + "Parameters": { + "direction": "-1", + "entryhour": "9", + "entryminute": "0", + "cancelhour": "14", + "closehour": "18", + "kclen": "10", + "kcmult": "1.3", + "atrmult": "2.5", + "slmult": "2.6", + "tpmult": "2.1", + "filtertrend": "True", + "malength": "200", + "compounding": "False", + "risk": "2" + } +} \ No newline at end of file diff --git a/Sources/Common/MSLib.sln b/Sources/Common/MSLib.sln new file mode 100644 index 0000000..b4eb1b6 --- /dev/null +++ b/Sources/Common/MSLib.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30114.105 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSLib", "MSLib\MSLib.csproj", "{81C5B946-7D77-4DDD-B9E0-9AE6E47ADE2E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {81C5B946-7D77-4DDD-B9E0-9AE6E47ADE2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81C5B946-7D77-4DDD-B9E0-9AE6E47ADE2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81C5B946-7D77-4DDD-B9E0-9AE6E47ADE2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81C5B946-7D77-4DDD-B9E0-9AE6E47ADE2E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Sources/Common/MSLib/LowPassFilter.cs b/Sources/Common/MSLib/LowPassFilter.cs new file mode 100644 index 0000000..6cfd73b --- /dev/null +++ b/Sources/Common/MSLib/LowPassFilter.cs @@ -0,0 +1,450 @@ +using System; +using System.Collections.Generic; // Required for List and Queue +using System.Linq; // Required for .Any() and .ToArray() +using System.Diagnostics; // For Debug.WriteLine, if needed for warnings/errors + +namespace MS +{ + // ICalculation interface defines a contract for updatable and resettable calculation objects. + // This allows different types of indicators or filters to be used interchangeably + // if they adhere to this structure. + public interface ICalculation + { + // Update processes a new data point (inputValue). + // inputValue: The new data point to incorporate into the calculation. + // commitState: If true, the internal state of the calculator is permanently updated. + // If false, the calculation is performed as a "peek" or "what-if" scenario + // without altering the persistent state of the calculator. + // Returns: The calculated value (e.g., median, MMI, filtered output) as a double. + // May return double.NaN if the calculation cannot be performed (e.g., insufficient data). + double Update(double inputValue, bool commitState = true); + + // Reset re-initializes the calculator to its default state. + // This typically involves clearing any stored historical data or state variables, + // making the calculator ready for a new sequence of data. + void Reset(); + } + + // Median class calculates a rolling median over a specified period. + // The median is the middle value of a data set sorted in ascending order. + // This implementation allows for committing state changes or calculating a "what-if" median. + public class Median : ICalculation + { + private readonly int _period; // The number of data points in the rolling window. + private readonly List _windowValues; // Stores the sorted values within the current window. Used for efficient median calculation. + private readonly Queue _windowOrder; // Stores the values in insertion order to manage the rolling window (FIFO). + + // Constructor for the Median calculator. + // period: The number of data points to include in the median calculation window. Must be positive. + public Median(int period) + { + if (period <= 0) + throw new ArgumentOutOfRangeException(nameof(period), "Period must be positive."); + + _period = period; + _windowValues = new List(_period); // Initialize with capacity for performance. + _windowOrder = new Queue(_period); // Initialize with capacity. + } + + // Updates the median calculation with a new data point (inputValue). + // If commitState is true, the inputValue is added to the window, and the oldest value is removed if the window is full. + // The median is then calculated from this updated (persisted) window. + // If commitState is false, the median is calculated based on a temporary window: + // - If the persisted window is full, it simulates replacing the oldest values with inputValue (current logic uses P-1 smallest). + // - If the persisted window is not full, it adds inputValue to the current persisted values. + // This temporary calculation does not alter the actual persisted state of _windowValues or _windowOrder. + public double Update(double inputValue, bool commitState = true) + { + List tempWindowForCalc = new List(); // Temporary list for performing the median calculation. + + if (commitState) // Persist the new value and update the window. + { + _windowOrder.Enqueue(inputValue); // Add to FIFO queue to track age. + int insertIndex = _windowValues.BinarySearch(inputValue); // Find position in sorted list. + if (insertIndex < 0) insertIndex = ~insertIndex; // If not found, get complement for insertion index. + _windowValues.Insert(insertIndex, inputValue); // Insert into sorted list. + + if (_windowOrder.Count > _period) // If window size exceeds period. + { + double oldestValue = _windowOrder.Dequeue(); // Remove oldest from FIFO queue. + _windowValues.Remove(oldestValue); // Remove oldest from sorted list (can be slow if list is large). + } + tempWindowForCalc.AddRange(_windowValues); // Calculation based on the actual, updated window. + } + else // Calculate "what-if" median without persisting state. + { + if (_windowValues.Any()) // If there are existing values. + { + if (_windowValues.Count == _period) // If the persisted window is full. + { + // Current "what-if" logic: takes the _period-1 smallest values from the current window + // and adds the new inputValue. This might not always reflect replacing the "oldest" actual item. + for (int i = 0; i < _period - 1; ++i) tempWindowForCalc.Add(_windowValues[i]); + } + else // Persisted window is not yet full. + { + tempWindowForCalc.AddRange(_windowValues); // Use all current values. + } + } + tempWindowForCalc.Add(inputValue); // Add the new input value to the temporary set. + } + + if (!tempWindowForCalc.Any()) // If no data in the temporary window. + { + return double.NaN; // Cannot calculate median. + } + + tempWindowForCalc.Sort(); // Median calculation requires a sorted list. + + int n = tempWindowForCalc.Count; + double calculatedMedian; + + if (n == 0) return double.NaN; // Should be caught by .Any() check above. + + if (n % 2 == 0) // Even number of elements. + { + if (n >= 2) { // Median is the average of the two middle elements. + calculatedMedian = (tempWindowForCalc[n / 2 - 1] + tempWindowForCalc[n / 2]) / 2.0; + } else { + return double.NaN; // Not enough elements for a meaningful even median. + } + } + else // Odd number of elements. + { + calculatedMedian = tempWindowForCalc[n / 2]; // Median is the middle element. + } + return calculatedMedian; + } + + // Resets the Median calculator to its initial state. + // Clears all stored values from the calculation window. + public void Reset() + { + _windowValues.Clear(); // Empties the sorted list of values. + _windowOrder.Clear(); // Empties the queue tracking insertion order. + } + } + + // MMI (Market Meanness Index) class calculates a rolling index indicating if a market is trending or mean-reverting. + // It uses a Median calculator internally. + // The MMI value is typically between 0 and 100. + public class MMI : ICalculation + { + private readonly int _period; // The period for MMI and its internal Median calculation. + private readonly Median _medianCalculator; // Internal Median calculator instance. + private readonly Queue _priceWindow; // Stores raw price values in insertion order for MMI logic. + + // Constructor for the MMI calculator. + // period: The number of data points for the MMI window. Must be at least 2. + public MMI(int period) + { + if (period < 2) // MMI calculation requires at least 2 data points to compare. + throw new ArgumentOutOfRangeException(nameof(period), "Period must be at least 2 for MMI calculation."); + + _period = period; + _medianCalculator = new Median(period); // Initialize the Median helper. + _priceWindow = new Queue(period); // Initialize price queue. + } + + // Updates the MMI calculation with a new data point (inputValue). + // It first updates its internal Median calculator. + // Then, it updates its own price window based on commitState. + // Finally, it calculates MMI based on the median and the price window. + // MMI is calculated as 100 * (nl + nh) / (period - 1), where: + // nl: count of prices > median and > previous price. + // nh: count of prices < median and < previous price. + // Returns NaN if the median is NaN or if the price window for MMI isn't full (_period size). + public double Update(double inputValue, bool commitState = true) + { + // Update the median, passing through the commitState. + double calculatedMedian = _medianCalculator.Update(inputValue, commitState); + + double[] pricesForMmiLoop; // Array to hold prices for the MMI loop. + + if (commitState) // Persist inputValue in MMI's price window. + { + _priceWindow.Enqueue(inputValue); + if (_priceWindow.Count > _period) + { + _priceWindow.Dequeue(); // Maintain window size. + } + pricesForMmiLoop = _priceWindow.ToArray(); // Use the actual, updated price window. + } + else // "What-if" scenario for MMI price window. + { + List tempList = new List(); + if (_priceWindow.Any()) + { + if (_priceWindow.Count == _period) // If full, simulate replacing the oldest. + { + var tempQueue = new Queue(_priceWindow.Skip(1)); // Create a new queue, skipping the oldest. + tempQueue.Enqueue(inputValue); // Add the new value. + pricesForMmiLoop = tempQueue.ToArray(); + } + else // Not full, just add to current MMI prices. + { + tempList.AddRange(_priceWindow); + tempList.Add(inputValue); + pricesForMmiLoop = tempList.ToArray(); + } + } + else // Price window is empty. + { + tempList.Add(inputValue); + pricesForMmiLoop = tempList.ToArray(); + } + } + + // MMI can only be calculated if median is valid and the price window for the loop is full. + if (double.IsNaN(calculatedMedian) || pricesForMmiLoop.Length != _period) + { + return double.NaN; + } + + int nl = 0; // Counter for "trending up" conditions. + int nh = 0; // Counter for "trending down" conditions. + // Loop starts from 1 because it compares price[i] with price[i-1]. + for (int i = 1; i < _period; i++) + { + double priceInWindow = pricesForMmiLoop[i]; + double prevPriceInWindow = pricesForMmiLoop[i - 1]; + // Condition for nl: price is above median and current price is greater than previous price. + if (priceInWindow > calculatedMedian && priceInWindow > prevPriceInWindow) nl++; + // Condition for nh: price is below median and current price is less than previous price. + else if (priceInWindow < calculatedMedian && priceInWindow < prevPriceInWindow) nh++; + } + // Denominator (_period - 1) is safe because constructor enforces _period >= 2. + return 100.0 * (nl + nh) / (_period - 1); + } + + // Resets the MMI calculator to its initial state. + // This involves resetting its internal Median calculator and clearing its own price window. + public void Reset() + { + _medianCalculator.Reset(); // Reset the dependent Median calculator. + _priceWindow.Clear(); // Clear the MMI's specific price data. + } + } + + // LowPassFilter class implements a 2nd order IIR (Infinite Impulse Response) digital filter. + // It can be configured as various types of low-pass filters (Butterworth, Bessel, Chebyshev) + // using static factory methods. + // The filter equation is: + // y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2] + public class LowPassFilter : ICalculation + { + // Filter coefficients for the numerator (feedforward) + private readonly double _b0, _b1, _b2; + // Filter coefficients for the denominator (feedback), signs are for the direct subtraction in formula. + private readonly double _a1, _a2; + + // State variables storing previous input values. + private double _x1; // x[n-1] + private double _x2; // x[n-2] + // State variables storing previous output values. + private double _y1; // y[n-1] + private double _y2; // y[n-2] + + // Constructor to initialize the filter with specific coefficients. + // Used by the static factory methods or for custom filter designs. + // b0_coeff, b1_coeff, b2_coeff: Numerator (feedforward) coefficients. + // a1_coeff, a2_coeff: Denominator (feedback) coefficients for the form y[n] = ... - a1*y[n-1] - a2*y[n-2]. + public LowPassFilter(double b0_coeff, double b1_coeff, double b2_coeff, double a1_coeff, double a2_coeff) + { + _b0 = b0_coeff; + _b1 = b1_coeff; + _b2 = b2_coeff; + _a1 = a1_coeff; // Corresponds to a1 in y[n] = ... - a1*y[n-1] + _a2 = a2_coeff; // Corresponds to a2 in y[n] = ... - a2*y[n-2] + Reset(); // Initialize state variables to zero. + } + + // Factory method to create a 2nd order Butterworth low-pass filter. + // Butterworth filters are known for their maximally flat passband response. + // cutoffFrequency: The -3dB cutoff frequency of the filter. + // samplingFrequency: The sampling frequency of the input signal. + public static LowPassFilter CreateButterworthLowPass(double cutoffFrequency, double samplingFrequency) + { + if (cutoffFrequency <= 0) + throw new ArgumentOutOfRangeException(nameof(cutoffFrequency), "Cutoff frequency must be positive."); + if (samplingFrequency <= 0) + throw new ArgumentOutOfRangeException(nameof(samplingFrequency), "Sampling frequency must be positive."); + // Cutoff frequency must be less than Nyquist frequency (samplingFrequency / 2.0). + if (cutoffFrequency >= samplingFrequency / 2.0) + throw new ArgumentOutOfRangeException(nameof(cutoffFrequency), $"Cutoff frequency ({cutoffFrequency}) must be strictly less than half the sampling frequency ({samplingFrequency / 2.0})."); + + double b0_calc, b1_calc, b2_calc, a1_calc, a2_calc; + // Prewarp the cutoff frequency for the bilinear transform. + // C = tan(pi * fc / fs) + double C = Math.Tan(Math.PI * cutoffFrequency / samplingFrequency); + + if (Math.Abs(C) < 1e-12) // Handle extremely low cutoff (approaching DC). + { + b0_calc = 0; b1_calc = 0; b2_calc = 0; // Effectively blocks AC signals. + // Coefficients for y[n] = 2*y[n-1] - y[n-2] (integrator-like behavior for output). + a1_calc = -2.0; // So that -a1_calc*y[n-1] becomes +2*y[n-1]. + a2_calc = 1.0; // So that -a2_calc*y[n-2] becomes -1*y[n-2]. + } + else + { + double sqrt2 = Math.Sqrt(2.0); + // Denominator factor for Butterworth coefficients after bilinear transform. + double D_butter = 1.0 / (1.0 + sqrt2 * C + C * C); + + // Numerator coefficients + b0_calc = C * C * D_butter; + b1_calc = 2.0 * b0_calc; + b2_calc = b0_calc; + + // Denominator coefficients (for 1 + a1_std*z^-1 + a2_std*z^-2) + // These are directly used as _a1, _a2 in the filter update equation. + a1_calc = 2.0 * (C * C - 1.0) * D_butter; + a2_calc = (1.0 - sqrt2 * C + C * C) * D_butter; + } + return new LowPassFilter(b0_calc, b1_calc, b2_calc, a1_calc, a2_calc); + } + + // Factory method to create a 2nd order Bessel low-pass filter. + // Bessel filters are known for their maximally flat group delay (linear phase response in passband). + // cutoffFrequency: The -3dB cutoff frequency. Note: Bessel filter design often refers to other frequency points. + // This implementation aims for -3dB at the specified cutoffFrequency. + // samplingFrequency: The sampling frequency of the input signal. + public static LowPassFilter CreateBesselLowPass(double cutoffFrequency, double samplingFrequency) + { + if (cutoffFrequency <= 0) throw new ArgumentOutOfRangeException(nameof(cutoffFrequency), "Cutoff frequency must be positive."); + if (samplingFrequency <= 0) throw new ArgumentOutOfRangeException(nameof(samplingFrequency), "Sampling frequency must be positive."); + if (cutoffFrequency >= samplingFrequency / 2.0) throw new ArgumentOutOfRangeException(nameof(cutoffFrequency), $"Cutoff frequency ({cutoffFrequency}) must be strictly less than half the sampling frequency ({samplingFrequency / 2.0})."); + + // C_bessel = tan(pi * fc / fs), prewarped frequency factor. + double C_bessel = Math.Tan(Math.PI * cutoffFrequency / samplingFrequency); + if (Math.Abs(C_bessel) < 1e-12) // Handle low cutoff. + { + return new LowPassFilter(0, 0, 0, -2.0, 1.0); // Similar to Butterworth low cutoff. + } + + // Coefficients derived from analog Bessel prototype (s^2 + 3s + 3), + // frequency scaled for -3dB at cutoffFrequency, then transformed using bilinear method. + // omega_c_analog_warped = 2 * fs * tan(pi * fc / fs) + double omega_c_analog_warped = 2.0 * samplingFrequency * C_bessel; + // k_bessel_norm_3db is a scaling factor for the Bessel prototype's natural frequency + // to achieve the -3dB point at the desired warped analog cutoff. Value is approx. 1.3617. + double k_bessel_norm_3db = 1.3617070504; // Sqrt(3 * (Sqrt(5.0) - 1.0) / 2.0) + double omega_0_scaled = omega_c_analog_warped / k_bessel_norm_3db; // Scaled analog natural frequency for prototype. + + // Analog prototype denominator: s^2 + A_s*s + B_s + // For Bessel n=2, scaled: s^2 + (3*omega_0_scaled)*s + (3*omega_0_scaled^2) + double as_coeff_analog = 3.0 * omega_0_scaled; // Coefficient for s-term. + double bs_coeff_analog = 3.0 * omega_0_scaled * omega_0_scaled; // Constant term (and numerator for DC gain 1). + + // K_T_bilinear = 2 * fs, factor in bilinear transform s = K_T * (1-z^-1)/(1+z^-1) (if K_T is used for 2/T_sample) + // Here, K_T_bilinear is 2*fs. + double K_T_bilinear = 2.0 * samplingFrequency; + + // Denominator after bilinear transform of H(s) = bs_coeff_analog / (s^2 + as_coeff_analog*s + bs_coeff_analog) + // gives A0_prime_denom = (K_T^2) + as_coeff_analog*K_T + bs_coeff_analog for normalization. + double A0_prime_denom = K_T_bilinear * K_T_bilinear + as_coeff_analog * K_T_bilinear + bs_coeff_analog; + if (Math.Abs(A0_prime_denom) < 1e-12) throw new InvalidOperationException("Denominator term A0_prime_denom is zero in Bessel filter calculation."); + + // Digital filter coefficients b_i = Bi_prime / A0_prime_denom, a_i = Ai_prime_std / A0_prime_denom + double b0_calc = bs_coeff_analog / A0_prime_denom; + double b1_calc = (2.0 * bs_coeff_analog) / A0_prime_denom; // From bilinear transform structure. + double b2_calc = bs_coeff_analog / A0_prime_denom; + + // Denominator coefficients for 1 + a1_std*z^-1 + a2_std*z^-2 form. + double a1_calc = (2.0 * bs_coeff_analog - 2.0 * K_T_bilinear * K_T_bilinear) / A0_prime_denom; + double a2_calc = (K_T_bilinear * K_T_bilinear - as_coeff_analog * K_T_bilinear + bs_coeff_analog) / A0_prime_denom; + + return new LowPassFilter(b0_calc, b1_calc, b2_calc, a1_calc, a2_calc); + } + + // Factory method to create a 2nd order Chebyshev Type I low-pass filter. + // Chebyshev Type I filters have a steeper roll-off than Butterworth, but exhibit ripple in the passband. + // cutoffFrequency: The frequency at which the passband ripple ends (e.g., gain drops by rippleDb). + // samplingFrequency: The sampling frequency of the input signal. + // rippleDb: The passband ripple in decibels (e.g., 0.5 dB, 1 dB). Must be positive. + public static LowPassFilter CreateChebyshevLowPass(double cutoffFrequency, double samplingFrequency, double rippleDb) + { + if (cutoffFrequency <= 0) throw new ArgumentOutOfRangeException(nameof(cutoffFrequency), "Cutoff frequency must be positive."); + if (samplingFrequency <= 0) throw new ArgumentOutOfRangeException(nameof(samplingFrequency), "Sampling frequency must be positive."); + if (cutoffFrequency >= samplingFrequency / 2.0) throw new ArgumentOutOfRangeException(nameof(cutoffFrequency), $"Cutoff frequency ({cutoffFrequency}) must be strictly less than half the sampling frequency ({samplingFrequency / 2.0})."); + if (rippleDb <= 0) throw new ArgumentOutOfRangeException(nameof(rippleDb), "Passband ripple must be positive."); + + // C_cheby = tan(pi * fc / fs), prewarped frequency factor. + double C_cheby = Math.Tan(Math.PI * cutoffFrequency / samplingFrequency); + if (Math.Abs(C_cheby) < 1e-12) // Handle low cutoff. + { + return new LowPassFilter(0,0,0, -2.0, 1.0); // Similar to Butterworth low cutoff. + } + + // Epsilon is derived from the passband ripple. + double epsilon = Math.Sqrt(Math.Pow(10, rippleDb / 10.0) - 1.0); + int N_order = 2; // Filter order is fixed at 2. + + // Parameters for locating analog prototype poles on an ellipse. + // alpha_val determines the eccentricity of the ellipse. + double alpha_val = Math.Asinh(1.0 / epsilon) / N_order; + // For N=2, poles are at s_k = -sigma_k +/- j*omega_k. + // These are scaled by C_cheby (warped cutoff frequency) for the specific filter. + double sin_pi_over_2N = Math.Sin(Math.PI / (2.0 * N_order)); // sin(pi/4) for N=2 + double cos_pi_over_2N = Math.Cos(Math.PI / (2.0 * N_order)); // cos(pi/4) for N=2 + + double sigma_k_scaled = Math.Sinh(alpha_val) * sin_pi_over_2N * C_cheby; + double omega_k_scaled = Math.Cosh(alpha_val) * cos_pi_over_2N * C_cheby; + + // Analog prototype denominator: s^2 + A_s*s + B_s + // Derived from poles: (s + sigma_k_scaled)^2 + omega_k_scaled^2 + double as_coeff_analog = 2.0 * sigma_k_scaled; // s-term coefficient. + double bs_coeff_analog = sigma_k_scaled * sigma_k_scaled + omega_k_scaled * omega_k_scaled; // Constant term. + + // Analog numerator: For Chebyshev Type I, N=2 (even order), DC gain H(0) = 1. + // So, numerator constant of analog prototype is bs_coeff_analog. + double num_s_coeff = bs_coeff_analog; + + double K_T_bilinear = 2.0 * samplingFrequency; // Factor for bilinear transform. + + // Denominator for normalization after bilinear transform. + double A0_prime_denom = K_T_bilinear * K_T_bilinear + as_coeff_analog * K_T_bilinear + bs_coeff_analog; + if (Math.Abs(A0_prime_denom) < 1e-12) throw new InvalidOperationException("Denominator term A0_prime_denom is zero in Chebyshev filter calculation."); + + // Digital filter coefficients. + double b0_calc = num_s_coeff / A0_prime_denom; + double b1_calc = (2.0 * num_s_coeff) / A0_prime_denom; + double b2_calc = num_s_coeff / A0_prime_denom; + + double a1_calc = (2.0 * bs_coeff_analog - 2.0 * K_T_bilinear * K_T_bilinear) / A0_prime_denom; + double a2_calc = (K_T_bilinear * K_T_bilinear - as_coeff_analog * K_T_bilinear + bs_coeff_analog) / A0_prime_denom; + + return new LowPassFilter(b0_calc, b1_calc, b2_calc, a1_calc, a2_calc); + } + + // Updates the filter with a new input sample (inputValue). + // Applies the difference equation: + // y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] - a2*y[n-2] + // If commitState is true, the internal state variables (previous inputs and outputs) are updated. + // If false, the output is calculated using the current state, but the state is not advanced. + public double Update(double inputValue, bool commitState = true) + { + // Calculate the current output y[n] based on current input x[n] and previous states. + double output = _b0 * inputValue + _b1 * _x1 + _b2 * _x2 - _a1 * _y1 - _a2 * _y2; + + if (commitState) // If true, update the filter's internal state. + { + // Shift previous inputs: x[n-2] = x[n-1], x[n-1] = x[n] (current inputValue). + _x2 = _x1; + _x1 = inputValue; + // Shift previous outputs: y[n-2] = y[n-1], y[n-1] = y[n] (current calculated output). + _y2 = _y1; + _y1 = output; + } + return output; // Return the filtered output. + } + + // Resets the filter's internal state variables to zero. + // This clears any memory of previous input or output values, useful for starting a new filtering sequence. + public void Reset() + { + _x1 = 0; _x2 = 0; // Reset previous input states. + _y1 = 0; _y2 = 0; // Reset previous output states. + } + } +} \ No newline at end of file diff --git a/Sources/Common/MSLib/MSLib.csproj b/Sources/Common/MSLib/MSLib.csproj new file mode 100644 index 0000000..bafd05b --- /dev/null +++ b/Sources/Common/MSLib/MSLib.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/Sources/Common/MSLib/ZorroBinaryFiles.cs b/Sources/Common/MSLib/ZorroBinaryFiles.cs new file mode 100644 index 0000000..4d84c14 --- /dev/null +++ b/Sources/Common/MSLib/ZorroBinaryFiles.cs @@ -0,0 +1,286 @@ +using System; +using System.Collections.Generic; // Required for List +using System.IO; // For File operations +using System.Runtime.InteropServices; // Required for StructLayout and Marshal + +namespace Zorro +{ + /// + /// Provides generic methods for loading and saving arrays of structures + /// from/to binary files using marshalling. + /// This class is intended for internal use within this assembly. + /// + internal static class BinaryFileHandler + { + public static void SaveArrayAsBlock(string filePath, T[] data) where T : struct + { + if (data == null || data.Length == 0) + { + File.WriteAllBytes(filePath, Array.Empty()); + return; + } + + int structSize = Marshal.SizeOf(typeof(T)); + byte[] byteArray = new byte[data.Length * structSize]; + IntPtr buffer = Marshal.AllocHGlobal(structSize); + try + { + for (int i = 0; i < data.Length; i++) + { + Marshal.StructureToPtr(data[i], buffer, false); + Marshal.Copy(buffer, byteArray, i * structSize, structSize); + } + File.WriteAllBytes(filePath, byteArray); + } + finally + { + Marshal.FreeHGlobal(buffer); + } + } + + public static T[]? LoadArrayAsBlock(string filePath) where T : struct + { + if (!File.Exists(filePath)) + { + return null; + } + + byte[] byteArray = File.ReadAllBytes(filePath); + if (byteArray.Length == 0) + { + return Array.Empty(); + } + + int structSize = Marshal.SizeOf(typeof(T)); + + if (byteArray.Length % structSize != 0) + { + throw new ArgumentException($"File size ({byteArray.Length} bytes) is not a valid multiple of the structure size ({structSize} bytes) for type {typeof(T).Name}. The file may be corrupted or not in the expected format."); + } + + int itemCount = byteArray.Length / structSize; + T[] dataArray = new T[itemCount]; + IntPtr buffer = Marshal.AllocHGlobal(structSize); + try + { + for (int i = 0; i < itemCount; i++) + { + Marshal.Copy(byteArray, i * structSize, buffer, structSize); + dataArray[i] = Marshal.PtrToStructure(buffer); + } + } + finally + { + Marshal.FreeHGlobal(buffer); + } + return dataArray; + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] + public struct ZorroT1 + { + public double OADate; + public float Value; + + /// + /// Returns the time as a UTC DateTime object. + /// Note: DateTime.FromOADate returns a DateTime with Kind=Unspecified. + /// We specify it as UTC as Zorro DATEs are GMT/UTC. + /// + public DateTime TimeUtc => DateTime.SpecifyKind(DateTime.FromOADate(OADate), DateTimeKind.Utc); + + public ZorroT1(double oaDate, float value) + { + OADate = oaDate; + Value = value; + } + public ZorroT1(DateTime dateTime, float value) + { + // Ensure the DateTime is converted to its UTC equivalent for OADate + OADate = dateTime.ToUniversalTime().ToOADate(); + Value = value; + } + + public static void SaveToFile(string filePath, ZorroT1[] data) => BinaryFileHandler.SaveArrayAsBlock(filePath, data); + public static ZorroT1[]? LoadFromFile(string filePath) => BinaryFileHandler.LoadArrayAsBlock(filePath); + } + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] + public struct ZorroT2 + { + public double OADate; + public float Price; + public float Volume; + + public DateTime TimeUtc => DateTime.SpecifyKind(DateTime.FromOADate(OADate), DateTimeKind.Utc); + + public ZorroT2(double oaDate, float price, float volume) + { + OADate = oaDate; + Price = price; + Volume = volume; + } + public ZorroT2(DateTime dateTime, float price, float volume) + { + OADate = dateTime.ToUniversalTime().ToOADate(); + Price = price; + Volume = volume; + } + + public static void SaveToFile(string filePath, ZorroT2[] data) => BinaryFileHandler.SaveArrayAsBlock(filePath, data); + public static ZorroT2[]? LoadFromFile(string filePath) => BinaryFileHandler.LoadArrayAsBlock(filePath); + } + + [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] + public struct ZorroT6 + { + public double OADate; + public float High; + public float Low; + public float Open; + public float Close; + public float AdditionalValue1; + public float AdditionalValue2; + + public DateTime TimeUtc => DateTime.SpecifyKind(DateTime.FromOADate(OADate), DateTimeKind.Utc); + + public ZorroT6(double oaDate, float high, float low, float open, float close, float additionalValue1, float additionalValue2) + { + OADate = oaDate; + High = high; + Low = low; + Open = open; + Close = close; + AdditionalValue1 = additionalValue1; + AdditionalValue2 = additionalValue2; + } + public ZorroT6(DateTime dateTime, float high, float low, float open, float close, float additionalValue1, float additionalValue2) + { + OADate = dateTime.ToUniversalTime().ToOADate(); + High = high; + Low = low; + Open = open; + Close = close; + AdditionalValue1 = additionalValue1; + AdditionalValue2 = additionalValue2; + } + + public static void SaveToFile(string filePath, ZorroT6[] data) => BinaryFileHandler.SaveArrayAsBlock(filePath, data); + public static ZorroT6[]? LoadFromFile(string filePath) => BinaryFileHandler.LoadArrayAsBlock(filePath); + } + + // --- Builder Classes for Incremental Array Construction --- + + public class ZorroT1ArrayBuilder + { + private readonly List _items; + + public ZorroT1ArrayBuilder(int initialCapacity = 0) + { + _items = initialCapacity > 0 ? new List(initialCapacity) : new List(); + } + + public ZorroT1ArrayBuilder Add(DateTime time, float value) + { + // Constructor of ZorroT1 now handles UTC conversion + _items.Add(new ZorroT1(time, value)); + return this; + } + + public ZorroT1ArrayBuilder Add(double oaDate, float value) + { + _items.Add(new ZorroT1(oaDate, value)); + return this; + } + + public ZorroT1ArrayBuilder Add(ZorroT1 item) + { + _items.Add(item); + return this; + } + + public ZorroT1[] ToArray() => _items.ToArray(); + public void Clear() => _items.Clear(); + public int Count => _items.Count; + + public void SaveToFile(string filePath) + { + ZorroT1.SaveToFile(filePath, _items.ToArray()); + } + } + + public class ZorroT2ArrayBuilder + { + private readonly List _items; + + public ZorroT2ArrayBuilder(int initialCapacity = 0) + { + _items = initialCapacity > 0 ? new List(initialCapacity) : new List(); + } + + public ZorroT2ArrayBuilder Add(DateTime time, float price, float volume) + { + _items.Add(new ZorroT2(time, price, volume)); + return this; + } + + public ZorroT2ArrayBuilder Add(double oaDate, float price, float volume) + { + _items.Add(new ZorroT2(oaDate, price, volume)); + return this; + } + + public ZorroT2ArrayBuilder Add(ZorroT2 item) + { + _items.Add(item); + return this; + } + + public ZorroT2[] ToArray() => _items.ToArray(); + public void Clear() => _items.Clear(); + public int Count => _items.Count; + + public void SaveToFile(string filePath) + { + ZorroT2.SaveToFile(filePath, _items.ToArray()); + } + } + + public class ZorroT6ArrayBuilder + { + private readonly List _items; + + public ZorroT6ArrayBuilder(int initialCapacity = 0) + { + _items = initialCapacity > 0 ? new List(initialCapacity) : new List(); + } + + public ZorroT6ArrayBuilder Add(DateTime time, float high, float low, float open, float close, float additionalValue1, float additionalValue2) + { + _items.Add(new ZorroT6(time, high, low, open, close, additionalValue1, additionalValue2)); + return this; + } + + public ZorroT6ArrayBuilder Add(double oaDate, float high, float low, float open, float close, float additionalValue1, float additionalValue2) + { + _items.Add(new ZorroT6(oaDate, high, low, open, close, additionalValue1, additionalValue2)); + return this; + } + + public ZorroT6ArrayBuilder Add(ZorroT6 item) + { + _items.Add(item); + return this; + } + + public ZorroT6[] ToArray() => _items.ToArray(); + public void Clear() => _items.Clear(); + public int Count => _items.Count; + + public void SaveToFile(string filePath) + { + ZorroT6.SaveToFile(filePath, _items.ToArray()); + } + } +} \ No newline at end of file diff --git a/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.deps.json b/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.deps.json new file mode 100644 index 0000000..0c157d0 --- /dev/null +++ b/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": { + "MSLib/1.0.0": { + "runtime": { + "MSLib.dll": {} + } + } + } + }, + "libraries": { + "MSLib/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.dll b/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..acf6f9a371cc8ead30bfc9cd2dc9a081c1670774 GIT binary patch literal 15360 zcmeHOd2k%%m4AIq_smEmt7mi>WHUyx86;UqzA&dHOFk4NOIWh4!$cm9TGGI1dgvb6 zmbF?;PIj}fISEcBS(3nJD?m28p(-I+C|I&7jsj9Ck_tK4u!Mx{W(i5iCLz0KfA8z= znUQ3JH&y#jDsB4p_m1yf-}{d45q+cYCxwVq+;6-=^kqEx>JaeF!AYB4xK)JC)g6wReZ_v0DIeFQgArD)5p-%Mct#dRkj=zJ-3vfG1*I zW*_7ut+r#Qz!tt8L4yO`hP&kIz;LzNX2yab`${Kqv#!f=ms}l0J4;Z}d=2sQ#lFcD zpd;|-&(;!2g8F|47s`nUQJ9)0yoOwRYYo(`uTeg}2&HP%)jmU6fx~CDiRk<`mHry0 zA#RY;qAR!6oR*rU+DNEn70C&Zn-i#hxYK1{(xwGjJ$ z6G^ZoQzv!3i~G60wnH(L8t@IFhT$x$XbDkOOxs?~%tS5dVU6R6>4x4Cp@af2!2U1j zSQbQ?c3WD%uI9873mU-hwLpBuV606yvXb7SSR75kHHb@1!UZDO( z3AJd*Iv@QL^{x{8z7my>}EBJ@L8l>>_qMIo}C^=Gwnh8}DVlioEK^2~v-#N6|2j)^b_88(MX zQsoMD5gEWUu!u>Fr?!Zhgr~k(fhUs1{_HxdKYxHq_7}EYe__12=^b(c5rZZxHEp`H z0qtf@aW3M-V#;yu6*><-U?7nD1*R#ggE%xR!5!srGx5NlSq?s~kdp~>aEZQBO`BXB z*2PfXw9P}HA1jQ{YG&4cQc5H_Dvg#$(*i+`W+R@9n8$8TRn#kCk zpFpr*x$z0?Qf7(x3X;4GBR=@eHQt9OW}xBMqEd5O#>yGiS}N@ZiE=g;+?=x=YEED( z!9`V;7x>{^2HGNGED*2*h8LlnQv=;9{Ug>VRG~r66<~$cNa(Vg!9uE7O0lj46$tB4 ztgC?Vwov143M~OcorF=~gGu4Wzla zwUbp)^9j#p0#mbm#3I|@jfQ6JVbz*&q)cbQ3ZtSW!c~Tg<(iM^ zb=a_^*eYXHOBd;Nr;#!#R%ukWG?J#*jn$3_C%Gva!(M0V7%Qjdic*`+Rn%NAItj^g z3PL{_k*4eYgzRN^-0`w{xb4?X2i#dwH}IoaG^x^}!G5mFii3%#En?5+wkQ?s)9xDg z3DgNzHJ(GvS5&JVvSF3Wp=A%KELkWQM!X7O&8PrA091Hlq5?Mf$lKs@8EyX%Cr=b% z3?s=3+_C55!IUrS7L`ybiK<9=oLW9*H9Nh~#WmqMVuUPLd-FPMudY_N!VG`74b8&z zf&(Zs$aqCiq-u$MU~jC{Z%fMyu3-!%4qv>TBckG{mo+cel-ERRW97|zNjJ(*#Ug;U zBd1Uv5p7%0h!_>8Na){{eE4jLmpMe68&5(sLR9v8V$z3Z@l@`M{m3eO9YSX<^ISrk4uxUvO=reZ$0eK z`&W11EVx~)oj$K4aV?whd%e2DW4yY6x4v%4&xnY!#7A$pWqh(sbMu*@R zI*+hu(X7xl;_3neUTAtSWT*~y8O>WOc&!g$#X|^Z8pntc!4SR0IPxNQ4&%s6o;Qw_ zg>kI3OUAL%AID0&WE?A3j$@@=GLDsRI*ws&#VBIJl#Zf5D8+I0DGwJi>!vKa{dtVF z&+Sk~F&GVxY*h~2`uMMRljB+nP zEEZ905?m8^qb9J&uAJLZBl^}g!OovUO;j0Geoa&tYNEQdCaV3Ks4lIE>XkK7U0M^> zB{kuX19@vxjZp*FzJ|Qo-{$0=WdS%t;nW(ne^}wvZ6C%;>5WQbhwo7%7N)`CGVzW5t?MM)~d3C>uq^l%ZrpVhdVPva5~NDB1JWLdk}W^0Amd zE2zT=V}%;SwkPPTiq=CVB?}{EC|Sr=7EO-8B$Eu@ER9u0rD3=wTZfXZL&>6M6`I2n z+dZE}cq>z|5sJNR0k7)n=&-yXwzLJj5(`XhYzufVS4T(W1+l#?#03^s%k&l;A!N~W zkvm{}WGx_Zheei?wMA}|R*ugkO|O^ig083^AGr#ODEBIEnL=07&cV0sl)SG=n0It^ zOKV%}=C;l4II8noR|fF6U^M(W(IkR=4F|Y}!MvT$PCG0yj5Ej=@Uq!(V32}{6R$+n zu;)MzPQ_FQe3E%PGu8wPg+^bH&r>y8RNeqA z7w~bJ+dmfY8bLWF+8r`$_?+@haQEvB$7F`ri}v>JWO31laDL0P9&LxQ1v)pdm`TBrBlNfS`}5EVB_@j_s2S zkUvC<4_~eFbK2Gd_FnkR7-zhaCK3Hsv{gC@>|24!KqvAWpb)SCO$K%W(*<@|U;(Vc z%)4D+K@_)yvHdI2ZxsfOu{#A;iEllO-7heMHqfWw(=XMp0!FD-@O}WS6Ih$TK1+;M z(`JDMHOA`j(R2ensny6Es9HTw)+i#c0eo7C7uszSx1SQw<#wt}`Jm45N22|j;BF$O zWB}LEt6GDA%>r%)Oh{J%KB!#{_*h_9fl{OOqWv+QDH5##Y!z@uz$O7F0VRBCW_X)` z!vcN~a3GG5={>UM+c^?+o?Q}v-0_#{uxNfJkdcCaB`!8hd zJ;9&TBN(U8xEL(ha)9nHV8>;ho)_5dbc=M89HN&!Y(aXjTt=_Dl0r*_++B?QyiJZ! zy;vX^`-oggeF9@GpO9m8$io(-yX9&ccO`|ETCxlM?v-ol-U9X|c`f~q*Y6hTQF%S- zJh>6kg7l<(5v>v!+mq;GYI8CAJ$+MdqTvGeUAcu$7O)rOR=U%}?$KYCFQNN9>^+zn zm(W*TEO<=+1+d3F-Yux#OXvqKChXyTa=pkW?7bql6MsxYc7gpy-a-Qf><#%+%6Zs5 zx~6QWMGs?p+v$BSChTpeJ3JoS+fMhnn6P&leZ%AZ9xKe{gcA4ctyVgzt$?jp_R@fd z-J`cCJ#?LivArI;!Nr8V9y;#v*dE@d#P#*S`SKb@4FkGDD+uuJ1YGY?Ep3^-Y>e~m`;m;zRq)zJd>@; zN{OC_eu*9{iKsNvr(l;euw1e<3Rk|Aa<*RQ;-{x)(iNYJ_>k;nu26XUj+QL_73_0G~5DsuUZNC26l=U=tI&e(Pqj*;1vB7 zGL=HZCjeiP{+3Q5`1=6sr7r@0UU~$uO#V9EEc~e|K+FlOST6zIqyGmWuMt(mYhS&P zVJM-^GW9~HUdYr7nMNVQP{OH;Wg3M{qmXG7GQR`YkXnSy76G}f;YZL%l$UT8+oE0p z?#+6qv_;5op$C+`pnO;91H4iiltR+C^tYqUUbWEI)GXR;tA%dCdeb6oZSf#S5t6PC zd=T0a+8`vEVo3L3zOR;^Qy&DpN@IAd{-Cr@;=HYvZr5K2Wk7IW5iktyYUvu$J_s13 zyJ?ji#F#LA2~ehuQWfB30`3xU5wHYiGE1`O+hIlHAs2sbJ9Oc-^1aOWp$GA z&0fL$QxQ)9S=7+`S2Tc`T?!ZU1E3V4jGhYmmZOi1dCPk0p+!bTmI1clt?E+DjbD=_ z)knHGh2G3{kd=}4V>AiHl^ikYfaZC6u(EUA-#wXfn)Us`BsGWLtW#?v1 zJ2{atkF?XZbLJdBd(%!HkMSh#iFWFooJ{A_RyLVAn9R(X?UYi>NxKCOT&iZ_tD_IlQ(Bud-|zw5NF-VWIjoD zI+x3s-4h`7rYC%nE-RBUQ|zkKy2s3#b~;7VW`2AqJ!>Awr`R3p%;n7NbB;PJ=#B)%|p%5 ze9qjP%ua%`$ILUf+qPysO0SiiWOR2L?7`$wbI1}+_Hkcw)+{)~K?<*E$U2ZsA2n?! znPD&eNIh$G(8^%^=&1V;!^1XdAa4&@crl(!<>zdZx-ynyQc6H}pudyDhH|fAB?W#U z$95@Y&CaItgL!W6nw>BwC(X&uJl?V==0NGPW^?f0772z(39BGawy^>FGH;$+c5d;)W`S`^`-9xM(>=zVE?+jiOEEiwr+F=;goMDKh*XtT~yT zFEYFV74&?1BArR+OSn7dk@#-&MxLLjJ@=W;=H~KZ$muB0OWJSFT1QbL=@VxE6iu{^ zrz~@7ijwVKW5RDFH~AF5u{)ETURGPJUQY3Cg?6U1Nqc_KOxmd#+MAx9p&15)>Ff-3 zIt;rkXNLNc`5BtRa13yRtG&~trS)CUp-M1p;T*^P7f}S?V(<(|Gh_j+4azE>cfdGLxFih|wzq zX-;`d1$Elfm_ylo|6IO*N=)xv$5UpGOM!Z_NNsu&`rO(ma{OLJN*}7%w7KBi)rni_b8zC}oz?x@OFYd1uBv>XQqz*j=g|+I1Wos6+h|*JC$AIF6YYCEI0TlR!;5 zrk$rjSfjxk0icHlaF2^k=8zax%78Fri4mvNT;7_R!UVy@&!**cMgzhcjG-GLng(^LFv9I1H03;P7EOVk$BE3m>-Q}Dm?&kN@Z52?F?mm@&o@rA$E!R%WI1x zT1U@4P`vAW_;)8yHa-32ogd$N`LT@;s85g@m!zN)Cn zpRv}gB_%B33xq6HtO?-TFWv~FrjZVi6pWfGNp-ed8;LGYxy zD!rWB&{8J@$g*A!^r{QO0agrAqc0L9+33T+ zc~u9h#>wb|a0Et;ItKL&;#zg|S|;dHw2|Y9Q6NrhVg%8k%d2M|z5}sboZBsmF3Idj zMMZ$A5x@gdq*gZs7K|VjazyqZB&A@CGPJztR)?}z(b65q@2@c^p)dN0GLJ{iV3hn ziz`y3yj;fvOrKjXxb+p`xXxU@%Ftv9zC0aqAr-H{k3`W%@L(a@$c9h=Mja2nQ5TFW z(S*><4d`NS!l)PA`trCQZSl3jLbS!R#!@XtTu1>TZ*njmK<;s2LPW2OMDT@!9}zXd z<(QygP~yLD#I=@xwi}Xb4%x}vJ}X-|)eggqp#=<|*J zAA9oHe?D{XFTcb(x-LI_0Ea;5@J@SfcGk=s?zU3m9mF}D>dZ`AhX<`W8z<+(I4aLt z*~21thpmb04~x_t&YF4T+aHmKoE_ED(-JQwwCGjpb>!dL9rg#fu?i=f&V|mz1mHi3(Bh3K+ z&d%Q@>EzM?#q`CoXeFKH_TnBsLUe~e>44uMZvi|=gE&4N#FxtbX!YQCzSEJ}P1TG(<92~`p zCvPEuzbN@F%t-LbJ$1S##36*6sz+x@o%$1>yq-)pht;|o0>2y?>5JR;(As43L< zL2obongF&%$ogLL$;`ol&^^@oZv)(^v`-sWaH$a4L2-=acN2bd;Hw=c*|x&XHo}nS z47f*5KGtSRJSysL#gQ_De?<5zAoS^l?r9;-(d2NpW6!2>zRN=U@%zukuq(EtDd literal 0 HcmV?d00001 diff --git a/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.pdb b/Sources/Common/MSLib/bin/Debug/net6.0/MSLib.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d1c06a665fbc4adca8323df228ed5f71e861dd3d GIT binary patch literal 15424 zcmb6=2Ut_r_xC+Q2t$SnA}$ma1!RNU0tq_|K}D-Jh7d3s5=?>+TQvbiMBEld#l835 z3UyTLs9IOmI_j#m)w=4|{?B=NFGQgIegAylz3-j-&c64ad+yD9QRxX$6rl+I9H69% zqC7_j`3Eu$gipSK8yys{)T~TwdkUqW4Z!0F5eW#n4WwS_I*me=qs8a#?Fiw))vJFx z=>+$~@IJPGya=wP0PhI`I7+ETW=);?j61Zceaie(1&_~ec)q*CokeG%nPeR-rC56i4<77lcg)lg$XiZvwG~8u@<# zB@zn4ZcyR?H618Q;W`_xH{kjgT)&_w(wBmExXy=b-5*U<9ci-EnJrv*0G#Ly<24y6aA}9-?Y=?3Z%1=5p;dBOP_)=sDl;eIBxdFw#3q=(E6fr>A z0!0%*k(fY=qy z23TMLI|FQM0k;O&&H}at*xmxhG2mbUBfmx#a5I1%E#M9SJ6XWU&)EV-el8X;@@s4X zqkT;*;AnuGTENK9)dEI-ZWgd7z|AaR4}jh4z|Ae-rtsXu0>(Mo!UD!|-_ioc=dCPY zq;G8jdjj0X0&W4YXC1h$1&s9VEMVmCWdWo7_7*Tc?_dEVeMbw}6JT!(*bCrJb>Pkx zFw*;2z{ua%0!I0M7BD{VVgVz4AdE(Cyd?n~WC3r3@rke_j7N+!(BpC2r0LCBoUx)=90dS}VTm@(dy8`}Dcs84T?gsD-xbMiq%>Zr-xQK)J?f`cL z80Sdgp{hH;0W7={;2r=+vT#1& z_XIeKh5G=Eztd1CavC^7G=rK)_)tST)X)xhH2DVZt;k{KDdO0%INcdq5wy?*0t?XY zg4%}EKs$$n?GR%aoEA`95i6+qqy%bPvI{UB7;cTo8fbAO6;KnB2!$epp@vuqwH3r_ z^R2EQ@X6j=gKX&8lwkBb(M+=bejynvcdG62Vhw1!&1@V907+cEs@ z8U79oe?l%Z-1MvN>+ zMwSyJ%bAho!pfQsoKg4Du%h5K!WUOIZ;*D7@&;+YS}g(Hr+e2x9o?yzvLgGb+cck4 z!eqkQlc{erHQ_NWOnsZFi8a&0)P&C`gM2-q{?>08b8mn;)c-cri2=lhPZ|Y!LTwWi z0rhlP&xv-FMi)$kM5|Cq@)Q#FXt_oboJ?eDttB{8k}20}B(n~z8cq~Ms>~ZMm5i1uiI6pwsFWl!P?D!n17WaejQ!$l;?%-8AQ zMge9B)%hwNV~<#&)e&{RE-zmP{N$rkk!QTh7@sB z{x-6wj`4%XU6NT|FBevi-65GyVdbKP&PI z*X!r3dREFSb^Yz;;K8>C#z~5IH~CVn(Ws*oDyc>f4CLC+=yjgO2ZEXix*nK#>1atK zew$Hgla6KBjk)StIr6q_ZB)DF|5&LrM_7yGnfW<T|%~ zKRLReP_2Yf0JkXAs@|hPhJPf?q1;TRK2ir+H;e*C?Ya_-&YrWZ&e~iU>9I8I zT7smclR8w`cEG94a`(eC=EeUpHbZN4H7U!ni&tf<8&K7#@l>A3mE9PSy5sGT@Dn+U z);}8Bcu8xYRB2RI`ongjONf7PaA4Ok z{}A7>?!jS!L9)!u?y~M7-9rPr21|oO!(>5WnIWNJ-LkX0bqfj$%jytn8pbv#w_Ppg`C|sq&RdX{J(6qE*Z#OP&q0neL{m!BTHHFSB#QA31~MHZ@+O1TVYk{0?wCCk@nAUv~zTym$} zKubkcr?*6&4vtyAY(Z?}$ITu$Kx^`-#H;Lk%w*1;A6)o0U{2h&A^Mn#gij$25X9%^ z=Id|%Zzj&o zQ>(xyN$M=Q(mztAQtOz=!#TM5vnIuu_STHGy7R-z@8Y*ydVjafwQ^9y^del9>+zU1 ze8xlU(cG49UAv|wMONP1a%%LGXP+A8Ve)n4gYaWW)6ZV^^e^>^$Yln}lb#i?Ga9Ce z9t|eIbdzUAYV|74aqs$ldXGFLKRbQ*z@QdYABg+Cx@Y|0hI!PRK*JJicBAXA=5N%- zy$()V;qB`&-`*ytVe)?ZJUI+8SVM4GHyQEfOz+D$^iz93zU0xmZ^EI8fgkLn9A=w2 zsInC~`5MOIEJ+&QWjE>^k(}B4(zMwTJN}BG*J;*jYe}?f^Qcj?WGUgUfK{D zs{NVEzY7@gH!7cTJa6ajyRYK*Mt=AyN%#BAe<6k}mR0t|!ELXQuz4X#m0qxqpE2rf z>4sC6#;}B@{@8cm9-vS}ukAWdv0!&fV`%e8^yUyE=O^n;?v#d|nmHACLI#V|2pJqzxSoJS# zoU{yuWxW-Pzq&duvGQ+KhpMT~%UB}VdF4uBLPTm+K`h0`E%M*c;AHKif%!cjigtFq zbb916^&c#SDbHt z6fleRTOGeL!*No|x6NXkgm13oLi^_=^#X7mjasKvu!c5u-+UQKmrZ;BnZ& zH?H0Nx%J-oJ%e+yUDu4ZZI}ipFZ;wq{-|Q@Clnd7;^vIep&{{;%2sr*+N%s}nEXpc z9&%vSy)U@B4ry(=?EX0OoL0PI-3-6X$UuE9tx3kTtA&3e-qy=5-JZA<#P5FI;zxnT zc(fMJLaj&{1_#WZG-@R)C~W_Z{b-~6i!NVX?iiF%?0JpY$*!zvkbz0&(AQ3jP-eee z)hkhvn`q1a!91T%Cn_5x5osXBv zMY3Abcvva%)FNG{*1)EWb@TmQxt%CR$UEB%N?Qf;xtLb#wT+b{FC*!mX;VcV2EWTKcPU;cO@ek7Q6; z_&ZB3&1EeNTCn2->e;QyV(Wc}2P9Qb?D1^{Xk{_P&_h zD`o3emd0c_%fIo*xr@ndLZs|n8xK1$#O2|Usj}H2HcwtNn6i# zexA5yd7r*3XMEyvengDZ>9~#Fk*)R%aFa7;X@?O3Vbc~LaAK2l+Gnc&X(DR+}P?y-iZ^GVk zfgS}VNfn$ouYWjXM9?LCCW}p<_UU~=i@=mkaS`$Xjvu*DiT2cs1+nhGmZOAOucH@d#*B}t z9DFUT(e19W7826rqw?Y0lN*R97u?*3y{=!mX~#jA0`YQDv$j@ov$%ndQqtwH=Tqpo z&F$8*`IB*}cX08IZLO#ft$H?MZ|cTb)fO_+<(koO1evNRAGyHKlElfSaHLwht7YX$<`pq{!pwyEX)yy^ ziMGl&54kezyPqr+1bL857IKaV{WPiqO&X;3SyA-tQ{?guhxbKTkNWy^igebh&onJ_ z8afe4Pc+SszL)z(RQ>w9(sjSx>)9}=Y5s2@Q@5jaTbG2+f1&Q0JZ((jg{hA(aSMGi zoSMRZmvi4APp2P33B>E(bV<~R=rujPKDh`BXifr$Jpi`$YIFATXQ>M_Lj4|xr}a(P zlrmvLv1hk%djU(8k~sp6{V#SJ_;kp7j)~pI6tZp*dLG$S<>i@YHxkgB)LwSg?mtwuR^zVx=TE1 z^1L0Tzam*DDj(En!TLmgWPQSVQDooGF&A*8J-o2z;-WEUBCCdtR`bb9Zt1kJ7dPzn zGScm%YUZHI{lcA|o?rQW%6{uN%XU&9xE(cyROU$EKaH7*tiCbNk28t$FC~55KlFJQ zy>HyBDJQn2^_tXGCFP5L(Z~^Fc6Vm~wkX5BD#v~^^tLiorhkm@s90lPaZwc2J@%(d*X#3x zmy_V=n2U$A*8H}Q)WAD7JC!+|emN08fBnJ|+qaG%>d=YRxHzy~(msnEMpDaYEq zOo%9@N(R0+wpmbzrcUI2J@fbhoIUYBJv4ZxEQqaGUHnyXlbhyv!wv`V6LZRF8E6VG zoPB@-9e?b7>66#Y_+5(z?>PPO-LG{7eokuI!GiBOQ$we->;IFBMfw%JHEAkpvE{`=Qnk?-IqUe5F@eF^&Ht0WUJ#i@erIC!fgPSbPj$YT zRMKg7`cH?m+WjY&fw^3M)~9M@DU->RA9*9WAf!kINnVi(C0i9@TwUw8cbKe-6aXDzn^ ze!hxIT$gzrgTD|&JNI`TlCiJ{H`Qu2w^Tx?<#O$7-?rR>J)i!l2fuMtm)JEYFO57g zrW+SS8zzrd$<$f3Y3J;JijO0YWS{RUJrbuz85T|1B;dP!^`91`+mL!zKO>WKmwVXRZX;_VV1L*Pkh0M|M{f^#)$5a}Vw?7c9J;E1v{ZB;( zh6Q#P!tt>p8~zr=KS@nd=<@YZ7jQ&8eWl3~(2)syJJ~(Dsk6OOmzN3qR?{m?V)uQ~ zQ}Nfw?j&!r@x0P=@Az-)VuQ*mnIcch*?n-xt37D9{aBCk!;OpMjl+*usTRi8>%Ce! z(_i$QmRFbE{e-Un^M0_$pL>#0Di1uo9e?&+J-;yyl*4|tw%2U$x-tpn@POuvV(0Eo zm|xuDpprLuzFB1^Ava}ikjAoZnXGPh6&2Pj+M*2cJ{&cDrS&(3y~4S}DmIjVetJS}PJnj5RG*2Hj|`&v4aBlBjs z%|kJPp}T(QeLq9I{LkTjVK*JP4Nfh33jF_~WKM2aXGCbCuA!hFHCF`gGyPH~l7MBE z1NbjF>&y!FlWIq5{qZl2Y^Az@rM^*iz6j;^m#3DT*`bM_{qD!GxrsrC|ApG5tn9}Q zCs5>l8Lwk->lFzbspRz|)}Pq(FGThF-OytRbF}Fpjyvw({x5N{uUB-_VF^F}3w@oV z79UTS7byLS%KpMc(aPw3+UMWxUA6gGeQL&Z*3j6T#j9|vMXr0jr0Ip_DNEkvFB~%H z1GntdI@olV3Mcz4W&i6uCiiU=8dR0@^0jdJwi$w>6VG!K-+~feR^YOezN7zqhf0p* z^JedCvnXksM~`E-j~xGjQ&J;^B$fT&*5uTU?|1!$6mxg9_L)?EQarK5bCkqNS%UUU<0Yi)kz!^9ohJ{5aT(Iu=h?3~rt^S*@U20g!Dn|oU8{;O9bjGI+@f^4g^bTrJ5#q+54gwt^?SlP zCGBG$t$0IwnZ8BV-rg2u1G%@R*dD8D)$|^dN35gYo~fP^HQ&Bv%@3|ES6PzeD(ev0 zSRdGgzB;$jkT!aeOXQqgEk+nO$Ao`Q#A#?AhdW(8-($+-_w4QwxBE?!7gx+{zU(Wt zrzKgcR5zSe?Ju{}=TJ(*_D5FpV@5}>E_du3a&*O+dgyg+dQ^U`90^w(_WCkmXm#w8 z9ykAPC$zuEb~yfX&59^2>H7vTpZqfJ$0IA+B+hV~x@Fyw4m%3rZA!}7mLeT!0lYB` zud~yjcQ67rH1vxvU++x9;oW)?M8oTw6u#YVOECyyMF? z8-Ae$dg9O5^GRDo2k(Nb>Up;pEpWtV@DjGkyM5rLQzA35w;NRJSjNvZaiQT2SU_z< zji-#hRMA?h=ss24jCOXTXv0q0m`SMOZ|GtzpAaG(+};%~)K_4MGj@$5)5Emh6?&JF zL2Cd{;A(C~lAel0yo8MqG7NO>@g;1k;4=o!EEf;tG8Vbe92f2ps84ztiWBh~W|$zv ztI#m3eE@PZe9N(OKu&g8!JPmV5s>!g3aku35r)N_jQ@#mlDn3byH1FowS*Y9+v2E% z@i~wdz{}^f-i?QB_X67vJV6r_j$N#$-6+$O8hGMOTRbr}e-F(rw4jlh0L3{QPI=?i z(Qw)muMUPYtz6(r8P1v1Zp=u8mJq|$T1D(okpeesM7#xvU1&j5Ghb8leG`4%=06(N z;wh`eGggb|tQLRQ)8bRD7OXpU&)O!&6SilkwfapA%2f)93FOcnGAw=9ax?^J02WhSrhLetL1 zuE31y4$?wt0iQVYAd10j;!N+i#jfj4!yENYamYcRw;(>&#GlS^B5ir_*#b9p{SdJo zB7y=Gs=~%T42d{{VamhD7;ISZ!qLwGwtQ3M>_npQQ<(xLRKf>Yh&u=(G0VUQ88FP5 z3S=?Unir&x@cF_~v zsgj9w$v1SV2%^m7<@DqabXgn|TE>8<-7o;U((u&+aO?t(bu&!ide?~-z!0}0!_B=5 zFZDYR_?C;oHhP2JlwlEY5%VArI^*|IoK;MJLF}ycZZnj`s11F>-Vq3g*eAXi;F@7q zarEshJEj{>=hifQumB3M&gOc<6Jv05eAdzYjFG}2G^g#%&tOGlp2hQF_;8}2ry4>3 zz`|#bYpN~J4$J`W6T8XlSU;w`ig0Y8WF{qk8aR5ahsO z%_E(gN?W45P--v)EUL6QRXUh9@@V6?R548#2h+tGs`w>6X^b01mHtgl4x=V(=(5&y z*;BgoPmF%1=;C47MHqw?h7T59WJ8>AMsSq??*v4EZ6MoF39A}qw1-Y=P75Hm@rWF| zvjweZ00ja8Jbe>*_CdSE~cMsI!v z$pFzJ*BBmDU`scuXe>2h9yM`0RpLlZ@}njdQ>B}z$rq?8L#QbWsd782yo#D?i)K~P z#y~+4kaC(Nj!frGa+gX^rh{(lL$dUXGj*n?OXGOhzx^yLX6*{IKEx^_H>8IUzWqQQgF)QBC_5E$82--a4P8!oz0 ao;X{K2Z4!z7C6E9ZwwW!X74CE=l=j6wvdGY literal 0 HcmV?d00001 diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Common/MSLib/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfo.cs b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfo.cs new file mode 100644 index 0000000..ab39a41 --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MSLib")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MSLib")] +[assembly: System.Reflection.AssemblyTitleAttribute("MSLib")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfoInputs.cache b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfoInputs.cache new file mode 100644 index 0000000..243db22 --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5bd6cf3423e8e65d9421c371ad2c6b9a30b6eb1d diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..4db8300 --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MSLib +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\ diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GlobalUsings.g.cs b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GlobalUsings.g.cs new file mode 100644 index 0000000..ac22929 --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.assets.cache b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..d7e1628496032ca10cc92a3207c0bfcde3419d16 GIT binary patch literal 142 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 OZcU}>v1~CJmH!8?RV;}B literal 0 HcmV?d00001 diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.CoreCompileInputs.cache b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..5a1c6bb --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +375eb7427a13a6a1a036f49ce73cc2a66452e118 diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.FileListAbsolute.txt b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..71d3a6b --- /dev/null +++ b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.csproj.FileListAbsolute.txt @@ -0,0 +1,12 @@ +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\bin\Debug\net6.0\MSLib.deps.json +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\bin\Debug\net6.0\MSLib.dll +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\bin\Debug\net6.0\MSLib.pdb +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.csproj.AssemblyReference.cache +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.AssemblyInfoInputs.cache +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.AssemblyInfo.cs +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.csproj.CoreCompileInputs.cache +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.dll +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\refint\MSLib.dll +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\MSLib.pdb +C:\Users\Brummel\Documents\cAlgo\Sources\Common\MSLib\obj\Debug\net6.0\ref\MSLib.dll diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.dll b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..acf6f9a371cc8ead30bfc9cd2dc9a081c1670774 GIT binary patch literal 15360 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 literal 0 HcmV?d00001 diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.pdb b/Sources/Common/MSLib/obj/Debug/net6.0/MSLib.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d1c06a665fbc4adca8323df228ed5f71e861dd3d GIT binary patch literal 15424 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 ao;X{K2Z4!z7C6E9ZwwW!X74CE=l=j6wvdGY literal 0 HcmV?d00001 diff --git a/Sources/Common/MSLib/obj/Debug/net6.0/ref/MSLib.dll b/Sources/Common/MSLib/obj/Debug/net6.0/ref/MSLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..00ff9d317ed70305d9b98cdec2306919b6db0ad2 GIT binary patch literal 8192 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 z + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + \ No newline at end of file diff --git a/Sources/Common/MSLib/obj/MSLib.csproj.nuget.g.targets b/Sources/Common/MSLib/obj/MSLib.csproj.nuget.g.targets new file mode 100644 index 0000000..35a7576 --- /dev/null +++ b/Sources/Common/MSLib/obj/MSLib.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Sources/Common/MSLib/obj/project.assets.json b/Sources/Common/MSLib/obj/project.assets.json new file mode 100644 index 0000000..aec2b59 --- /dev/null +++ b/Sources/Common/MSLib/obj/project.assets.json @@ -0,0 +1,65 @@ +{ + "version": 3, + "targets": { + "net6.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net6.0": [] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Common\\MSLib\\MSLib.csproj", + "projectName": "MSLib", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Common\\MSLib\\MSLib.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Common\\MSLib\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Common/MSLib/obj/project.nuget.cache b/Sources/Common/MSLib/obj/project.nuget.cache new file mode 100644 index 0000000..701bd15 --- /dev/null +++ b/Sources/Common/MSLib/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "Oo9DgV2PMMwBLALF97djBTxT9Wgbo3xT86Zo8aWAwrxLBxF4zrxrwtxR5/TCIXpFczNFbEDKftQZxvjl9Y6BHQ==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Common\\MSLib\\MSLib.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/Bar times.algo b/Sources/Indicators/Bar times.algo new file mode 100644 index 0000000000000000000000000000000000000000..061a565671b3c6350af7c078bc79c179b1b953fd GIT binary patch literal 2899 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Bar times/Bar times.sln b/Sources/Indicators/Bar times/Bar times.sln new file mode 100644 index 0000000..9b30d8e --- /dev/null +++ b/Sources/Indicators/Bar times/Bar times.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bar times", "Bar times\Bar times.csproj", "{373DED72-A17B-4903-8EC9-FA9589B99D5D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {373DED72-A17B-4903-8EC9-FA9589B99D5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {373DED72-A17B-4903-8EC9-FA9589B99D5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {373DED72-A17B-4903-8EC9-FA9589B99D5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {373DED72-A17B-4903-8EC9-FA9589B99D5D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Bar times/Bar times/Bar times.cs b/Sources/Indicators/Bar times/Bar times/Bar times.cs new file mode 100644 index 0000000..a84fb3c --- /dev/null +++ b/Sources/Indicators/Bar times/Bar times/Bar times.cs @@ -0,0 +1,47 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cAlgo API MACD Crossover indicator provided by njardim@email.com on Dec 2015. +// +// Based on the original MACD Crossover indicator from cTrade. +// +// ------------------------------------------------------------------------------------------------- + +using System; +using cAlgo.API; +using cAlgo.API.Internals; +using cAlgo.API.Indicators; +using cAlgo.Indicators; + +namespace cAlgo +{ + [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class BarTimes : Indicator + { + [Output("Signal", LineColor = "Blue", PlotType = PlotType.Line, LineStyle = LineStyle.Lines, Thickness = 1)] + public IndicatorDataSeries Signal { get; set; } + + public IndicatorDataSeries Times { get; set; } + private MovingAverage TimesMa; + + protected override void Initialize() + { + Times = CreateDataSeries(); + TimesMa = Indicators.MovingAverage(Times, 200, MovingAverageType.Simple ); + } + + public override void Calculate(int index) + { + if( index>0 ) + { + var t0 = Bars.OpenTimes[index]; + var t1 = Bars.OpenTimes[index-1]; + if( t0.ToLocalTime().Date == t1.ToLocalTime().Date ) + Times[index] = (t0-t1).TotalMinutes; + else + Times[index] = 0; + } + + Signal[index] = Times[index]>0? TimesMa.Result[index] / Times[index] : 0; + } + } +} diff --git a/Sources/Indicators/Bar times/Bar times/Bar times.csproj b/Sources/Indicators/Bar times/Bar times/Bar times.csproj new file mode 100644 index 0000000..e33466c --- /dev/null +++ b/Sources/Indicators/Bar times/Bar times/Bar times.csproj @@ -0,0 +1,24 @@ + + + + net6.0 + False + False + + + 7.2 + Debug + AnyCPU + Properties + cAlgo + Bar times + 512 + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Bar times/Bar times/Properties/AssemblyInfo.cs b/Sources/Indicators/Bar times/Bar times/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..aca3ca9 --- /dev/null +++ b/Sources/Indicators/Bar times/Bar times/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Bar times")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Bar times")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("35f19c43-c7cc-4f53-b8e0-61caaf9cd8e8")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +#if DEBUG + [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations)] +#endif \ No newline at end of file diff --git a/Sources/Indicators/BarCloseAlert.algo b/Sources/Indicators/BarCloseAlert.algo new file mode 100644 index 0000000000000000000000000000000000000000..4edd7b7be1e577de8d9f590679e4f7cae39225d8 GIT binary patch literal 3098 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 hmaJustClosed); + + // Check for Low Point (Valley): Falling then Rising + // Shape: \ / + bool isLow = (hmaPrePrev > hmaPrev) && (hmaPrev < hmaJustClosed); + + if (isHigh || isLow) + { + Notifications.PlaySound(HmaSoundFileName); + } + } + + public override void Calculate(int index) + { + } + + protected override void OnDestroy() + { + Bars.BarClosed -= OnBarsClosed; + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/BarCloseAlert/BarCloseAlert/BarCloseAlert.csproj b/Sources/Indicators/BarCloseAlert/BarCloseAlert/BarCloseAlert.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/BarCloseAlert/BarCloseAlert/BarCloseAlert.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/Candlestick Patterns DEMO.algo b/Sources/Indicators/Candlestick Patterns DEMO.algo new file mode 100644 index 0000000000000000000000000000000000000000..84ced268b6deeef3b9547c071f655ef5e536441e GIT binary patch literal 16389 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO.sln b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO.sln new file mode 100644 index 0000000..b7a72d8 --- /dev/null +++ b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Candlestick Patterns DEMO", "Candlestick Patterns DEMO\Candlestick Patterns DEMO.csproj", "{B9F710D0-7DD5-4E04-B2E9-98C1878E7674}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B9F710D0-7DD5-4E04-B2E9-98C1878E7674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9F710D0-7DD5-4E04-B2E9-98C1878E7674}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9F710D0-7DD5-4E04-B2E9-98C1878E7674}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9F710D0-7DD5-4E04-B2E9-98C1878E7674}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.cs b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.cs new file mode 100644 index 0000000..0b8fa89 --- /dev/null +++ b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.cs @@ -0,0 +1,504 @@ +using System; +using System.IO; +using cAlgo.API; +using cAlgo.API.Internals; +using cAlgo.API.Indicators; +using cAlgo.Indicators; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FileSystem)] + public class CP : Indicator + { + #region Parameters + + [Parameter("Show names", DefaultValue = false)] + public bool Name_Status { get; set; } + + [Parameter("Show more info", DefaultValue = true)] + public bool Add_info { get; set; } + + [Parameter("Show Doji", DefaultValue = true)] + public bool Show_Doji { get; set; } + + [Parameter("Show Hammer", DefaultValue = true)] + public bool Show_Hammer { get; set; } + + [Parameter("MACD Long Cycle", DefaultValue = 26)] + public int LongCycle { get; set; } + + [Parameter("MACD Short Cycle", DefaultValue = 12)] + public int ShortCycle { get; set; } + + [Parameter("MACD Signal Periods", DefaultValue = 9)] + public int Periods { get; set; } + + [Parameter("Doji", DefaultValue = "✝")] + public string Doji_s { get; set; } + [Parameter("Hammer", DefaultValue = "☨")] + public string Hammer_s { get; set; } + + #endregion Parameters + + private MacdHistogram macd; + + private const VerticalAlignment vAlign = VerticalAlignment.Top; + private const HorizontalAlignment hAlign = HorizontalAlignment.Center; + + private const double n = 0.618; + + private const string UpArrow = "▲"; + private const string DownArrow = "▼"; + + private string Pattern_name; + + private double offset; + + private struct Candle + { + #region Data + + public double High; + public double Close; + public double Open; + public double Low; + + #endregion Data + + #region Functions + + public bool IsFallCandle() + { + if (Close < Open) + return true; + else + return false; + } + public bool IsRiseCandle() + { + if (Open < Close) + return true; + else + return false; + } + + public double Median() + { + return (High + Low) / 2; + } + + #endregion Functions + } + + private enum PatternType : int + { + Doji = 1, + Hammer = 2 + } + + protected override void Initialize() + { + macd = Indicators.MacdHistogram(MarketSeries.Close, LongCycle, ShortCycle, Periods); + offset = Symbol.PipSize * 5; + } + + private void DrawText(int index, int _Type) + { + var high = MarketSeries.High[index]; + var low = MarketSeries.Low[index]; + + int x = index; + + double h_y = high + offset; + double h_d_y = h_y + offset * 2.5; + double h_t_y = h_d_y + offset; + + double l_y = low - offset * 2.5; + double l_d_y = l_y - offset; + + + if (TimeFrame == TimeFrame.Minute) + { + h_y = high + offset / 2; + h_d_y = h_y + offset / 2; + h_t_y = h_d_y + offset; + + l_y = low - offset / 2; + l_d_y = l_y - offset / 2; + } + + + + if (TimeFrame == TimeFrame.Minute15) + { + h_y = high + offset / 1.5; + h_d_y = h_y + offset; + h_t_y = h_d_y + offset; + + l_y = low - offset * 1.5; + l_d_y = l_y - offset * 1.1; + } + + + if (TimeFrame == TimeFrame.Hour) + { + h_y = high + offset; + h_d_y = h_y + offset * 3; + h_t_y = h_d_y + offset; + + l_y = low - offset * 3; + l_d_y = l_y - offset * 3; + } + + if (TimeFrame == TimeFrame.Hour4) + { + h_y = high + offset; + h_d_y = h_y + offset * 5; + h_t_y = h_d_y + offset; + + l_y = low - offset * 5; + l_d_y = l_y - offset * 5; + } + + if (TimeFrame == TimeFrame.Daily) + { + h_y = high + offset * 3; + h_d_y = h_y + offset * 12; + h_t_y = h_d_y + offset; + + l_y = low - offset * 12; + l_d_y = l_y - offset * 12; + } + + if (TimeFrame == TimeFrame.Weekly) + { + h_y = high + offset * 6; + h_d_y = h_y + offset * 24; + h_t_y = h_d_y + offset; + + l_y = low - offset * 24; + l_d_y = l_y - offset * 24; + } + + if (TimeFrame == TimeFrame.Monthly) + { + h_y = high + offset * 24; + h_d_y = h_y + offset * 64; + h_t_y = h_d_y + offset; + + l_y = low - offset * 64; + l_d_y = l_y - offset * 64; + } + + string f_ObjName; + string s_ObjName; + + switch (_Type) + { + case (int)PatternType.Doji: + + f_ObjName = string.Format("Doji {0}", index); + s_ObjName = string.Format("Doji | {0}", index); + + ChartObjects.DrawText(f_ObjName, "Doji", x, h_d_y, vAlign, hAlign, Colors.White); + ChartObjects.DrawText(s_ObjName, "\n|", x, h_y, vAlign, hAlign, Colors.White); + + break; + + case (int)PatternType.Hammer: + + f_ObjName = string.Format("Hammer {0}", index); + s_ObjName = string.Format("Hammer | {0}", index); + + ChartObjects.DrawText(f_ObjName, "Hammer", x, h_d_y, vAlign, hAlign, Colors.White); + ChartObjects.DrawText(s_ObjName, "\n|", x, h_y, vAlign, hAlign, Colors.White); + + break; + + } + } + + private void DrawSymbols(int index, int _Type) + { + var high = MarketSeries.High[index]; + var low = MarketSeries.Low[index]; + + int x = index; + + double h_y = high + offset; + double h_d_y = h_y + offset * 2.5; + double h_t_y = h_d_y + offset; + + double l_y = low - offset * 2.5; + double l_d_y = l_y - offset; + + + if (TimeFrame == TimeFrame.Minute) + { + h_y = high + offset / 2; + h_d_y = h_y + offset / 2; + h_t_y = h_d_y + offset; + + l_y = low - offset / 2; + l_d_y = l_y - offset / 2; + } + + + + if (TimeFrame == TimeFrame.Minute15) + { + h_y = high + offset / 1.5; + h_d_y = h_y + offset; + h_t_y = h_d_y + offset; + + l_y = low - offset * 1.5; + l_d_y = l_y - offset * 1.1; + } + + + if (TimeFrame == TimeFrame.Hour) + { + h_y = high + offset; + h_d_y = h_y + offset * 3; + h_t_y = h_d_y + offset; + + l_y = low - offset * 3; + l_d_y = l_y - offset * 3; + } + + if (TimeFrame == TimeFrame.Hour4) + { + h_y = high + offset; + h_d_y = h_y + offset * 5; + h_t_y = h_d_y + offset; + + l_y = low - offset * 5; + l_d_y = l_y - offset * 5; + } + + if (TimeFrame == TimeFrame.Daily) + { + h_y = high + offset * 3; + h_d_y = h_y + offset * 12; + h_t_y = h_d_y + offset; + + l_y = low - offset * 12; + l_d_y = l_y - offset * 12; + } + + if (TimeFrame == TimeFrame.Weekly) + { + h_y = high + offset * 6; + h_d_y = h_y + offset * 24; + h_t_y = h_d_y + offset; + + l_y = low - offset * 24; + l_d_y = l_y - offset * 24; + } + + if (TimeFrame == TimeFrame.Monthly) + { + h_y = high + offset * 24; + h_d_y = h_y + offset * 64; + h_t_y = h_d_y + offset; + + l_y = low - offset * 64; + l_d_y = l_y - offset * 64; + } + + string f_ObjName; + string s_ObjName; + + switch (_Type) + { + case (int)PatternType.Doji: + + f_ObjName = string.Format("Doji {0}", index); + s_ObjName = string.Format("Doji | {0}", index); + + ChartObjects.DrawText(f_ObjName, Doji_s, x, h_d_y, vAlign, hAlign, Colors.White); + ChartObjects.DrawText(s_ObjName, "\n|", x, h_y, vAlign, hAlign, Colors.White); + + break; + + case (int)PatternType.Hammer: + + f_ObjName = string.Format("Hammer {0}", index); + s_ObjName = string.Format("Hammer | {0}", index); + + ChartObjects.DrawText(f_ObjName, Hammer_s, x, h_d_y, vAlign, hAlign, Colors.DarkOrange); + ChartObjects.DrawText(s_ObjName, "\n|", x, h_y, vAlign, hAlign, Colors.White); + + break; + + } + } + + + private bool Size(Candle candle) + { + if (candle.IsFallCandle()) + { + if ((candle.Open - candle.Close) > (candle.High - candle.Low) * n) + return true; + } + else if (candle.IsRiseCandle()) + { + if ((candle.Close - candle.Open) > (candle.High - candle.Low) * n) + return true; + } + + return false; + } + + private void Text_Info(int index, string Pattern_name) + { + if (Add_info == true) + { + + #region Pattern + + ChartObjects.DrawText("PATTERN", "LAST PATTERN : " + Pattern_name, StaticPosition.TopLeft, Colors.White); + + #endregion Pattern + + #region MACD + + if (MACD_Info(index) == "UP") + { + ChartObjects.DrawText("MACD", "\nMACD : ", StaticPosition.TopLeft, Colors.White); + ChartObjects.DrawText("ARROW MACD", "\n\t" + UpArrow, StaticPosition.TopLeft, Colors.DodgerBlue); + + } + else if (MACD_Info(index) == "DOWN") + { + ChartObjects.DrawText("MACD", "\nMACD : ", StaticPosition.TopLeft, Colors.White); + ChartObjects.DrawText("ARROW MACD", "\n\t" + DownArrow, StaticPosition.TopLeft, Colors.Crimson); + } + + #endregion MACD + + } + } + + private string MACD_Info(int index) + { + if (macd.Histogram[index] > 0) + { + return "UP"; + } + + if (macd.Histogram[index] < 0) + { + return "DOWN"; + } + return "ZERO"; + } + + + private bool Doji(Candle candle) + { + + if (candle.IsFallCandle() & (candle.Close != candle.Low)) + { + if ((candle.High - candle.Low) > 12 * (candle.Open - candle.Close)) + return true; + } + if (candle.IsRiseCandle() & (candle.Close != candle.High)) + { + if ((candle.High - candle.Low) > 12 * (candle.Close - candle.Open)) + return true; + } + return false; + } + + private bool Hammer(Candle candle) + { + if (candle.IsFallCandle() & (candle.Close == candle.Low)) + { + if ((candle.Median() > candle.Open) & (candle.Median() > candle.Close)) + { + if ((candle.Median() - candle.Low) > 1.618 * (candle.Open - candle.Close)) + return true; + } + } + + if (candle.IsRiseCandle() & (candle.Close == candle.High)) + { + if ((candle.Median() < candle.Open) & (candle.Median() < candle.Close)) + { + if ((candle.High - candle.Median()) > 1.618 * (candle.Close - candle.Open)) + return true; + } + } + + return false; + } + + public override void Calculate(int index) + { + #region structs + + Candle candle = new Candle(); + + #endregion structs + + #region variables + + int candle_index = 0; + + candle.High = MarketSeries.High.Last(candle_index); + candle.Open = MarketSeries.Open.Last(candle_index); + candle.Close = MarketSeries.Close.Last(candle_index); + candle.Low = MarketSeries.Low.Last(candle_index); + + #endregion variables + + #region Patterns + + // Doji + + if (Doji(candle)) + { + if (Show_Doji == true) + { + Pattern_name = "Doji"; + if (Name_Status == true) + { + DrawText(index, (int)PatternType.Doji); + } + else + { + DrawSymbols(index, (int)PatternType.Doji); + } + } + } + + //Hammer + + if (Hammer(candle)) + { + if (Show_Hammer == true) + { + Pattern_name = "Hammer"; + if (Name_Status == true) + { + DrawText(index, (int)PatternType.Hammer); + } + else + { + DrawSymbols(index, (int)PatternType.Hammer); + } + } + } + + #endregion Patterns + + #region Text + + Text_Info(index, Pattern_name); + + #endregion Text + } + } +} diff --git a/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.csproj b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.csproj new file mode 100644 index 0000000..bfeb7d6 --- /dev/null +++ b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Candlestick Patterns DEMO.csproj @@ -0,0 +1,58 @@ + + + + + Debug + AnyCPU + {B9F710D0-7DD5-4E04-B2E9-98C1878E7674} + {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + cAlgo + Candlestick Patterns DEMO + v4.0 + Client + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + False + ..\..\..\..\API\cAlgo.API.dll + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Properties/AssemblyInfo.cs b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..814d8b2 --- /dev/null +++ b/Sources/Indicators/Candlestick Patterns DEMO/Candlestick Patterns DEMO/Properties/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Candlestick Patterns DEMO")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Candlestick Patterns DEMO")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("35f19c43-c7cc-4f53-b8e0-61caaf9cd8e8")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Sources/Indicators/Correlation with angle v1.1.algo b/Sources/Indicators/Correlation with angle v1.1.algo new file mode 100644 index 0000000000000000000000000000000000000000..4f167e948977fa624ee4fe1742fd388741db21a3 GIT binary patch literal 7374 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 Ah5!Hn literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1.sln b/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1.sln new file mode 100644 index 0000000..f4ad4f5 --- /dev/null +++ b/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Correlation with angle v1.1", "Correlation with angle v1.1\Correlation with angle v1.1.csproj", "{0e2c43ed-8f8d-446b-848e-ed1fe9ef49a2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0e2c43ed-8f8d-446b-848e-ed1fe9ef49a2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0e2c43ed-8f8d-446b-848e-ed1fe9ef49a2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0e2c43ed-8f8d-446b-848e-ed1fe9ef49a2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0e2c43ed-8f8d-446b-848e-ed1fe9ef49a2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.cs b/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.cs new file mode 100644 index 0000000..901975e --- /dev/null +++ b/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.cs @@ -0,0 +1,249 @@ +using System; +using System.Linq; +using System.Threading; +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; +using cAlgo.Indicators; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace cAlgo +{ + [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class Correlationwithanglev11 : Indicator + { + [Parameter("Symbol Selection Method", DefaultValue = SymbolSelectionMethodType.SymbolList, Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")] + public SymbolSelectionMethodType SymbolSelectionMethod { get; set; } + public enum SymbolSelectionMethodType + { + WatchList, + SymbolList + } + + [Parameter("Symbol List 1 / WatchList Name 1:", DefaultValue = "XAUUSD", Group = "Symbol Management (5 Symbol / List Maximum)")] + public string TradedSymbols1 { get; set; } + [Parameter("Symbol List 2 / WatchList Name 2:", DefaultValue = "SpotBrent", Group = "Symbol Management (5 Symbol / List Maximum)")] + public string TradedSymbols2 { get; set; } + + [Parameter("ExtraLevel", DefaultValue = 50, Group = "Angle Level")] + public int ExtraLevel { get; set; } + + [Parameter("PeriodA ngle", DefaultValue = 14, Group = "Angle Setting")] + public int PeriodAngle { get; set; } + [Parameter("Loockback Periods Angle", DefaultValue = 1, Group = "Angle Setting")] + public int LookbackAngle { get; set; } + [Parameter("Price Smooth Type", DefaultValue = MovingAverageType.Weighted, Group = "Angle Setting")] + public MovingAverageType MaTypeAngle { get; set; } + + [Parameter("History Diff Angle", DefaultValue = 1, Group = "Base Setting")] + public int HistoryTextLookback { get; set; } + + [Parameter("ShowSignals", DefaultValue = true, Group = "Histogram Setting")] + public bool ShowSignal { get; set; } + [Parameter("Sensibility Histogram", DefaultValue = 0.3, Group = "Histogram Setting")] + public double SensibilityHisto { get; set; } + + [Parameter("Signal Periods", DefaultValue = 55, Group = "Histogram Setting")] + public int SignalPeriods { get; set; } + [Parameter("Price Smooth Type", DefaultValue = MovingAverageType.Weighted, Group = "Histogram Setting")] + public MovingAverageType MaTypeSignal { get; set; } + + [Output("List 1 : Symb n° 1", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN1 { get; set; } + [Output("List 1 : Symb n° 2", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN2 { get; set; } + [Output("List 1 : Symb n° 3", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN3 { get; set; } + [Output("List 1 : Symb n° 4", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN4 { get; set; } + [Output("List 1 : Symb n° 5", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN5 { get; set; } + + [Output("List 2 : Symb n° 6", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN6 { get; set; } + [Output("List 2 : Symb n° 7", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN7 { get; set; } + [Output("List 2 : Symb n° 8", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN8 { get; set; } + [Output("List 2 : Symb n° 9", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN9 { get; set; } + [Output("List 2 : Symb n° 10", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN10 { get; set; } + + [Output("LevelHigh", LineColor = "Gold", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries LevelHigh { get; set; } + [Output("LevelMid", LineColor = "White", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries LevelMid { get; set; } + [Output("LevelLow", LineColor = "Gold", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries LevelLow { get; set; } + + private MovingAverage[] angleIndex1, angleIndex2; + private AverageTrueRange[] atrIndex1, atrIndex2; + + private Symbol[] TradeList1, TradeList2; + private Bars[] bars1, bars2; + private IndicatorDataSeries[] ResPaireWatchlist1, ResPaireWatchlist2; + private int[] indexBars1, indexBars2; + + protected override void Initialize() + { + if (SymbolSelectionMethod == SymbolSelectionMethodType.WatchList) + { + // Get the trade list from the watchlist 1 provided by the user + foreach (Watchlist w in Watchlists) + { + if (w.Name == TradedSymbols1) + { + TradeList1 = Symbols.GetSymbols(w.SymbolNames.ToArray()); + } + } + // Get the trade list from the watchlist 2 provided by the user + foreach (Watchlist w in Watchlists) + { + if (w.Name == TradedSymbols2) + { + TradeList2 = Symbols.GetSymbols(w.SymbolNames.ToArray()); + } + } + Print(); + Print("Watchlist 1 : [ {0} ] = {1} symbols || Watchlist 2 : [ {2} ] = {3} symbols", Bars.ToString().Substring(0, 3), TradeList1.Length, Bars.ToString().Substring(3, 3), TradeList2.Length); + Print(); + } + else if (SymbolSelectionMethod == SymbolSelectionMethodType.SymbolList) + { + // Get the trade list from the SymbolList provided by the user + string[] SymbolList = TradedSymbols1.Split(' '); + TradeList1 = Symbols.GetSymbols(SymbolList); + + // Get the trade list from the SymbolList provided by the user + string[] SymbolList2 = TradedSymbols2.Split(' '); + TradeList2 = Symbols.GetSymbols(SymbolList2); + } + + //Create Indicators for Watchlist 1 + angleIndex1 = new MovingAverage[TradeList1.Length]; + atrIndex1 = new AverageTrueRange[TradeList1.Length]; + bars1 = new Bars[TradeList1.Length]; + indexBars1 = new int[TradeList1.Length]; + ResPaireWatchlist1 = new IndicatorDataSeries[TradeList1.Length]; + + //Create Indicators for Watchlist 2 + angleIndex2 = new MovingAverage[TradeList2.Length]; + atrIndex2 = new AverageTrueRange[TradeList2.Length]; + bars2 = new Bars[TradeList2.Length]; + indexBars2 = new int[TradeList2.Length]; + ResPaireWatchlist2 = new IndicatorDataSeries[TradeList2.Length]; + + //Initialize Indicators for Watchlist 1 + int i = 0; + foreach (var symbol in TradeList1) + { + Print("Watchlist : [ {0} ] => {1} symbols = {2}", Bars.SymbolName, (i + 1), symbol.Name); + //Load bars of watchlist 1 + bars1[i] = MarketData.GetBars(TimeFrame, symbol.Name); + while (bars1[i].OpenTimes[0] > Bars.OpenTimes[0]) + bars1[i].LoadMoreHistory(); + + //Load Futurs DataSerie watchlist 1 (calculation in Calculate(int index)) + ResPaireWatchlist1[i] = CreateDataSeries(); + + //Load Indicators watchlist 1 + + atrIndex1[i] = Indicators.AverageTrueRange(bars1[i], 500, MovingAverageType.Simple); + angleIndex1[i] = Indicators.MovingAverage(bars1[i].ClosePrices, PeriodAngle, MaTypeAngle); + i++; + } + //Initialize Indicators for Watchlist 2 + Print(); + + int j = 0; + foreach (var symbol2 in TradeList2) + { + Print("Watchlist : [ {0} ] => {1} symbols = {2}", Bars.SymbolName, (j + 1), symbol2.Name); + //Load bars of watchlist 2 + bars2[j] = MarketData.GetBars(TimeFrame, symbol2.Name); + while (bars2[j].OpenTimes[0] > Bars.OpenTimes[0]) + bars2[j].LoadMoreHistory(); + + //Load Futurs DataSerie watchlist 2 (calculation in Calculate(int index)) + ResPaireWatchlist2[j] = CreateDataSeries(); + + //Load Indicators watchlist 2 + atrIndex2[j] = Indicators.AverageTrueRange(bars2[j], 500, MovingAverageType.Simple); + angleIndex2[j] = Indicators.MovingAverage(bars2[j].ClosePrices, PeriodAngle, MaTypeAngle); + j++; + } + Print(); + } + public override void Calculate(int index) + { + //Plot Static level on indicator + LevelHigh[index] = ExtraLevel; + LevelMid[index] = 0; + LevelLow[index] = 0 - ExtraLevel; + + if (index < PeriodAngle) + return; + + //Calculate angle by symbol list 1 + for (int i = 0; i < TradeList1.Length; i++) + { + indexBars1[i] = bars1[i].OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); + ResPaireWatchlist1[i][index] = GetCalculationAngle(angleIndex1[i].Result[indexBars1[i]], angleIndex1[i].Result[indexBars1[i] - LookbackAngle], atrIndex1[i].Result[indexBars1[i]]); + } + + //Remove Static text of difference into index and index - HistoryTextLookback + if (IndicatorArea.FindAllObjects(ChartObjectType.Text).Length > 0) + IndicatorArea.RemoveAllObjects(); + //Calculate difference into index and index - HistoryTextLookback list 1 + for (int i = 0; i < TradeList1.Length; i++) + IndicatorArea.DrawText((TradeList1[i]).ToString() + index, TradeList1[i] + " : " + ResPaireWatchlist1[i][index].ToString("F2"), index + 2, double.IsNaN(ResPaireWatchlist1[i][index]) ? 0 : ResPaireWatchlist1[i][index], ResPaireWatchlist1[i][index] > ResPaireWatchlist1[i][index - HistoryTextLookback] ? Color.Lime : Color.Red); + + //Output the result like symbolList number != output number list 1 + int j = TradeList1.Length - 1; + SymbN1[index] = ResPaireWatchlist1[0 < j ? 0 : j][index]; + SymbN2[index] = ResPaireWatchlist1[1 < j ? 1 : j][index]; + SymbN3[index] = ResPaireWatchlist1[2 < j ? 2 : j][index]; + SymbN4[index] = ResPaireWatchlist1[3 < j ? 3 : j][index]; + SymbN5[index] = ResPaireWatchlist1[4 < j ? 4 : j][index]; + + //Calculate angle by symbol list 2 + for (int i = 0; i < TradeList2.Length; i++) + { + indexBars2[i] = bars2[i].OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); + ResPaireWatchlist2[i][index] = GetCalculationAngle(angleIndex2[i].Result[indexBars2[i]], angleIndex2[i].Result[indexBars2[i] - LookbackAngle], atrIndex2[i].Result[indexBars2[i]]); + } + + //Calculate difference into index and index - HistoryTextLookback list 2 + for (int i = 0; i < TradeList2.Length; i++) + IndicatorArea.DrawText((TradeList2[i]).ToString() + index, TradeList2[i] + " : " + ResPaireWatchlist2[i][index].ToString("F2"), index + 2, double.IsNaN(ResPaireWatchlist2[i][index]) ? 0 : ResPaireWatchlist2[i][index], ResPaireWatchlist2[i][index] > ResPaireWatchlist2[i][index - HistoryTextLookback] ? Color.Lime : Color.Red); + + //Output the result like symbolList number != output number list 2 + int k = TradeList2.Length - 1; + SymbN6[index] = ResPaireWatchlist2[0 < k ? 0 : k][index]; + SymbN7[index] = ResPaireWatchlist2[1 < k ? 1 : k][index]; + SymbN8[index] = ResPaireWatchlist2[2 < k ? 2 : k][index]; + SymbN9[index] = ResPaireWatchlist2[3 < k ? 3 : k][index]; + SymbN10[index] = ResPaireWatchlist2[4 < k ? 4 : k][index]; + + } + + //Function for angle calculation with atr normalization + public double GetCalculationAngle(double priceSmooth, double priceSmoothLoockBack, double atr) + { + var _momentumpositive = priceSmooth - priceSmoothLoockBack; + var _momentumnegative = priceSmoothLoockBack - priceSmooth; + var _momentum = priceSmooth > priceSmoothLoockBack + ? _momentumpositive / atr + : _momentumnegative / atr; + var _hypothenuse = Math.Sqrt((_momentum * _momentum) + (LookbackAngle * LookbackAngle)); + var _cos = (LookbackAngle / _hypothenuse); + var _angle = priceSmooth > priceSmoothLoockBack + ? (0 + (Math.Acos(_cos) * 100)) + : (0 - (Math.Acos(_cos) * 100)); + return _angle; + } + } +} diff --git a/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.csproj b/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.csproj new file mode 100644 index 0000000..4040d8c --- /dev/null +++ b/Sources/Indicators/Correlation with angle v1.1/Correlation with angle v1.1/Correlation with angle v1.1.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.cs b/Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.cs new file mode 100644 index 0000000..c1cd75e --- /dev/null +++ b/Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.cs @@ -0,0 +1,182 @@ +using System; +using System.Linq; +using System.Threading; +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; +using cAlgo.Indicators; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace cAlgo +{ + //[Cloud("Fast Smooth", "Slow Smooth", FirstColor = "Green", SecondColor = "Red", Opacity = 0.1)] + [Levels(0)] + [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class AngleOfMultiSymbol : Indicator + { + [Parameter("Symbol Selection Method", DefaultValue = SymbolSelectionMethodType.SymbolList, Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")] + public SymbolSelectionMethodType SymbolSelectionMethod { get; set; } + [Parameter("Symbol List", DefaultValue = "EURUSD GBPUSD AUDUSD USDCHF", Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")] + public string TradedSymbols { get; set; } + [Parameter("Watchlist Name", DefaultValue = "My Watchlist", Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")] + public string WatchlistName { get; set; } + + public enum SymbolSelectionMethodType + { + CurrentChart, + SymbolList, + WatchList + } + + [Parameter("History Diff Angle", DefaultValue = 1, Group = "Base Setting")] + public int HistoryTextLookback { get; set; } + [Parameter("Tf", DefaultValue = "Hour1", Group = "Base Setting")] + public TimeFrame Tf { get; set; } + [Parameter("Price Smooth Period (255)", DefaultValue = 255, Group = "Angle Setting")] + public int SmoothPeriods { get; set; } + [Parameter("Price Smooth Type", DefaultValue = MovingAverageType.Weighted, Group = "Angle Setting")] + public MovingAverageType MaType { get; set; } + [Parameter("Loockback Periods Angle", DefaultValue = 1, Group = "Angle Setting")] + public int LookbackPeriodsAngle { get; set; } + [Parameter("Sensitivity (1.0)", DefaultValue = 1, Group = "Angle Setting")] + public double Sensitivity { get; set; } + + [Output("Symb n° 1", LineColor = "White", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN1 { get; set; } + [Output("Symb n° 2", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN2 { get; set; } + [Output("Symb n° 3", LineColor = "Green", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN3 { get; set; } + [Output("Symb n° 4", LineColor = "DeepSkyBlue", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN4 { get; set; } + [Output("Symb n° 5", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN5 { get; set; } + [Output("Symb n° 6", LineColor = "Magenta", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN6 { get; set; } + + /*Uncomment For more Symbole on the chart + [Output("Symb n° 7", LineColor = "Green", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN7 { get; set; } + [Output("Symb n° 8", LineColor = "DeepSkyBlue", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN8 { get; set; } + [Output("Symb n° 9", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN9 { get; set; } + [Output("Symb n° 10", LineColor = "Magenta", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)] + public IndicatorDataSeries SymbN10 { get; set; } + */ + + private MovingAverage[] ma; + private AverageTrueRange[] atr; + + private Symbol[] TradeList; + private Bars[] bars; + private IndicatorDataSeries[] Sources, ResSymbol; + private int[] indexBars; + + protected override void Initialize() + { + if (SymbolSelectionMethod == SymbolSelectionMethodType.WatchList) + { + // Get the trade list from the watchlist provided by the user + foreach (Watchlist w in Watchlists) + { + if (w.Name == WatchlistName) + { + TradeList = Symbols.GetSymbols(w.SymbolNames.ToArray()); + } + } + } + else if (SymbolSelectionMethod == SymbolSelectionMethodType.SymbolList) + { + // Get the trade list from the sysmbol list provided by the user + string[] SymbolList = TradedSymbols.ToUpper().Split(' '); + + TradeList = Symbols.GetSymbols(SymbolList); + } + else + { + TradeList = new Symbol[1]; + TradeList[0] = Symbol; + } + + atr = new AverageTrueRange[TradeList.Length]; + ma = new MovingAverage[TradeList.Length]; + bars = new Bars[TradeList.Length]; + indexBars = new int[TradeList.Length]; + Sources = new IndicatorDataSeries[TradeList.Length]; + ResSymbol = new IndicatorDataSeries[TradeList.Length]; + + Print("{0} traded symbols: ", TradeList.Length); + + int i = 0; + foreach (var symbol in TradeList) + { + Print(symbol.Name); + + bars[i] = MarketData.GetBars(Tf, symbol.Name); + if (bars[i].OpenTimes[0] > Bars.OpenTimes[0]) + bars[i].LoadMoreHistory(); + //Load indicators on start up EP5-ATR + Sources[i] = CreateDataSeries(); + ResSymbol[i] = CreateDataSeries(); + atr[i] = Indicators.AverageTrueRange(bars[i], 500, MovingAverageType.Simple); + + ma[i] = Indicators.MovingAverage(Sources[i], SmoothPeriods, MaType); + i++; + } + } + + public override void Calculate(int index) + { + if (index < SmoothPeriods) + return; + + for (int i = 0; i < TradeList.Length; i++) + { + //indexBars[i] = GetIndexByDate(bars[i], Bars.OpenTimes[index]); + + indexBars[i] = bars[i].OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); + Sources[i][index] = bars[i].ClosePrices[indexBars[i]]; + ResSymbol[i][index] = GetCalculationSymbol(ma[i].Result[index], ma[i].Result[index - LookbackPeriodsAngle], atr[i].Result[indexBars[i]]); + } + + SymbN1[index] = ResSymbol[0][index]; + SymbN2[index] = ResSymbol[1][index]; + SymbN3[index] = ResSymbol[2][index]; + SymbN4[index] = ResSymbol[3][index]; + SymbN5[index] = ResSymbol[4][index]; + SymbN6[index] = ResSymbol[5][index]; + + /* Uncomment For More Symbols on chart + SymbN7[index] = ResSymbol[2][index]; + SymbN8[index] = ResSymbol[3][index]; + SymbN9[index] = ResSymbol[4][index]; + SymbN10[index] = ResSymbol[5][index]; + */ + + IndicatorArea.RemoveAllObjects(); + + for (int i = 0; i < TradeList.Length; i++) + { + IndicatorArea.DrawText((TradeList[i]).ToString() + index, TradeList[i] + " : " + ResSymbol[i][index].ToString("F2"), index, ResSymbol[i][index], ResSymbol[i][index] > ResSymbol[i][index - HistoryTextLookback] ? Color.Lime : Color.Red); + } + + } + public double GetCalculationSymbol(double priceSmooth, double priceSmoothLoockBack, double atr) + { + var _momentumpositive = priceSmooth - priceSmoothLoockBack; + var _momentumnegative = priceSmoothLoockBack - priceSmooth; + var _momentum = priceSmooth > priceSmoothLoockBack + ? _momentumpositive / atr + : _momentumnegative / atr; + var _hypothenuse = Math.Sqrt((_momentum * _momentum) + (LookbackPeriodsAngle * LookbackPeriodsAngle)); + var _cos = (LookbackPeriodsAngle / _hypothenuse); + var _angle = priceSmooth > priceSmoothLoockBack + ? (0 + (Math.Acos(_cos) * 100)) * Sensitivity + : (0 - (Math.Acos(_cos) * 100)) * Sensitivity; + return _angle; + } + } +} diff --git a/Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.csproj b/Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.csproj new file mode 100644 index 0000000..4040d8c --- /dev/null +++ b/Sources/Indicators/Correlation with angle v1.1/msAngle of MultiSymbol.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/Difference.algo b/Sources/Indicators/Difference.algo new file mode 100644 index 0000000000000000000000000000000000000000..aee3263e68719d0bd9c6cb3a7fc3f0659ede2a33 GIT binary patch literal 2793 zcmV1u zjA$WSLqu*s&m}40tC05=!a+~=j+O`oJpFEe+26v*3}T)!lS7Vzf-nUR>%!8^qPbzL zJ)2RbB~6XSYpkkWUwqF3JNZ>YQL-$K0Q#a5KNzHXy z8=1|=`Ceb0KW=oY6qMAxx#@{lTbkXYbL$-k&9N{N3{#AXe+0oLmg0QgH!j5vq^=$fFIL#6dCakig<~C& zS{mr1oVU8N=|3d>DQ-cOUK3_ujj2Oe%-iuZM9)BFlJ4vbvhn!`;Y0hili!F5llPOJ z5SvJi75rF&n#8-fT!%8D`dsfVwfUG4O_qSItDfMsp1$KAs^9cA%Im}2)HqeG4WGY( z%h7*HOZaQFg#TY!jz`mJQf`G{K=>1kV5dz}C797*-(P~$_X&1T!)sN%pXmGxRGsQZ zvLh*FRNF#0?#X&eOm)3r48%*&{iA7~A6~MRh_*!P;iG^kbSF4rF)zfOWP?e4OX@lB zsXlRW*KV3Ri$o3!!Z)UVb^K_Fu6E5f4$; z&)WdaN7J?$1kRXYLL{tdTFoth79N#KQD~{g2e;!>w43e-U6TKl!>;@8OS}p$kdE@O zQFL-#CuVzu?I=+{`D6@H1E*$jlY|2~Oe+uG__8@|s7mJyw|LlYOWSRqtFI@pTJt!{{?Zk#^l1 zIvl;I$wq@UrCZWvuhq&Sc$6s{*}Q=qi$1ag$<7rm?S}3TvQzb8d@nZwctns^3O3=8 z`RH{QJ^I(|Hz+Vhv$Ze+KOpKY7t)i6waUF92|EY;k8ms7aa_n>gqp*T3 zrDJ@>lNho1N>v*U{wbQ0N>U<}NPoDC46N}&h46y+!ox^?MY?>+KaBvmg{dNlghpNA z*b<5|b+>O+g<^qRDIUqy0DGddR@719|E5vyJE2)R$J%m*u&Q#~@U$#rMc_=NHSS!j zH3-QIZRe(%S%fjlo`c;ju2^m1^)!&*u7;76D_cyK$5hpbwTNvy<~=aW zBd&9bsf7%b^p7BpecEs_8)KSa=M}iWLzQ*gQ=DtS!#-}@;}e(U_+&AiHiV0n+ni8m z^ahko_!Hz0tjwdlM#{fz6i0%Hbbxbd_VF_+d(Mf zkx##rep}olYD0xo(GvVQ7&f`O;_f9v5l)2CzpEYY#hajqfQ5@*s293OiufZ=_br*~ z3*SUhjwY*^Mv$>1E+%o@4syYFu&}0RID;7IZAe{7mR_?ozm+{NtZw z2nL3xb2+Dm9Dn1C-~)e@M->7xqF1jA-V=*(i%pl9@4trI-aWutfcMF3{l=OAV0?Xj z!e9ZkpORl2^Ta{Z1nZJ}`g^gHI$GCXKAbdPH;t{#0jw}_C-Z&3hB})3#-7Thd-45W zEMwRX7K&crG3aEeNYrQ~r63=YDKO1Kd+G&b_E&h}LS)@^=RN?ysql)(_G~iB0NdU9`$`rKpgi68n4qhi z8fL-t=_JKt8+|D6)7_v)k51*c&#RH+}{mGw%gG_+6=Ym(te}o{}N=y zMV+YaF{7@W9*wm%))FFWh}A%jnvDmz`s@NFf8bgBeDu$=d>$sdeCOfM-f?|++J{|t zcur5Ox151S*#`R$P0Az1?aNCxmfte4pgrS03056PYan^u^gkkdz=(RZJBNS(bl@-HB# zr!u2V4Sy-L|7p3#D)Xly3KRp0)R0&IM_yrnyen(NF(6ab4k}S}P zYlzf5u+5L}xz%SNv)(2+`QG=#L7vAP0JF>uy6BMZ;T-@#0>9rO + + net6.0 + + + + + + diff --git a/Sources/Indicators/Economic Events On Chart.algo b/Sources/Indicators/Economic Events On Chart.algo new file mode 100644 index 0000000000000000000000000000000000000000..bd94e709bd6a7b6b26d6c590b20ea2cd174881ae GIT binary patch literal 303336 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

8tb978Mvob$v9_#UnR2+-(JB?j5l+I0iP)mPO6 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

{hXJ-56)bOL z{|PM*F%MSo`|#wcumqa9+-Ub+NAn}%*Y3&{I%GJ9iD8`zqO8*|0?3gAbez|ch;R=* z7jv5^BkKfR(XAiV;+l0;l6R?%sQ+t}%>VM62?w0#=zv#%M>h+bMf1zesx(=+Uea9x z?!hl7P2bBVW$jP5Le^rAnZ-vEF);-slZp|LycmBwUQO&w&&{3%b$y;&tW0aHqj;Z{|N{^AZaZVFvzICEhY$1q$86vvjQWn5$ zr9p!b&UA1%O-FfM&cY*W@RvzG$M@p#_eD_kBW#0k2zQv|2~p#ei*{(O9DmYzUM0rg+D5miVFBPl1{o&93)>Nr%Vf_n zM=ftQ6_tn1QNndli|gfre7@3&d5qi(Db%D90z|@dONaZ*q!ReLJGhA&&Aj`*7{_I) z6?NIS{w=t63KNxvVpzA+iKb}a){7C31z1ai5Hc8&U*9=9=`hK!?T-~!bs2n;D}>>iZD$sImkzFcB23Oe>7rHM{G?3~- z{Ovoki*I&Vq(a1+#}3dSd>{8{6x>Ar14zpD??(iu3WYE^@I+P3RrB;Gd49FIt$

  • 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Economic Events On Chart/.gitattributes b/Sources/Indicators/Economic Events On Chart/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/Sources/Indicators/Economic Events On Chart/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/Sources/Indicators/Economic Events On Chart/.gitignore b/Sources/Indicators/Economic Events On Chart/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/Sources/Indicators/Economic Events On Chart/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/Sources/Indicators/Economic Events On Chart/Economic Events On Chart.sln b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart.sln new file mode 100644 index 0000000..d5b245c --- /dev/null +++ b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Economic Events On Chart", "Economic Events On Chart\Economic Events On Chart.csproj", "{7D9A4560-D021-4B46-8D58-83DCBEBBE654}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7D9A4560-D021-4B46-8D58-83DCBEBBE654}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D9A4560-D021-4B46-8D58-83DCBEBBE654}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D9A4560-D021-4B46-8D58-83DCBEBBE654}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D9A4560-D021-4B46-8D58-83DCBEBBE654}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.cs b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.cs new file mode 100644 index 0000000..b831773 --- /dev/null +++ b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.cs @@ -0,0 +1,345 @@ +using System; +using cAlgo.API; +using System.Collections.Generic; +using System.Xml; +using System.Net; +using System.Xml.Serialization; +using System.IO; +using System.Text; +using System.Linq; +using System.Globalization; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.Internet)] + public class EconomicEventsOnChart : Indicator + { + private Color _colorHighImpact, _colorMediumImpact, _colorLowImpact, _colorOthers; + + private TextBlock _textBlock; + + [Parameter("Data URI", DefaultValue = "https://nfs.faireconomy.media/ff_calendar_thisweek.xml", Group = "General")] + public string DataUri { get; set; } + + [Parameter("Only Symbol Events", DefaultValue = true, Group = "General")] + public bool OnlySymbolEvents { get; set; } + + [Parameter("Show Past Events", DefaultValue = true, Group = "General")] + public bool ShowPastEvents { get; set; } + + [Parameter("Show", DefaultValue = true, Group = "High Impact")] + public bool ShowHighImpact { get; set; } + + [Parameter("Color", DefaultValue = "Red", Group = "High Impact")] + public string ColorHighImpact { get; set; } + + [Parameter("Style", DefaultValue = LineStyle.Solid, Group = "High Impact")] + public LineStyle LineStyleHighImpact { get; set; } + + [Parameter("Thickness", DefaultValue = 1, Group = "High Impact")] + public int ThicknessHighImpact { get; set; } + + [Parameter("Show", DefaultValue = true, Group = "Medium Impact")] + public bool ShowMediumImpact { get; set; } + + [Parameter("Color", DefaultValue = "Gold", Group = "Medium Impact")] + public string ColorMediumImpact { get; set; } + + [Parameter("Style", DefaultValue = LineStyle.Solid, Group = "Medium Impact")] + public LineStyle LineStyleMediumImpact { get; set; } + + [Parameter("Thickness", DefaultValue = 1, Group = "Medium Impact")] + public int ThicknessMediumImpact { get; set; } + + [Parameter("Show", DefaultValue = true, Group = "Low Impact")] + public bool ShowLowImpact { get; set; } + + [Parameter("Color", DefaultValue = "Yellow", Group = "Low Impact")] + public string ColorLowImpact { get; set; } + + [Parameter("Style", DefaultValue = LineStyle.Solid, Group = "Low Impact")] + public LineStyle LineStyleLowImpact { get; set; } + + [Parameter("Thickness", DefaultValue = 1, Group = "Low Impact")] + public int ThicknessLowImpact { get; set; } + + [Parameter("Show", DefaultValue = false, Group = "Others")] + public bool ShowOthers { get; set; } + + [Parameter("Color", DefaultValue = "Gray", Group = "Others")] + public string ColorOthers { get; set; } + + [Parameter("Style", DefaultValue = LineStyle.Solid, Group = "Others")] + public LineStyle LineStyleOthers { get; set; } + + [Parameter("Thickness", DefaultValue = 1, Group = "Others")] + public int ThicknessOthers { get; set; } + + [Parameter("Show", DefaultValue = true, Group = "Text Block")] + public bool ShowTextBlock { get; set; } + + [Parameter("Background Color", DefaultValue = "#969696", Group = "Text Block")] + public string TextBlockBackgroundColor { get; set; } + + [Parameter("Color", DefaultValue = "White", Group = "Text Block")] + public string TextBlockColor { get; set; } + + [Parameter("Horizontal Alignment", DefaultValue = HorizontalAlignment.Center, Group = "Text Block")] + public HorizontalAlignment TextBlockHorizontalAlignment { get; set; } + + [Parameter("Vertical Alignment", DefaultValue = VerticalAlignment.Bottom, Group = "Text Block")] + public VerticalAlignment TextBlockVerticalAlignment { get; set; } + + [Parameter("Text Alignment", DefaultValue = TextAlignment.Center, Group = "Text Block")] + public TextAlignment TextBlockTextAlignment { get; set; } + + [Parameter("Font Weight", DefaultValue = FontWeight.Bold, Group = "Text Block")] + public FontWeight TextBlockFontWeight { get; set; } + + protected override void Initialize() + { + RemoveEventLines(); + + if (ShowTextBlock) + { + _textBlock = new TextBlock + { + IsVisible = false, + HorizontalAlignment = TextBlockHorizontalAlignment, + VerticalAlignment = TextBlockVerticalAlignment, + BackgroundColor = GetColor(TextBlockBackgroundColor), + ForegroundColor = GetColor(TextBlockColor), + TextAlignment = TextBlockTextAlignment, + FontWeight = TextBlockFontWeight, + Padding = 5 + }; + + Chart.AddControl(_textBlock); + + Chart.ObjectHoverChanged += Chart_ObjectHoverChanged; + } + + _colorHighImpact = GetColor(ColorHighImpact); + _colorMediumImpact = GetColor(ColorMediumImpact); + _colorLowImpact = GetColor(ColorLowImpact); + _colorOthers = GetColor(ColorOthers); + + var events = GetNewsEvents(); + + DisplayEvents(events); + } + + private void Chart_ObjectHoverChanged(ChartObjectHoverChangedEventArgs obj) + { + if (!obj.IsObjectHovered || obj.ChartObject == null || string.IsNullOrWhiteSpace(obj.ChartObject.Name) || !obj.ChartObject.Name.EndsWith("Event", StringComparison.OrdinalIgnoreCase)) + { + _textBlock.IsVisible = false; + + return; + } + + _textBlock.Text = string.Format("{0} | {1}", obj.ChartObject.Name.Replace(" | Event", string.Empty), obj.ChartObject.Comment); + + _textBlock.IsVisible = true; + } + + public override void Calculate(int index) + { + } + + private IEnumerable GetNewsEvents() + { + using (var webClient = new WebClient()) + { + var data = webClient.DownloadString(DataUri); + + return GetNewsEventsFromXml(data); + } + } + + private IEnumerable GetNewsEventsFromXml(string xml) + { + var xmlSerializer = new XmlSerializer(typeof(WeeklyEvents)); + + var stream = new StringReader(xml); + + var weeklyEvents = xmlSerializer.Deserialize(stream) as WeeklyEvents; + + foreach (var newsEvent in weeklyEvents.Events) + { + var timeString = string.Format("{0} {1}", newsEvent.UtcDate, newsEvent.UtcTime); + + DateTimeOffset time; + + if (DateTimeOffset.TryParseExact(timeString, "MM-dd-yyyy h:mmtt", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out time)) + { + newsEvent.Time = time; + } + } + + return weeklyEvents.Events; + } + + private void DisplayEvents(IEnumerable events) + { + foreach (var newsEvent in events) + { + if (!newsEvent.Time.HasValue + || (newsEvent.Impact == NewsEventImpact.High && !ShowHighImpact) + || (newsEvent.Impact == NewsEventImpact.Medium && !ShowMediumImpact) + || (newsEvent.Impact == NewsEventImpact.Low && !ShowLowImpact) + || ((newsEvent.Impact == NewsEventImpact.None || newsEvent.Impact == NewsEventImpact.Holiday) && !ShowOthers) + || (OnlySymbolEvents && !IsEventRelatedToSymbol(newsEvent.Currency)) + || (!ShowPastEvents && newsEvent.Time < Server.TimeInUtc)) continue; + + var lineSettings = GetLineSettings(newsEvent.Impact); + + var eventLine = Chart.DrawVerticalLine(string.Format("{0} | {1} | {2} | Event", newsEvent.Title, newsEvent.Currency, newsEvent.Impact), newsEvent.Time.Value.UtcDateTime, lineSettings.Color, lineSettings.Thickness, lineSettings.Style); + + var stringBuilder = new StringBuilder(); + + if (!string.IsNullOrWhiteSpace(newsEvent.Forecast)) + { + stringBuilder.Append(string.Format("Forecast: {0} | ", newsEvent.Forecast)); + } + + if (!string.IsNullOrWhiteSpace(newsEvent.Previous)) + { + stringBuilder.Append(string.Format("Previous: {0} | ", newsEvent.Previous)); + } + + if (newsEvent.Time.HasValue) + { + var time = newsEvent.Time.Value.ToOffset(Application.UserTimeOffset); + + stringBuilder.Append(string.Format("Time: {0:s}", time)); + } + + eventLine.Comment = stringBuilder.ToString(); + eventLine.IsInteractive = true; + eventLine.IsLocked = true; + } + } + + private bool IsEventRelatedToSymbol(string eventCurrency) + { + return SymbolName.StartsWith(eventCurrency, StringComparison.OrdinalIgnoreCase) || SymbolName.EndsWith(eventCurrency, StringComparison.OrdinalIgnoreCase); + } + + private Color GetColor(string colorString, int alpha = 255) + { + var color = colorString[0] == '#' ? Color.FromHex(colorString) : Color.FromName(colorString); + + return Color.FromArgb(alpha, color); + } + + private LineSettings GetLineSettings(NewsEventImpact impact) + { + switch (impact) + { + case NewsEventImpact.High: + return new LineSettings + { + Color = _colorHighImpact, + Style = LineStyleHighImpact, + Thickness = ThicknessHighImpact + }; + + case NewsEventImpact.Medium: + return new LineSettings + { + Color = _colorMediumImpact, + Style = LineStyleMediumImpact, + Thickness = ThicknessMediumImpact + }; + + case NewsEventImpact.Low: + return new LineSettings + { + Color = _colorLowImpact, + Style = LineStyleLowImpact, + Thickness = ThicknessLowImpact + }; + + default: + return new LineSettings + { + Color = _colorOthers, + Style = LineStyleOthers, + Thickness = ThicknessOthers + }; + } + } + + private void RemoveEventLines() + { + var chartObjects = Chart.Objects.ToArray(); + + foreach (var chartObject in chartObjects) + { + if (chartObject.ObjectType != ChartObjectType.VerticalLine || !chartObject.IsInteractive || string.IsNullOrEmpty(chartObject.Name) || !chartObject.Name.EndsWith("Event", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + Chart.RemoveObject(chartObject.Name); + } + } + } + + [XmlRoot("weeklyevents")] + public class WeeklyEvents + { + [XmlElement("event")] + public List Events { get; set; } + } + + public class NewsEvent + { + [XmlElement("title")] + public string Title { get; set; } + + [XmlElement("country")] + public string Currency { get; set; } + + [XmlElement("date")] + public string UtcDate { get; set; } + + [XmlElement("time")] + public string UtcTime { get; set; } + + [XmlIgnore] + public DateTimeOffset? Time { get; set; } + + [XmlElement("impact")] + public NewsEventImpact Impact { get; set; } + + [XmlElement("previous")] + public string Previous { get; set; } + + [XmlElement("forecast")] + public string Forecast { get; set; } + } + + public enum NewsEventImpact + { + None, + + High, + + Medium, + + Low, + + Holiday + } + + public struct LineSettings + { + public Color Color { get; set; } + + public LineStyle Style { get; set; } + + public int Thickness { get; set; } + } +} \ No newline at end of file diff --git a/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.csproj b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.csproj new file mode 100644 index 0000000..b2d03cf --- /dev/null +++ b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Economic Events On Chart.csproj @@ -0,0 +1,60 @@ + + + + + 7.2 + Debug + AnyCPU + {7D9A4560-D021-4B46-8D58-83DCBEBBE654} + {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + cAlgo + Economic Events On Chart + v4.0 + Client + 512 + True + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + False + ..\..\..\..\API\cAlgo.API.dll + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Properties/AssemblyInfo.cs b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5334d9f --- /dev/null +++ b/Sources/Indicators/Economic Events On Chart/Economic Events On Chart/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Economic Events On Chart")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Economic Events On Chart")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("35f19c43-c7cc-4f53-b8e0-61caaf9cd8e8")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +#if DEBUG + [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations)] +#endif \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterDisplay.algo b/Sources/Indicators/HmaClusterDisplay.algo new file mode 100644 index 0000000000000000000000000000000000000000..17e0f4958fb56a0c81517707954a7772277d22a7 GIT binary patch literal 4032 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 mIkU~Zx+T!bo + + net6.0 + + + + + + diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfo.cs b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfo.cs new file mode 100644 index 0000000..c44f687 --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaClusterDisplay")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaClusterDisplay")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaClusterDisplay")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfoInputs.cache b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfoInputs.cache new file mode 100644 index 0000000..fb3298c --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c64656f30d6316c2781214813c004e91eeb999a2 diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..eb62e09 --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaClusterDisplay +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\HmaClusterDisplay\HmaClusterDisplay\ diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.assets.cache b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..49943a95891d39ff2ce61e404539809ef87d4190 GIT binary patch literal 571 zcmWIWc6a1rU|`6tny)d#ab9D7bh6mxs`v^ce>IL4`{G&eUjCq^%?G(EK>rXVpnJ25@AI3~HIC^03qNH4LpBtJK?BsIoR z&p^-6Bqk>_DJCzq#7xg1CfPA3Jzvi;z*8?JCx;oybS5Ah#Ag9wR;V~K1#*EvatOo% zN2moL1t1AUf=&ae1OeK3gbiXi*mQJ{faKVLm;;D8ffy9@+(3*Bcz_%}zf$+qk^o3p zdZu9bRTx=53>XcW`FU)R0Ok!yEXnZ9gX)z42Dd&Wxb;zjo71tlIJG3CvLKbcs5Gx6 pGdGpfIlrLNCqFqchoz*bG*!qYwYVfRFR=t@bZ}`B$W&ew697*bnd<-m literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.csproj.AssemblyReference.cache b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/Debug/net6.0/HmaClusterDisplay.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.dgspec.json b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.dgspec.json new file mode 100644 index 0000000..3d07a8d --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj", + "projectName": "HmaClusterDisplay", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.props b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.targets b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/HmaClusterDisplay.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.assets.json b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.assets.json new file mode 100644 index 0000000..4e3616e --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj", + "projectName": "HmaClusterDisplay", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.nuget.cache b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.nuget.cache new file mode 100644 index 0000000..14266fc --- /dev/null +++ b/Sources/Indicators/HmaClusterDisplay/HmaClusterDisplay/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "yHH60uYu212/ZwKBjFEs3QIJ5FpzVGBMwmFDYLX2rhH2Cs1IBW+Oz5ZVjZ6S4fBauvoGBarOvV07SnxXEk/83g==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaClusterDisplay\\HmaClusterDisplay\\HmaClusterDisplay.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterSR.algo b/Sources/Indicators/HmaClusterSR.algo new file mode 100644 index 0000000000000000000000000000000000000000..329c2c45555dc6769b8c782abecad67472f2f5b3 GIT binary patch literal 6761 zcmV-v8kXf@Y-eu*000B*ABzY80000001C`kOK;ma5WW}ae-L!)0*)d16+1uTGafM=LyU@quncl+9+qMT z%{60t*_38V(xq0ojrn#{S053L*-A*N*6A#+YqVMm*%04n&=kHW**er|O*#==0apj5 znYY|qL%tRozjxjnb_c!lDkM~3(#o$&?Zyh@epOw>Wp6Sjx`Gvy(tHP# zVgpi@lLXI*inxYrWbp0SISR}#!LgID8IZ@jz$0EVtXKQWRLK*&y)2S+W6G0R&pjx2 zSNjCZ{>!l3_nw92ak^ntVX6Klt_!qf+<6y1QohQ5d!5u{HR(UeKE5rF((bi?PQ2GX zmETi=^$Jc9e@FNVZqYAAN*l-2AYLoscqHL5=RnwLsMEB`>M+9(;AgG zIOWzH24qW2qfj0e-@f_rF8}}l|NjF3Nt*TN+YbN$0000Gt5#E^ek8<p_;j?M7Ivh$h5i4ek*Z0ub@ynLpJF3Lr|ui!&;d>$->nP-%p5Kitm9w% zO*bOy3@FYp&2FkgNXlX|X7%uwr{{V#`4Z=D1!pPEb8};;f4c7JdB+1RjoX(i2t-$h z*^ZB?15CI8Wo7UH3m@k}Fkj)QLwX5XHfKzbU0P|Q(A*Q|#=k5>E0cS+Y^88GvfK}5 zg*Vn_gzJV5q5ZCN`#64uL=su@?M-!r1w8MOe6$>cL;#&p-CZi%acH#Vc(?MJ+--(j z{H+L%fqs#e3*GE?hmP; zcyDQS@@v0=3#-Cp(M{CTcfUhit@?Me=WvVH9qPVTt!R>9j=39QZ9pv!!}-0HK1oRt zw^Q!J|w&Nsvi@_&SUOy(zccdL4=eT-jb07TKPWkk}R3; zow4l-YAd}g+&91wQfMTq5KH~m0r+uVV_a@`=zx@p&5wkE;N$@O4VEb?K?aU)4Dwu^ z&ps24VAxzSE=b`HmX~?dLc{>L|8G5EmyVx}cXv*}>H{r$>ouh!lU;?RMn{nS90xit z9()&3q`x3#^4`Hp@mMr<>XKV>6*P7fx)Sjao)LVu)K^tAMXSa=aY&z&#Yfp)K3rix z!A4b|z|9mYt6UHpFIqBdxo~W&814LFOy7pNfOlG!2Zq=cg8H_sCDIRs*N}`X_XIXe zPCX5`YREP@Sy@?-cOE1cr)6+3m=Gn8&JKC4?4E4~FsC*6T(=3mm(P;~$SZue7mioH z^fzEj`Q~Lr9uw4Kwq*6SUW>a-}dL*j&GsN9{s3^rH132oR_o!pqo7!a6I=C zP|dSemz8R7VYlq7aWc%5lQWX4=gFU`m$OL=rHi_B7a5WyA#>o7AF&Gii_eH0W$RmN z@VOvxzOY88-?p!09ysYiQv>XHA9y6cZ`O;#9f3wZ70~}9SQ6d4t!^*>mY(%ndH!Of zJaNN*xsb1QU-b4d+)2&&uv6A=M0W(iFdC};@a;8}vbxdq;b+d89PAFA2RvkA-E0n- z4X9mfF(5fO_!0C;xf@9UK2JR>R|7BvWB`9fmzOz`pT_d6r|c6+ei;2+U2jQzN{{&d zkbf?@I{bji=dCiBI-A5rjc)wAS1dz`*u@sfX=L0r26z`@P@8>|BcWxmqGH+@dGfzK zZ5SoEd%qQAvarH5c>@XXx9-f2Hyk>2k5hL;)H7BW{QCE#fTu?49`0;h2}m|RaN+W> zEct&{3j*y*lkTLMnQ7A18A$5^yhT^ z+yL$+=;T>2*HsK8*{xg-W{jOcs8Yt79u^b@L~PciM!K)J=8Ry`(d2sRn2UpL?t_LR zUyMum8jZa7_AvCM$YB9pP(v#RdGI7<2PF2;rU#{(R)}gpv=e)hB|?ZC|E@T65auy| zC}@J{Ms{RAH(amIUi<5-CLpV}2Js3uKHoOO??XR0EEoCSf~|s0jiz)b@^dWh?c`cu z^_sF|TM_{F-Rwa(7eiqI+XuV^24I0LK%iD<5cuJpH;Mp3aRw}eX#hpQhqz6)@J}gr zKagz>tpS~gQ2KrK^IaoMM%=OE&oYpGIH}b|Q?^@Bn2pYSbpBoDy~z`vySr=2!wl+A zKdtHhUS>6g#WRzg_&8Y?`oqlXFlv+1GJQ?1fNrr_!;zAL^A%`3gW2@XgQ+};+)Hy6 z=xGbI;&}bWu)j&da^$X2=WKiUCz8`S7xSOY|1SZDymKd&cF1wISV$lIu@|1O7X6u3 zLnC@FFt?9TP#=Q*nx-B#)t|kK?KXKJ_%`PucSoKG3ps88b$$;BkWfZHIO?C0W2nNh zelULSUOoVsI<1W22l~10Y(pf))OqaiA9|;WW^jUc!?oikEXo(o zA$G{85gA6k=2-hh9VhBZ*l6o9k$BuBC|=>8{1=)>l5_8O-1xNE2fTV-Ild^_EK_?h z%9O-sb;Lmx=nsy~d#f3_T(#m?%M~vb?4zqIr9=X-r4&`7(fzTJ^Sln8m8-aYBk2<+ z)v$Yxyqa1<^jmYXXdEhZ!?Mx%$=$eDG8*`eRKWA!p8qubBumR$r#8;=hGh$UNaXVv z-f)G96jtS(e$UG|=oS&)l!d3!I$F%yjv{**mrRu`-3hoUKl_B)oa>xPStQkGme1-0V+IIZUPiMGHlNtl#&DLTBJqHaaHGPiZKc}&}PrJH;E z2_+|I>J1h1WypEbxUP#d9IgxPI1?*|GCNg`Ceq69V}G1XOG`4C9x1ZGigEe(1j?qq zJh8yde8vUXc65)Zgyzk z&GaGWJL2NTM>S5kT?@ASO?fB`gM|TY`3)7Huu5VZnq;5OHfZn7@0`_b+(Q`Zg2*KR z5lDBW;dvQza@FJD6sKiRk3xk?;gfL&MZ~eRxG~oNA-qsx!)mcRL3M6-#3K--=Y*}= z?7nDx&tVaf>o3QfIj_k#C_CouAp;MaGZhvkS@`US@gYCXc8OEl5CcN zCf-Qng>H?uBx|t@V*lbMXa0l(HuE9Gg<5}K%c6p+KSfkO;5;U5j3`B5BK<+YlL_fI zeZ7?I2kf9Q@U_wK5!L)Z=oW>atuHDT%=Pd5qOdOY;ANjBdE;e-%ft|1ALsrov3yBL zS`z@3u1c%MCHR2KKR5L%jclRbzq0#s%i#3xk6W3CI2B?3UGoSMs34C1rhD?zXojn! zeqzprC*9QWz#6l}lfKReM0F^ccJU&{m>}0@1##7irm<$%aM`5$*gKME0EQ8diO($P zjy6T@g%G73=FohA3p+{G8{e|6G+i;JEY}gc094xE)Q%<2)%OBLM}@5IIEDWCt+}}5 z=)5xCvZ>1c#YYKEB5EYoY_KS#F z<_Uoz>*?io>g?X!PyKOJP<)>4*9W|sAh9?T?DFf{HH9oZkOX~x`P3lz(NF+$i*onI zw?(ip{u(#ywG+pH zBfyCO(hkmcU+nN)i(QU+2sY}6AgHO^uecZdFAE#x0;~noSLXUMUwDs$!(}hfw|rkh z`D&i|TR&mGt~^DO&C=jP%O~{!L_B8#TYk*~0#|=!E${D`N}2R+iHj{P*F$Y>MU-&W zA86J%fV{03h0T?X8J9%cm2m_yIbz~8-2@gS!88hsyHze*Ko0SjK1;Esfp{oW!p9s( zRSWipQ$=Rs+m{-74ahcdI;tm>i0r57Hv;wSw|TG1gjE)k-6ujT&AmwB{Fgs^I@Vh=vs$^t!kLM19jz6R$vJmtnm}e-g26$ISMSgmv6pQ0`rdiQXg7MF-0*gX4C?LLqVn|Bz8)3W<31}7VzrJ$v=1YC#!6K! z&a?Eu-B4CS+&`9}Ma031m~mv(3g_EF9a%^aPX2})hn?0o17g z$uIo+T5VrWHG`nHVq}uRVMl`G_}PPKonbFc;msTkZQ+!P`Ms}s{-6j_J0x-i2|R^! zR_*zx-e`?lQxd0Mz*Mcl`cnLSEP=6ToOlAt1yuZ%3W`|0FT{UKlM`;5?1pl0>kz#c zIbi@Y^K8dAt#Y)1Zp@^gc2a$=GV+MjEuOAtM*i78WqxE}wA3*QJT<;i{XPEc^0O~_ zVf=xcu+0N_p?9@4GQ($?M4}CNLI%pf3IDHp!+UJoQMyRhi&8FQOCjgTK6F_xxH~Y{ zJn*gnIE4wY=Q$Z70KaQ>oe*y=Tb?5QVsP(A$0XiPdR{5+%0dULyYlb+G$1C#{w8r} zenF!JA(@C>Z|}83h2Qa?a8vP>g&$R7g;DV{%>=r=S!{h=8Wc>lt`c|Rv^A9COEfwm z6RO94F0=TdG1O|1GWLshnRo5QDrU(o&v=9(3Jwx>J11E_W8jBStd=r;GZ5p?In0n; zsJUVerITz#X=5OhiB{Ow>TNVbW1$t?>31_e1}j9{mjr5ENQUK+vLz%-UJPQhy;w&; z3KEgiwb#-f|6Uk=m@8Pyf06N4&=b{iEVaD>b4KdOE2mqNU*b#bqNrkRr008@EdeYf z(A4zP#0LZgK0Vmrc0rPA1km?itdg4!`RG4|08$i->^9q$;VOeb8v8XSRaT-s?z)s>L-b0SIyA7AqpA+GBOVb%yRF!kUp!_j>2L^sDni+sIfqnYFa0{v? zuXPz~VUe&EuyAP?N^(^@>aI#&xLPSg$#zJ~Bj+66Z*#}}so*K^3@W`NfFSG_cF8f{ zMa;bHwWPWM78z{0T1b2B3v&=l()bm4RuXKxFz8bRkq$Y=C+)_L2F5I%1v0#}+J6YM>mv6YgEIWf~2JVRWb=%DrRg z?1AcLh2AmOb$>Ou9JaQhc~NUhb%Mlh*i|ALAENm>_<7uO^G z-vtv}JcHFqO6lqq`taHFwiILGzCc*}alJ1@U&KV1Qm-{h5!4n@W}9{5O~E8}JPi#R z4f%sFT|%_)s7dT(@$jbBGRo$tl@K2WIQ%&##og4|f8BH7N*3hN7Z{~$t8QsR?bpPz z%Fm^%2Zm^qZhjC8Ba2P2%{2Lqq(th{N||)D7_y0k!DRd9)H|D)8^yRlBIRo)P5>Gn z;;QjsM~Gv?yD0%O;s+=*%)ezI=yPvx`GLHi*Aw17K{GAj>5lUU1&q08_#}&dYztUD zhoLDn5(+AzfKwMu7P_i+tp-GBbN^;5%kKtIgh?8oHlHshA_#_Tshs`5(0G3V(l>*H z$&%_;!rXi1+R30A`5a4GcvxGr-aEyBrL%3ox{s_i^ry9J6+0HEG|uJ4}r3Q zGH8P6f0T^a*85&tV4Nf>Z=u8k=2P?<W>pHc>+(0i3N4-p=2XW{trHg_L* z!%KS80u8zME8m&!R@4U@N)_-p);qbDz-t4I6qA|mrEkkN;js=gu}WX;tKf~DEh-`O zj^m^&P!PS|J5(SZG1Qp^RqPNKZWWe##1t->bwUK?bweQrVvJ@t_`~;eYxEfUxF>wl zusxu{I-%fr9PzB7dY|}W8&<4&C8^G!FzBe%ptJ8i&467gOtZ7y*jmufl;j=%k8Bj{ z&hnAm%Zh4o_NF_;%#&_wsjL?MX<6NIprPd+Jkkn31?*@(4^A(2gdjg$0FAtr#7IvQ z?dt@Cwax%yTj1(yoW#UXIAsh5pEK_)tAHCGuUS%S(xYHZvBGG|^y~xc3+iw%>4Cqk zTS{I^;NR#Xr!M1gU0IqsE8iakCS6SEGErHd7cHbz#bzV$W;(m&&SVh;7!l`8php-T zdW&iHp=t^qrF&iZ14VZReI;R+(su~?hAhJkOHfkQyuJGdyw?Hax1?r3%yY7UpHXu3 znkYSLRQ9bI>202_21J=|Y(L)5g^;dgrcLz#8RegOa$Pi`NW*>lu1tV3-c}aiHDy}t z!FiQ>wLQb*B}>inFocU5vc2W~5*{VN8aE>wY=gCDi>Sv+PS9OgBPfwwLlu#AyFB4> zJZGzTy>`dS^t;Dfyc*@kj|U5Xj&-C}o~O>R z>_E%v{%r=?;&)nN5gvfwU?Mbti538KY=4>@I@1hb@{T=-4TDE;-!DRDFD5hLb^+I< z9wZ)U)W{k#kQ))PzgrYRy1&qW72?G`LomH*iNuUW6|;m*9l3JnuxMQXkMSyM+u4lc zbgv|-H0{)(sy74IGaF*29f7#=XR8`qAx#6W%r)IA$*&jitKK^#HpHo`O$QyMY%i5> zTpxB#PB$yO2J_gGguI|!MJR+~L~LP9DfpYK|H6Q+Nvj$<7;Tx>bOHMPUih3*MT2SD z|2raiXar7%_!@ZzstB4oW{s|lp>{tR3d^sPoc+O^5;t%*_>pifvI z?RWhRKOCV~U4;>zo*9Tc_?)1y*xE0}C)&Q2iXxm_efjaViQ&xyD8%fW>$Cp$oj6a( z$HazuNsyxlJ5C5IHvc$hFWnN)6b8&!Uk7?2BhH9Z3XzQ*4GZ}Np;IHl`tVVzjDu7{ z{lYy|ZH^wKh+-X@{f(>#o=w?!V#6D|7;{-qkYPRCZ&=sz^b1A!WJg?ioo(YgSdGp@ zIAIx=0fsTgH?+pcR#xligz2AFyMQnR(hG7pb%V}FNqb*4ML6r1nkB~4OWvITfqEZf z3`NaC!O2clPu0xZP8sT`8e_n2YdNW?(eG2<9rwdf6GymHOT2<9O#nuO?mB-HmcYUF zwPPe65YtVa3fo>kT#_lF!O&rxbYd~HLE;c)dkEQ#q1vS=2mR6k1&sv`z%oxOWIWN? z95))>EM|Q^m9T~h)PkI@{Mc0JDK@&*t?o((01IFWhWYx`izQ|;Wq3`Rku}4Ki>US! z{ifcY7{v9iYU+^DHCxG(0$s8zkJ%D6&y!yk#PJ@lWc~1ic=6ppBcT*w_b6C!O@XlT zFiT~wN+hGE7n7YiECd2EAlCa-dRPH^+x _strategies = new List(); + private static readonly HttpClient _httpClient = new HttpClient(); + + protected override void OnStart() + { + try + { + if (string.IsNullOrWhiteSpace(SymbolsCsv)) + { + Print("CSV is empty. Running in Single-Symbol Mode on Chart Symbol."); + + var config = new StrategyConfig + { + SymbolName = SymbolName, + EntrySigThreshold = EntrySigThreshold, + SlSigThreshold = SlSigThreshold, + SmaBiasPeriod = SmaBiasPeriod, + HmaBiasPeriod = HmaBiasPeriod, + HmaClusterPeriod = HmaClusterPeriod, + UseBiasDeviationFilter = UseBiasDeviationFilter, + BiasDeviationAvgPeriod = BiasDeviationAvgPeriod, + UseDynamicPositionManagement = UseDynamicPositionManagement, + CloseProfitOnBiasFlip = CloseProfitOnBiasFlip, + SendTelegramOnly = SendTelegramOnly, + RiskPercent = RiskPercent, + MaxPoints = MaxPoints, + DecayPeriod = DecayPeriod + }; + + var strategy = new ClusterStrategy(this, Symbol, Bars, config, _httpClient, TelegramBotToken, TelegramChatId, BroadcastError); + _strategies.Add(strategy); + strategy.Start(); + } + else + { + Print("CSV detected. Running in Multi-Symbol Mode."); + ParseCsvAndCreateStrategies(); + } + } + catch (Exception ex) + { + BroadcastError($"CRITICAL STARTUP ERROR: {ex.Message}"); + Stop(); + } + } + + protected override void OnStop() + { + foreach (var strategy in _strategies) + { + strategy.Stop(); + } + } + + protected override void OnError(Error error) + { + BroadcastError($"TRADING ERROR [{error.Code}]: {error.ToString}"); + } + + public void BroadcastError(string message) + { + Print(message); + + if (!string.IsNullOrWhiteSpace(TelegramBotToken) && !string.IsNullOrWhiteSpace(TelegramChatId)) + { + string formattedMsg = $"⚠️ ERROR @ {DateTime.UtcNow:HH:mm:ss} UTC\n\n{message}"; + _ = SendTelegramRawAsync(TelegramBotToken, TelegramChatId, formattedMsg); + } + } + + private async Task SendTelegramRawAsync(string token, string chatId, string message) + { + try + { + string url = $"https://api.telegram.org/bot{token}/sendMessage?chat_id={chatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + await _httpClient.GetAsync(url); + } + catch (Exception ex) + { + Print("FAILED TO SEND TELEGRAM ERROR: " + ex.Message); + } + } + + private void ParseCsvAndCreateStrategies() + { + var normalizedCsv = SymbolsCsv.Replace("\n", ",").Replace("\r", ","); + + var tokens = normalizedCsv.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(t => t.Trim()) + .Where(t => !string.IsNullOrEmpty(t)) + .ToArray(); + + int paramsPerSymbol = 10; + + if (tokens.Length % paramsPerSymbol != 0) + { + string err = $"CSV Token count ({tokens.Length}) is not a multiple of {paramsPerSymbol}. Check format."; + BroadcastError(err); + } + + for (int i = 0; i < tokens.Length; i += paramsPerSymbol) + { + if (i + paramsPerSymbol > tokens.Length) break; + + string symName = tokens[i]; + + try + { + Symbol symbol = Symbols.GetSymbol(symName); + if (symbol == null) + { + BroadcastError($"Symbol '{symName}' not found in cTrader."); + continue; + } + + Bars bars = MarketData.GetBars(TimeFrame, symName); + + var config = new StrategyConfig + { + SymbolName = symName, + EntrySigThreshold = double.Parse(tokens[i + 1], CultureInfo.InvariantCulture), + SlSigThreshold = double.Parse(tokens[i + 2], CultureInfo.InvariantCulture), + SmaBiasPeriod = int.Parse(tokens[i + 3], CultureInfo.InvariantCulture), + HmaBiasPeriod = int.Parse(tokens[i + 4], CultureInfo.InvariantCulture), + HmaClusterPeriod = int.Parse(tokens[i + 5], CultureInfo.InvariantCulture), + UseBiasDeviationFilter = bool.Parse(tokens[i + 6]), + BiasDeviationAvgPeriod = int.Parse(tokens[i + 7], CultureInfo.InvariantCulture), + UseDynamicPositionManagement = bool.Parse(tokens[i + 8]), + SendTelegramOnly = bool.Parse(tokens[i + 9]), + + // Default values for parameters not in CSV yet + CloseProfitOnBiasFlip = CloseProfitOnBiasFlip, + RiskPercent = RiskPercent, + MaxPoints = MaxPoints, + DecayPeriod = DecayPeriod + }; + + var strategy = new ClusterStrategy(this, symbol, bars, config, _httpClient, TelegramBotToken, TelegramChatId, BroadcastError); + _strategies.Add(strategy); + strategy.Start(); + + Print("Initialized Strategy for {0}", symName); + } + catch (Exception ex) + { + BroadcastError($"Config Error for '{symName}': {ex.Message}"); + } + } + } + } + + public class StrategyConfig + { + public string SymbolName { get; set; } + public double EntrySigThreshold { get; set; } + public double SlSigThreshold { get; set; } + public int SmaBiasPeriod { get; set; } + public int HmaBiasPeriod { get; set; } + public int HmaClusterPeriod { get; set; } + public bool UseBiasDeviationFilter { get; set; } + public int BiasDeviationAvgPeriod { get; set; } + public bool UseDynamicPositionManagement { get; set; } + public bool CloseProfitOnBiasFlip { get; set; } + public bool SendTelegramOnly { get; set; } + public double RiskPercent { get; set; } + public int MaxPoints { get; set; } + public int DecayPeriod { get; set; } + } + + public class ClusterStrategy + { + #region Types & Fields + + private enum PointType { Peak, Trough } + private enum Bias { Long, Short, Neutral } + + private struct ExtremumPoint + { + public double Price; + public int Index; + public PointType Type; + } + + public struct ClusterLevel + { + public double Price; + public double Significance; + } + + private readonly Robot _robot; + private readonly Symbol _symbol; + private readonly Bars _bars; + private readonly StrategyConfig _config; + private readonly HttpClient _httpClient; + private readonly string _botToken; + private readonly string _chatId; + private readonly Action _errorCallback; + + private SimpleMovingAverage _smaBias; + private HullMovingAverage _hmaBias; + private HullMovingAverage _hmaCluster; + + private readonly Queue _deviationQueue = new Queue(); + private double _runningDeviationSum; + + private bool _deviationConditionMetInCurrentCycle; + private bool _isTradingAllowedBasedOnPrevCycle; + + private readonly List _extremaPoints = new(); + private readonly List _amplitudes = new(); + + private double _trendExtremum; + private int _trendExtremumIndex; + private double _lastExtremumPrice; + private bool? _isUpTrend; + private double _currentDynamicRange; + + private const string Label = "HmaClusterBot"; + + #endregion + + public ClusterStrategy( + Robot robot, + Symbol symbol, + Bars bars, + StrategyConfig config, + HttpClient httpClient, + string token, + string chatId, + Action errorCallback) + { + _robot = robot; + _symbol = symbol; + _bars = bars; + _config = config; + _httpClient = httpClient; + _botToken = token; + _chatId = chatId; + _errorCallback = errorCallback; + } + + public void Start() + { + int requiredBars = Math.Max(_config.SmaBiasPeriod, _config.HmaBiasPeriod); + requiredBars = Math.Max(requiredBars, _config.BiasDeviationAvgPeriod) + 10; + + while (_bars.Count < requiredBars) + { + int loaded = _bars.LoadMoreHistory(); + if (loaded == 0) + { + _errorCallback?.Invoke($"Not enough history for {_config.SymbolName}. Loaded: {_bars.Count}, Req: {requiredBars}"); + return; + } + } + + _smaBias = _robot.Indicators.SimpleMovingAverage(_bars.ClosePrices, _config.SmaBiasPeriod); + _hmaBias = _robot.Indicators.HullMovingAverage(_bars.ClosePrices, _config.HmaBiasPeriod); + _hmaCluster = _robot.Indicators.HullMovingAverage(_bars.ClosePrices, _config.HmaClusterPeriod); + + _currentDynamicRange = 5.0 * _symbol.PipSize; + _deviationConditionMetInCurrentCycle = false; + _isTradingAllowedBasedOnPrevCycle = false; + + int startIndex = Math.Max(_config.SmaBiasPeriod, _config.HmaBiasPeriod); + startIndex = Math.Max(startIndex, _config.BiasDeviationAvgPeriod); + + for (int i = startIndex; i < _bars.Count; i++) + { + UpdateFilterState(i); + UpdateClusterData(i); + } + + _bars.BarOpened += OnBarOpened; + } + + public void Stop() + { + _bars.BarOpened -= OnBarOpened; + } + + private void OnBarOpened(BarOpenedEventArgs obj) + { + try + { + int index = _bars.Count - 2; + if (index < _config.BiasDeviationAvgPeriod) return; + + UpdateFilterState(index); + UpdateClusterData(index); + + var clusters = CalculateClusters(index); + + // 1. Dynamic SL/TP Management + if (!_config.SendTelegramOnly && _config.UseDynamicPositionManagement && clusters.Count >= 2) + { + ManagePositions(clusters); + } + + var currentBias = GetCurrentBias(index); + + // 2. Check for Profit Close on Bias Flip + if (!_config.SendTelegramOnly && _config.CloseProfitOnBiasFlip) + { + CloseReversedPositions(currentBias); + } + + // 3. New Entry Logic + ManageOrders(currentBias, index, clusters); + } + catch (Exception ex) + { + _errorCallback?.Invoke($"Runtime Error ({_config.SymbolName}): {ex.Message}\n{ex.StackTrace}"); + } + } + + private void CloseReversedPositions(Bias currentBias) + { + if (currentBias == Bias.Neutral) return; + + foreach (var pos in _robot.Positions) + { + if (pos.SymbolName != _config.SymbolName || pos.Label != Label) continue; + if (pos.NetProfit <= 0) continue; + + bool close = false; + + if (currentBias == Bias.Short && pos.TradeType == TradeType.Buy) + close = true; + else if (currentBias == Bias.Long && pos.TradeType == TradeType.Sell) + close = true; + + if (close) + { + var result = _robot.ClosePosition(pos); + if (result.IsSuccessful) + { + string msg = $"🔒 CLOSE PROFIT (Bias Flip) @ {_config.SymbolName}\n" + + $"Profit: {pos.NetProfit:F2}"; + _ = SendTelegramMessageAsync(msg); + } + } + } + } + + private void UpdateFilterState(int index) + { + double currHma = _hmaBias.Result[index]; + double currSma = _smaBias.Result[index]; + double prevHma = _hmaBias.Result[index - 1]; + double prevSma = _smaBias.Result[index - 1]; + + double currentBiasDeviation = Math.Abs(currHma - currSma); + + _deviationQueue.Enqueue(currentBiasDeviation); + _runningDeviationSum += currentBiasDeviation; + + if (_deviationQueue.Count > _config.BiasDeviationAvgPeriod) + { + double removed = _deviationQueue.Dequeue(); + _runningDeviationSum -= removed; + } + + double averageDeviation = (_deviationQueue.Count > 0) + ? _runningDeviationSum / _deviationQueue.Count + : 0.0; + + bool currHmaAbove = currHma > currSma; + bool prevHmaAbove = prevHma > prevSma; + + if (currHmaAbove != prevHmaAbove) + { + _isTradingAllowedBasedOnPrevCycle = _deviationConditionMetInCurrentCycle; + _deviationConditionMetInCurrentCycle = false; + } + + if (currentBiasDeviation > averageDeviation) + { + _deviationConditionMetInCurrentCycle = true; + } + } + + private Bias GetCurrentBias(int index) + { + double hma = _hmaBias.Result[index]; + double sma = _smaBias.Result[index]; + double prevSma = _smaBias.Result[index - 1]; + + if ((hma > sma) && (sma > prevSma)) return Bias.Long; + if ((hma < sma) && (sma < prevSma)) return Bias.Short; + + return Bias.Neutral; + } + + private void ManagePositions(List clusters) + { + double pNow = _symbol.Bid; + + foreach (var pos in _robot.Positions) + { + if (pos.Label != Label || pos.SymbolName != _config.SymbolName) continue; + + ClusterLevel? newSl = null; + ClusterLevel? newTp = null; + + 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) + { + 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 // Sell + { + 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) + { + newTp = c; + lowestTpPrice = 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.Ask && (finalTp == 0 || finalTp < _symbol.Ask)) + { + _robot.ModifyPosition(pos, finalSl, finalTp, ProtectionType.Absolute); + } + } + } + } + } + + private void ManageOrders(Bias bias, int index, List clusters) + { + CleanupOrders(bias); + + if (_config.UseBiasDeviationFilter && !_isTradingAllowedBasedOnPrevCycle) + return; + + if (bias == Bias.Neutral) return; + + if (!_config.SendTelegramOnly) + { + bool hasLong = _robot.Positions.Any(p => p.SymbolName == _config.SymbolName && p.Label == Label && p.TradeType == TradeType.Buy); + bool hasShort = _robot.Positions.Any(p => p.SymbolName == _config.SymbolName && p.Label == Label && p.TradeType == TradeType.Sell); + + if ((bias == Bias.Long && hasLong) || (bias == Bias.Short && hasShort)) + return; + } + + if (clusters.Count < 2) return; + + double pNow = _bars.ClosePrices[index]; + + if (bias == Bias.Short) + ProcessShortSetup(clusters, pNow); + else if (bias == Bias.Long) + ProcessLongSetup(clusters, pNow); + } + + private void CleanupOrders(Bias currentBias) + { + if (_config.SendTelegramOnly) return; + + foreach (var order in _robot.PendingOrders) + { + if (order.Label != Label || order.SymbolName != _config.SymbolName) continue; + + if (currentBias == Bias.Long && order.TradeType == TradeType.Sell) + _robot.CancelPendingOrder(order); + else if (currentBias == Bias.Short && order.TradeType == TradeType.Buy) + _robot.CancelPendingOrder(order); + else if (currentBias == Bias.Neutral) + _robot.CancelPendingOrder(order); + } + } + + private void ProcessShortSetup(List clusters, double pNow) + { + ClusterLevel? entry = null; + ClusterLevel? sl = null; + ClusterLevel? tp = null; + + double highestEntryPrice = double.MinValue; + double lowestSlPrice = double.MaxValue; + double lowestTpPrice = double.MaxValue; + + foreach (var c in clusters) + { + if (c.Price > pNow) + { + if ((c.Significance >= _config.EntrySigThreshold) && (c.Price > highestEntryPrice)) + { + entry = c; + highestEntryPrice = c.Price; + } + if ((c.Significance < _config.SlSigThreshold) && (c.Price < lowestSlPrice)) + { + sl = c; + lowestSlPrice = c.Price; + } + } + } + + if (entry == null || sl == null) return; + + foreach (var c in clusters) + { + if ((c.Price < entry.Value.Price) && (c.Significance >= _config.EntrySigThreshold)) + { + if (c.Price < lowestTpPrice) + { + tp = c; + lowestTpPrice = c.Price; + } + } + } + + if (tp != null && (sl.Value.Price > entry.Value.Price)) + { + double risk = sl.Value.Price - entry.Value.Price; + double reward = entry.Value.Price - tp.Value.Price; + + if (risk <= reward) + UpdateOrPlaceLimitOrder(TradeType.Sell, entry.Value.Price, sl.Value.Price, tp.Value.Price); + } + } + + private void ProcessLongSetup(List clusters, double pNow) + { + ClusterLevel? entry = null; + ClusterLevel? sl = null; + ClusterLevel? tp = null; + + double lowestEntryPrice = double.MaxValue; + double highestSlPrice = double.MinValue; + double highestTpPrice = double.MinValue; + + foreach (var c in clusters) + { + if (c.Price < pNow) + { + if ((c.Significance >= _config.EntrySigThreshold) && (c.Price < lowestEntryPrice)) + { + entry = c; + lowestEntryPrice = c.Price; + } + if ((c.Significance < _config.SlSigThreshold) && (c.Price > highestSlPrice)) + { + sl = c; + highestSlPrice = c.Price; + } + } + } + + if (entry == null || sl == null) return; + + foreach (var c in clusters) + { + if ((c.Price > entry.Value.Price) && (c.Significance >= _config.EntrySigThreshold)) + { + if (c.Price > highestTpPrice) + { + tp = c; + highestTpPrice = c.Price; + } + } + } + + if (tp != null && (sl.Value.Price < entry.Value.Price)) + { + double risk = entry.Value.Price - sl.Value.Price; + double reward = tp.Value.Price - entry.Value.Price; + + if (risk <= reward) + UpdateOrPlaceLimitOrder(TradeType.Buy, entry.Value.Price, sl.Value.Price, tp.Value.Price); + } + } + + private void UpdateOrPlaceLimitOrder(TradeType type, double entry, double sl, double tp) + { + double slDistPips = Math.Abs(entry - sl) / _symbol.PipSize; + if (slDistPips <= 0) return; + + double riskAmount = _robot.Account.Balance * (_config.RiskPercent / 100.0); + double volume = _symbol.VolumeForFixedRisk(riskAmount, slDistPips); + + volume = _symbol.NormalizeVolumeInUnits(volume, RoundingMode.Down); + if (volume < _symbol.VolumeInUnitsMin) return; + + double lots = _symbol.VolumeInUnitsToQuantity(volume); + + if (_config.SendTelegramOnly) + { + string directionStr = type == TradeType.Buy ? "BUY" : "SELL"; + string directionIcon = type == TradeType.Buy ? "📈" : "📉"; + string msg = $"{directionIcon} {directionStr} Signal @ {_config.SymbolName}\n\n" + + $"Entry: {entry}\n" + + $"SL: {sl}\n" + + $"TP: {tp}\n" + + $"Vol: {lots:F2} Lots"; + + _ = SendTelegramMessageAsync(msg); + return; + } + + var existingOrder = _robot.PendingOrders.FirstOrDefault(o => o.SymbolName == _config.SymbolName && o.Label == Label && o.TradeType == type); + + if (existingOrder != null) + { + bool volumeChanged = Math.Abs(existingOrder.VolumeInUnits - volume) > _symbol.VolumeInUnitsStep; + bool entryChanged = Math.Abs(existingOrder.TargetPrice - entry) > _symbol.TickSize; + bool slChanged = Math.Abs((existingOrder.StopLoss ?? 0) - sl) > _symbol.TickSize; + bool tpChanged = Math.Abs((existingOrder.TakeProfit ?? 0) - tp) > _symbol.TickSize; + + if (volumeChanged || entryChanged || slChanged || tpChanged) + { + _robot.ModifyPendingOrder(existingOrder, entry, sl, tp, ProtectionType.Absolute, null, volume); + } + } + else + { + _robot.Print("[SIGNAL] {0} {1} | Entry: {2} | SL: {3} | TP: {4} | Vol: {5:F2} Lots", + (type == TradeType.Buy ? "BUY" : "SELL"), _config.SymbolName, entry, sl, tp, lots); + + _robot.PlaceLimitOrder(type, _config.SymbolName, volume, entry, Label, sl, tp, ProtectionType.Absolute); + } + } + + private async Task SendTelegramMessageAsync(string message) + { + if (_robot.IsBacktesting) return; + if (string.IsNullOrWhiteSpace(_botToken) || string.IsNullOrWhiteSpace(_chatId)) return; + + try + { + string url = $"https://api.telegram.org/bot{_botToken}/sendMessage?chat_id={_chatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + HttpResponseMessage response = await _httpClient.GetAsync(url); + + if (!response.IsSuccessStatusCode) + { + _errorCallback?.Invoke($"Telegram Error: {response.StatusCode}"); + } + } + catch (Exception ex) + { + _errorCallback?.Invoke($"Telegram Exception: {ex.Message}"); + } + } + + private void UpdateClusterData(int index) + { + double currentHma = _hmaCluster.Result[index]; + double prevHma = _hmaCluster.Result[index - 1]; + bool currentDirectionUp = (currentHma > prevHma); + + if (_isUpTrend == null) + { + _isUpTrend = currentDirectionUp; + SetExtremum(index); + _lastExtremumPrice = _trendExtremum; + return; + } + + if (currentDirectionUp != _isUpTrend) + { + double amp = Math.Abs(_trendExtremum - _lastExtremumPrice); + if (amp > 0) + { + _amplitudes.Add(amp); + if (_amplitudes.Count > 50) _amplitudes.RemoveAt(0); + + double sum = 0; + for (int i = 0; i < _amplitudes.Count; i++) sum += _amplitudes[i]; + _currentDynamicRange = (sum / _amplitudes.Count) * 0.5; + } + _extremaPoints.Add(new ExtremumPoint { Price = _trendExtremum, Index = _trendExtremumIndex, Type = _isUpTrend.Value ? PointType.Peak : PointType.Trough }); + if (_extremaPoints.Count > _config.MaxPoints) _extremaPoints.RemoveAt(0); + + _lastExtremumPrice = _trendExtremum; + _isUpTrend = currentDirectionUp; + SetExtremum(index); + } + else + { + UpdateExtremum(index); + } + } + + private void SetExtremum(int index) + { + _trendExtremum = _isUpTrend.Value ? _bars.HighPrices[index] : _bars.LowPrices[index]; + _trendExtremumIndex = index; + } + + private void UpdateExtremum(int index) + { + if (_isUpTrend.Value && (_bars.HighPrices[index] > _trendExtremum)) + { + _trendExtremum = _bars.HighPrices[index]; + _trendExtremumIndex = index; + } + else if (!_isUpTrend.Value && (_bars.LowPrices[index] < _trendExtremum)) + { + _trendExtremum = _bars.LowPrices[index]; + _trendExtremumIndex = index; + } + } + + private List CalculateClusters(int currentIndex) + { + int count = _extremaPoints.Count; + if (count < 2) return new List(); + + double currentPrice = _bars.ClosePrices[currentIndex]; + double range = _currentDynamicRange; + + // Score-First / Global Density Approach (Matches Indicator) + var candidates = _extremaPoints + .Select(p => { + double weightedScore = _extremaPoints + .Where(other => Math.Abs(other.Price - p.Price) <= range) + .Sum(other => GetWeight(other, currentIndex, currentPrice)); + + return new { Price = p.Price, Score = weightedScore }; + }) + .OrderByDescending(z => z.Score) + .ToList(); + + var topZones = new List(); + foreach (var zone in candidates) + { + // Filter Overlap + if (!topZones.Any(z => Math.Abs(z.Price - zone.Price) < range)) + { + // Normalize Score relative to total Weight of all points (Matches Indicator Normalization) + double totalWeightSum = _extremaPoints.Sum(p => GetWeight(p, currentIndex, currentPrice)); + double sigPercent = (totalWeightSum > 0) ? (zone.Score / totalWeightSum) * 100.0 : 0; + + topZones.Add(new ClusterLevel { Price = zone.Price, Significance = sigPercent }); + } + } + + return topZones; + } + + private double GetWeight(ExtremumPoint point, int currentIndex, double currentPrice) + { + double weight = Math.Max(0.0, 1.0 - ((double)(currentIndex - point.Index) / _config.DecayPeriod)); + if ((point.Type == PointType.Peak) && (point.Price < currentPrice)) weight *= 2.0; + else if ((point.Type == PointType.Trough) && (point.Price > currentPrice)) weight *= 2.0; + return weight; + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaClusterSR/HmaClusterSR/HmaClusterSR.csproj b/Sources/Indicators/HmaClusterSR/HmaClusterSR/HmaClusterSR.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/HmaClusterSR/HmaClusterSR/HmaClusterSR.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/HmaMitigationCount/HmaMitigationCount.sln b/Sources/Indicators/HmaMitigationCount/HmaMitigationCount.sln new file mode 100644 index 0000000..15e2f62 --- /dev/null +++ b/Sources/Indicators/HmaMitigationCount/HmaMitigationCount.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HmaMitigationCount", "HmaMitigationCount\HmaMitigationCount.csproj", "{a7f42ba9-479c-418c-83b4-228416c67510}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {a7f42ba9-479c-418c-83b4-228416c67510}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {a7f42ba9-479c-418c-83b4-228416c67510}.Debug|Any CPU.Build.0 = Debug|Any CPU + {a7f42ba9-479c-418c-83b4-228416c67510}.Release|Any CPU.ActiveCfg = Release|Any CPU + {a7f42ba9-479c-418c-83b4-228416c67510}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.cs b/Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.cs new file mode 100644 index 0000000..1ee97f0 --- /dev/null +++ b/Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.cs @@ -0,0 +1,162 @@ +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; +using System.Collections.Generic; +using System.Linq; +using System; + +namespace cAlgo.Indicators +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class HmaMitigationCount : Indicator + { + [Parameter("HMA Period", DefaultValue = 20, MinValue = 2)] + public int HmaPeriod { get; set; } + + [Parameter("Session Close Time (UTC)", DefaultValue = "17:30")] + public TimeSpan SessionCloseTimeUtc { get; set; } + + [Output("HMA", LineColor = "Orange")] + public IndicatorDataSeries HmaOutput { get; set; } + + private HullMovingAverage _hma; + private Stack _peakStack; + private Stack _troughStack; + private int lblCnt = 0; + private int mitigatedPeaks = 0; + private int mitigatedTroughs = 0; + private int dir = 0; + + private DateTime _currentSessionEndTimeUtc = DateTime.MinValue; + + protected override void Initialize() + { + _hma = Indicators.HullMovingAverage(Bars.ClosePrices, HmaPeriod); + _peakStack = new Stack(); + _troughStack = new Stack(); + } + + public override void Calculate(int index) + { + HmaOutput[index] = _hma.Result[index]; + DateTime barOpenTime = Bars.OpenTimes[index]; // This is UTC + + // --- Session Initialization (run once) --- + if (_currentSessionEndTimeUtc == DateTime.MinValue) + { + // Find the session close time for the *current* bar's day + DateTime sessionCloseToday = barOpenTime.Date.Add(SessionCloseTimeUtc); + + // If the bar is already *after* today's close, the session ends *tomorrow* + if (barOpenTime >= sessionCloseToday) + { + _currentSessionEndTimeUtc = sessionCloseToday.AddDays(1); + } + // If the bar is *before* today's close, the session ends *today* + else + { + _currentSessionEndTimeUtc = sessionCloseToday; + } + } + + // --- Session Check --- + // Check if the current bar has crossed the session boundary + if (barOpenTime >= _currentSessionEndTimeUtc) + { + // New session starts, clear stacks + _peakStack.Clear(); + _troughStack.Clear(); + //Chart.RemoveAllObjects(); // Optional: Clear old session text + + // Set the *next* session end time, looping in case of market gaps (weekends) + while (barOpenTime >= _currentSessionEndTimeUtc) + { + _currentSessionEndTimeUtc = _currentSessionEndTimeUtc.AddDays(1); + } + } + + // Stop logic from running on the forming bar + if (IsLastBar) + { + return; + } + + // We need at least 3 bars to identify a peak/trough at index - 1 + if (index < 2) + { + return; + } + + // --- 1. Identify new peaks/troughs at index - 1 AND check mitigation --- + // All HMA values are now based on closed bars (index, index-1, index-2). + double prevHma = _hma.Result[index - 1]; + double prevHma2 = _hma.Result[index - 2]; + double currentHma = _hma.Result[index]; + + // A peak at index-1 + bool isPeak = (prevHma > prevHma2) && (prevHma > currentHma); + // A trough at index-1 + bool isTrough = (prevHma < prevHma2) && (prevHma < currentHma); + + if (isPeak) + { + // New Peak: Check if it mitigates any *previous Peaks* + if( dir < 0 ) + { + mitigatedPeaks = 0; + lblCnt++; + } + + // A new peak (prevHma) mitigates old peaks that are *lower* + while (_peakStack.Count > 0 && prevHma >= _peakStack.Peek()) + { + _peakStack.Pop(); // Pop the mitigated (lower) peak + mitigatedPeaks++; + } + + if (mitigatedPeaks > 0) + { + // Draw mitigation count above the peak bar + // The remaining count is the peaks *higher* than the new one + string label = $"Mit: {mitigatedPeaks} / Rem: {_peakStack.Count}"; + double yPos = Bars.HighPrices[index - 1] + Symbol.PipSize * 5; + Chart.DrawText($"peak_mit_{lblCnt}", label, index - 1, yPos, Color.Red); + dir = 1; + } + + // Add the new peak to its own stack + _peakStack.Push(prevHma); + } + + if (isTrough) + { + // New Trough: Check if it mitigates any *previous Troughs* + if( dir > 0 ) + { + mitigatedTroughs = 0; + lblCnt++; + } + + // A new trough (prevHma) mitigates old troughs that are *higher* + while (_troughStack.Count > 0 && prevHma <= _troughStack.Peek()) + { + _troughStack.Pop(); // Pop the mitigated (higher) trough + mitigatedTroughs++; + } + + if (mitigatedTroughs > 0) + { + // Draw mitigation count below the trough bar + // The remaining count is the troughs *lower* than the new one + string label = $"Mit: {mitigatedTroughs} / Rem: {_troughStack.Count}"; + double yPos = Bars.LowPrices[index - 1] - Symbol.PipSize * 5; + Chart.DrawText($"trough_mit_{lblCnt}", label, index - 1, yPos, Color.Lime); + dir = -1; + } + + // Add the new trough to its own stack + _troughStack.Push(prevHma); + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.csproj b/Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/HmaMitigationCount/HmaMitigationCount/HmaMitigationCount.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/HmaMitigationSignals.algo b/Sources/Indicators/HmaMitigationSignals.algo new file mode 100644 index 0000000000000000000000000000000000000000..5286de21520fd103e36564a7c1cdddab92cd8da6 GIT binary patch literal 4144 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 _peakStack; + private Stack _troughStack; + + private DateTime _currentSessionEndTimeUtc = DateTime.MinValue; + + // State flags for entry setup + private bool _buySetupActive = false; + private bool _sellSetupActive = false; + + protected override void Initialize() + { + _hma = Indicators.HullMovingAverage(Bars.ClosePrices, HmaPeriod); + _peakStack = new Stack(); + _troughStack = new Stack(); + } + + public override void Calculate(int index) + { + HmaOutput[index] = _hma.Result[index]; + DateTime barOpenTime = Bars.OpenTimes[index]; // This is UTC + + // --- Session Initialization (run once) --- + if (_currentSessionEndTimeUtc == DateTime.MinValue) + { + // Convert the current UTC bar time to the chart's local time zone + DateTime barOpenTimeChartTz = TimeZoneInfo.ConvertTimeFromUtc(barOpenTime, this.TimeZone); + + // Create the session close time for "today" *in the chart's timezone* + DateTime sessionCloseChartTz = barOpenTimeChartTz.Date.Add(SessionCloseTime); + + // Convert this chart-timezone-based closing time back to UTC + DateTime sessionCloseTodayUtc = TimeZoneInfo.ConvertTimeToUtc( sessionCloseChartTz, this.TimeZone); + + if (barOpenTime >= sessionCloseTodayUtc) + { + // Bar is after today's close. Session end is tomorrow (chart time). + // Add 1 day *in chart time* (handles DST) + DateTime nextSessionEndChartTz = sessionCloseChartTz.AddDays(1); + // Convert back to UTC + _currentSessionEndTimeUtc = TimeZoneInfo.ConvertTime(nextSessionEndChartTz, this.TimeZone, TimeZoneInfo.Utc); + } + else + { + // Bar is before today's close. Session end is today (chart time). + _currentSessionEndTimeUtc = sessionCloseTodayUtc; + } + } + + // --- Session Check --- + // Check if the current bar has crossed the session boundary + if (barOpenTime >= _currentSessionEndTimeUtc) + { + // New session starts, clear stacks and drawings + _peakStack.Clear(); + _troughStack.Clear(); + //Chart.RemoveAllObjects(); // Clear old session text and icons + + // Reset setup flags + _buySetupActive = false; + _sellSetupActive = false; + + // Set the *next* session end time, looping in case of market gaps (weekends) + while (barOpenTime >= _currentSessionEndTimeUtc) + { + // Convert current UTC end time to chart time + DateTime currentSessionEndChartTz = TimeZoneInfo.ConvertTimeFromUtc(_currentSessionEndTimeUtc, this.TimeZone); + // Add 1 day *in chart time* (handles DST) + DateTime nextSessionEndChartTz = currentSessionEndChartTz.AddDays(1); + // Convert back to UTC for the next comparison + _currentSessionEndTimeUtc = TimeZoneInfo.ConvertTime(nextSessionEndChartTz, this.TimeZone, TimeZoneInfo.Utc); + } + } + + // Stop signal logic from running on the forming bar (which causes repainting) + if (IsLastBar) + { + return; + } + + // We need at least 3 bars to identify a peak/trough at index - 1 + if (index < 2) + { + return; + } + + // --- 1. Identify new peaks/troughs at index - 1 AND check for entry --- + // All HMA values are now based on closed bars (index, index-1, index-2). + double prevHma = _hma.Result[index - 1]; + double prevHma2 = _hma.Result[index - 2]; + double currentHma = _hma.Result[index]; + + // A peak at index-1 + bool isPeak = (prevHma > prevHma2) && (prevHma > currentHma); + // A trough at index-1 + bool isTrough = (prevHma < prevHma2) && (prevHma < currentHma); + + if (isPeak) + { + // Check if a sell setup was active *before* pushing the new peak + if (_sellSetupActive) + { + // Draw sell icon at the peak (index - 1) + Chart.DrawIcon($"sell_{index - 1}", ChartIconType.DownArrow, index - 1, Bars.HighPrices[index - 1] + Symbol.PipSize * 10, Color.Red); + _sellSetupActive = false; // Reset setup + } + + _peakStack.Push(prevHma); + // Draw count above the peak bar + string peakLabel = $"{_peakStack.Count}"; + double yPos = Bars.HighPrices[index - 1] + Symbol.PipSize * 5; + Chart.DrawText($"peak_{index - 1}", peakLabel, index - 1, yPos, Color.Red); + } + + if (isTrough) + { + // Check if a buy setup was active *before* pushing the new trough + if (_buySetupActive) + { + // Draw buy icon at the trough (index - 1) + Chart.DrawIcon($"buy_{index - 1}", ChartIconType.UpArrow, index - 1, Bars.LowPrices[index - 1] - Symbol.PipSize * 10, Color.Lime); + _buySetupActive = false; // Reset setup + } + + _troughStack.Push(prevHma); + // Draw count below the trough bar + string troughLabel = $"{_troughStack.Count}"; + double yPos = Bars.LowPrices[index - 1] - Symbol.PipSize * 5; + Chart.DrawText($"trough_{index - 1}", troughLabel, index - 1, yPos, Color.Lime); + } + + // --- 2. Check for mitigation (Setup) based on the hma value --- + // Mitigation is checked against the closed bar 'currentHma' (at index). + + // Check peak mitigation (testing highs) + bool peakMitigationTriggeredSetup = false; + while (_peakStack.Count > 0 && currentHma >= _peakStack.Peek()) + { + _peakStack.Pop(); + if (_peakStack.Count <= 1) + { + peakMitigationTriggeredSetup = true; + } + } + if (peakMitigationTriggeredSetup) + { + // Alert only on the first bar the setup becomes active + if (EnableAlerts && !_sellSetupActive && !string.IsNullOrEmpty(AlertSoundPath)) + { + Notifications.PlaySound(AlertSoundPath); + } + _sellSetupActive = true; // Activate sell setup + } + + // Check trough mitigation (testing lows) + bool troughMitigationTriggeredSetup = false; + while (_troughStack.Count > 0 && currentHma <= _troughStack.Peek()) + { + _troughStack.Pop(); + if (_troughStack.Count <= 1) + { + troughMitigationTriggeredSetup = true; + } + } + if (troughMitigationTriggeredSetup) + { + // Alert only on the first bar the setup becomes active + if (EnableAlerts && !_buySetupActive && !string.IsNullOrEmpty(AlertSoundPath)) + { + Notifications.PlaySound(AlertSoundPath); + } + _buySetupActive = true; // Activate buy setup + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/HmaMitigationSignals.csproj b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/HmaMitigationSignals.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/HmaMitigationSignals.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfo.cs b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfo.cs new file mode 100644 index 0000000..87c1693 --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaMitigationSignals")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaMitigationSignals")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaMitigationSignals")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfoInputs.cache b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfoInputs.cache new file mode 100644 index 0000000..9f3e929 --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +eba8fecb039ecb3c0a142d0f2a9b3f551d940de1 diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..073d1ae --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaMitigationSignals +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\HmaMitigationSignals\HmaMitigationSignals\ diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.assets.cache b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..55fe793dbf6e79188469e54762a4a767b1c10251 GIT binary patch literal 571 zcmWIWc6a1rU|?9Qd-Fm4+Os_Y5fp%! zfzDPjp~b01#W7ArrMbDOIWc;9rRk|9F$Iaq*@@|?#WBexMTse?MS6*)CHc9DC8;rn zdIoxiCNVjgNilh;C1!dCG0BcO>G^t&0iJp(IXTQorZWNAAU+EavqHs@DUb^Ul0zUC zI6^G|DF8_*5_B3!B?!>QBWw`E!KR~o1SH1}#2i4(3B;hF=LTYAzysv)`IWk-mIOe; z(lZ6aufoXkVZdm}%+F(k1Tb$vVo8Q)9#pRcFu3(0!L5%H+?ebrKv(Lsl_Fkd5I-Jqk~J6K&JAdm;eBj(wY7M literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.csproj.AssemblyReference.cache b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/Debug/net6.0/HmaMitigationSignals.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.dgspec.json b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.dgspec.json new file mode 100644 index 0000000..f587421 --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj", + "projectName": "HmaMitigationSignals", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.props b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.targets b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/HmaMitigationSignals.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.assets.json b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.assets.json new file mode 100644 index 0000000..592a61b --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj", + "projectName": "HmaMitigationSignals", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.nuget.cache b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.nuget.cache new file mode 100644 index 0000000..cca9cd0 --- /dev/null +++ b/Sources/Indicators/HmaMitigationSignals/HmaMitigationSignals/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "DxEeUy28ZBdzEtfthwL77wzQ4ke6Qq+9ihU8hGHHq9Zkz9SR9yfNrOVC7zcjvC2fluF4I2zsexRZHVqmVVc3IA==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaMitigationSignals\\HmaMitigationSignals\\HmaMitigationSignals.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal.algo b/Sources/Indicators/HmaSmaCrossoverSignal.algo new file mode 100644 index 0000000000000000000000000000000000000000..d72829253ff16e5de7a97862aa70170cca68790d GIT binary patch literal 3424 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 Crmy4x literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.sln b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.sln new file mode 100644 index 0000000..ed32b08 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HmaSmaCrossoverSignal", "HmaSmaCrossoverSignal\HmaSmaCrossoverSignal.csproj", "{82d7192b-57bd-41f4-b4a0-b60264330377}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {82d7192b-57bd-41f4-b4a0-b60264330377}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82d7192b-57bd-41f4-b4a0-b60264330377}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82d7192b-57bd-41f4-b4a0-b60264330377}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82d7192b-57bd-41f4-b4a0-b60264330377}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.cs b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.cs new file mode 100644 index 0000000..2296db4 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.cs @@ -0,0 +1,101 @@ +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo.Indicators +{ + // Indicator in a separate window, shows HMA A (fast HMA) and trade signals. + [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class HmaSmaCrossoverSignal : Indicator + { + [Parameter("HMA A Period (Fast)", DefaultValue = 20, Group = "Periods")] + public int HmaAPeriod { get; set; } + + [Parameter("HMA B Period (Slow)", DefaultValue = 250, Group = "Periods")] + public int HmaBPeriod { get; set; } + + [Parameter("SMA C Period (Base)", DefaultValue = 200, Group = "Periods")] + public int SmaCPeriod { get; set; } + + // Output for HMA A to provide context for signals + [Output("HMA A", LineColor = "Cyan")] + public IndicatorDataSeries HmaAOutput { get; set; } + + // Output for Buy signals + [Output("Buy Signal", LineColor = "Green", PlotType = PlotType.Points, Thickness = 8)] + public IndicatorDataSeries BuySignal { get; set; } + + // Output for Sell signals + [Output("Sell Signal", LineColor = "Red", PlotType = PlotType.Points, Thickness = 8)] + public IndicatorDataSeries SellSignal { get; set; } + + // Internal indicator references + private HullMovingAverage _hmaA; + private HullMovingAverage _hmaB; + private SimpleMovingAverage _smaC; + + protected override void Initialize() + { + // Initialize the internal indicators using the close prices + _hmaA = Indicators.HullMovingAverage(Bars.ClosePrices, HmaAPeriod); + _hmaB = Indicators.HullMovingAverage(Bars.ClosePrices, HmaBPeriod); + _smaC = Indicators.SimpleMovingAverage(Bars.ClosePrices, SmaCPeriod); + } + + public override void Calculate(int index) + { + // Assign HMA A value to the output series for the current index + HmaAOutput[index] = _hmaA.Result[index]; + + // We need at least 3 bars (index, index-1, index-2) for peak/trough detection at index-1 + if (index < 2) + { + BuySignal[index] = double.NaN; + SellSignal[index] = double.NaN; + return; + } + + // Get HMA A values for peak/trough detection + double hmaA_curr = _hmaA.Result[index]; + double hmaA_prev = _hmaA.Result[index - 1]; + double hmaA_prev2 = _hmaA.Result[index - 2]; + + // Get values for signal conditions (at index - 1) + double hmaB_prev = _hmaB.Result[index - 1]; + double smaC_prev = _smaC.Result[index - 1]; + + // Detect peak or trough at index - 1 (the last closed bar confirmed by the current bar) + // A peak occurs if the middle bar (index-1) is higher than its neighbors (index-2 and index) + bool isPeak = (hmaA_prev2 < hmaA_prev) && (hmaA_prev > hmaA_curr); + // A trough occurs if the middle bar (index-1) is lower than its neighbors + bool isTrough = (hmaA_prev2 > hmaA_prev) && (hmaA_prev < hmaA_curr); + + // Initialize signals for the current bar (index) to NaN + BuySignal[index] = double.NaN; + SellSignal[index] = double.NaN; + + // Reset signals at index - 1 (to handle repainting if the current bar 'index' changes) + BuySignal[index - 1] = double.NaN; + SellSignal[index - 1] = double.NaN; + + // --- Sell Signal Condition --- + // B < C (Slow HMA below Base SMA) + // A > C (Fast HMA above Base SMA) + // A forms a peak (at index - 1) + if ((hmaB_prev < smaC_prev) && (hmaA_prev > smaC_prev) && isPeak) + { + // Place the signal dot at the peak (index - 1) at the HMA A level + SellSignal[index - 1] = hmaA_prev; + } + + // --- Buy Signal Condition --- + // B > C (Slow HMA above Base SMA) + // A < C (Fast HMA below Base SMA) + // A forms a trough (at index - 1) + if ((hmaB_prev > smaC_prev) && (hmaA_prev < smaC_prev) && isTrough) + { + // Place the signal dot at the trough (index - 1) at the HMA A level + BuySignal[index - 1] = hmaA_prev; + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.csproj b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.csproj new file mode 100644 index 0000000..c8ec96f --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfo.cs b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfo.cs new file mode 100644 index 0000000..47a7a17 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaSmaCrossoverSignal")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaSmaCrossoverSignal")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaSmaCrossoverSignal")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfoInputs.cache b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f9e0068 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +68c010eb8d891632f96c629d00071703b797f10f diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..71b7f07 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaSmaCrossoverSignal +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\HmaSmaCrossoverSignal\HmaSmaCrossoverSignal\ diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.assets.cache b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..c8cec845a895b6552b99125ffd27ae7728215d5d GIT binary patch literal 571 zcmWIWc6a1rU|={@F8}4&Q!D#x*OxKA&hWT;f#vzO1lQ-sE=zB!@sO zaD-X_QUH=rBG2uO|{h&h0m6No`U&ke-LfCtFo^DA{vEeU{x zrDqC;Uxkt7!+_C{nV-i731HrU#F7lpJg8m?U~ub0f?FRYxH%n*i&INNDhpECi%RoK qGILWoo%0JSee#nNb684>N>hbgQj1G6^AbydMhBNBflTE^F#!Na4x7UO literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.csproj.AssemblyReference.cache b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/Debug/net6.0/HmaSmaCrossoverSignal.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.dgspec.json b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.dgspec.json new file mode 100644 index 0000000..1cf2a99 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "projectName": "HmaSmaCrossoverSignal", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.props b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.targets b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/HmaSmaCrossoverSignal.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.assets.json b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.assets.json new file mode 100644 index 0000000..036fc56 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "projectName": "HmaSmaCrossoverSignal", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.nuget.cache b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.nuget.cache new file mode 100644 index 0000000..0cfe061 --- /dev/null +++ b/Sources/Indicators/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "gsY+QQDmIPx+sSjbH7sxPisXr6pkw57LnDv8vmwyNX36zT16qTTfyBOGiCeYbT44fvyFC/YvqEHJXGdREbyY6w==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/ImbalanceAlert.algo b/Sources/Indicators/ImbalanceAlert.algo new file mode 100644 index 0000000000000000000000000000000000000000..c1fa991f5c35f8fa0a52e2321495329599eecbea GIT binary patch literal 4873 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 vRpRe(ZN+0mm|EpBRJanfmXeQhTAkOd3|)Zm literal 0 HcmV?d00001 diff --git a/Sources/Indicators/ImbalanceAlert/ImbalanceAlert.sln b/Sources/Indicators/ImbalanceAlert/ImbalanceAlert.sln new file mode 100644 index 0000000..7bfe896 --- /dev/null +++ b/Sources/Indicators/ImbalanceAlert/ImbalanceAlert.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImbalanceAlert", "ImbalanceAlert\ImbalanceAlert.csproj", "{c36a0d9f-f01d-43c6-8718-c23e761197a5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {c36a0d9f-f01d-43c6-8718-c23e761197a5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {c36a0d9f-f01d-43c6-8718-c23e761197a5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {c36a0d9f-f01d-43c6-8718-c23e761197a5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {c36a0d9f-f01d-43c6-8718-c23e761197a5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.cs b/Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.cs new file mode 100644 index 0000000..befe35b --- /dev/null +++ b/Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.cs @@ -0,0 +1,170 @@ +using System; +using cAlgo.API; +using cAlgo.API.Internals; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class ImbalanceAlert : Indicator + { + #region Parameters + + // Alert Settings + [Parameter("Send Email", DefaultValue = true, Group = "Alert Settings")] + public bool SendEmail { get; set; } + + [Parameter("Sender Email", DefaultValue = "junk001@mycelium.de", Group = "Alert Settings")] + public string SenderEmail { get; set; } + + [Parameter("Recipient Email", DefaultValue = "junk001@mycelium.de", Group = "Alert Settings")] + public string RecipientEmail { get; set; } + + [Parameter("Play Sound", DefaultValue = true, Group = "Alert Settings")] + public bool PlaySound { get; set; } + + [Parameter("Sound File Path", DefaultValue = "C:\\Windows\\Media\\Alarm07.wav", Group = "Alert Settings")] + public string SoundFilePath { get; set; } + + // Filters + [Parameter("Min Gap Size (Pips)", DefaultValue = 1.0, Group = "Filters")] + public double MinGapSizePips { get; set; } + + // Visuals + [Parameter("Draw Boxes", DefaultValue = true, Group = "Visuals")] + public bool DrawBoxes { get; set; } + + [Parameter("Bullish Color", DefaultValue = "Green", Group = "Visuals")] + public string BullishColorName { get; set; } + + [Parameter("Bearish Color", DefaultValue = "Red", Group = "Visuals")] + public string BearishColorName { get; set; } + + #endregion + + #region Fields + + private int _lastAlertBarIndex = -1; + private Color _bullColor; + private Color _bearColor; + + #endregion + + protected override void Initialize() + { + // 50% Transparency (Alpha 127 out of 255) + _bullColor = Color.FromArgb(127, Color.FromName(BullishColorName)); + _bearColor = Color.FromArgb(127, Color.FromName(BearishColorName)); + } + + public override void Calculate(int index) + { + // Need at least 3 completed bars (index-3 to index-1) + if (index < 3) return; + + int cIndex = index - 1; // The closed bar confirming the gap + int aIndex = index - 3; // The origin bar + + double highA = Bars.HighPrices[aIndex]; + double lowA = Bars.LowPrices[aIndex]; + + double highC = Bars.HighPrices[cIndex]; + double lowC = Bars.LowPrices[cIndex]; + + // Check Bullish FVG (Undervalued) + // Gap is between High of A and Low of C + if (lowC > highA) + { + // Bottom: HighA, Top: LowC + ProcessGap(true, aIndex, cIndex, highA, lowC, index); + } + // Check Bearish FVG (Overvalued) + // Gap is between Low of A and High of C + else if (highC < lowA) + { + // Bottom: HighC, Top: LowA (Bugfix: Parameter order swapped) + ProcessGap(false, aIndex, cIndex, highC, lowA, index); + } + } + + private void ProcessGap(bool isBullish, int startBarIdx, int endBarIdx, double bottomPrice, double topPrice, int currentIndex) + { + double gapSize = topPrice - bottomPrice; + + // Check against min size + if (gapSize < MinGapSizePips * Symbol.PipSize) return; + + // Visualization + if (DrawBoxes) + { + string objName = $"FVG_{startBarIdx}"; + var color = isBullish ? _bullColor : _bearColor; + + // Draw rectangle + var rect = Chart.DrawRectangle(objName, startBarIdx, bottomPrice, endBarIdx, topPrice, color, 1, LineStyle.Solid); + rect.IsFilled = true; + } + + // Alert Logic + if (IsLastBar && RunningMode == RunningMode.RealTime) + { + if (_lastAlertBarIndex != currentIndex) + { + TriggerAlerts(isBullish, topPrice, bottomPrice); + _lastAlertBarIndex = currentIndex; + } + } + } + + private void TriggerAlerts(bool isBullish, double top, double bottom) + { + string type = isBullish ? "BULLISH" : "BEARISH"; + string message = $"{Symbol.Name} ({TimeFrame}): {type} Imbalance Detected. Range: {bottom} - {top}"; + + // 1. Sound Alert + if (PlaySound) + { + if (!string.IsNullOrWhiteSpace(SoundFilePath)) + { + try + { + Notifications.PlaySound(SoundFilePath); + } + catch + { + Notifications.PlaySound(SoundType.Doorbell); + } + } + } + + // 2. Email Alert + if (SendEmail) + { + SendAlertEmail(type, top, bottom); + } + + Print(message); + } + + private void SendAlertEmail(string type, double top, double bottom) + { + try + { + string subject = $"{Symbol.Name} ({TimeFrame}): {type} Imbalance Detected"; + string body = $@" +

    Imbalance Manifested

    +

    Symbol: {Symbol.Name}

    +

    Timeframe: {TimeFrame}

    +

    Direction: {type}

    +

    Gap Range: {bottom} - {top}

    +

    Time: {Server.Time.ToUniversalTime()} UTC

    + "; + + Notifications.SendEmail(SenderEmail, RecipientEmail, subject, body); + } + catch (Exception ex) + { + Print($"Failed to send email: {ex.Message}"); + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.csproj b/Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/ImbalanceAlert/ImbalanceAlert/ImbalanceAlert.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/Kairi Relative Index.algo b/Sources/Indicators/Kairi Relative Index.algo new file mode 100644 index 0000000000000000000000000000000000000000..d00ded5d9719d3d1bc353c0ee2c99028b2f2c82a GIT binary patch literal 6123 zcmV|B38a&1lLFL8^7IW}!SKpN48X!!O zpmFM$kYgTtRt5m0GaX9N;{jLA9Hg(B*)hoc(qEhm=sDC)b}W%u=R06Cjn8=`VAUVE ztS(UyO^W{%1Z?cjOfZZEb`7^XDDrRy=^pL@sOyi~4%FI5^sRok6Z7#yKYjDF7?ATu zjR*!Qew^d^W^ee|;2kg*-XOhMGdjbUy&5<>Zkj`@D|T#-%@_vKB8Gpzq^SAD{>2mg zO`#f|)4H6t!Xm}k{Z=e(xmd?R`DK6l|7F`#0Xm0}-#91sl@k=X5t?tSvl8f!WlNFKi@ErWww=cTOF=c{iJRF%@RXc zL}SLltt6}yhWJcbde>j5E=E44XTE-wrz>YmHEEUzi0*>XKO7U_Dq`$UN2{9PDnil-B;bYKpSvS^$uQ-I8l4 zfleyPAPMl-T|c`oL?^u?s9meTR&l<>j9S`==|aD6fm9+#LI!kq?GTa_eg9@`YjfF= z#EbX%R~{U?#};NVi47q1uirmPrEq4FAIvTLskz(!87{tkj?WAD%}(A5O#65Zk`;4( z;Q5vReDR!oqL+Kn*ryO?pcCG!iU5o#qMgRu7Ux%0MM? zO+{}D>kmt-a{@?)q&AGrX@wyp!5(~ayz9KJ5~{yNpbNKDxk z>rGacLl2ddps3?NPKVi-$3JXY6z$b?3X=w}!UVG3gC=&R_nf@A33M_j2Z^IIsUP6S zP_0|Jh`@-%(sL9Pt+g&Q!MTj9)vn(7`Cuu$Ezb1co)WhWZ!O@}`S9aqJfg`{jD~LH z6K;O(XAZ1&RXRs?rHYuKOgDCEA^SiDTQv}hd?Y!gsRCHZOQMHKX=Xt}`|cNtwCAS} zE^A#O`x`(D#G`!SuT^eFCWvWsDBh7wzG?Lzj0({(j&lV@JO>PXBShRpK|do|)(7+U zPKg3NamAV`3@ytayf00LtNr8>N(=>h?J9I@z0OesPBG?%4XgR%(8Ikob@8uHnHGGgat>5`sC({gjl zv9R3s!uV{8z!|O&e-gzz`w86Wtn>WS>72*5;~{eW=j)h7Sd+FdQk{o58`xePST+Ry zSyw4ppr1gWXtgXVp0|exq4*scSvTS>@a3+L_F^)iT%;>$%5nU5QZu3?ClX|O*|c_w*_$0nORY)?CrK4Wwgo!-S%tRvJ-7@5;CNPZf)_9 zP@m}_@{g#3K{pqi2;SNf-gp~EmfX4>4`v~E)*bNh0Z|fVM$0M=2`KCmH7V|D^quZg z*unQCejaZPFq|kFZez}3k1K-60w+m`E**(fYG_IH_BINlZ#IQelJ?2o`=BIc%CW=# zoRnh5TJ-Ac;MYA=j)m1-nh44YPQ;lf$bOi7YcEoZP-tEi(++B2(KNBc=+7G#L!a2l zpnh>&!E8of;hVMeavN`L5|Ago`RBZYO98w~WIV4KG6eWPuyav&!;g{=lB)tk0zfhZ zsu)uRa`Vj-2@*G)2c<|PLh`?|zYqB0sGAm)`e0Mm?mfE&3}=P+b#(Dfc-TJCct{I4 zjp{(BOGwu2?ihGk@T0jv?fw&lZZQZzgT%zb$kEt?_I^xMk(Fl0)DRnn38wZyz|O`T z5RqkT4AAqt>}o9P*?GS;h?GF|dsRqETrL3hV)#03DcIxvczSnp6xrm~e>_DqJ?<+y zf@J_k5Hat>aGjE`*oT$@nO20qEz$NEZh-Us7j-T`+~kTb%{$VcwDeuduSr0 zj=`sU@v4BG;h*7J9m`*_nK*?gnr&>M4^vQ0w10`>mD)pQAo-u@`8;N4GpAf9IGx2o zZyP}x*bH&8m7SGn>X;LA%y2jPaQ+OcNUo4&VX9cXI5?#h(L`R@I4Nm-A;r`*3>-i< zO8Zf*`3>Nq{&Cl&^kI~c7^}NgI`afXA`W6H>PLmsgwY36|3H4~Xn zE?JBjGiCb@y8a%_#oq|IF`8F@uB-jPI>)N*tozl>5=z#V@pX)SV*MWz`85$uj!=JT zk4vA!{;`4u<|V7omFZjd_>Hc@58_GmhcSPk3aI(!8P`Q_TWvS)Q}vZS!O$8KDWhHQ zcv{sS+g#0Ep$cIMP}sIZ?S%*+KLi|>{EzyUeqZ8r1^sB`YI01*bfjY^+*dlW&TQlQ zZy^J8{jaQ={+D$!Selehd?O39OhraDVq(mGk)>H_@Ry`6VRz@w;q-<)x_f@UFusG3JxSFcX7JE&$-~` z28D4#e+#M~(&H+Xe9ThO(dOiH#Mp6x?8X%*zH^!Q%yiV9@CWGZA84;v-G&?`);O1z zUcBsCgaLj2{mPgBb*}&7H5NCtb@nK>D;#}A22FG-^sAZV1r z#GuNEmF>X4WRPB7okQFJ3*p9C(*n)+?`R@n?h9bn}c%F;^(hKG8ybB7|jf_B-FR&h8Xe0*|I^!$|%}o)L>0xbU z`BiRsX5Ntq!urwDU>TTsk=|ZL*ri`Nrx4c09k$HgI(?F;ZrZe^r1lCPqo+_ql7f`#^zBat4vnEvI3e3A;%qI?05@~uWlitRa||EB$a zZxR-Is%iq9Wn=~p534?KIxt3z7UQd6#pJTH`t(4mRRqbf6bTBE`vd3X5kiUoY55e8152P>Uwg=>Qc*X`o>rlJZac5^pd}uQtuKMlZZPhYpH--w%#68%(8Ya}_x=###-aquCIvT`59Q8be5|iCEaX z_mrEvyUfKk9~0w;bJ~4@O>Y66{03AJ3?ZvP@PXy55fG#|XAX6mFQQzrGpcYLKaQ4r zpTS)7D1+NK3Q^4u^)78d$C=t00S+^`9(wk=t^iF>dr?Bmyhwh5-^Po+9OB2ruAeUr zGUUUE7Ptke+wq;$Y^l)NXChK})NdJRu^GMt+zn6d^HD_Oef~htL$t|pAu}*R(I;XU z++=*q9rOsx7F<(K!ivFDt)tHTw$UwcnLjCP_rE=hUrnvT5&f9VqwUgrvx_@TNIK`` zroqJ}{@K7X24E1km4G-qsDJ*sXkzh7|85(xY=tZ!}d_TFdl*fSk%MNS%p@Om2*LQ^32fuLbZ6q)X7`xRcnV?ep7uBfgQlc*@BP-@yfu!5VD%mK1 zMOR>!01c;7(WC&&oNv{l%xS)njpBy4w6%>>WRJD?@Wph_ZGA`Kx`dTN=HevTrFvu9 znBMjaOCH&RTu5`Qh1n!QR0}XAbXl62lbCj8%N=>wMl^^*A!?2M;F6Cmt!H1AcU{f- zj+ubCCR=V_)BF!)-&aH)W3o0otNETOwS=2C;gHDBjDoNgCO9z<4;+vdvYNYP`6Fwp zM$F=6!zDa6LBQ`aievfPBwt+ayH;3*TGGsug5Gq*|4Gh^D_-)22g-?B3IuEjnxBVN zpzz_x!*poK_lGqLJ+E|cFcm2ap?N_vNo7Ww`_97={dKa>m zaQ(154G8!7=^ew4`X(3cDTgd%;GKzfnN`5V(q^)3)B2cOKH*@=bBG%XEw zNJLd3oSbvOuq^ZgHY;cq9hU0SAx3Y!olyj*y`ajQnV7J3m0L7B!Oyf}R;&*P?`Oci z{=OC|L20M;BBf|((jTW|Yp9GW=cg}F468mkqp~eIW+K?F$l1E3i$I5?OG*F%67#(F zRgiq~TDz)Fd6F7K5^o0ihSY!L>t@ z?^I=n0?jH3^m7sCT`z3p&A!V7R>^3Y!2sIT(b-{UMWvB;$2cDjEhjN25aQ(w4d@!- zJ(vquz$%4;$7s)cns=e^>Wf89<>S&q;4*g|r`3BJtLSa5QU+$GPxF>{Vg;=?$GJ+I z%_w~Gn@cbkJ25%b!F?2Z0|D1II!a16q;;uyR!Mx?7c7FuS%0_Mz;H4`Fj5^@qAwef z9CDvvOHVPTb&J>>% zP*7q5=!IFOD#jUm>-4+7Zs~}H?JwZt;P7c$AXgpH8@3PFdZ{Y~py(JMUgq6z#3L_0 zvr0(U_6Lym;>yeGdsw(~nqf7`R%G9fl=Xf2kn7jZU3j+5N)4X}8JGYtN1juBBOXFE zpn9-QL16M$xK+1?w^ZbteujL3Za(P2vy!B=-Mnt@^DEl;Lu>eOtDB`^B7iL4CK_r>=zRjf?VzcJ7`0?1xf$bF(8l5XoF;Ip+XK!{9uuhm&7 z(-hLG)rGATWH9$|*|~Sh^4 ztD@F8)BEUtI;MJD?X4_yi{{K!`?Z~w)tor&+>zWxd`EG zr8Mp%LeLU2Lao0@tvQJ_k!1f6iVbj)SyZ{eF2~`F(TTk5Krgzd&K>wGLYZ-XoJCD+ zMyXyjQgcmEU^*0xeEJ=X@t7m3sQ5h(mWi8-M>)nkv%NFPg4Dui0@%Wi<<>i~KZyb`z8eXU_2B^^uIKKf2=jqc}q zhEK>WCcq-zNZ}o9@2*~Ot=!c_y!=iwq?=x?;#*b@D^g}`xr?a1F8Uz>kx?7wHSVAQ zw0susQR^P-J<#+NDSVD>F<4)-5*ssz^736;Du);|@17+xN!vl7dVMXgCWCp0r*i;C zA`R|D!#C)oRy;w4N8t8u$ebdT1}ySt6S$zhmf(6s^}Cbddq^iX1I z^gPG@x8-0(lHfI5U-a1N2=Z{CJAvgE@Lw9jJKl)Z$4z=@O6P2^0&*GtO7PcOr(=bv_~j!N8CF z%~PfkoNf{+ed;fpkTXS)a&dJ_9Yr1@f?Re;emafGm(~@>f1(q_XCX?Ak&wN6YCV*4 xTS>WSakqmF^TxkAU3{A=TSHWLmc; + + + + 7.2 + Debug + AnyCPU + {C3FBC874-301E-41CA-A6FE-A1059BA1C86E} + {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + cAlgo + Kairi Relative Index + v4.0 + Client + 512 + True + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + False + ..\..\..\..\API\cAlgo.API.dll + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Kairi Relative Index/Kairi Relative Index/Properties/AssemblyInfo.cs b/Sources/Indicators/Kairi Relative Index/Kairi Relative Index/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..afde0ef --- /dev/null +++ b/Sources/Indicators/Kairi Relative Index/Kairi Relative Index/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Kairi Relative Index")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Kairi Relative Index")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("35f19c43-c7cc-4f53-b8e0-61caaf9cd8e8")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +#if DEBUG + [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations)] +#endif \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7).algo b/Sources/Indicators/MACD Crossover (7).algo new file mode 100644 index 0000000000000000000000000000000000000000..8be90bafcb8c4ef13862496d91cbcffbac0e5661 GIT binary patch literal 3441 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 T$?5VRh&-W;dP0 ) + { + var t0 = Bars.OpenTimes[index]; + var t1 = Bars.OpenTimes[index-1]; + if( t0.ToLocalTime().Date == t1.ToLocalTime().Date ) + Times[index] = (t0-t1).TotalMinutes; + else + Times[index] = 0; + } + + macd[index] = (FastMa.Result[index] - SlowMa.Result[index]); + Histogram[index] = macd[index]; + if( ScaleByTimeSpan && Times[index]>0) + Histogram[index] *= TimesMa.Result[index] / Times[index]; + + Signal[index] = SignalMa.Result[index]; + + HistogramRisingPositive[index] = 0; + HistogramRisingNegative[index] = 0; + HistogramFallingPositive[index] = 0; + HistogramFallingNegative[index] = 0; + + if (Histogram[index] > 0) + { + if (Histogram.IsRising()) + HistogramRisingPositive[index] = Histogram[index]; + else + HistogramRisingNegative[index] = Histogram[index]; + } + else if (Histogram[index] < 0) + { + if (Histogram.IsRising()) + HistogramFallingPositive[index] = Histogram[index]; + else + HistogramFallingNegative[index] = Histogram[index]; + } + } + } +} diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj new file mode 100644 index 0000000..6b327b8 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj @@ -0,0 +1,24 @@ + + + + net6.0 + False + False + + + 7.2 + Debug + AnyCPU + Properties + cAlgo + MACD Crossover (7) + 512 + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj.backup b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj.backup new file mode 100644 index 0000000..d9c3f61 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/MACD Crossover (7).csproj.backup @@ -0,0 +1,64 @@ + + + + + 7.2 + Debug + AnyCPU + {373DED72-A17B-4903-8EC9-FA9589B99D5D} + {DD87C1B2-3799-4CA2-93B6-5288EE928820};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + cAlgo + MACD Crossover (7) + v4.6.1 + + + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + CS0108,CS0162,CS0109,CS0219,CS0169,CS0628 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + CS0108,CS0162,CS0109,CS0219,CS0169,CS0628 + false + + + + + + + + + + False + ..\..\..\..\API\cAlgo.API.dll + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/Properties/AssemblyInfo.cs b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e15f025 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MACD Crossover (7)")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("MACD Crossover (7)")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("35f19c43-c7cc-4f53-b8e0-61caaf9cd8e8")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +#if DEBUG + [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations)] +#endif \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).algo b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).algo new file mode 100644 index 0000000000000000000000000000000000000000..59678847f481ba08919ac66ea0da5137b39c81e0 GIT binary patch literal 4907 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 djiRV+5~*s^&nRaK$i`)BsD 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).pdb b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/MACD Crossover (7).pdb new file mode 100644 index 0000000000000000000000000000000000000000..9581cad3b427f3a8aa165b78f51132c6f38d9262 GIT binary patch literal 10912 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 m=0H8eo`{{U;Q%(G*rTH-ME(ao+z06Z literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).deps.json b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).deps.json new file mode 100644 index 0000000..8ae490d --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).deps.json @@ -0,0 +1,41 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": { + "MACD Crossover (7)/1.0.0": { + "dependencies": { + "cTrader.Automate": "1.0.9" + }, + "runtime": { + "MACD Crossover (7).dll": {} + } + }, + "cTrader.Automate/1.0.9": { + "runtime": { + "lib/net6.0/cAlgo.API.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + } + } + }, + "libraries": { + "MACD Crossover (7)/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "cTrader.Automate/1.0.9": { + "type": "package", + "serviceable": true, + "sha512": "sha512-F2rQGQi6h9OVGfd4ePfa8nr1qU+WOqTFYnpm3hr6E+ibtgUamuzTelupnxNuPCBbuBHuxyvrCL+4emiOfdAIRg==", + "path": "ctrader.automate/1.0.9", + "hashPath": "ctrader.automate.1.0.9.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).dll b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).dll new file mode 100644 index 0000000000000000000000000000000000000000..ffe38c7bced0013313df47eabf01fd51d8ff0a43 GIT binary patch literal 8704 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).pdb b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/MACD Crossover (7).pdb new file mode 100644 index 0000000000000000000000000000000000000000..9581cad3b427f3a8aa165b78f51132c6f38d9262 GIT binary patch literal 10912 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 m=0H8eo`{{U;Q%(G*rTH-ME(ao+z06Z literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/cAlgo.API.dll b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/bin/Release/net6.0/publish/cAlgo.API.dll new file mode 100644 index 0000000000000000000000000000000000000000..fc0d146954f61d57f7826a0c6379c6f8088a58a9 GIT binary patch literal 314368 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
    Yq7(EHl8v}?bC-b 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 d&!~+V�{#&nU`_C5bU(N#e<$Nd8>% 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 CnGECr literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.dgspec.json b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.dgspec.json new file mode 100644 index 0000000..e9ff3f2 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj", + "projectName": "MACD Crossover (7)", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[1.*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.props b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.props new file mode 100644 index 0000000..2f5501b --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.9 + + \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.targets b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.targets new file mode 100644 index 0000000..611004a --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/MACD Crossover (7).csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/MACD Crossover (7).csproj.FileListAbsolute.txt b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/MACD Crossover (7).csproj.FileListAbsolute.txt new file mode 100644 index 0000000..e69de29 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..08b7b92 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = cAlgo +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\ diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).assets.cache b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..718dfc470ffa4834c6b9990630f61c8754a8714d GIT binary patch literal 568 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.CoreCompileInputs.cache b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..772ddb5 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +8b1c4478054cdd89cfbdb0145247239631117c52 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.FileListAbsolute.txt b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.FileListAbsolute.txt new file mode 100644 index 0000000..bac60d3 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).csproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\MACD Crossover (7).deps.json +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\MACD Crossover (7).dll +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\MACD Crossover (7).pdb +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\MACD Crossover (7).csproj.AssemblyReference.cache +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\MACD Crossover (7).GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\MACD Crossover (7).csproj.CoreCompileInputs.cache +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\MACD Crossover (7).dll +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\refint\MACD Crossover (7).dll +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\MACD Crossover (7).pdb +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\obj\Release\net6.0\ref\MACD Crossover (7).dll diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).dll b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).dll new file mode 100644 index 0000000000000000000000000000000000000000..ffe38c7bced0013313df47eabf01fd51d8ff0a43 GIT binary patch literal 8704 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).pdb b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/MACD Crossover (7).pdb new file mode 100644 index 0000000000000000000000000000000000000000..9581cad3b427f3a8aa165b78f51132c6f38d9262 GIT binary patch literal 10912 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 m=0H8eo`{{U;Q%(G*rTH-ME(ao+z06Z literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/PublishOutputs.d8d4e7c099.txt b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/PublishOutputs.d8d4e7c099.txt new file mode 100644 index 0000000..e482eef --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/PublishOutputs.d8d4e7c099.txt @@ -0,0 +1,4 @@ +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\publish\MACD Crossover (7).dll +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\publish\MACD Crossover (7).deps.json +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\publish\MACD Crossover (7).pdb +C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MACD Crossover (7)\MACD Crossover (7)\bin\Release\net6.0\publish\cAlgo.API.dll diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/ref/MACD Crossover (7).dll b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/ref/MACD Crossover (7).dll new file mode 100644 index 0000000000000000000000000000000000000000..b741e2ace3fc6d7e14e95e406d3baca7f844597a GIT binary patch literal 7680 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 S{ulIz;kVU`_bPvzBJf|Fr7^ky literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/refint/MACD Crossover (7).dll b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/Release/net6.0/refint/MACD Crossover (7).dll new file mode 100644 index 0000000000000000000000000000000000000000..b741e2ace3fc6d7e14e95e406d3baca7f844597a GIT binary patch literal 7680 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 S{ulIz;kVU`_bPvzBJf|Fr7^ky literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.assets.json b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.assets.json new file mode 100644 index 0000000..a19a355 --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.assets.json @@ -0,0 +1,136 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.9": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.9": { + "sha512": "F2rQGQi6h9OVGfd4ePfa8nr1qU+WOqTFYnpm3hr6E+ibtgUamuzTelupnxNuPCBbuBHuxyvrCL+4emiOfdAIRg==", + "type": "package", + "path": "ctrader.automate/1.0.9", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.9.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= 1.*" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj", + "projectName": "MACD Crossover (7)", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[1.*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.nuget.cache b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.nuget.cache new file mode 100644 index 0000000..8d633ec --- /dev/null +++ b/Sources/Indicators/MACD Crossover (7)/MACD Crossover (7)/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "yMGrNe3fSoOGtiz6KSiUvXuOVjyIqkEcHNE7aWnXF14zQSbGwqVbP2ubdcaxcLHLIR45SieCJ9HedMTgx/OgPA==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MACD Crossover (7)\\MACD Crossover (7)\\MACD Crossover (7).csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.9\\ctrader.automate.1.0.9.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo.algo b/Sources/Indicators/MS_LowPassFilterDemo.algo new file mode 100644 index 0000000000000000000000000000000000000000..b608d5ffa8a54439152485ac5401a3936cdd2ba1 GIT binary patch literal 9162 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 3: + // 1.0 / CutoffPeriodParameter > 0 is true. + // 1.0 / CutoffPeriodParameter < 0.5 implies CutoffPeriodParameter > 2, which is true. + // The check is kept for robustness. + if (actualCutoffFrequency <= 0 || actualCutoffFrequency >= SamplingFrequency / 2.0) + { + Print($"Error: Invalid CutoffPeriodParameter ({CutoffPeriodParameter}). " + + $"The resulting Cutoff Frequency ({actualCutoffFrequency:F4}) must be > 0 and < {SamplingFrequency / 2.0}. " + + $"This implies CutoffPeriodParameter must be > 2."); + Stop(); + return; + } + + besselFilter = LowPassFilter.CreateBesselLowPass(actualCutoffFrequency, SamplingFrequency); + filterOutput = CreateDataSeries(); + atr = Indicators.AverageTrueRange(AtrPeriodParameter, MovingAverageType.Simple); + + mmiCalculator = new MS.MMI(MmiPeriodParameter); + mmiOutput = CreateDataSeries(); + + besselFilter.Reset(); + mmiCalculator.Reset(); + + for (int i = 0; i < Bars.Count; i++) + { + double historicalClose = Bars.ClosePrices[i]; + + double filterVal = besselFilter.Update(historicalClose); + filterOutput[i] = filterVal; + + double mmiVal = mmiCalculator.Update(historicalClose); + mmiOutput[i] = mmiVal; + } + } + + protected override void OnBar() + { + if (Bars.Count < 4) + { + Print($"Bars.Count = {Bars.Count}. Waiting for more history (need Bars.Count >= 4 for Last(3) access)."); + return; + } + + // Check if enough bars have loaded for ATR calculation. + // AtrPeriodParameter is the period for ATR, not related to CutoffPeriodParameter directly for this check. + if (Bars.Count <= AtrPeriodParameter) + { + Print($"Bars.Count = {Bars.Count}. Waiting for more bars for ATR calculation (AtrPeriod: {AtrPeriodParameter})."); + return; + } + + double currentAtrValue = atr.Result.Last(1); + if (double.IsNaN(currentAtrValue) || currentAtrValue <= 0) + { + Print($"ATR value is not valid (NaN or <=0): {currentAtrValue:F5} for bar index {Bars.Count - 2}. Trade checks skipped."); + return; + } + + double closeOfRecentlyClosedBar = Bars.ClosePrices.Last(1); + + double currentFilterValue = besselFilter.Update(closeOfRecentlyClosedBar); + filterOutput[Bars.Count - 2] = currentFilterValue; + + double currentMmiValue = mmiCalculator.Update(closeOfRecentlyClosedBar); + mmiOutput[Bars.Count - 2] = currentMmiValue; + + double filterVal_L1_Recent = filterOutput.Last(1); + double filterVal_L2_TurnPoint = filterOutput.Last(2); + double filterVal_L3_Prior = filterOutput.Last(3); + + if (double.IsNaN(filterVal_L1_Recent) || double.IsNaN(filterVal_L2_TurnPoint) || double.IsNaN(filterVal_L3_Prior)) + { + Print($"Filter values contain NaN. Waiting for filter to stabilize. L1: {filterVal_L1_Recent}, L2: {filterVal_L2_TurnPoint}, L3: {filterVal_L3_Prior}"); + return; + } + + bool isLowPoint = filterVal_L3_Prior > filterVal_L2_TurnPoint && filterVal_L2_TurnPoint < filterVal_L1_Recent; + bool isHighPoint = filterVal_L3_Prior < filterVal_L2_TurnPoint && filterVal_L2_TurnPoint > filterVal_L1_Recent; + + if (isLowPoint || isHighPoint) + { + double mmi_L1_Recent = mmiOutput.Last(1); + double mmi_L2_Prior = mmiOutput.Last(2); + + if (double.IsNaN(mmi_L1_Recent) || double.IsNaN(mmi_L2_Prior)) + { + Print($"MMI values for comparison contain NaN. MMI_L1_Recent: {mmi_L1_Recent}, MMI_L2_Prior: {mmi_L2_Prior}. Trade condition not met."); + return; + } + + bool isMmiFalling = mmi_L2_Prior > mmi_L1_Recent; + + if (isMmiFalling) + { + Print($"MMI is falling (Prior L2: {mmi_L2_Prior:F2} > Recent L1: {mmi_L1_Recent:F2}). Bessel signal confirmed."); + if (isLowPoint) + { + ClosePositions(TradeType.Sell); + if (Positions.FindAll(BotLabel, SymbolName, TradeType.Buy).Length == 0) + { + ExecuteOrder(TradeType.Buy, "Long Entry (Bessel Low, MMI Falling)", currentAtrValue); + } + } + else // isHighPoint + { + ClosePositions(TradeType.Buy); + if (Positions.FindAll(BotLabel, SymbolName, TradeType.Sell).Length == 0) + { + ExecuteOrder(TradeType.Sell, "Short Entry (Bessel High, MMI Falling)", currentAtrValue); + } + } + } + else + { + Print($"MMI is not falling (Prior L2: {mmi_L2_Prior:F2}, Recent L1: {mmi_L1_Recent:F2}). Trade condition not met."); + } + } + } + + private void ExecuteOrder(TradeType tradeType, string comment, double validatedAtrValue) + { + double volume = Symbol.QuantityToVolumeInUnits(VolumeInLots); + double stopLossDistanceInPrice = 4 * validatedAtrValue; + double stopLossInPips = stopLossDistanceInPrice / Symbol.PipSize; + + if (stopLossInPips < 1.0) + { + Print($"Calculated Stop Loss in pips ({stopLossInPips:F2}) is less than 1. Adjusting to 1 pip for order '{comment}'. ATR ({validatedAtrValue:F5}), PipSize ({Symbol.PipSize:F5})."); + stopLossInPips = 1.0; + } + + double? takeProfitInPips = null; + if (TakeProfitFactor > 0) + { + takeProfitInPips = stopLossInPips * TakeProfitFactor; + if (takeProfitInPips < 1.0) + { + takeProfitInPips = 1.0; + Print($"Calculated Take Profit in pips ({stopLossInPips * TakeProfitFactor:F2}) is less than 1. Adjusting to 1 pip."); + } + } + + ExecuteMarketOrder(tradeType, SymbolName, volume, BotLabel, stopLossInPips, takeProfitInPips, comment); + } + + private void ClosePositions(TradeType tradeType) + { + foreach (var position in Positions.FindAll(BotLabel, SymbolName, tradeType)) + { + ClosePosition(position); + } + } + + protected override void OnStop() + { + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/MS_LowPassFilterDemo.csproj b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/MS_LowPassFilterDemo.csproj new file mode 100644 index 0000000..866383b --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/MS_LowPassFilterDemo.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + ..\..\..\Common\MSLib\obj\Debug\net6.0\MSLib.dll + + + \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfo.cs b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfo.cs new file mode 100644 index 0000000..60b590e --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MS_LowPassFilterDemo")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MS_LowPassFilterDemo")] +[assembly: System.Reflection.AssemblyTitleAttribute("MS_LowPassFilterDemo")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfoInputs.cache b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd186c5 --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +bcc33b8311974b4171c0c2609349fa752b073072 diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..5685d8b --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MS_LowPassFilterDemo +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MS_LowPassFilterDemo\MS_LowPassFilterDemo\ diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.assets.cache b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..17656a93a744309886929753a7c37e5f16424218 GIT binary patch literal 571 zcmWIWc6a1rU|?7{=SbA61CNu-Ww&_8HO+aosMgQEDa$ADk;KuXy7iYHO=bitf&vgT z(Ag>`v^ce>IL4`{G&eUjCq^%?G(EK>rXVpnJ25@AI3~HIC^03qNH4LpBtJK?BsIoR z&p^-6C?+Q}DJCzq#7xg1CfPA3Jzvi;z*8?JCx;oybS5Ah#Ag9wR;V~K1#*EvatOo% zN2moL1t1AUf=&ae1OeK3gbiXi*mQJ{faKVLm;;D8ffy9@+(3*Bcz_%}zf$+qk^o3p zdZu9bRTx=53>XcW`FU)R0Ok!yEXnZ9gX)z42Dd&Wxb;zjo71tlIJG3CvLKbcs5Gx6 pGdGpfIlrLNCqFqchoz*bG*!qYwYVfRFR=t@bZ}`B$W&ew699~2ns)#I literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.csproj.AssemblyReference.cache b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/Debug/net6.0/MS_LowPassFilterDemo.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..76e6da8385c67815702896fcdc466aa3c3ce7e0e GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.dgspec.json b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.dgspec.json new file mode 100644 index 0000000..b0d3c2e --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj", + "projectName": "MS_LowPassFilterDemo", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.props b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.props new file mode 100644 index 0000000..120d227 --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.targets b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/MS_LowPassFilterDemo.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.assets.json b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.assets.json new file mode 100644 index 0000000..ac27895 --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj", + "projectName": "MS_LowPassFilterDemo", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.nuget.cache b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.nuget.cache new file mode 100644 index 0000000..110c62c --- /dev/null +++ b/Sources/Indicators/MS_LowPassFilterDemo/MS_LowPassFilterDemo/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "ZUN9dJK6IO89CJta6N5Xb6zI5P/TwW3ITVnZJdBrfsSAyQZJNs0epgLJUeOFB7BtelfX4t45/QcE1YswvR+aYw==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo\\MS_LowPassFilterDemo.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini.algo b/Sources/Indicators/MS_MMI-Gemini.algo new file mode 100644 index 0000000000000000000000000000000000000000..8e97c834a9f1d084da308c10cb604b81dded3260 GIT binary patch literal 7146 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MS_MMI-Gemini/.vscode/tasks.json b/Sources/Indicators/MS_MMI-Gemini/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini.sln b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini.sln new file mode 100644 index 0000000..9042903 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MS_MMI-Gemini", "MS_MMI-Gemini\MS_MMI-Gemini.csproj", "{79df7f5d-d387-4a9d-92f8-9072b4d06c29}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {79df7f5d-d387-4a9d-92f8-9072b4d06c29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79df7f5d-d387-4a9d-92f8-9072b4d06c29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79df7f5d-d387-4a9d-92f8-9072b4d06c29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79df7f5d-d387-4a9d-92f8-9072b4d06c29}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.cs b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.cs new file mode 100644 index 0000000..56834af --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using cAlgo.API; +using cAlgo.API.Internals; +using cAlgo.API.Indicators; + +using MS; + +namespace cAlgo +{ + [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class MarketMeannessIndex : Indicator + { + [Parameter("Time Period", DefaultValue = 20, MinValue = 2)] + public int TimePeriod { get; set; } + + [Parameter("Source")] + public DataSeries Source { get; set; } + + [Output("MMI", LineColor = "Orange")] + public IndicatorDataSeries Result { get; set; } + + // Instance of the MMI class to handle all MMI calculations. + private MMI _mmiCalculator; + private int _lastIndex = -1; + + protected override void Initialize() + { + // Initialize the MMI calculator with the specified TimePeriod. + _mmiCalculator = new MMI(TimePeriod); // Use new class name MMI + } + + public override void Calculate(int index) + { + Result[index] = _mmiCalculator.Update(Source[index], index > _lastIndex); + _lastIndex = index; + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.csproj b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.csproj new file mode 100644 index 0000000..866383b --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/MS_MMI-Gemini.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + ..\..\..\Common\MSLib\obj\Debug\net6.0\MSLib.dll + + + \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfo.cs b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfo.cs new file mode 100644 index 0000000..5ee631a --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MS_MMI-Gemini")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MS_MMI-Gemini")] +[assembly: System.Reflection.AssemblyTitleAttribute("MS_MMI-Gemini")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfoInputs.cache b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b983df7 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6212e91709e6f354c7deb7d22a8e0ffdd8bd7ce9 diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..8a9195f --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MS_MMI-Gemini +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MS_MMI-Gemini\MS_MMI-Gemini\ diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.assets.cache b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..59fab5b3eaf1b0114e9fd4e72406cd4c81c6f9b3 GIT binary patch literal 571 zcmWIWc6a1rU|?{+GAqQ7gUc~z3*Qty=@45@o;ORnGHlkZk8hdZ+9NY(G9yqC6o8n4 z&Q>v@#i>QbF-}FLxw)x1F?xBW>8T|#1&PVoiRr1uG07!Gi7BZ?dWoea`MHTDsWFCn z26~1@F*%t@F?p#aW_kuO$&NYc`Ff54o_Z-cIm}3=GXdEkJ_``DLdB6OkP8HoLm(D7 zLM;F(07)nkbQ(w{2++nOY!Ji2rlWfVB*zZK96-zo#Gs((24ZBu1LW}emAa>v1VF;l zGX=x1!pQPrz-Y+K&troGFmFI&Nrq=0RIdauxb-2yt&bAioQ}oCsU;zm1*z;srFkWp pxv8Aa`303e`N@enEG0#ysX{KP#U+_}i6uazgG-Y@rt+eg007@{mHPky literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.csproj.AssemblyReference.cache b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/Debug/net6.0/MS_MMI-Gemini.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..5fa6f84a1db8cd5b7073cfeab517aa35af16873a GIT binary patch literal 74006 zcmd^I4U`ncou5Gv0xBQExlzHzs5u439cC965WQu01>&+UyUPMHAiXoSyA3_vLr)K| z-cx)JqwxdvAd&d-PI8Iy;|!;XK8R0FFTNA>iAJAMIS3kaxrFBh#k=a6uKri| zRPT1iD&J7S_tu5|*KGajSO2R2S5=)H{XrxWiMBP)PAg3@p}t&FXg9UG3-?Vm^ttg^js4%$>c+fg>uYhFL`@<-D-vB?f;6V*dy$pQDyg+f zFGiTcpO;2vOvzhDMzK)R{+;pZNeu&bU>1fX*3h=lg&OHQcH6@X3sAr2{bTa>GwnElq~hh9G=yL{f5$6K%YyA|p2&&J<-^Ss~fx%%FTw{H4;=Hey$zCY^j zsV3(T9E809Ir>0^B(#b*- zS+!uFL*R4H%t_lVX^u|N4oniRx7R;|p?Q_|~KP_tM1SZPp zNLg83&csU*T2R+8n_(D2MJVi2RZmQhwV7&0wbb<}2W#)G{rgK5)-NvaD!dY?^@9d} zxvs}ZfW8*H-i~_JoMrX{xv;TT`Ee3qd8u6y1X&QVtGE%{(Vw$W#c2fU=fTsy zc<{L&o~y0dGIM0hzLP#3zhJHY?77Ro{p0%ilk}tOUfKF1<&wxV$Iu&R|LVP$5B@P# zvvAv#!r~lu7OnYZ>bg>s` z8PugxGrQx7o}N^CdODr1i#t}M$Ddroo4Q6r(@@I7&TbAHxq2#Zn%E5oCSh@%=m2E5 z;7M#{S-YzT#9ao@Vay{{B+m;onY^WRYY1qLUUbk|anEMJbsNab^3?;u7DTd8Wo|X} z`AA15c3xfQ2K-i*GD8b_X=W)i;1&bD&~?L7idL7)DwtZ6U7$g&qJ#qE&OYhpV6;1lieJ@-#e!@pjUH0hM_|8%L62JUp_2k}Z+pCVmAKLlc zsXK;WeEyr)?lSg{KEC|+{cqKM*fQ(3=EmWNKbUjF1>@)L+r|L6oeNp`{!kyjl_cESM))NwVTmhsm^Tx;d7rcj$P%AJoU z3afQvD4&UVPzCqnU$04aeZBU*o1?ANr@{z@pWHKNDs`#48Sz<(T2xa%i{)f+j}O_t zAx_-bRgy4JU}BK?5G5w>Bq#A93M|mbb)s{R+!wlRf9XJ0^F|BlcKIolPz6JRMDE!w z_$dR4l(T;ij4N05;J$zqdhaeEpciBTv475Q%*X;_f2yDn;+`06Qk7oa$XRNtkO0Qj z$SI4Oc(7NJ#2~YQyo(A+3^HK@$y}Ege$`XXjz)LBP(crS1(e2B1qsVb?usDDf{5iF za_|uAYI5=P1aSPnM<+YwI3(mSP&=M5R5w#O(Jc;2x+PUyn*1DGx3CE4{$n79S;yg}sZ-HB_TmzpY05){a8 z!R76C;TCHZzlbrz1DeY_12W+ULC|y%YM*x+hDNRF1KZ~XVR@-$+2;kwf{5i_sYhFB z1?~2m=0Gp0)C*`LFUh1*F95h8s)br+Hr1-$3rjfA%(BcJad|0bS!NDsLG<=;-?2?) zgH0(^WB|Khm3^J;O(oLulA8>~EQnj~8Nw!qEjLgMnI@7UbVS0&ig(z_AAG06(CdTm zSg0%?nPdnZpg>*t0Dp*c`YG;e*{>@Ze8!H;wCcX$I7i-Araadyyjl0;1VV>^5qvd##Sy?g5E(Y2%m<$u6u5{qF@#g>o=eYPkt+F-6hs<0Pr%X4ilHucq^^9`>Yi9GmpIPgs#qUrgTsn zdCBe`1i2u#x!1>enRCr1u!Bi`oJUYzUP*nN2d*G8xmN%zywWZp%9=QpfQwFI^Gw6i zRM>doG6qrsz-$nf+`-GRNXDJ{Yswka5OrDHi~oI{w^MD7?z`G@#=av?H7P0n4{Q|H z?HGJ;NwIz4uYv&%Z}^88VD6a`AAqaWtUbmsZDB1UnG$vje)E=OCfL6R#x=b49b#O$ zm$LhM@6J{*)krD3SCZd2lG1VS=L;G??s<9KYf9N0Qg((GSKV5sp~2(?TZrW42WS>{ zWOqdHpA#zPK$gS-z?VaNh&TjySH}yX$;9`Mc}p>7y%=@;SK{gfG?ABX;_3td7eqC8 zSI66ZRy-KiO5*ASwUL)>;_3t;7sR#*>zG>4mnv4OkIv1*N={kFr48ienX=YPVGAOe zyFcrlq^`{a)l@lFp&5ql0h1;Ur+sa8UVW<>m3J0K|e=;yg0@y_Yb9`$AGIUP*cBBq<*+UO{|vzht1$YgZ@1@FABB z*guz-J96oPjZzR}SMlB?izX|qqi{g_RA-|oO7LW@vdRkEJUGkXElfcn_ieBhS+NC{ zm5qHXN8fh?&rOhR&?6`>i)0)0z!gL$_XvR7X?N*_*ba#R5E-5nR#yEdi2x9!Wv~~f z;FG(bLHb*IT=nHW)lR0H_!)j#o@`duvP%36KjJc24YR-s(aA-MO1T)Yw$eIj%gD>?sYp_mq$7JQbY*xkh6%ioV;9;vxqd> z6N$+Vgx@z*E$Z!9xZaXxlF0paFiFq~Vp53b*@4XUY6`U(D*ad`gz;$4la}SlXytmI zG~zN?4dZ!ozsTBNQ#y>)T0}3jVET-6;+2#bPcAFVTOk)&Q(()WF^rocBtp9sbvJ6N z=NVbhOgcjA3i70~vec4}(7JHTATx|kazE5!&p+Jh1xQIF6W;xWpaSS8In)x+geSq3 zrK{vnO91dPs1BpILJVC@HNH}GBV`_e+S29`k>g2fWoa#K=n}MLFd0T^xgS_@CL-BO z{VOr3EIF{kY`~M-%2HTzV1)_043fjBtB^PYo|uGWH-pBGGk~PLw9;_~z$=K)rMwFg z?8)eoxVrtAb1}e3uzJH@0dV4-0$v0lfv)hE4}>`F%ijgfXY7~NbFnUz!bgm#B1;Gj zxh|+rR$di!lb=4sz-sub4??iYKlD!e&Co!jy?lA|5dv9(a!yTTt5WHPEGE|^@++$FS#Gr z2UrlL+ygvxw;4}G!gfspJj@32(n|t7OxS`*=Kh)h)%iupQquM_udeRisZ}`@w&XPd zhPb>0lh*_opasz@QioX=NCCkN9fk(-Qq0g{fGvn*?stGv^Ru%*i&&Q;pAk9R(PVN5 zXka6G$tHJ_20|A^_$uB}Tnd1@RzpB=tP|%1DS0XFEWs*>L++tnyLLWr;#)g$-JhNI zhFy2dPp10LwfJS_<&%VV{fGszDqtxFR*T;)DqLPd(Yt!nl#-=5ppm>h!%`doT@c{{ z)wuYyBB(L&Ofobusf)7m(p##=MZ|(w&2isgomYPB`|9!4Z>Ce|n2RmZb4m|&&)=@! zOmmd^0|kS$hEsqVzgZ zi}petzjAG4-EG^Mq|5`YV5h}>i`U?vBJV`7{^GF^G)K4>o0A30&#oIufeAs1%>$aq z%RVVK4*)KRYGJ!KrrK2XoLxxgvJ55X{@oj-c@kV%h3Ed=8!(r_ZJ6?N?v=@8YPJ~O z=oxI@W6i0%c?FLeOvhs5322y;81+gm3 zi^i6i3NN%4U)04W8nqq+%YH99sI9!L`@QI(5fC&BbWvux7l-$5Jy^FV`%KT$R`N2R z9u&JE&c7nfhvYg~VkaqcofzuCnh$N|<$qw!hY=7o3;5^5oPEoy!^<+%#c!baZfQbL zBYAmu^I<{I1rg4_;D`yp^}4of{>(XY<`x{W8t^;y;uiR@ehmyN*CQ}1MD3sMFhYpp zH1CEXuZAr40tM>09(&<_ogTULCg_P8j)$KJ!%TS z@=ZB)U;s=TP#OH6An%OG{zc;;XkKtnT)7)Op3-_s%_>@Ksj8=q4b)tKeSsvdf?LVU zKS^8#V;96Z_o5*N0ypjosVY)5R4Oem$E0Ye6tf_1xo0Qbo)^AB_$_IVg%8U*$xbjE z$jdOvmM~!pBANU3YHsIUwLN3s5hv?Ju2&;6VG~U!-ff5Ex;KIp*bATQ3UN6e_c}0~ zDYkFiFW&ctFW3YF{QLPwo__nlh-frQ>cIT6JlTBe^E(d>+0=W}qz$w0c=zV|mnQBX zvJ3sJdgAKkm)^B!E1LA3`(C(g{DhC5y6n-h@tvdgC4TwI>dC#+wpSgAKeY3?Q+Eu% z`207o-DT_@eSG=t``@bjuw~Y5&5gqke=z5U3&zjgx%cQ@n~m)+eLBDG;Pzzt{i^$$ z-~H3ti>8d5|JZIc<>>Aa!&W{V9TAB{;=icxdTd5(U6j;;`4N}FY9ij`+r< zpQ7tXqgZCF!zI!@39is}xCC<<+=f|)`?#;eZqKh=k4#O;W>Fe;S-8vVEV529`31M)$#`Y0-6Z7~jJ*ub!>r-LHM~tR6-`4_@z0@g7dxhPkcN{sJo&Dy zwLD0}3Gy=74zr$fFV*+YS2xH3aV%1*?-P}mTT-g;11yMA?nxu6+lA$uwKbEZkzZC` zQc2Rtk5~|^0!`~8f;PjTmSoV@QqvmbN!NaM_f>F$-MAzXl9xs|E=iyYB9MQu%2e zlLjTyJSnX#hlkX^b(UZ*gWE8U4)@o$Jw10>g(3{{`Zg^WwghAF7bv?(Fo+sI7`gCe zNg-aLlWGEKE|5cV2kS7-atCzz>tY&I;V_viJCYr0GyoG(~snu=y zZcR;Hf%-d*wMd^EX7+QpHthW80?W!Su~bd9sORS)aYn2SpQyZR8nHHffPvD`#VKJZ z<^GDMMD&Ka=*x= zCBpo)VnxuefPoCZ4}?$;?p22N*eq)@QuwY{oq84+3~Ewk=n<4xF-Vo62QHAwRV%nZ zAzJ8kn_~5`D1|8Pnbf3R<`tKhSn`A@V~hmR%RQh6U5CZay$XQ@^jsl%sU!hC7pfov zxx2lE4rjE|<+e1)?h}=lOyc(X01Kj2h#`WzPHYi6a{~4yZHRb;<)xK2j69G95z9TE zVb4d#GCLCXPJUJ-i67wK3B$wHZtUP~fV)F;YybWyif2JjE)EU9VOd!GKtV&YjN6bn z@q>9vjtWV`8QD?P&%+MR4m&_LNHDsx&c(J;D9d0h%vsna+!)K`QiiFi)FGTz3-&qF zcm(-jSgr<-om@davW$W04&fE@o60(}au$AtO);s`=_5b*t>aOTqJAE=^CKjLYfo45 Xee^`ntF%%mfwAeaI6jumC!_NJ4>0IO literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.dgspec.json b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.dgspec.json new file mode 100644 index 0000000..dda5145 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj", + "projectName": "MS_MMI-Gemini", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.props b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.props new file mode 100644 index 0000000..120d227 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.targets b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/MS_MMI-Gemini.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.assets.json b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.assets.json new file mode 100644 index 0000000..1291cf1 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj", + "projectName": "MS_MMI-Gemini", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.nuget.cache b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.nuget.cache new file mode 100644 index 0000000..f6a5e37 --- /dev/null +++ b/Sources/Indicators/MS_MMI-Gemini/MS_MMI-Gemini/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "elBf61JcK4g2x3cqEBsppIXUJSF6GeLSDQQLuujEWh0gPIwtNN2wYTVF2iOPwt/aBLgdzQWsCtyEVbtTTANXcQ==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MS_MMI-Gemini\\MS_MMI-Gemini\\MS_MMI-Gemini.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/MS_Trend_BlackBook.algo b/Sources/Indicators/MS_Trend_BlackBook.algo new file mode 100644 index 0000000000000000000000000000000000000000..89d07ffe9cee7516250d6772e0082abc7ea8a430 GIT binary patch literal 9169 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 PQj5X6BLsG7-B;ZR2G9Wm literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/.vscode/tasks.json b/Sources/Indicators/MultiTimeframeSignalAggregator/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.sln b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.sln new file mode 100644 index 0000000..2cd43d9 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HmaSmaCrossoverSignal", "..\HmaSmaCrossoverSignal\HmaSmaCrossoverSignal\HmaSmaCrossoverSignal.csproj", "{e8c2d7a1-30b4-4506-8340-eb539cf7beb6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultiTimeframeSignalAggregator", "MultiTimeframeSignalAggregator\MultiTimeframeSignalAggregator.csproj", "{14f3d6c2-2294-4116-a68c-4e6230c98b1c}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {14f3d6c2-2294-4116-a68c-4e6230c98b1c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14f3d6c2-2294-4116-a68c-4e6230c98b1c}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14f3d6c2-2294-4116-a68c-4e6230c98b1c}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14f3d6c2-2294-4116-a68c-4e6230c98b1c}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal + diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.cs b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.cs new file mode 100644 index 0000000..c4a0132 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.cs @@ -0,0 +1,156 @@ +using System; +using cAlgo.API; +using cAlgo.API.Indicators; +// using cAlgo.API.Extensions; // Removed faulty namespace reference + +namespace cAlgo.Indicators +{ + // Aggregates signals from HmaSmaCrossoverSignal on two timeframes + [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class MultiTimeframeSignalAggregator : Indicator + { + [Parameter("HTF TimeFrame (B)", DefaultValue = "m2")] + public TimeFrame HtfTimeFrame { get; set; } + + [Parameter("HMA A Period (Fast)", DefaultValue = 20, Group = "Indicator Settings")] + public int HmaAPeriod { get; set; } + + [Parameter("HMA B Period (Slow)", DefaultValue = 250, Group = "Indicator Settings")] + public int HmaBPeriod { get; set; } + + [Parameter("SMA C Period (Base)", DefaultValue = 200, Group = "Indicator Settings")] + public int SmaCPeriod { get; set; } + + // Output for final Buy signals + [Output("Buy Signal", LineColor = "Yellow", PlotType = PlotType.Points, Thickness = 8)] + public IndicatorDataSeries BuySignal { get; set; } + + // Output for final Sell signals + [Output("Sell Signal", LineColor = "Red", PlotType = PlotType.Points, Thickness = 8)] + public IndicatorDataSeries SellSignal { get; set; } + + // Indicator A (Current Chart) + private HmaSmaCrossoverSignal _indicatorA; + + // Indicator B (Higher Timeframe) + private HmaSmaCrossoverSignal _indicatorB; + private Bars _htfBars; + + // State variables to track the last signal on the HTF + private DateTime _lastHtfBuyTime = DateTime.MinValue; + private DateTime _lastHtfSellTime = DateTime.MinValue; + private int _lastHtfIndexChecked = -1; + + protected override void Initialize() + { + // Get the Bars for the higher timeframe + _htfBars = MarketData.GetBars(HtfTimeFrame); + + // Initialize Indicator A (current timeframe) + _indicatorA = Indicators.GetIndicator(HmaAPeriod, HmaBPeriod, SmaCPeriod); + + // Initialize Indicator B (higher timeframe) + _indicatorB = Indicators.GetIndicator(_htfBars, HmaAPeriod, HmaBPeriod, SmaCPeriod); + } + + public override void Calculate(int index) + { + // Reset signals for the current bar (index) and the previous bar (index - 1) + // This handles the repainting nature of the underlying signal + BuySignal[index] = double.NaN; + SellSignal[index] = double.NaN; + if (index > 0) + { + BuySignal[index - 1] = double.NaN; + SellSignal[index - 1] = double.NaN; + } + + // Need at least 2 bars for index-1 signals + if (index < 2) + { + return; + } + + // --- 1. Update HTF (Indicator B) State --- + + // Manual replacement for GetIndexByTime + int htfIndex = GetHtfIndex(Bars.OpenTimes[index]); + if (htfIndex == -1) + { + // Not enough HTF data + return; + } + + // Scan HTF bars from where we left off up to the current htfIndex + // We scan efficiently, only checking new bars + int scanFromIndex = Math.Max(0, _lastHtfIndexChecked + 1); + int scanToIndex = htfIndex; + + for (int i = scanFromIndex; i <= scanToIndex; i++) + { + // The signal indicator needs at least 2 bars (i and i-1) to check for signals + if (i < 2) continue; + + // Check for confirmed signals at (i-1) + if (!double.IsNaN(_indicatorB.BuySignal[i - 1])) + { + _lastHtfBuyTime = _htfBars.OpenTimes[i - 1]; + } + if (!double.IsNaN(_indicatorB.SellSignal[i - 1])) + { + _lastHtfSellTime = _htfBars.OpenTimes[i - 1]; + } + } + // Remember how far we've scanned + _lastHtfIndexChecked = scanToIndex; + + // --- 2. Check Current TF (Indicator A) Signal --- + + // Get the confirmed signal from the *previous* bar (index - 1) + double currentBuySignal = _indicatorA.BuySignal[index - 1]; + double currentSellSignal = _indicatorA.SellSignal[index - 1]; + + bool hasCurrentBuy = !double.IsNaN(currentBuySignal); + bool hasCurrentSell = !double.IsNaN(currentSellSignal); + + if (!hasCurrentBuy && !hasCurrentSell) + { + // No signal on current TF + return; + } + + // --- 3. Apply Aggregation Logic --- + + // Buy signal: Current TF shows Buy AND the last HTF signal was also a Buy + if (hasCurrentBuy && (_lastHtfBuyTime > _lastHtfSellTime)) + { + // Place the signal at index - 1, using the value from Indicator A + BuySignal[index - 1] = currentBuySignal; + } + + // Sell signal: Current TF shows Sell AND the last HTF signal was also a Sell + if (hasCurrentSell && (_lastHtfSellTime > _lastHtfBuyTime)) + { + // Place the signal at index - 1, using the value from Indicator A + SellSignal[index - 1] = currentSellSignal; + } + } + + // Manual implementation of GetIndexByTime + // Finds the index of the bar that was open at the specified time + private int GetHtfIndex(DateTime time) + { + // Loop backwards for efficiency, assuming time is recent + for (int i = _htfBars.Count - 1; i >= 0; i--) + { + // If the bar's open time is at or before the requested time, this is the bar + if (_htfBars.OpenTimes[i] <= time) + { + return i; + } + } + // Time is before the first bar + return -1; + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.csproj b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.csproj new file mode 100644 index 0000000..74027d2 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator.csproj @@ -0,0 +1,12 @@ + + + + net6.0 + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..9e27e66 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs new file mode 100644 index 0000000..85f33e4 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MultiTimeframeSignalAggregator")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MultiTimeframeSignalAggregator")] +[assembly: System.Reflection.AssemblyTitleAttribute("MultiTimeframeSignalAggregator")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Von der MSBuild WriteCodeFragment-Klasse generiert. + diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache new file mode 100644 index 0000000..8edc280 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f0108d5c6b0163cb6f7beb9819d3362ef1dbdcd diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..e3c9e8a --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net10.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MultiTimeframeSignalAggregator +build_property.ProjectDir = c:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MultiTimeframeSignalAggregator\MultiTimeframeSignalAggregator\ diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GlobalUsings.g.cs b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GlobalUsings.g.cs new file mode 100644 index 0000000..ac22929 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net10.0/MultiTimeframeSignalAggregator.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs new file mode 100644 index 0000000..fd7866f --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MultiTimeframeSignalAggregator")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MultiTimeframeSignalAggregator")] +[assembly: System.Reflection.AssemblyTitleAttribute("MultiTimeframeSignalAggregator")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache new file mode 100644 index 0000000..8edc280 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f0108d5c6b0163cb6f7beb9819d3362ef1dbdcd diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..61ea2e1 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MultiTimeframeSignalAggregator +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Indicators\MultiTimeframeSignalAggregator\MultiTimeframeSignalAggregator\ diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.assets.cache b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..c6f45e39e1909a2a32b0b371c5f657f112b6d433 GIT binary patch literal 571 zcmWIWc6a1rU|{%qui{qUkHD`}|GZwg&U=Hnr(Els{(BMKW{IAA=f7eMnal`O1O*^w zptDs>XmM&$ag0+@X>M+6PK;h&X?ki&OhICDc4B&JaZGYaQDRDJkzQhHNq%l(NotIt zo`IgBNlZ>=QcPZIiJ6{3OtNE6dcK}xfTvzcP7X7Y=}bU2h|dDVtWa@e3giNTA)xq%oN@Ble{ex>fIB>|AI z^i09YE9acW6OWkD)?QE6UD qW^O8{bACakPkwS@4ogW+sUSbK*=-|>Mkg2>VCIA2ra+{d| literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.csproj.AssemblyReference.cache b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/Debug/net6.0/MultiTimeframeSignalAggregator.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.dgspec.json b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.dgspec.json new file mode 100644 index 0000000..a9d9750 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.dgspec.json @@ -0,0 +1,128 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "projectName": "HmaSmaCrossoverSignal", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + }, + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj", + "projectName": "MultiTimeframeSignalAggregator", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj": { + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.props b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.targets b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/MultiTimeframeSignalAggregator.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.assets.json b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.assets.json new file mode 100644 index 0000000..bc15bae --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.assets.json @@ -0,0 +1,162 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + }, + "HmaSmaCrossoverSignal/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v6.0", + "dependencies": { + "cTrader.Automate": "0.0.0" + }, + "compile": { + "bin/placeholder/HmaSmaCrossoverSignal.dll": {} + }, + "runtime": { + "bin/placeholder/HmaSmaCrossoverSignal.dll": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + }, + "HmaSmaCrossoverSignal/1.0.0": { + "type": "project", + "path": "../../HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.csproj", + "msbuildProject": "../../HmaSmaCrossoverSignal/HmaSmaCrossoverSignal/HmaSmaCrossoverSignal.csproj" + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "HmaSmaCrossoverSignal >= 1.0.0", + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj", + "projectName": "MultiTimeframeSignalAggregator", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj": { + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal\\HmaSmaCrossoverSignal.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.nuget.cache b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.nuget.cache new file mode 100644 index 0000000..14547d9 --- /dev/null +++ b/Sources/Indicators/MultiTimeframeSignalAggregator/MultiTimeframeSignalAggregator/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "l9ej8bY5Nt/RoGXI8NmU4NSEfOvDahP0rhvkoxUdx179x2+rf5i3gpg/Ke460Mq9eCvmMBPmNfVR12kmifXGaA==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Indicators\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator\\MultiTimeframeSignalAggregator.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Indicators/Parabolic Stop.algo b/Sources/Indicators/Parabolic Stop.algo new file mode 100644 index 0000000000000000000000000000000000000000..3f2709c730e1f9ff14a489ce0333d75538befee9 GIT binary patch literal 3415 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Parabolic Stop/Parabolic Stop.sln b/Sources/Indicators/Parabolic Stop/Parabolic Stop.sln new file mode 100644 index 0000000..76b2901 --- /dev/null +++ b/Sources/Indicators/Parabolic Stop/Parabolic Stop.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Parabolic Stop", "Parabolic Stop\Parabolic Stop.csproj", "{fbbf853c-ecf6-4c65-b8cf-c9b8291d74f7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {fbbf853c-ecf6-4c65-b8cf-c9b8291d74f7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {fbbf853c-ecf6-4c65-b8cf-c9b8291d74f7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {fbbf853c-ecf6-4c65-b8cf-c9b8291d74f7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {fbbf853c-ecf6-4c65-b8cf-c9b8291d74f7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.cs b/Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.cs new file mode 100644 index 0000000..fbe35a5 --- /dev/null +++ b/Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.cs @@ -0,0 +1,74 @@ +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class ParabolicStop : Indicator + { + + [Parameter("Start", DefaultValue = 0.02)] + public double Start { get; set; } + + [Parameter("Maximum", DefaultValue = 0.2)] + public double Maximum { get; set; } + + [Parameter("Length", DefaultValue = 20)] + public int Length { get; set; } + + [Parameter("Multiplier", DefaultValue = 4)] + public int Multiplier { get; set; } + + private ParabolicSAR _sar; + private SimpleMovingAverage _smaClose; + private AverageTrueRange _atr; + + private double _max; + private double _min; + private bool _isUptrend; + private double _vstop; + bool isUptrendPrev; + double vstopPrev; + + // Erstelle die IndicatorDataSeries mit Output-Attribut und LineColor + [Output("Stop Line", LineColor = "Aqua", PlotType = PlotType.Line)] + public IndicatorDataSeries _stopLine { get; set; } + + [Output("SMA Line", LineColor = "White", PlotType = PlotType.Line)] + public IndicatorDataSeries _smaLine { get; set; } + + protected override void Initialize() + { + _sar = Indicators.ParabolicSAR(Bars, Start, Maximum); + _smaClose = Indicators.SimpleMovingAverage(Bars.ClosePrices, 3 * Length); + _atr = Indicators.AverageTrueRange(Bars, Length, MovingAverageType.Exponential); + + } + + public override void Calculate(int index) + { + double smaClose = _smaClose.Result[index]; + + double max1 = System.Math.Max(_max, Bars.ClosePrices[index]); + double min1 = System.Math.Min(_min, Bars.ClosePrices[index]); + + double stop = isUptrendPrev ? max1 - Multiplier * _atr.Result[index] : min1 + Multiplier * _atr.Result[index]; + + double vstop1 = isUptrendPrev ? System.Math.Min(System.Math.Max(vstopPrev, stop), _sar.Result[index]) : System.Math.Max(System.Math.Min(vstopPrev, stop), _sar.Result[index]); + + isUptrendPrev = _isUptrend; + _isUptrend = Bars.ClosePrices[index] - vstop1 >= 0; + bool isTrendChanged = _isUptrend != isUptrendPrev; + + _max = isTrendChanged ? Bars.ClosePrices[index] : max1; + _min = isTrendChanged ? Bars.ClosePrices[index] : min1; + + vstopPrev = _vstop; + _vstop = isTrendChanged ? (_isUptrend ? System.Math.Max(_max - Multiplier * _atr.Result[index], _sar.Result[index]) : System.Math.Min(_min + Multiplier * _atr.Result[index], _sar.Result[index])) : vstop1; + + _stopLine[index] = _vstop; + _smaLine[index] = smaClose; + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.csproj b/Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/Parabolic Stop/Parabolic Stop/Parabolic Stop.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Indicators/Sample Alligator.algo b/Sources/Indicators/Sample Alligator.algo new file mode 100644 index 0000000000000000000000000000000000000000..c01e571c2909229fee8c4787fd9b74731f4ef1c9 GIT binary patch literal 4304 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Sample Alligator/Sample Alligator.sln b/Sources/Indicators/Sample Alligator/Sample Alligator.sln new file mode 100644 index 0000000..b8e84c1 --- /dev/null +++ b/Sources/Indicators/Sample Alligator/Sample Alligator.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Alligator", "Sample Alligator\Sample Alligator.csproj", "{D11E711B-6CE5-42A2-BD07-F25907198272}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D11E711B-6CE5-42A2-BD07-F25907198272}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D11E711B-6CE5-42A2-BD07-F25907198272}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D11E711B-6CE5-42A2-BD07-F25907198272}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D11E711B-6CE5-42A2-BD07-F25907198272}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F5EF3993-F32A-48D0-A3D9-C1F8B25B02A8} + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.cs b/Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.cs new file mode 100644 index 0000000..6dece75 --- /dev/null +++ b/Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.cs @@ -0,0 +1,63 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AutoRescale = false, AccessRights = AccessRights.None)] + public class SampleAlligator : Indicator + { + [Parameter("Periods", Group = "Jaws", DefaultValue = 13)] + public int JawsPeriods { get; set; } + + [Parameter("Shift", Group = "Jaws", DefaultValue = 8)] + public int JawsShift { get; set; } + + [Parameter("Periods", Group = "Teeth", DefaultValue = 8)] + public int TeethPeriods { get; set; } + + [Parameter("Shift", Group = "Teeth", DefaultValue = 5)] + public int TeethShift { get; set; } + + [Parameter("Periods", Group = "Lips", DefaultValue = 5)] + public int LipsPeriods { get; set; } + + [Parameter("Shift", Group = "Lips", DefaultValue = 3)] + public int LipsShift { get; set; } + + [Output("Jaws", LineColor = "Blue")] + public IndicatorDataSeries Jaws { get; set; } + + [Output("Teeth", LineColor = "Red")] + public IndicatorDataSeries Teeth { get; set; } + + [Output("Lips", LineColor = "Lime")] + public IndicatorDataSeries Lips { get; set; } + + private WellesWilderSmoothing jawsMa; + private WellesWilderSmoothing teethMa; + private WellesWilderSmoothing lipsMa; + + protected override void Initialize() + { + jawsMa = Indicators.WellesWilderSmoothing(Bars.MedianPrices, JawsPeriods); + teethMa = Indicators.WellesWilderSmoothing(Bars.MedianPrices, TeethPeriods); + lipsMa = Indicators.WellesWilderSmoothing(Bars.MedianPrices, LipsPeriods); + } + + public override void Calculate(int index) + { + Jaws[index + JawsShift] = jawsMa.Result[index]; + Teeth[index + TeethShift] = teethMa.Result[index]; + Lips[index + LipsShift] = lipsMa.Result[index]; + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.csproj b/Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.csproj new file mode 100644 index 0000000..6d836c9 --- /dev/null +++ b/Sources/Indicators/Sample Alligator/Sample Alligator/Sample Alligator.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample Bears Power.algo b/Sources/Indicators/Sample Bears Power.algo new file mode 100644 index 0000000000000000000000000000000000000000..7421891b3ce6f4853bae39a96561fecc3b755fb0 GIT binary patch literal 4040 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 uj1J`0okGL6au!ItInQ>+285Za#`ky%fL?n literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Sample Bears Power/Sample Bears Power.sln b/Sources/Indicators/Sample Bears Power/Sample Bears Power.sln new file mode 100644 index 0000000..eae0b40 --- /dev/null +++ b/Sources/Indicators/Sample Bears Power/Sample Bears Power.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Bears Power", "Sample Bears Power\Sample Bears Power.csproj", "{A47D013C-CD13-4116-B515-982BB6DB8193}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A47D013C-CD13-4116-B515-982BB6DB8193}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A47D013C-CD13-4116-B515-982BB6DB8193}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A47D013C-CD13-4116-B515-982BB6DB8193}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A47D013C-CD13-4116-B515-982BB6DB8193}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A737E7DA-C31D-464C-A4C9-2892B58E2BD2} + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.cs b/Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.cs new file mode 100644 index 0000000..dfad65d --- /dev/null +++ b/Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.cs @@ -0,0 +1,42 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Indicator(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleBearsPower : Indicator + { + [Parameter("Source")] + public DataSeries Source { get; set; } + + [Parameter(DefaultValue = 13, MinValue = 2)] + public int Periods { get; set; } + + [Parameter("MA Type", DefaultValue = MovingAverageType.Exponential)] + public MovingAverageType MAType { get; set; } + + [Output("Result", LineColor = "Orange", PlotType = PlotType.Histogram)] + public IndicatorDataSeries Result { get; set; } + + private MovingAverage movingAverage; + + protected override void Initialize() + { + movingAverage = Indicators.MovingAverage(Source, Periods, MAType); + } + + public override void Calculate(int index) + { + Result[index] = Bars.LowPrices[index] - movingAverage.Result[index]; + } + } +} diff --git a/Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.csproj b/Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.csproj new file mode 100644 index 0000000..6d836c9 --- /dev/null +++ b/Sources/Indicators/Sample Bears Power/Sample Bears Power/Sample Bears Power.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample Bulls Power.algo b/Sources/Indicators/Sample Bulls Power.algo new file mode 100644 index 0000000000000000000000000000000000000000..ea487dc623dc9b86c97d96bb68cca21272570d9e GIT binary patch literal 4043 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Sample Bulls Power/Sample Bulls Power.sln b/Sources/Indicators/Sample Bulls Power/Sample Bulls Power.sln new file mode 100644 index 0000000..61afa95 --- /dev/null +++ b/Sources/Indicators/Sample Bulls Power/Sample Bulls Power.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Bulls Power", "Sample Bulls Power\Sample Bulls Power.csproj", "{DEFFA144-B39B-4DC8-89F6-79B28D235012}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DEFFA144-B39B-4DC8-89F6-79B28D235012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEFFA144-B39B-4DC8-89F6-79B28D235012}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEFFA144-B39B-4DC8-89F6-79B28D235012}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEFFA144-B39B-4DC8-89F6-79B28D235012}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8BE518C6-1636-48D4-BA7A-CAE50E5D6353} + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.cs b/Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.cs new file mode 100644 index 0000000..a3f006a --- /dev/null +++ b/Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.cs @@ -0,0 +1,42 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; +using cAlgo.API.Indicators; + +namespace cAlgo +{ + [Indicator(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SampleBullsPower : Indicator + { + [Parameter("Source")] + public DataSeries Source { get; set; } + + [Parameter(DefaultValue = 13, MinValue = 2)] + public int Periods { get; set; } + + [Parameter("MA Type", DefaultValue = MovingAverageType.Exponential)] + public MovingAverageType MAType { get; set; } + + [Output("Result", LineColor = "Orange", PlotType = PlotType.Histogram)] + public IndicatorDataSeries Result { get; set; } + + private MovingAverage movingAverage; + + protected override void Initialize() + { + movingAverage = Indicators.MovingAverage(Source, Periods, MAType); + } + + public override void Calculate(int index) + { + Result[index] = Bars.HighPrices[index] - movingAverage.Result[index]; + } + } +} diff --git a/Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.csproj b/Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.csproj new file mode 100644 index 0000000..6d836c9 --- /dev/null +++ b/Sources/Indicators/Sample Bulls Power/Sample Bulls Power/Sample Bulls Power.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample DeMarker.algo b/Sources/Indicators/Sample DeMarker.algo new file mode 100644 index 0000000000000000000000000000000000000000..b8c3b8a82e9b0b493e9cce10b9f1383209e7ccb0 GIT binary patch literal 3790 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 + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample EMA.algo b/Sources/Indicators/Sample EMA.algo new file mode 100644 index 0000000000000000000000000000000000000000..eb998ca44f582edaf6a33edc10ee3968d1548578 GIT binary patch literal 2499 zcmV;!2|V^;Y-eu*0007pABzY80000001AXuO^@0z5WQFGe~9Q6ki$lRkT@V%s;H$! zh2^kS4QU>_Z>S4gpjg9Ldm@6vFFVjzkU7`1dY*wtw3oeMPm>&!ZvA> zM$;opwg+wK{@{QP=|nB^&?4cIbO)q2h)BEB>4qfiKj-`@ryK3Ku}E1$jZ{SoPf^R9ap{u`+SewCmQ7w1)k< zx<`PdW{`Vmi1u;6W-zwgSOr4?)+oxG!Q8GnOTNKzDR&@-?f|9S&TP+8_`FZcaS4g_ z&sR{K9uYFiLK&F@8buhofr?99wF%`gSCFvW+}9<4hgaafaepqs6-zE5_q3Y83&nG+ zD7XGtm`Ya*KW8e$nNUL)fEL#u6q#Ke71GUY)RFvXm4>4vK=XgK%$O+ZXm!G<7xf>y zQU5ycjQ%S)XG*W?5pY8tHtz`)MjvPt3j-S{T{5)-;lwbBt-G&KJ?oA{bsnJyx@Mdi z*R^Y>WVhGIWOw!rya1DhvWQQP@27VF009600|1`AE#$EV0000001(og91-A*rHve9 z5(@cR$OeH1&V&N!I1iM=daBZthh0CBBPgUfvQ<_dZzdXPe1T*CjkjHwQI1Iz8Td8u zcuPJW@efttJN~v!006jVl53iv_gkAeCliSL2`7Y(Z7t*AD8^_gQ5;Z|MqDM#jYBuX zh+P~N%0=COfQPq`pirVd>bA*dgIP+zC=a)ts>}c@<~5qDLbIv@tGpvM2!rd}j`t;O zJ`a0sG12(0C!tc;0rZJLWwD9H*4y=UyA5rAMZ7%ioAC!%O5$D{P6Jf$EXR29WQK%h z$+7Ldh;3XNB!NiSo&B1zSwiNdgUdph5W{VKV5sqw;h0ZdV;2o*qhpB#rwLOnC&K`J zgqMv$lBPGSFD8TitIOq`Zr5+z+V9>q^)ZZAV1Jh{%GO=E#~t%xN24$qd&ai+SoIUd zkl5Pdzbg)HwK?l+&Tv51;Ojr9hl97l1gHl|%6l{s{$Nzn$bwBbTS!X=ATIUHdM~Ds zDfW4N^*_(xM-p;tN|SvEz1?3JUc-s+hmD+lPBd=)h)vBIbuT|LH6U<x*@#N0|=;lFihCSuIakoj{#Rn7^E2794NGyy8)Etw~;PBk3jdhUP80cTz zc){JIm$c-hv~Cz)k`+p54VJnGK_vhOgSD>ZyZ zuVht=Q*!aNdbtXM&6>)lC|cTWumpOAcL*2bRPqL0f^xOuz${i;R*p{;)d4I|yU)PmAt zyi1HIr!3_e%`2f)YHut(oP_u?-Lc0P-V}Vbb5OwY?`4)s{l=XdG=BVW_o0P+92awX zpw{6$#IO8d(z`ZOPuy=w8w|C>@DmHhk54DH9=(Q8Fcmr`>x(meBrwjK(djv)ahQH9(lBqz5MmB|*kAibcHm zHt+PBXGRf=hUc7i_l$9LF;v6;xJ1G5;u=P3kV&<~DseXp88KWi7y^7tx*q>sYm`#~ zNzdDOhrJUbgkai)!YeoOwDtz1l_~qgh_s0V;-CQo?Bmusrlj`@Bp`?FA7MW{q{Yreq@3*LBl2hk}(eF=m z0Y>OoU%r!tX+H#D61&f8(ZTXI)jj^2oO>!U7F0zx!3f`V-;l|mH)|4=hAY!F zCV18>WjK}#vm(c!V5P{_{aNR22xCo)j1#x;F)(i|+K5nXx|2&8oWztu?#O7|BDf<%WI}*{+hHx6sU8OBHH6 NsIgUL8Y2usF+|*7$zcEh literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Sample EMA/Sample EMA.sln b/Sources/Indicators/Sample EMA/Sample EMA.sln new file mode 100644 index 0000000..bd79b9f --- /dev/null +++ b/Sources/Indicators/Sample EMA/Sample EMA.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample EMA", "Sample EMA\Sample EMA.csproj", "{F76AABC5-E32A-4B1F-9FBF-EAA686B5F769}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F76AABC5-E32A-4B1F-9FBF-EAA686B5F769}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F76AABC5-E32A-4B1F-9FBF-EAA686B5F769}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F76AABC5-E32A-4B1F-9FBF-EAA686B5F769}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F76AABC5-E32A-4B1F-9FBF-EAA686B5F769}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {244A7EFF-8CB3-4A89-A5CB-E9224A234C17} + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.cs b/Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.cs new file mode 100644 index 0000000..f51e502 --- /dev/null +++ b/Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.cs @@ -0,0 +1,43 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AutoRescale = false, AccessRights = AccessRights.None)] + public class SampleEMA : Indicator + { + [Parameter("Source")] + public DataSeries Source { get; set; } + + [Parameter("Periods", DefaultValue = 14)] + public int Periods { get; set; } + + [Output("Main", LineColor = "Turquoise")] + public IndicatorDataSeries Result { get; set; } + + private double exp; + + protected override void Initialize() + { + exp = 2.0 / (Periods + 1); + } + + public override void Calculate(int index) + { + var previousValue = Result[index - 1]; + + if (double.IsNaN(previousValue)) + Result[index] = Source[index]; + else + Result[index] = Source[index] * exp + previousValue * (1 - exp); + } + } +} diff --git a/Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.csproj b/Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.csproj new file mode 100644 index 0000000..6d836c9 --- /dev/null +++ b/Sources/Indicators/Sample EMA/Sample EMA/Sample EMA.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample Envelopes Cloud.algo b/Sources/Indicators/Sample Envelopes Cloud.algo new file mode 100644 index 0000000000000000000000000000000000000000..7236bdd8ac52f9069f5186a82b3c3a56e524875e GIT binary patch literal 4115 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 + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample Price Channels.algo b/Sources/Indicators/Sample Price Channels.algo new file mode 100644 index 0000000000000000000000000000000000000000..b68b6241501d9427ce1dd4d6c9edd1b43de3f4cc GIT binary patch literal 3861 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 XF($7;NC>%-_}WmWgtW9ul^8lni|B8O literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Sample Price Channels/Sample Price Channels.sln b/Sources/Indicators/Sample Price Channels/Sample Price Channels.sln new file mode 100644 index 0000000..7428ac6 --- /dev/null +++ b/Sources/Indicators/Sample Price Channels/Sample Price Channels.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample Price Channels", "Sample Price Channels\Sample Price Channels.csproj", "{352AA4CE-9530-4132-B500-F2809A0EEBB7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {352AA4CE-9530-4132-B500-F2809A0EEBB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {352AA4CE-9530-4132-B500-F2809A0EEBB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {352AA4CE-9530-4132-B500-F2809A0EEBB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {352AA4CE-9530-4132-B500-F2809A0EEBB7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AE838552-C7FC-4153-AD99-5C69B0E8E315} + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.cs b/Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.cs new file mode 100644 index 0000000..8f4f1a9 --- /dev/null +++ b/Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.cs @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using System; +using cAlgo.API; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AutoRescale = false, AccessRights = AccessRights.None)] + public class SamplePriceChannels : Indicator + { + [Parameter(DefaultValue = 20)] + public int Periods { get; set; } + + [Output("Upper", LineColor = "Pink")] + public IndicatorDataSeries Upper { get; set; } + + [Output("Lower", LineColor = "Pink")] + public IndicatorDataSeries Lower { get; set; } + + [Output("Center", LineColor = "Pink")] + public IndicatorDataSeries Center { get; set; } + + public override void Calculate(int index) + { + double upper = double.MinValue; + double lower = double.MaxValue; + + for (int i = index - Periods; i <= index - 1; i++) + { + upper = Math.Max(Bars.HighPrices[i], upper); + lower = Math.Min(Bars.LowPrices[i], lower); + } + + Upper[index] = upper; + Lower[index] = lower; + Center[index] = (upper + lower) / 2; + } + } +} diff --git a/Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.csproj b/Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.csproj new file mode 100644 index 0000000..6d836c9 --- /dev/null +++ b/Sources/Indicators/Sample Price Channels/Sample Price Channels/Sample Price Channels.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample Reference SMA.algo b/Sources/Indicators/Sample Reference SMA.algo new file mode 100644 index 0000000000000000000000000000000000000000..157bf47b19790d16717b294bf9b1f41e21572752 GIT binary patch literal 6052 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

    L+6etHPQZ-7H@{Y^V%A}Co^FmgF4Sagj z+QZ^Ij8riuaGW*{>V&olVvVxRoHv~JdvK)NQ*QKwUSL1Z8(7jAmQg$pQYd4VOYw>|mc*3xB|6$u&1qpQ8hrA0 zT%37tHkc7gkB<4N`JK%C@{RIIPqUgVx4OTwL#un^>{k+#|e3ZtAoCR<;g`I2IE1G^+Bz*&$eLXg=Gf1!X>W!@S)j?PI8obBN{> z*_fLbjkZSZIzr-o2LFFmegVc_V_a|>vD6>S6LNZY>0S7W7+)(%gV{vBjx4DFeJ1bc zpJ$)#6StA<_B=N)L6iDQ)(TfL)q*5iAP}J2V7*MB93=iPX3X&5!Xt&1V$HEkKZsS7 z30{L<1A8jP$6>vkb`DgF7ASo0>tN_4U_1|hAd>ScnNX3jz_IU*h4{B!1^k+pzVCG+a zf5Utg%KDRtB6$F8OHS+FUjGQf1PFZiD)#NojoGV3C*&Pu>rWs>*B)}TKzbF4{sDMMWuj8YMX9O0HO*k zgUyJrkB}t;IXX`L6~=|$(4%-W$OyDtN99F4*yn+8sN}1`D=x~}PV>IuyoL{35z-9* z_mvkuP6Wa*(Cdq)sYN}Lre=)40mG^_{4%FSiu$J7_LDX3unks>JOc{yV>OJPOlcTC z;iS@lZ1JxCf;pf{%(a#wB3RBsrr&uY>?o1hBh>#^rTJ2C1Qi-HBMeP+XGO0NxcSb4 zYN22m!9Z;ZCTDMHcnb=Rihbg=W&u@WGHvXl0$5e|&_hZJznYj@FSBehA{Qlld>PaQ z(9EXdOvkv=s=FQRN=xIXeN9!2Js~}HJFO49<2oXzq5$^2jd$pN2%(5BVk*kMOEOaa zPcuG-zXf{UHyaa58$XKaFrZ`cAvIiE!Bc7<=o@D~T}U9dtjv1;JQ1#Cq_%Uob(Jz1 z8s+6vZwoX4MFLLVs@LFVHrA2_9*lcL5IuBPm6vPKf$hG->l*DIiMd|>k2DxsKO}Jv z#2YdaKV+ujbXg72jOaW$So&@xU{?qt2E(g|59DVJ2sYx*i>Y*Tr)+{J9q`QOb4?cX zbk`Xa7Qb31E!XX@h)d&QqVp;_WzVylQ1}z*ylfY)-)s|$VM6?dA(Source, SmaPeriod); + } + + public override void Calculate(int index) + { + refSMA[index] = sma.Result[index]; + } + } +} diff --git a/Sources/Indicators/Sample Reference SMA/Sample Reference SMA/Sample Reference SMA.csproj b/Sources/Indicators/Sample Reference SMA/Sample Reference SMA/Sample Reference SMA.csproj new file mode 100644 index 0000000..eaf6065 --- /dev/null +++ b/Sources/Indicators/Sample Reference SMA/Sample Reference SMA/Sample Reference SMA.csproj @@ -0,0 +1,13 @@ + + + net6.0 + + + + + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample SMA.algo b/Sources/Indicators/Sample SMA.algo new file mode 100644 index 0000000000000000000000000000000000000000..28fe32fc2fb97e98db58416710b1a6c2b2a37499 GIT binary patch literal 3604 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 literal 0 HcmV?d00001 diff --git a/Sources/Indicators/Sample SMA/Sample SMA.sln b/Sources/Indicators/Sample SMA/Sample SMA.sln new file mode 100644 index 0000000..1305b29 --- /dev/null +++ b/Sources/Indicators/Sample SMA/Sample SMA.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31729.503 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample SMA", "Sample SMA\Sample SMA.csproj", "{A84A345B-D154-47A0-B384-D178681525D7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A84A345B-D154-47A0-B384-D178681525D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A84A345B-D154-47A0-B384-D178681525D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A84A345B-D154-47A0-B384-D178681525D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A84A345B-D154-47A0-B384-D178681525D7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4C1B609B-0732-4915-AC38-A0C170900740} + EndGlobalSection +EndGlobal diff --git a/Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.cs b/Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.cs new file mode 100644 index 0000000..7889bf2 --- /dev/null +++ b/Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.cs @@ -0,0 +1,36 @@ +// ------------------------------------------------------------------------------------------------- +// +// This code is a cTrader Automate API example. +// +// All changes to this file might be lost on the next application update. +// If you are going to modify this file please make a copy using the "Duplicate" command. +// +// ------------------------------------------------------------------------------------------------- + +using cAlgo.API; + +namespace cAlgo +{ + [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AutoRescale = false, AccessRights = AccessRights.None)] + public class SampleSMA : Indicator + { + [Parameter("Source")] + public DataSeries Source { get; set; } + + [Parameter(DefaultValue = 14)] + public int Periods { get; set; } + + [Output("Main", LineColor = "Turquoise")] + public IndicatorDataSeries Result { get; set; } + + public override void Calculate(int index) + { + var sum = 0.0; + + for (var i = index - Periods + 1; i <= index; i++) + sum += Source[i]; + + Result[index] = sum / Periods; + } + } +} diff --git a/Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.csproj b/Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.csproj new file mode 100644 index 0000000..6d836c9 --- /dev/null +++ b/Sources/Indicators/Sample SMA/Sample SMA/Sample SMA.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/Sample Standard Deviation.algo b/Sources/Indicators/Sample Standard Deviation.algo new file mode 100644 index 0000000000000000000000000000000000000000..b8df7c28d9d8d64fa93eaff456bd177580c0dbc9 GIT binary patch literal 4104 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 + + net6.0 + + + + + + \ No newline at end of file diff --git a/Sources/Indicators/SmaHmaCrossoverAlert.algo b/Sources/Indicators/SmaHmaCrossoverAlert.algo new file mode 100644 index 0000000000000000000000000000000000000000..02032c4f15d454537eb1739fe6cfa02883f37cf3 GIT binary patch literal 3571 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 smaPrev; + bool isSmaFalling = smaCurr < smaPrev; + + // Condition 2: Crossover + // CrossUp: Previous HMA was below/equal SMA, Current HMA is above SMA + bool isCrossUp = (hmaPrev <= smaPrev) && (hmaCurr > smaCurr); + + // CrossDown: Previous HMA was above/equal SMA, Current HMA is below SMA + bool isCrossDown = (hmaPrev >= smaPrev) && (hmaCurr < smaCurr); + + // Signal Evaluation + if ((isSmaRising) && (isCrossUp)) + { + PlayAlert(index); + } + else if ((isSmaFalling) && (isCrossDown)) + { + PlayAlert(index); + } + } + + private void PlayAlert(int index) + { + _lastAlertBarIndex = index; + + // Try/Catch block to prevent indicator crash if file is missing + try + { + Notifications.PlaySound(SoundFilePath); + } + catch (Exception ex) + { + Print("Error playing sound: {0}", ex.Message); + } + } + } +} \ No newline at end of file diff --git a/Sources/Indicators/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert.csproj b/Sources/Indicators/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Indicators/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert/SmaHmaCrossoverAlert.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Plugins/MS_StartAllBots.algo b/Sources/Plugins/MS_StartAllBots.algo new file mode 100644 index 0000000000000000000000000000000000000000..71e4831a8d972ecb8afbfd42b83510467f4a1940 GIT binary patch literal 2688 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. + //var chartFrames = ChartManager; + + // Iterate through each chart frame. + foreach (var frame in ChartManager) + { + if( frame is ChartFrame ) + { + var chartFrame = frame as ChartFrame; + + // Each ChartFrame has a Chart property. + var chart = chartFrame.Chart; + + // It's good practice to ensure the chart object is not null. + if (chart != null) + { + // Access all cBot instances (IChartRobot) attached to the current chart. + // Chart.Robots returns an IReadOnlyList. + var chartRobots = chart.Robots; + + // Iterate through each cBot instance on the current chart. + foreach (var chartRobot in chartRobots) + { + // Check if the cBot's template name matches the target name + // and if the cBot instance is not currently running. + if (chartRobot.Name == TargetBotName) + { + RobotState state = chartRobot.State; + if( state == RobotState.Stopped ) + { + var ppath = chartRobot.Parameters.First( p => p.Name == "DirectoryName" ); + if( ppath != null ) + { + ppath.Value = "\\\\COFFEE\\TickData\\Pepperstone"; + chartRobot.Start(); + } + } + } + } + } + } + } + } + + protected override void OnStop() + { + // Handle Plugin stop here if needed. + } + } +} \ No newline at end of file diff --git a/Sources/Plugins/MS_StartAllBots/MS_StartAllBots/MS_StartAllBots.csproj b/Sources/Plugins/MS_StartAllBots/MS_StartAllBots/MS_StartAllBots.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Plugins/MS_StartAllBots/MS_StartAllBots/MS_StartAllBots.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Plugins/Webhook.algo b/Sources/Plugins/Webhook.algo new file mode 100644 index 0000000000000000000000000000000000000000..26cd160fd45cd931317bef19fb7e4544d049d7b5 GIT binary patch literal 5759 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 netsh http add urlacl url=http://+:80/ctrader user=RAKI\Brummel + +2. Windows Defender Firewall, Outgoing Rules: + New rule, Ports-->TCP-->local port = 80, remote ports = all + +3. FritzBox: + New "MyFritz-Freigabe", HTTP-Server, Deviceport 80, external port 80, Folder "ctrader" + +Result: +Webhook in Tradingview: http://raki.1k9zmiax0jpc2iys.myfritz.net:80/ctrader +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Resources; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Globalization; +using System.Text.Json; +using cAlgo.API; +using cAlgo.API.Collections; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; + +namespace cAlgo.Plugins; + +[Plugin(AccessRights = AccessRights.FullAccess)] +public class Webhook : Plugin +{ + private HttpListener listener; + private string lastMsg = ""; + private bool msgProcessed = false; + private readonly CancellationTokenSource cancellationTokenSource = new(); + private Task task; + private TradeInfo tradeInfo; + private Symbol symbol; + private readonly List charts = new(); + + private class TradeInfo + { + public string Symbol { get; set; } + public double StopLoss { get; set; } + public int Risk { get; set; } + public double Buy { get; set; } + public double Sell { get; set; } + public double Open { get; set; } + public double Low { get; set; } + public double High { get; set; } + public double Close { get; set; } + public DateTime ReceiveTime { get; set; } + public List Charts { get; set; } + } + + protected override void OnStart() + { + listener = new HttpListener(); + //listener.Prefixes.Add("http://localhost:3000/"); + listener.Prefixes.Add("http://+:80/ctrader/"); + listener.Start(); + + var cancellationToken = cancellationTokenSource.Token; + + task = Task.Run(() => + { + while( !cancellationToken.IsCancellationRequested ) + { + // Wait for a request to come in + var context = listener.GetContext(); + var request = context.Request; + + // Read the request body + using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) + { + string m = reader.ReadToEnd(); + + Monitor.Enter(this); + try + { + if( m != lastMsg ) + { + lastMsg = m; + msgProcessed = false; + } + } + finally + { + Monitor.Exit(this); + } + } + + // Send a response + var response = context.Response; + response.StatusCode = 200; + response.ContentType = "text/plain"; + var buffer = Encoding.UTF8.GetBytes("OK - cTrader"); + response.ContentLength64 = buffer.Length; + response.OutputStream.Write(buffer, 0, buffer.Length); + response.OutputStream.Close(); + } + }, cancellationToken); + + Timer.Start(TimeSpan.FromSeconds(1)); + Positions.Opened += (a) => { UpdateStops(); }; + } + + protected override void OnTimer() + { + ProcessMsg(); + } + + protected override void OnStop() + { + Timer.Stop(); + cancellationTokenSource.Cancel(); + task.Wait(); + listener.Stop(); + } + + protected bool UpdateTradeInfo() + { + string m = ""; + + Monitor.Enter(this); + try + { + if( !msgProcessed ) + { + msgProcessed = true; + m = lastMsg; + } + } + finally + { + Monitor.Exit(this); + } + + if( m== "" ) + return false; + + Print( "Received: {0}", m ); + tradeInfo = JsonSerializer.Deserialize(m); + tradeInfo.ReceiveTime = DateTime.Now; + symbol = Symbols.GetSymbol(tradeInfo.Symbol); + if( symbol == null ) + { + Print( "Error: unknown symbol {0}", tradeInfo.Symbol ); + return false; + } + + tradeInfo.StopLoss = Math.Round( tradeInfo.StopLoss, symbol.Digits ); + tradeInfo.Buy = Math.Round( tradeInfo.Buy, symbol.Digits ); + tradeInfo.Sell = Math.Round( tradeInfo.Sell, symbol.Digits ); + + charts.Clear(); + foreach (var frame in ChartManager) + if (frame is ChartFrame chartFrame) + if( chartFrame.Chart.Symbol == symbol ) + charts.Add( chartFrame.Chart ); + + foreach (var chart in charts ) + chart.DrawStaticText("Message", tradeInfo.ReceiveTime.ToString("HH:mm:ss")+ ": "+m, VerticalAlignment.Top, HorizontalAlignment.Right, chart.ColorSettings.ForegroundColor); + + return true; + } + + protected void ProcessMsg() + { + if( UpdateTradeInfo() ) + { + foreach (var chart in charts ) + { + chart.DrawHorizontalLine( "SL", tradeInfo.StopLoss, Color.White ); + if( tradeInfo.Buy > 0 ) + chart.DrawIcon("Buy" + chart.Bars.Count, ChartIconType.UpArrow, chart.Bars.Count - 1, chart.Bars.ClosePrices[chart.Bars.Count - 1], Color.Green); + if( tradeInfo.Sell > 0 ) + chart.DrawIcon("Sell" + chart.Bars.Count, ChartIconType.DownArrow, chart.Bars.Count - 1, chart.Bars.ClosePrices[chart.Bars.Count - 1], Color.Red); + } + + ManageOrders(); + UpdateStops(); + } + } + + private PendingOrder pendingOrder; + + private double CalculateVolume(double StopLoss) + { + var maxAmountRisked = Account.Equity * ((double)tradeInfo.Risk / 100); + return symbol.NormalizeVolumeInUnits(maxAmountRisked / (StopLoss/symbol.PipSize * symbol.PipValue), RoundingMode.Down); + + } + + protected void ManageOrders() + { + return; + + if( Positions.Count > 0 || tradeInfo.Symbol != "GER40" ) + return; + + if( tradeInfo.Buy > 0 ) + { + double buyPrice = Math.Round( tradeInfo.Buy+symbol.Spread, symbol.Digits ); + double stopLossPrice = Math.Round( tradeInfo.StopLoss-symbol.Spread, symbol.Digits ); + + if( pendingOrder != null ) + if( pendingOrder.TradeType != TradeType.Buy || pendingOrder.TargetPrice != buyPrice ) + { + pendingOrder.Cancel(); + pendingOrder = null; + } + + if( pendingOrder == null ) + { + TradeResult tradeResult = PlaceStopOrder( + TradeType.Buy, tradeInfo.Symbol, + 2, // CalculateVolume( buyPrice-stopLossPrice ), + buyPrice, "Managed long", + (buyPrice-stopLossPrice)/symbol.PipSize, null); + + if( tradeResult.IsSuccessful ) + pendingOrder = tradeResult.PendingOrder; + } + } + else if( tradeInfo.Sell > 0 ) + { + double sellPrice = Math.Round( tradeInfo.Sell-symbol.Spread, symbol.Digits ); + double stopLossPrice = Math.Round( tradeInfo.StopLoss+symbol.Spread, symbol.Digits ); + + if( pendingOrder != null ) + if( pendingOrder.TradeType != TradeType.Sell || pendingOrder.TargetPrice != sellPrice ) + { + pendingOrder.Cancel(); + pendingOrder = null; + } + + if( pendingOrder == null ) + { + TradeResult tradeResult = PlaceStopOrder( + TradeType.Sell, tradeInfo.Symbol, + 2, // CalculateVolume( stopLossPrice-sellPrice ), + sellPrice, "Managed short", + (stopLossPrice-sellPrice)/symbol.PipSize, null); + + if( tradeResult.IsSuccessful ) + pendingOrder = tradeResult.PendingOrder; + } + } + } + + protected void UpdateStops() + { + foreach (var position in Positions) + { + if (position.Symbol != symbol) + continue; + + if( position.TradeType == TradeType.Buy ) + { + double sl = Math.Round( tradeInfo.StopLoss-symbol.Spread, symbol.Digits ); + + if( !position.StopLoss.HasValue || position.StopLoss < sl ) + ModifyPosition(position, sl, position.TakeProfit); +/* + if( tradeInfo.Close < sl ) + { + position.Close(); + continue; + } + + double be = Math.Round( position.EntryPrice+symbol.Spread, symbol.Digits ); + double sl_be = Math.Min( sl, be ); + + if( !position.StopLoss.HasValue || position.StopLoss < sl_be ) + ModifyPosition(position, sl_be, position.TakeProfit); +*/ +} + else + { + double sl = Math.Round( tradeInfo.StopLoss+symbol.Spread, symbol.Digits ); + + if( !position.StopLoss.HasValue || position.StopLoss > sl ) + ModifyPosition(position, sl, position.TakeProfit); +/* + if( tradeInfo.Close > sl ) + { + position.Close(); + continue; + } + + double be = Math.Round( position.EntryPrice-symbol.Spread, symbol.Digits ); + double sl_be = Math.Max( sl, be ); + + if( !position.StopLoss.HasValue || position.StopLoss > sl_be ) + ModifyPosition(position, sl_be, position.TakeProfit); +*/ + } + } + } +} \ No newline at end of file diff --git a/Sources/Plugins/Webhook/Webhook/Webhook.csproj b/Sources/Plugins/Webhook/Webhook/Webhook.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Plugins/Webhook/Webhook/Webhook.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/HMACrossBot.algo b/Sources/Robots/HMACrossBot.algo new file mode 100644 index 0000000000000000000000000000000000000000..adfe42e8958da65bc5cdd9b13597a5543cf073f4 GIT binary patch literal 4245 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 SlowHmaPeriod) + { + Print("Error: Fast HMA Period must be less than Slow HMA Period for this logic."); + Stop(); + return; + } + + _fastHma = Indicators.HullMovingAverage(Bars.ClosePrices, FastHmaPeriod); + _slowHma = Indicators.HullMovingAverage(Bars.ClosePrices, SlowHmaPeriod); + + // Generate a unique label for this cBot instance + _botLabel = $"HMACrossBot_{SymbolName}_{TimeFrame}_{InstanceId}"; + } + + // Main logic executed at the close of each bar + protected override void OnBar() + { + // Ensure we have enough data to calculate HMA direction + if (_slowHma.Result.Count < 3) + { + return; + } + + // --- 1. Get HMA values --- + // Use index 1 (the most recently closed bar) as OnBar fires at the close. + double fastHmaCurrent = _fastHma.Result.Last(1); + double slowHmaCurrent = _slowHma.Result.Last(1); + double slowHmaPrevious = _slowHma.Result.Last(2); + + // --- 2. Check Exit Conditions (Close First) --- + + // Close all LONG positions if fast HMA crosses below or equals slow HMA + if (fastHmaCurrent <= slowHmaCurrent) + { + ClosePositions(TradeType.Buy); + } + + // Close all SHORT positions if fast HMA crosses above or equals slow HMA + // (Corrected: Use TradeType.Sell, not .Short) + if (fastHmaCurrent >= slowHmaCurrent) + { + ClosePositions(TradeType.Sell); + } + + // --- 3. Check Entry Conditions (Open After) --- + + // Get current positions count (check only positions managed by this bot) + int longPositionsCount = Positions.Count(p => p.Label == _botLabel && p.SymbolName == SymbolName && p.TradeType == TradeType.Buy); + // (Corrected: Use TradeType.Sell, not .Short) + int shortPositionsCount = Positions.Count(p => p.Label == _botLabel && p.SymbolName == SymbolName && p.TradeType == TradeType.Sell); + + // LONG Entry: fast > slow AND slow is rising + if ((fastHmaCurrent > slowHmaCurrent) && (slowHmaCurrent > slowHmaPrevious)) + { + if (longPositionsCount < MaxPositions) + { + ExecuteTrade(TradeType.Buy); + } + } + + // SHORT Entry: fast < slow AND slow is falling + if ((fastHmaCurrent < slowHmaCurrent) && (slowHmaCurrent < slowHmaPrevious)) + { + if (shortPositionsCount < MaxPositions) + { + // (Corrected: Use TradeType.Sell, not .Short) + ExecuteTrade(TradeType.Sell); + } + } + } + + // Helper to execute a trade with normalized volume + private void ExecuteTrade(TradeType tradeType) + { + // Normalize volume to the symbol's requirements + double volumeToTrade = Symbol.NormalizeVolumeInUnits(VolumeInUnits, RoundingMode.ToNearest); + + // Ensure minimum volume is met + if (volumeToTrade < Symbol.VolumeInUnitsMin) + { + volumeToTrade = Symbol.VolumeInUnitsMin; + } + + ExecuteMarketOrder(tradeType, SymbolName, volumeToTrade, _botLabel); + } + + // Helper to close all positions of a specific type + private void ClosePositions(TradeType tradeType) + { + // Find all positions for the specified trade type and label + // (Corrected: Removed 'IsClosing' check, as it's not on Position interface) + var positionsToClose = Positions + .Where(p => p.Label == _botLabel && + p.SymbolName == SymbolName && + p.TradeType == tradeType) + .ToList(); + + foreach (var position in positionsToClose) + { + // Asynchronously close each position + ClosePositionAsync(position); + } + } + + protected override void OnStop() + { + // cBot is stopping + } + + protected override void OnTick() + { + // All logic is handled OnBar in this strategy + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/HMACrossBot.csproj b/Sources/Robots/HMACrossBot/HMACrossBot/HMACrossBot.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/HMACrossBot.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfo.cs b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfo.cs new file mode 100644 index 0000000..9731d22 --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HMACrossBot")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HMACrossBot")] +[assembly: System.Reflection.AssemblyTitleAttribute("HMACrossBot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfoInputs.cache b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..92984ff --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f7a58568308eab12ad2da8f697114353004279fa diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..1172ac7 --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HMACrossBot +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\HMACrossBot\HMACrossBot\ diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.assets.cache b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..8e381370bbaf5739561735a1355899c234dc53fe GIT binary patch literal 571 zcmWIWc6a1rU|?8KY^9SFxoAP@v_I2V)E9ew6Y=}Da!pY2nZ3Q!^0Q9%PG$ruf&vgT z(Ag>`v^ce>IL4`{G&eUjCq^%?G(EK>rXVpnJ25@AI3~HIC^03qNH4LpBtJK?BsIoR z&p^-6Bqk>_DJCzq#7xg1CfPA3Jzvi;z*8?JCx;oybS5Ah#Ag9wR;V~K1#*EvatOo% zN2moL1t1AUf=&ae1OeK3gbiXi*mQJ{faKVLm;;D8ffy9@+(3*Bcz_%}zf$+qk^o3p zdZu9bRTx=53>XcW`FU)R0Ok!yEXnZ9gX)z42Dd&Wxb;zjo71tlIJG3CvLKbcs5Gx6 pGdGpfIlrLNCqFqchoz*bG*!qYwYVfRFR=t@bZ}`B$W&ew696|2np*$> literal 0 HcmV?d00001 diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.csproj.AssemblyReference.cache b/Sources/Robots/HMACrossBot/HMACrossBot/obj/Debug/net6.0/HMACrossBot.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.dgspec.json b/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..eb178b0 --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj", + "projectName": "HMACrossBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.props b/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.targets b/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/HMACrossBot.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/project.assets.json b/Sources/Robots/HMACrossBot/HMACrossBot/obj/project.assets.json new file mode 100644 index 0000000..5e04cdc --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj", + "projectName": "HMACrossBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HMACrossBot/HMACrossBot/obj/project.nuget.cache b/Sources/Robots/HMACrossBot/HMACrossBot/obj/project.nuget.cache new file mode 100644 index 0000000..271cf55 --- /dev/null +++ b/Sources/Robots/HMACrossBot/HMACrossBot/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "K2rUaOKUIqRJ+x6ANzVtKPk1+58QBQ2T6CNqLozyqXgru9j1i7/TzPvsHUDY/xQrYcV+KOxXpy8WirqosKokuQ==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HMACrossBot\\HMACrossBot\\HMACrossBot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/Hma20CandleStartegy_V1.algo b/Sources/Robots/Hma20CandleStartegy_V1.algo new file mode 100644 index 0000000000000000000000000000000000000000..135d0fcf18b3d7f4bdc0df56a8f925e0064b79a9 GIT binary patch literal 3829 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/Hma20CandleStartegy_V1/.vscode/tasks.json b/Sources/Robots/Hma20CandleStartegy_V1/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.sln b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.sln new file mode 100644 index 0000000..50c5570 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hma20CandleStartegy_V1", "Hma20CandleStartegy_V1\Hma20CandleStartegy_V1.csproj", "{f2e9a40a-78e5-4641-8770-59be963064e1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {f2e9a40a-78e5-4641-8770-59be963064e1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {f2e9a40a-78e5-4641-8770-59be963064e1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {f2e9a40a-78e5-4641-8770-59be963064e1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {f2e9a40a-78e5-4641-8770-59be963064e1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.cs b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.cs new file mode 100644 index 0000000..c4e3568 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.cs @@ -0,0 +1,130 @@ +using cAlgo.API; +using cAlgo.API.Indicators; +using System; + +namespace cAlgo.Robots +{ + // A simple trading strategy based on HMA slope and candle patterns. + [Robot(AccessRights = AccessRights.None)] + public class HmaBiasStrategy : Robot + { + [Parameter("HMA Period", DefaultValue = 20, Group = "Parameters")] + public int HmaPeriod { get; set; } + + [Parameter("ATR Period", DefaultValue = 14, Group = "Parameters")] + public int AtrPeriod { get; set; } + + [Parameter("ATR Multiplier for SL", DefaultValue = 4.0, Group = "Parameters")] + public double AtrMultiplier { get; set; } + + [Parameter("Volume (Units)", DefaultValue = 10000, MinValue = 1000, Group = "Parameters")] + public double VolumeInUnits { get; set; } + + [Parameter("Wick Ratio (Lower > Upper * Ratio)", DefaultValue = 2.0, Group = "Parameters")] + public double WickRatio { get; set; } + + [Parameter("Trade Label", DefaultValue = "HmaBiasStrategy", Group = "Parameters")] + public string Label { get; set; } + + // Hull Moving Average for trend direction and momentum. + private HullMovingAverage _hma; + // Average True Range for Stop Loss calculation. + private AverageTrueRange _atr; + + // Holds the currently open position. + private Position _position; + // Tracks the bar index when a position was opened. + private int _entryBarIndex; + + // Initialize indicators and state variables. + protected override void OnStart() + { + _hma = Indicators.HullMovingAverage(Bars.ClosePrices, HmaPeriod); + _atr = Indicators.AverageTrueRange(AtrPeriod, MovingAverageType.Simple); + _position = null; + _entryBarIndex = -1; + } + + // Main logic, executed on every bar close. + protected override void OnBar() + { + // First, check if we need to close the existing position. + if ((_position != null) && (Bars.Count - 1 > _entryBarIndex)) + { + ClosePosition(_position); + _position = null; + } + + // If no position is open, check for a new entry signal. + if (_position == null) + { + // Ensure we have enough data for the lookback. + if (Bars.Count < HmaPeriod + 5) + { + return; + } + + // --- Bias Calculation on PREVIOUS bar --- + var hmaPrev = _hma.Result.Last(2); + var hmaPrev2 = _hma.Result.Last(3); + var hmaPrev3 = _hma.Result.Last(4); + + var slopeOnPrevBar = hmaPrev - hmaPrev2; + var slopeOnPrevBar2 = hmaPrev2 - hmaPrev3; + + // Check if the bias was bullish on the bar that just closed before this one. + bool previousBarHadBullishBias = (slopeOnPrevBar > 0) && (slopeOnPrevBar > slopeOnPrevBar2); + + if (previousBarHadBullishBias) + { + // --- Signal Check on CURRENT bar --- + var currentBar = Bars.LastBar; + var previousBar = Bars.Last(1); // This is the bar that had the bias + bool signalTriggered = false; + + // Signal 1: Current bar's close is above the previous bar's high. + if (currentBar.Close > previousBar.High) + { + signalTriggered = true; + } + + // Signal 2: Current bar is a bullish candle with a long lower wick. + bool isBullishCandle = currentBar.Close > currentBar.Open; + if ((!signalTriggered) && (isBullishCandle)) + { + double lowerWick = currentBar.Open - currentBar.Low; + double upperWick = currentBar.High - currentBar.Close; + if (lowerWick > (upperWick * WickRatio)) + { + signalTriggered = true; + } + } + + // --- Execute Trade --- + if (signalTriggered) + { + var volumeInUnits = Symbol.NormalizeVolumeInUnits(VolumeInUnits, RoundingMode.ToNearest); + var stopLossPips = _atr.Result.LastValue * AtrMultiplier / Symbol.PipSize; + var result = ExecuteMarketOrder(TradeType.Buy, Symbol.Name, volumeInUnits, Label, stopLossPips, null); + + if (result.IsSuccessful) + { + _position = result.Position; + _entryBarIndex = Bars.Count - 1; + } + } + } + } + } + + // Ensure any open position is closed when the cBot stops. + protected override void OnStop() + { + if (_position != null) + { + ClosePosition(_position); + _position = null; + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.csproj b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfo.cs b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfo.cs new file mode 100644 index 0000000..d4bfd27 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Hma20CandleStartegy_V1")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("Hma20CandleStartegy_V1")] +[assembly: System.Reflection.AssemblyTitleAttribute("Hma20CandleStartegy_V1")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfoInputs.cache b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfoInputs.cache new file mode 100644 index 0000000..66c1358 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ae0e2f4e15affc77969c0b7d1a4875435b51d9bc diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..2e081dd --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Hma20CandleStartegy_V1 +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\Hma20CandleStartegy_V1\Hma20CandleStartegy_V1\ diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.assets.cache b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..c3001a0173891766041379c658be0aed70e77f4b GIT binary patch literal 571 zcmWIWc6a1rU|>+}nUIxIyRRU5L#8puYW`5`(!OPrx(^b$);@^ceQQezDD z4D<|*V{$T+V)9Z;%=8Rmk{xr>^Yt79JoQp?a+r}!X9BW8d=?;Pg^D9nAQuQEhd?ZF zgjxVn0FqE7=roW@5TK1m*dT_3O-J_#NRAzdIe?fGh(STm4aCTR2gu>`D|JsT34ny9 zX9|X2g^}gMfYFedpT`CXVBUblk_^v0s9p(RaO*>YTOTF3IUS3OQ%gcB3sTvOO7luG pb5l8;^9w3{@{<#DSW1dYQ-xeoi%T-|5=($a2bU&+Oyxx}0RSOfm-qkx literal 0 HcmV?d00001 diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.csproj.AssemblyReference.cache b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Debug/net6.0/Hma20CandleStartegy_V1.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..bea28c323a0363787640e14f59334fb06bc2078b GIT binary patch literal 73772 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 {h#(tlbWSgjBL&r;5ot^2vss5*9FW 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 + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.13 + + \ No newline at end of file diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Hma20CandleStartegy_V1.csproj.nuget.g.targets b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Hma20CandleStartegy_V1.csproj.nuget.g.targets new file mode 100644 index 0000000..13634e8 --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/Hma20CandleStartegy_V1.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.assets.json b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.assets.json new file mode 100644 index 0000000..d4c456d --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.13": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.13": { + "sha512": "teFQQhvFb8/1XQsvvGXNlUIkwZ6Ab+FZHqJ8kXiR2AW8IJA0EIue2dRHNglmlRdqSwnMhocSS9EkPZBTXxsHLQ==", + "type": "package", + "path": "ctrader.automate/1.0.13", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.13.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1.csproj", + "projectName": "Hma20CandleStartegy_V1", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.nuget.cache b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.nuget.cache new file mode 100644 index 0000000..7ae9eae --- /dev/null +++ b/Sources/Robots/Hma20CandleStartegy_V1/Hma20CandleStartegy_V1/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "KAVywmsuuoI+N5Yoz0EqytZDCBvv/kG4rq4cxtRVij8d4jb5sQvxFq6zhsdVSKst9ebEbkC7kERvAUjuJ6BsPw==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1\\Hma20CandleStartegy_V1.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.13\\ctrader.automate.1.0.13.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot.algo b/Sources/Robots/HmaClusterBot.algo new file mode 100644 index 0000000000000000000000000000000000000000..c70f58cb275540282dc98937fd83764c35c33e51 GIT binary patch literal 13784 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 OdpM2+15fOvGxIJcYq_!j literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaClusterBot/.vscode/tasks.json b/Sources/Robots/HmaClusterBot/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/HmaClusterBot/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot.sln b/Sources/Robots/HmaClusterBot/HmaClusterBot.sln new file mode 100644 index 0000000..da49bf6 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HmaClusterBot", "HmaClusterBot\HmaClusterBot.csproj", "{5ca67298-283e-4125-b2b7-5ca1cceeb315}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5ca67298-283e-4125-b2b7-5ca1cceeb315}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5ca67298-283e-4125-b2b7-5ca1cceeb315}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5ca67298-283e-4125-b2b7-5ca1cceeb315}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5ca67298-283e-4125-b2b7-5ca1cceeb315}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs b/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs new file mode 100644 index 0000000..6a1f1b9 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.cs @@ -0,0 +1,936 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; + +namespace cAlgo.Robots +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class HmaClusterBot : Robot + { + #region Parameters + + [Parameter("Symbols (CSV)", DefaultValue = "", Group = "Multi Symbol")] + public string SymbolsCsv { get; set; } + + [Parameter("Risk % of Balance", DefaultValue = 1.0, MinValue = 0.1, MaxValue = 10.0, Group = "Risk")] + public double RiskPercent { get; set; } + + [Parameter("Entry Significance %", DefaultValue = 20.0, MinValue = 1.0, Group = "Thresholds")] + public double EntrySigThreshold { get; set; } + + [Parameter("Stop Loss Significance %", DefaultValue = 10.0, MinValue = 1.0, Group = "Thresholds")] + public double SlSigThreshold { get; set; } + + [Parameter("SMA Bias Period", DefaultValue = 200, Group = "Bias")] + public int SmaBiasPeriod { get; set; } + + [Parameter("HMA Bias Period", DefaultValue = 250, Group = "Bias")] + public int HmaBiasPeriod { get; set; } + + [Parameter("Use Bias Deviation Filter", DefaultValue = true, Group = "Bias Filter")] + public bool UseBiasDeviationFilter { get; set; } + + [Parameter("Bias Deviation Avg Period", DefaultValue = 500, Group = "Bias Filter")] + public int BiasDeviationAvgPeriod { get; set; } + + [Parameter("Use Dynamic Position Management", DefaultValue = true, Group = "Management")] + public bool UseDynamicPositionManagement { get; set; } + + [Parameter("Close Profit on Bias Flip", DefaultValue = false, Group = "Management")] + public bool CloseProfitOnBiasFlip { get; set; } + + [Parameter("HMA Cluster Period", DefaultValue = 25, Group = "Clusters")] + public int HmaClusterPeriod { get; set; } + + [Parameter("Cluster Max Points", DefaultValue = 2000, Group = "Clusters")] + public int MaxPoints { get; set; } + + [Parameter("Cluster Decay (Bars)", DefaultValue = 1000, Group = "Clusters")] + public int DecayPeriod { get; set; } + + // --- Telegram Parameters --- + [Parameter("Send Telegram Only", DefaultValue = false, Group = "Telegram")] + public bool SendTelegramOnly { get; set; } + + [Parameter("Telegram Bot Token", DefaultValue = "", Group = "Telegram")] + public string TelegramBotToken { get; set; } + + [Parameter("Telegram Chat ID", DefaultValue = "", Group = "Telegram")] + public string TelegramChatId { get; set; } + + #endregion + + private readonly List _strategies = new List(); + private static readonly HttpClient _httpClient = new HttpClient(); + + protected override void OnStart() + { + try + { + if (string.IsNullOrWhiteSpace(SymbolsCsv)) + { + Print("CSV is empty. Running in Single-Symbol Mode on Chart Symbol."); + + var config = new StrategyConfig + { + SymbolName = SymbolName, + EntrySigThreshold = EntrySigThreshold, + SlSigThreshold = SlSigThreshold, + SmaBiasPeriod = SmaBiasPeriod, + HmaBiasPeriod = HmaBiasPeriod, + HmaClusterPeriod = HmaClusterPeriod, + UseBiasDeviationFilter = UseBiasDeviationFilter, + BiasDeviationAvgPeriod = BiasDeviationAvgPeriod, + UseDynamicPositionManagement = UseDynamicPositionManagement, + CloseProfitOnBiasFlip = CloseProfitOnBiasFlip, + SendTelegramOnly = SendTelegramOnly, + RiskPercent = RiskPercent, + MaxPoints = MaxPoints, + DecayPeriod = DecayPeriod + }; + + var strategy = new ClusterStrategy(this, Symbol, Bars, config, _httpClient, TelegramBotToken, TelegramChatId, BroadcastError); + _strategies.Add(strategy); + strategy.Start(); + } + else + { + Print("CSV detected. Running in Multi-Symbol Mode."); + ParseCsvAndCreateStrategies(); + } + } + catch (Exception ex) + { + BroadcastError($"CRITICAL STARTUP ERROR: {ex.Message}"); + Stop(); + } + } + + protected override void OnStop() + { + foreach (var strategy in _strategies) + { + strategy.Stop(); + } + } + + protected override void OnError(Error error) + { + BroadcastError($"TRADING ERROR [{error.Code}]: {error.ToString}"); + } + + public void BroadcastError(string message) + { + Print(message); + + if (!string.IsNullOrWhiteSpace(TelegramBotToken) && !string.IsNullOrWhiteSpace(TelegramChatId)) + { + string formattedMsg = $"⚠️ ERROR @ {DateTime.UtcNow:HH:mm:ss} UTC\n\n{message}"; + _ = SendTelegramRawAsync(TelegramBotToken, TelegramChatId, formattedMsg); + } + } + + private async Task SendTelegramRawAsync(string token, string chatId, string message) + { + try + { + string url = $"https://api.telegram.org/bot{token}/sendMessage?chat_id={chatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + await _httpClient.GetAsync(url); + } + catch (Exception ex) + { + Print("FAILED TO SEND TELEGRAM ERROR: " + ex.Message); + } + } + + private void ParseCsvAndCreateStrategies() + { + var normalizedCsv = SymbolsCsv.Replace("\n", ",").Replace("\r", ","); + + var tokens = normalizedCsv.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(t => t.Trim()) + .Where(t => !string.IsNullOrEmpty(t)) + .ToArray(); + + int paramsPerSymbol = 10; + + if (tokens.Length % paramsPerSymbol != 0) + { + string err = $"CSV Token count ({tokens.Length}) is not a multiple of {paramsPerSymbol}. Check format."; + BroadcastError(err); + } + + for (int i = 0; i < tokens.Length; i += paramsPerSymbol) + { + if (i + paramsPerSymbol > tokens.Length) break; + + string symName = tokens[i]; + + try + { + Symbol symbol = Symbols.GetSymbol(symName); + if (symbol == null) + { + BroadcastError($"Symbol '{symName}' not found in cTrader."); + continue; + } + + Bars bars = MarketData.GetBars(TimeFrame, symName); + + var config = new StrategyConfig + { + SymbolName = symName, + EntrySigThreshold = double.Parse(tokens[i + 1], CultureInfo.InvariantCulture), + SlSigThreshold = double.Parse(tokens[i + 2], CultureInfo.InvariantCulture), + SmaBiasPeriod = int.Parse(tokens[i + 3], CultureInfo.InvariantCulture), + HmaBiasPeriod = int.Parse(tokens[i + 4], CultureInfo.InvariantCulture), + HmaClusterPeriod = int.Parse(tokens[i + 5], CultureInfo.InvariantCulture), + UseBiasDeviationFilter = bool.Parse(tokens[i + 6]), + BiasDeviationAvgPeriod = int.Parse(tokens[i + 7], CultureInfo.InvariantCulture), + UseDynamicPositionManagement = bool.Parse(tokens[i + 8]), + SendTelegramOnly = bool.Parse(tokens[i + 9]), + + // Defaults from global params + CloseProfitOnBiasFlip = CloseProfitOnBiasFlip, + RiskPercent = RiskPercent, + MaxPoints = MaxPoints, + DecayPeriod = DecayPeriod + }; + + var strategy = new ClusterStrategy(this, symbol, bars, config, _httpClient, TelegramBotToken, TelegramChatId, BroadcastError); + _strategies.Add(strategy); + strategy.Start(); + + Print("Initialized Strategy for {0}", symName); + } + catch (Exception ex) + { + BroadcastError($"Config Error for '{symName}': {ex.Message}"); + } + } + } + } + + public class StrategyConfig + { + public string SymbolName { get; set; } + public double EntrySigThreshold { get; set; } + public double SlSigThreshold { get; set; } + public int SmaBiasPeriod { get; set; } + public int HmaBiasPeriod { get; set; } + public int HmaClusterPeriod { get; set; } + public bool UseBiasDeviationFilter { get; set; } + public int BiasDeviationAvgPeriod { get; set; } + public bool UseDynamicPositionManagement { get; set; } + public bool CloseProfitOnBiasFlip { get; set; } + public bool SendTelegramOnly { get; set; } + public double RiskPercent { get; set; } + public int MaxPoints { get; set; } + public int DecayPeriod { get; set; } + } + + public class ClusterStrategy + { + #region Types & Fields + + private enum PointType { Peak, Trough } + private enum Bias { Long, Short, Neutral } + + private struct ExtremumPoint + { + public double Price; + public int Index; + public PointType Type; + } + + public struct ClusterLevel + { + public double Price; + public double Significance; + } + + private readonly Robot _robot; + private readonly Symbol _symbol; + private readonly Bars _bars; + private readonly StrategyConfig _config; + private readonly HttpClient _httpClient; + private readonly string _botToken; + private readonly string _chatId; + private readonly Action _errorCallback; + + private SimpleMovingAverage _smaBias; + private HullMovingAverage _hmaBias; + private HullMovingAverage _hmaCluster; + + private readonly Queue _deviationQueue = new Queue(); + private double _runningDeviationSum; + + private bool _deviationConditionMetInCurrentCycle; + private bool _isTradingAllowedBasedOnPrevCycle; + + private readonly List _extremaPoints = new(); + private readonly List _amplitudes = new(); + + private double _trendExtremum; + private int _trendExtremumIndex; + private double _lastExtremumPrice; + private bool? _isUpTrend; + private double _currentDynamicRange; + + private const string Label = "HmaClusterBot"; + + #endregion + + public ClusterStrategy( + Robot robot, + Symbol symbol, + Bars bars, + StrategyConfig config, + HttpClient httpClient, + string token, + string chatId, + Action errorCallback) + { + _robot = robot; + _symbol = symbol; + _bars = bars; + _config = config; + _httpClient = httpClient; + _botToken = token; + _chatId = chatId; + _errorCallback = errorCallback; + } + + public void Start() + { + int requiredBars = Math.Max(_config.SmaBiasPeriod, _config.HmaBiasPeriod); + requiredBars = Math.Max(requiredBars, _config.BiasDeviationAvgPeriod) + 10; + + while (_bars.Count < requiredBars) + { + int loaded = _bars.LoadMoreHistory(); + if (loaded == 0) + { + _errorCallback?.Invoke($"Not enough history for {_config.SymbolName}. Loaded: {_bars.Count}, Req: {requiredBars}"); + return; + } + } + + _smaBias = _robot.Indicators.SimpleMovingAverage(_bars.ClosePrices, _config.SmaBiasPeriod); + _hmaBias = _robot.Indicators.HullMovingAverage(_bars.ClosePrices, _config.HmaBiasPeriod); + _hmaCluster = _robot.Indicators.HullMovingAverage(_bars.ClosePrices, _config.HmaClusterPeriod); + + _currentDynamicRange = 5.0 * _symbol.PipSize; + _deviationConditionMetInCurrentCycle = false; + _isTradingAllowedBasedOnPrevCycle = false; + + int startIndex = Math.Max(_config.SmaBiasPeriod, _config.HmaBiasPeriod); + startIndex = Math.Max(startIndex, _config.BiasDeviationAvgPeriod); + + for (int i = startIndex; i < _bars.Count; i++) + { + UpdateFilterState(i); + UpdateClusterData(i); + } + + _bars.BarOpened += OnBarOpened; + } + + public void Stop() + { + _bars.BarOpened -= OnBarOpened; + } + + private void OnBarOpened(BarOpenedEventArgs obj) + { + try + { + int index = _bars.Count - 2; + if (index < _config.BiasDeviationAvgPeriod) return; + + UpdateFilterState(index); + UpdateClusterData(index); + + var clusters = CalculateClusters(index); + + // 1. Dynamic SL/TP Management + if (!_config.SendTelegramOnly && _config.UseDynamicPositionManagement && clusters.Count >= 2) + { + ManagePositions(clusters); + } + + var currentBias = GetCurrentBias(index); + + // 2. Check for Profit Close on Bias Flip + if (!_config.SendTelegramOnly && _config.CloseProfitOnBiasFlip) + { + CloseReversedPositions(currentBias); + } + + // 3. New Entry Logic with FIXED Orphan-Cleanup and Validations + ManageOrders(currentBias, index, clusters); + } + catch (Exception ex) + { + _errorCallback?.Invoke($"Runtime Error ({_config.SymbolName}): {ex.Message}\n{ex.StackTrace}"); + } + } + + private void CloseReversedPositions(Bias currentBias) + { + if (currentBias == Bias.Neutral) return; + + foreach (var pos in _robot.Positions) + { + if (pos.SymbolName != _config.SymbolName || pos.Label != Label) continue; + if (pos.NetProfit <= 0) continue; + + bool close = false; + + if (currentBias == Bias.Short && pos.TradeType == TradeType.Buy) + close = true; + else if (currentBias == Bias.Long && pos.TradeType == TradeType.Sell) + close = true; + + if (close) + { + var result = _robot.ClosePosition(pos); + if (result.IsSuccessful) + { + string msg = $"🔒 CLOSE PROFIT (Bias Flip) @ {_config.SymbolName}\n" + + $"Profit: {pos.NetProfit:F2}"; + _ = SendTelegramMessageAsync(msg); + } + } + } + } + + private void UpdateFilterState(int index) + { + double currHma = _hmaBias.Result[index]; + double currSma = _smaBias.Result[index]; + double prevHma = _hmaBias.Result[index - 1]; + double prevSma = _smaBias.Result[index - 1]; + + double currentBiasDeviation = Math.Abs(currHma - currSma); + + _deviationQueue.Enqueue(currentBiasDeviation); + _runningDeviationSum += currentBiasDeviation; + + if (_deviationQueue.Count > _config.BiasDeviationAvgPeriod) + { + double removed = _deviationQueue.Dequeue(); + _runningDeviationSum -= removed; + } + + double averageDeviation = (_deviationQueue.Count > 0) + ? _runningDeviationSum / _deviationQueue.Count + : 0.0; + + bool currHmaAbove = currHma > currSma; + bool prevHmaAbove = prevHma > prevSma; + + if (currHmaAbove != prevHmaAbove) + { + _isTradingAllowedBasedOnPrevCycle = _deviationConditionMetInCurrentCycle; + _deviationConditionMetInCurrentCycle = false; + } + + if (currentBiasDeviation > averageDeviation) + { + _deviationConditionMetInCurrentCycle = true; + } + } + + private Bias GetCurrentBias(int index) + { + double hma = _hmaBias.Result[index]; + double sma = _smaBias.Result[index]; + double prevSma = _smaBias.Result[index - 1]; + + if ((hma > sma) && (sma > prevSma)) return Bias.Long; + if ((hma < sma) && (sma < prevSma)) return Bias.Short; + + return Bias.Neutral; + } + + private void ManagePositions(List clusters) + { + double pNow = _symbol.Bid; + + foreach (var pos in _robot.Positions) + { + if (pos.Label != Label || pos.SymbolName != _config.SymbolName) continue; + + ClusterLevel? newSl = null; + ClusterLevel? newTp = null; + + 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) + { + 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 // Sell + { + 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) + { + newTp = c; + lowestTpPrice = 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.Ask && (finalTp == 0 || finalTp < _symbol.Ask)) + { + _robot.ModifyPosition(pos, finalSl, finalTp, ProtectionType.Absolute); + } + } + } + } + } + + private void ManageOrders(Bias bias, int index, List clusters) + { + // Standard Cleanup: Orders in wrong direction (Bias Change) + CleanupWrongBiasOrders(bias); + + if (_config.UseBiasDeviationFilter && !_isTradingAllowedBasedOnPrevCycle) + return; + + if (bias == Bias.Neutral) return; + + if (!_config.SendTelegramOnly) + { + bool hasLong = _robot.Positions.Any(p => p.SymbolName == _config.SymbolName && p.Label == Label && p.TradeType == TradeType.Buy); + bool hasShort = _robot.Positions.Any(p => p.SymbolName == _config.SymbolName && p.Label == Label && p.TradeType == TradeType.Sell); + + // --- FIX 1: Open Positions Cleanup --- + // If we are already invested, we ensure no pending orders for the same direction are lingering around. + if (bias == Bias.Long && hasLong) + { + CancelPendingOrders(TradeType.Buy); + return; + } + if (bias == Bias.Short && hasShort) + { + CancelPendingOrders(TradeType.Sell); + return; + } + } + + if (clusters.Count < 2) return; + + double pNow = _bars.ClosePrices[index]; + + if (bias == Bias.Short) + ProcessShortSetup(clusters, pNow); + else if (bias == Bias.Long) + ProcessLongSetup(clusters, pNow); + } + + private void CancelPendingOrders(TradeType type) + { + foreach (var order in _robot.PendingOrders) + { + if (order.SymbolName == _config.SymbolName && order.Label == Label && order.TradeType == type) + { + _robot.CancelPendingOrder(order); + } + } + } + + private void CleanupWrongBiasOrders(Bias currentBias) + { + if (_config.SendTelegramOnly) return; + + foreach (var order in _robot.PendingOrders) + { + if (order.Label != Label || order.SymbolName != _config.SymbolName) continue; + + if (currentBias == Bias.Long && order.TradeType == TradeType.Sell) + _robot.CancelPendingOrder(order); + else if (currentBias == Bias.Short && order.TradeType == TradeType.Buy) + _robot.CancelPendingOrder(order); + else if (currentBias == Bias.Neutral) + _robot.CancelPendingOrder(order); + } + } + + private void ProcessShortSetup(List clusters, double pNow) + { + ClusterLevel? entry = null; + ClusterLevel? sl = null; + ClusterLevel? tp = null; + + double highestEntryPrice = double.MinValue; + double lowestSlPrice = double.MaxValue; + double lowestTpPrice = double.MaxValue; + + foreach (var c in clusters) + { + if (c.Price > pNow) + { + if ((c.Significance >= _config.EntrySigThreshold) && (c.Price > highestEntryPrice)) + { + entry = c; + highestEntryPrice = c.Price; + } + if ((c.Significance < _config.SlSigThreshold) && (c.Price < lowestSlPrice)) + { + sl = c; + lowestSlPrice = c.Price; + } + } + } + + if (entry == null || sl == null) return; + + foreach (var c in clusters) + { + if ((c.Price < entry.Value.Price) && (c.Significance >= _config.EntrySigThreshold)) + { + if (c.Price < lowestTpPrice) + { + tp = c; + lowestTpPrice = c.Price; + } + } + } + + if (tp != null && (sl.Value.Price > entry.Value.Price)) + { + double risk = sl.Value.Price - entry.Value.Price; + double reward = entry.Value.Price - tp.Value.Price; + + if (risk <= reward) + UpdateOrPlaceLimitOrder(TradeType.Sell, entry.Value.Price, sl.Value.Price, tp.Value.Price); + } + } + + private void ProcessLongSetup(List clusters, double pNow) + { + ClusterLevel? entry = null; + ClusterLevel? sl = null; + ClusterLevel? tp = null; + + double lowestEntryPrice = double.MaxValue; + double highestSlPrice = double.MinValue; + double highestTpPrice = double.MinValue; + + foreach (var c in clusters) + { + if (c.Price < pNow) + { + if ((c.Significance >= _config.EntrySigThreshold) && (c.Price < lowestEntryPrice)) + { + entry = c; + lowestEntryPrice = c.Price; + } + if ((c.Significance < _config.SlSigThreshold) && (c.Price > highestSlPrice)) + { + sl = c; + highestSlPrice = c.Price; + } + } + } + + if (entry == null || sl == null) return; + + foreach (var c in clusters) + { + if ((c.Price > entry.Value.Price) && (c.Significance >= _config.EntrySigThreshold)) + { + if (c.Price > highestTpPrice) + { + tp = c; + highestTpPrice = c.Price; + } + } + } + + if (tp != null && (sl.Value.Price < entry.Value.Price)) + { + double risk = entry.Value.Price - sl.Value.Price; + double reward = tp.Value.Price - entry.Value.Price; + + if (risk <= reward) + UpdateOrPlaceLimitOrder(TradeType.Buy, entry.Value.Price, sl.Value.Price, tp.Value.Price); + } + } + + private void UpdateOrPlaceLimitOrder(TradeType type, double entry, double sl, double tp) + { + var existingOrder = _robot.PendingOrders.FirstOrDefault(o => o.SymbolName == _config.SymbolName && o.Label == Label && o.TradeType == type); + + // --- FIX 4: Market Proximity Check --- + // If the limit price is invalid (e.g. Buy Limit above Ask), we must abort/cancel. + bool priceInvalid = false; + double buffer = _symbol.PipSize; + + if (type == TradeType.Buy && entry >= (_symbol.Ask - buffer)) priceInvalid = true; + if (type == TradeType.Sell && entry <= (_symbol.Bid + buffer)) priceInvalid = true; + + if (priceInvalid) + { + if (existingOrder != null) _robot.CancelPendingOrder(existingOrder); + return; + } + + // --- FIX 3: SL Distance Check --- + double slDistPips = Math.Abs(entry - sl) / _symbol.PipSize; + if (slDistPips <= 0) + { + if (existingOrder != null) _robot.CancelPendingOrder(existingOrder); + return; + } + + // --- FIX 2: Volume Check --- + double riskAmount = _robot.Account.Balance * (_config.RiskPercent / 100.0); + double volume = _symbol.VolumeForFixedRisk(riskAmount, slDistPips); + volume = _symbol.NormalizeVolumeInUnits(volume, RoundingMode.Down); + + if (volume < _symbol.VolumeInUnitsMin) + { + if (existingOrder != null) _robot.CancelPendingOrder(existingOrder); + return; + } + + double lots = _symbol.VolumeInUnitsToQuantity(volume); + + if (_config.SendTelegramOnly) + { + string directionStr = type == TradeType.Buy ? "BUY" : "SELL"; + string directionIcon = type == TradeType.Buy ? "📈" : "📉"; + string msg = $"{directionIcon} {directionStr} Signal @ {_config.SymbolName}\n\n" + + $"Entry: {entry}\n" + + $"SL: {sl}\n" + + $"TP: {tp}\n" + + $"Vol: {lots:F2} Lots"; + + _ = SendTelegramMessageAsync(msg); + return; + } + + if (existingOrder != null) + { + bool volumeChanged = Math.Abs(existingOrder.VolumeInUnits - volume) > _symbol.VolumeInUnitsStep; + bool entryChanged = Math.Abs(existingOrder.TargetPrice - entry) > _symbol.TickSize; + bool slChanged = Math.Abs((existingOrder.StopLoss ?? 0) - sl) > _symbol.TickSize; + bool tpChanged = Math.Abs((existingOrder.TakeProfit ?? 0) - tp) > _symbol.TickSize; + + if (volumeChanged || entryChanged || slChanged || tpChanged) + { + var result = _robot.ModifyPendingOrder(existingOrder, entry, sl, tp, ProtectionType.Absolute, null, volume); + if (!result.IsSuccessful) + { + // Fallback: If modify fails (e.g. spread jump), cancel it to avoid stale orders + _robot.CancelPendingOrder(existingOrder); + } + } + } + else + { + _robot.Print("[SIGNAL] {0} {1} | Entry: {2} | SL: {3} | TP: {4} | Vol: {5:F2} Lots", + (type == TradeType.Buy ? "BUY" : "SELL"), _config.SymbolName, entry, sl, tp, lots); + + _robot.PlaceLimitOrder(type, _config.SymbolName, volume, entry, Label, sl, tp, ProtectionType.Absolute); + } + } + + private async Task SendTelegramMessageAsync(string message) + { + if (_robot.IsBacktesting) return; + if (string.IsNullOrWhiteSpace(_botToken) || string.IsNullOrWhiteSpace(_chatId)) return; + + try + { + string url = $"https://api.telegram.org/bot{_botToken}/sendMessage?chat_id={_chatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + HttpResponseMessage response = await _httpClient.GetAsync(url); + + if (!response.IsSuccessStatusCode) + { + _errorCallback?.Invoke($"Telegram Error: {response.StatusCode}"); + } + } + catch (Exception ex) + { + _errorCallback?.Invoke($"Telegram Exception: {ex.Message}"); + } + } + + private void UpdateClusterData(int index) + { + double currentHma = _hmaCluster.Result[index]; + double prevHma = _hmaCluster.Result[index - 1]; + bool currentDirectionUp = (currentHma > prevHma); + + if (_isUpTrend == null) + { + _isUpTrend = currentDirectionUp; + SetExtremum(index); + _lastExtremumPrice = _trendExtremum; + return; + } + + if (currentDirectionUp != _isUpTrend) + { + double amp = Math.Abs(_trendExtremum - _lastExtremumPrice); + if (amp > 0) + { + _amplitudes.Add(amp); + if (_amplitudes.Count > 50) _amplitudes.RemoveAt(0); + + double sum = 0; + for (int i = 0; i < _amplitudes.Count; i++) sum += _amplitudes[i]; + _currentDynamicRange = (sum / _amplitudes.Count) * 0.5; + } + _extremaPoints.Add(new ExtremumPoint { Price = _trendExtremum, Index = _trendExtremumIndex, Type = _isUpTrend.Value ? PointType.Peak : PointType.Trough }); + if (_extremaPoints.Count > _config.MaxPoints) _extremaPoints.RemoveAt(0); + + _lastExtremumPrice = _trendExtremum; + _isUpTrend = currentDirectionUp; + SetExtremum(index); + } + else + { + UpdateExtremum(index); + } + } + + private void SetExtremum(int index) + { + _trendExtremum = _isUpTrend.Value ? _bars.HighPrices[index] : _bars.LowPrices[index]; + _trendExtremumIndex = index; + } + + private void UpdateExtremum(int index) + { + if (_isUpTrend.Value && (_bars.HighPrices[index] > _trendExtremum)) + { + _trendExtremum = _bars.HighPrices[index]; + _trendExtremumIndex = index; + } + else if (!_isUpTrend.Value && (_bars.LowPrices[index] < _trendExtremum)) + { + _trendExtremum = _bars.LowPrices[index]; + _trendExtremumIndex = index; + } + } + + private List CalculateClusters(int currentIndex) + { + int count = _extremaPoints.Count; + if (count == 0) return new List(); + + double currentPrice = _bars.ClosePrices[currentIndex]; + double[] weights = new double[count]; + double totalWeightSum = 0; + + for (int i = 0; i < count; i++) + { + weights[i] = GetWeight(_extremaPoints[i], currentIndex, currentPrice); + totalWeightSum += weights[i]; + } + + if (totalWeightSum == 0) return new List(); + + var zones = new List(); + for (int i = count - 1; i >= 0; i--) + { + var p = _extremaPoints[i]; + + bool exists = false; + for (int j = 0; j < zones.Count; j++) + { + if (Math.Abs(zones[j].Price - p.Price) < _currentDynamicRange) + { + exists = true; + break; + } + } + if (exists) continue; + + double score = 0; + for (int k = 0; k < count; k++) + { + if (Math.Abs(_extremaPoints[k].Price - p.Price) <= _currentDynamicRange) + { + score += weights[k]; + } + } + + zones.Add(new ClusterLevel { Price = p.Price, Significance = (score / totalWeightSum) * 100.0 }); + } + return zones; + } + + private double GetWeight(ExtremumPoint point, int currentIndex, double currentPrice) + { + double weight = Math.Max(0.0, 1.0 - ((double)(currentIndex - point.Index) / _config.DecayPeriod)); + if ((point.Type == PointType.Peak) && (point.Price < currentPrice)) weight *= 2.0; + else if ((point.Type == PointType.Trough) && (point.Price > currentPrice)) weight *= 2.0; + return weight; + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.csproj b/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.csproj new file mode 100644 index 0000000..c8ec96f --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/HmaClusterBot.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + + + + + \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfo.cs b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfo.cs new file mode 100644 index 0000000..72bd866 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaClusterBot")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaClusterBot")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaClusterBot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfoInputs.cache b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f3fa1ee --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +296f6e29070e0927c857564d4a04976a31621cde diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..5f6e32e --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaClusterBot +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\HmaClusterBot\HmaClusterBot\ diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.assets.cache b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/Debug/net6.0/HmaClusterBot.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..dad4a4e1d247e0710c5afc479bf36528a4596f21 GIT binary patch literal 571 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.dgspec.json b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..69eb6f5 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj", + "projectName": "HmaClusterBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.props b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.targets b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/HmaClusterBot.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.assets.json b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.assets.json new file mode 100644 index 0000000..f728640 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj", + "projectName": "HmaClusterBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.nuget.cache b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.nuget.cache new file mode 100644 index 0000000..4172436 --- /dev/null +++ b/Sources/Robots/HmaClusterBot/HmaClusterBot/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "NEYKNJ+0pRHXWSIUJ8meJtMDF84xyxPwtc1chms3WBz34cQ0viYha1RgvvteKYETOCh8y4l1tk9Xm9OxaOeitA==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaClusterBot\\HmaClusterBot\\HmaClusterBot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/HmaClusterSR.algo b/Sources/Robots/HmaClusterSR.algo new file mode 100644 index 0000000000000000000000000000000000000000..e7234d11783e4f50a2f75d6ab155bd1b20b1b197 GIT binary patch literal 14977 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 L`9{Vc-vq6ZD?Sx{ literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaKcBot.algo b/Sources/Robots/HmaKcBot.algo new file mode 100644 index 0000000000000000000000000000000000000000..6562343e2ad9106f33800caa3aa1e8c25765c025 GIT binary patch literal 3822 zcmVI;`S;u-< zNRB5;>LrYqX&K%V>XI4bSk9AvTt<|fGhPYb2&e`xkeH8DQi_I*N}zHJ+6bDC*Pe8| zM$qa69SHns9JHo>Ckmpe*J#*gYtQRn4~&e=^{ie|-;<>)1SFH{ zL^Uh-Jp7|pWYjKc!b7vJxJ z6SOQDD}#ohokt~_K@}ZEh`^9Tg!7ZKyY5T42a;{v&uy>=Q=|(YEt3f&d*#X*rrzv? zR0y{?23DO7Qz%as5~kvEaEMG+spZ^yYR6X@>k89bM3kBRq~SJ$X4~_d?bp>^*JD%$`+kV4yTfvu4o^#l^&*JAUcIr>~xc-!pdraT<;b|Z1q&OwGvOD{ne2DvI znpb2g%4?o}|DvV)GFo0^u_!zh|E{JXTL;;1re|g8uVq)~Wi-|eaC*sv7~)hsp|GJ^ zhHHIDHT&ahNWA`AY%NfVCYWG}t6fLdJ$B`)0k6O#kmXP}j{7vm5z>9X7_)GWxU9BY znx&^>6p=oivKvnFC9Mcqk*l2f`$EWKxI}cOR?V9oj&$BMf5jLsbyH7!NTR}fMxQgf z0){AB=wXGIpsed$wdKc0kADCF0RR630F$KlEGG>B000005NSWcgdL6fLTPxOCM%eA zVWv2mG%8~6NGSG_L$|d)&JIP5lg_BowIeGx33L_9yxn8FZh4!!i@2TR=4gN(^`33- ze+ydB*vX1yv)|U=IJPz!7N^G?Z4;^xISo>~sEO+>lr;xFOVs$ihE9q^APoPUxQHhg z06^__nWdc-KlO(}*{JK*@0KDKPj9?CichJFk&9OlrR*Tg*6q;igu=J?fvud+K#m3# zq-gZe`!?cdKSZ56{dUf7g(W?JZxcLgI#LSQLjlo&_u1M-`iyaSBPRlB`3`@W6rKSv zUDWOm88s~Nvi(A_Ng=yDI{jCv4mQ{82A{x#`WB6HvZTESFQow9Mz_^K)A4u{2v+uQ zhKOblDhMCVLU9T`vEPdDF*Re%JOgyo@b7t$a4nH#H4*G!boeyJyrafk(9eV z3W+xt)uP44M8%+TE>07e0-S_Mo$>N`8ZQ%Q%)nU`s!u!A$?z z(pO^bCPhcAjdPZ>Qt`&C)(?zJ2t!M339t8Yu8`;-guT@AGN@w-7Foe}FBMfbNemUu z2&s7m>bkD{B$j7!&aw@L{#^Ct>n^P8(pG}sbPKSY7;$H?$Dt9bEXluIGf z?NQFi>N3`2-cdRicp2^(4PTK@5!5HGmgJ!yuZQNyLmp%SkxZ-9uSO^{%^qO2*d|M_ z`pg_q>=df$`$EPp^EiYPCRO=EOb3U`6VkA_u~c5{!QSOLg^n!V8SUG??sk9#~6 z;xLXt)r}DJ8Pri{N1MWCZj|@Pcgo*MV`e_dM#&WG^}QDz_Vr3z_%bPiSm)@KugDVD ztdLc#(tLXGXrYWTf%mDYjgw&LQ)<<0h-ATI}#1A7g}}COAF8wrQjSv*U3On1YC? z?4=D2_N@z?)$>&7n;EuL(#vDx*frCT@o3uY+7x>#2J)UXb@bPiEduyf6p^ zI;s*o)luZ*T^_AyE*h95p+>CZPZ^e)B7Bsf3(NR^xoH!EX&4~glPdr3$S;=UG|B`z}6^w*VytJ(DVa?u|+6W8;c9Tj5(T=#|~1C+gT;P12|6%ekJ2NQ_4(owkwyyg0bP$t z?j`iQ3(uK|xcx~bTboudW3|BL{6oM$O(u|qTV0+uuLhgR0=X!_hWcl_sNcNBP;=TK zP4i~~$w9wOo!T(%y@u(t`7y%7Yug9lHi72D8>VZl!`|Z-+yDF%EjCG%LwMLoc?4L| zRVA}8zcLTHqUrCh^ukQJ69w(0v}@k=h{g3C*-|04iaGYhLnEN9v}iiznK2^`LrxO0aB zzB9&+t0(8|%!wPeJ8X@Lkg2wIHu=ZqP*6`~2iF0-8ZsudEm5`J^sgbNHavKP<%NV( zpr8SSW39F9%~~1C=cFCmW$9m}B`FsV?1$cR%JiIyCN?l7pH04{?*P4>O3tYDEIUI- z;3VL5L)x;Cg(ebk4s6`VK3ZMZ+)2>i(^x$KibvyVN`?{C!o|JEEfbS0N%l^lI?29ASPxCx%1p=}f8|J$y^>9< z3k3^x%1iaeFEhSjhCBb8nAIaE@o?_S5@kA-=13pf238XeAl;1kwx&M687wWZM{$=m zs|swIZ`KITP=eP(s$k;$g?$Q;X0x)F)vd?x8gq#|Y?GSa`x}Tj1@Q&PWWpR-rbe9a z2!vbT6$((X7`&!d7+ntt{$-iU#0l|We|Xr6+~C%wb&tAXw(MNbjQ3XVjZU&G`7xJl zq~?O^aOD03b35kf#cM6U%XUh~w3fbG_dJ|mz-@Q-Q@;>Vo2Vkc=Ny+zlqn>=r{0G!Q&1Uzw$(C+pBaJ0C}UDF5?!rZH`~$9 zeC8R6-AVmoIaD_c**o9PS}LZY=nj?`Xdu7SoxMF{oAW;E>isrwyLFl$>k6oJCv$yl zleyOGjd*&aUF9e3q2Ud;XJV=$;JU|c;cx6eS2b(Y%XSBC8FaF@=YEN^v<-H>!PiZ4 zZ+e0Z7QWu!3L?I(^iLcSO|{0;X=h2epM$D9IraFi>aP)SJNtXsg_K}7@P=HH`~M8e z^A}?MFon-6^p#k_jbiu0QQ=nzyhR+!mnhP%FgM3c{4}}S>>U!vqM0;6xCq&=!xE=> zVs@AIEE;q8Gc7O5LBGV$D>;W~_8$yTee(t+?X@#AQknXY$KRxp*tf-Ui6p<9%mRQ%%o|r;AwR zUCl9RARv%G;LU=|LBhRnfMv43HQPR&Ib8$q?PrPG6@2O3o;Y3k(Fx(N_Yc; kU4Gjxmx4<~#q~}4-~S#!J4(igEP#QD>Fz=tE>|JxEYS>Z-v9sr literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaKcBot/.vscode/tasks.json b/Sources/Robots/HmaKcBot/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/HmaKcBot/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/HmaKcBot/HmaKcBot.sln b/Sources/Robots/HmaKcBot/HmaKcBot.sln new file mode 100644 index 0000000..2dc08ae --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HmaKcBot", "HmaKcBot\HmaKcBot.csproj", "{335ef48b-c961-4e40-97d0-9890a4d69d46}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {335ef48b-c961-4e40-97d0-9890a4d69d46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {335ef48b-c961-4e40-97d0-9890a4d69d46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {335ef48b-c961-4e40-97d0-9890a4d69d46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {335ef48b-c961-4e40-97d0-9890a4d69d46}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.cs b/Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.cs new file mode 100644 index 0000000..d466f62 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.cs @@ -0,0 +1,114 @@ +using cAlgo.API; +using cAlgo.API.Indicators; +using System; + +namespace cAlgo.Robots +{ + [Robot(AccessRights = AccessRights.None)] + public class HmaKcBot : Robot + { + [Parameter("HMA Period", DefaultValue = 250)] + public int HmaPeriod { get; set; } + + [Parameter("KC MA Period", DefaultValue = 20)] + public int KcMaPeriod { get; set; } + + [Parameter("KC ATR Period", DefaultValue = 20)] + public int KcAtrPeriod { get; set; } + + [Parameter("KC Multiplier", DefaultValue = 2.0)] + public double KcMultiplier { get; set; } + + [Parameter("Risk Percentage", DefaultValue = 1.0, MinValue = 0.1, MaxValue = 10.0)] + public double RiskPercentage { get; set; } + + [Parameter("Stop Loss (pips)", DefaultValue = 20, MinValue = 1)] + public double StopLossPips { get; set; } + + private HullMovingAverage _hma; + private KeltnerChannels _kc; + private const string Label = "HmaKcBot"; + + protected override void OnStart() + { + _hma = Indicators.HullMovingAverage(Bars.ClosePrices, HmaPeriod); + _kc = Indicators.KeltnerChannels(KcMaPeriod, MovingAverageType.Simple, KcAtrPeriod, MovingAverageType.Hull, KcMultiplier); + } + + protected override void OnBar() + { + var hmaCurrent = _hma.Result.Last(1); + var hmaPrevious = _hma.Result.Last(2); + var hmaOld = _hma.Result.Last(3); + + // Sell Condition + if (hmaPrevious > hmaCurrent && hmaPrevious > hmaOld) + { + ClosePositions(TradeType.Buy); + var position = Positions.Find(Label, SymbolName, TradeType.Sell); + if (position == null) + { + var volumeInUnits = Symbol.VolumeForProportionalRisk(ProportionalAmountType.Equity, RiskPercentage, StopLossPips); + var normalizedVolume = Symbol.NormalizeVolumeInUnits(volumeInUnits, RoundingMode.ToNearest); + + if (normalizedVolume > 0) + { + ExecuteMarketOrder(TradeType.Sell, SymbolName, normalizedVolume, Label, StopLossPips, null); + } + } + } + + // Buy Condition + if (hmaPrevious < hmaCurrent && hmaPrevious < hmaOld) + { + ClosePositions(TradeType.Sell); + var position = Positions.Find(Label, SymbolName, TradeType.Buy); + if (position == null) + { + var volumeInUnits = Symbol.VolumeForProportionalRisk(ProportionalAmountType.Equity, RiskPercentage, StopLossPips); + var normalizedVolume = Symbol.NormalizeVolumeInUnits(volumeInUnits, RoundingMode.ToNearest); + + if (normalizedVolume > 0) + { + ExecuteMarketOrder(TradeType.Buy, SymbolName, normalizedVolume, Label, StopLossPips, null); + } + } + } + + TrailStopLoss(); + } + + private void TrailStopLoss() + { + foreach (var position in Positions.FindAll(Label, SymbolName)) + { + if (position.TradeType == TradeType.Buy) + { + var newStopLoss = Math.Round(_kc.Bottom.Last(1), Symbol.Digits); + if (position.StopLoss == null || newStopLoss > position.StopLoss) + { + // Updated ModifyPosition to include ProtectionType.Absolute. + ModifyPosition(position, newStopLoss, position.TakeProfit, ProtectionType.Absolute); + } + } + else if (position.TradeType == TradeType.Sell) + { + var newStopLoss = Math.Round(_kc.Top.Last(1), Symbol.Digits); + if (position.StopLoss == null || newStopLoss < position.StopLoss) + { + // Updated ModifyPosition to include ProtectionType.Absolute. + ModifyPosition(position, newStopLoss, position.TakeProfit, ProtectionType.Absolute); + } + } + } + } + + private void ClosePositions(TradeType tradeType) + { + foreach (var position in Positions.FindAll(Label, SymbolName, tradeType)) + { + ClosePosition(position); + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.csproj b/Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/HmaKcBot.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfo.cs b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfo.cs new file mode 100644 index 0000000..56ee436 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaKcBot")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaKcBot")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaKcBot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfoInputs.cache b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f4c5c57 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c085c96e76c2bfbc661649df310079c6fc9608f0 diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..adf838d --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaKcBot +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\HmaKcBot\HmaKcBot\ diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.assets.cache b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..afd6281b7a95e7392c30d0b1c45ae03b477e7e57 GIT binary patch literal 571 zcmWIWc6a1rU|=|%$pQ_W;qqB6~k}F$lCo=*SK>>&v z=xh}eTAW%`9OG0}nwy)N6Qh?`nx0w`Q;?XPotU0l9Fts9l$erQq?cG)lAoJck{V;E zXP{?j6qA#g6qA=)Vy0&hlkAw2p0DQ^;Hj6Alf#T;Iuno$;D0P_YUmSlM5LG?-igIgaG-1;cN&FNTNoLUl6S&+(JRGL?k pnVZV#oL^Aslb@WJ!%|XInkwXyT3nKumskQcI=D0mWGXL;2>?jdndkrj literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.csproj.AssemblyReference.cache b/Sources/Robots/HmaKcBot/HmaKcBot/obj/Debug/net6.0/HmaKcBot.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..76e6da8385c67815702896fcdc466aa3c3ce7e0e GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.dgspec.json b/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..54c62f5 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj", + "projectName": "HmaKcBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.props b/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.props new file mode 100644 index 0000000..120d227 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.targets b/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/HmaKcBot.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/project.assets.json b/Sources/Robots/HmaKcBot/HmaKcBot/obj/project.assets.json new file mode 100644 index 0000000..73f1439 --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj", + "projectName": "HmaKcBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaKcBot/HmaKcBot/obj/project.nuget.cache b/Sources/Robots/HmaKcBot/HmaKcBot/obj/project.nuget.cache new file mode 100644 index 0000000..656182d --- /dev/null +++ b/Sources/Robots/HmaKcBot/HmaKcBot/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "XgjSBy1e5g3yI21pAC15ZU+Ik0YPC1U9+c5CtniqfcpL0zXKjYStMBHb3A6jnU4FFMSg8LtqczM9QrWa3Q/x0w==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaKcBot\\HmaKcBot\\HmaKcBot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot.algo b/Sources/Robots/HmaSmaCrossoverBot.algo new file mode 100644 index 0000000000000000000000000000000000000000..880fca2d746f4a01cf69020fecd3b9ceaad54684 GIT binary patch literal 4698 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaSmaCrossoverBot/.vscode/tasks.json b/Sources/Robots/HmaSmaCrossoverBot/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot.sln b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot.sln new file mode 100644 index 0000000..2495992 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HmaSmaCrossoverBot", "HmaSmaCrossoverBot\HmaSmaCrossoverBot.csproj", "{b3f19675-15c1-4ecd-87db-b4e345e3d6f5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {b3f19675-15c1-4ecd-87db-b4e345e3d6f5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {b3f19675-15c1-4ecd-87db-b4e345e3d6f5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {b3f19675-15c1-4ecd-87db-b4e345e3d6f5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {b3f19675-15c1-4ecd-87db-b4e345e3d6f5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.cs b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.cs new file mode 100644 index 0000000..3429511 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.cs @@ -0,0 +1,198 @@ +using cAlgo.API; +using cAlgo.API.Indicators; +using System; + +namespace cAlgo.Robots +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class HmaSmaCrossoverBot : Robot + { + [Parameter("HMA A Period (Fast)", DefaultValue = 20, Group = "Periods")] + public int HmaAPeriod { get; set; } + + [Parameter("HMA B Period (Slow)", DefaultValue = 250, Group = "Periods")] + public int HmaBPeriod { get; set; } + + [Parameter("SMA C Period (Base)", DefaultValue = 200, Group = "Periods")] + public int SmaCPeriod { get; set; } + + [Parameter("Lot Size", DefaultValue = 0.1, Group = "Volume")] + public double LotSize { get; set; } + + [Parameter("Max Positions", DefaultValue = 4, Group = "Volume")] + public int MaxPositions { get; set; } + + [Parameter("Stop Loss (Pips)", DefaultValue = 50, Group = "Protection")] + public double StopLossPips { get; set; } + + // Label for position management + private const string BotLabel = "HmaSmaCrossoverBot"; + + private HullMovingAverage _hmaA; + private HullMovingAverage _hmaB; + private SimpleMovingAverage _smaC; + private double _volumeInUnits; + private TimeZoneInfo _germanZone; // Added for time filter + + protected override void OnStart() + { + _hmaA = Indicators.HullMovingAverage(Bars.ClosePrices, HmaAPeriod); + _hmaB = Indicators.HullMovingAverage(Bars.ClosePrices, HmaBPeriod); + _smaC = Indicators.SimpleMovingAverage(Bars.ClosePrices, SmaCPeriod); + + // Convert LotSize to normalized VolumeInUnits + double preciseVolume = Symbol.QuantityToVolumeInUnits(LotSize); + _volumeInUnits = Symbol.NormalizeVolumeInUnits(preciseVolume, RoundingMode.ToNearest); + + if (_volumeInUnits < Symbol.VolumeInUnitsMin) + { + _volumeInUnits = Symbol.VolumeInUnitsMin; + Print($"Warning: Requested volume {preciseVolume} is below minimum. Using minimum: {_volumeInUnits} units."); + } + + // Initialize German TimeZone + try + { + // "W. Europe Standard Time" is the ID for Berlin, Amsterdam, Rome (CET/CEST) + _germanZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); + } + catch (TimeZoneNotFoundException) + { + Print("Error: TimeZone 'W. Europe Standard Time' not found. Using Server TimeZone as fallback for time filter (might be incorrect)."); + _germanZone = TimeZone; // Fallback to server zone (which is UTC here) + } + catch (Exception ex) + { + Print($"Error initializing TimeZone: {ex.Message}. Using Server TimeZone as fallback."); + _germanZone = TimeZone; + } + } + + protected override void OnBar() + { + // Ensure indicators have enough data + 3 bars for peak/trough logic + int requiredBars = Math.Max(HmaAPeriod, Math.Max(HmaBPeriod, SmaCPeriod)) + 3; + if (Bars.Count < requiredBars) + { + return; + } + + // Check exit conditions first + HandleExits(); + + // Check entry conditions + HandleEntries(); + } + + // Checks and executes exit logic based on rules + private void HandleExits() + { + // Get current and previous values (based on closed bars) + // Last(0) = current closed bar, Last(1) = previous bar + double hmaB_curr = _hmaB.Result.Last(0); + double smaC_curr = _smaC.Result.Last(0); + double hmaB_prev = _hmaB.Result.Last(1); + + double low_curr = Bars.LowPrices.Last(0); + double low_prev = Bars.LowPrices.Last(1); + double high_curr = Bars.HighPrices.Last(0); + double high_prev = Bars.HighPrices.Last(1); + + // --- Long Exit Conditions --- + // 1. B < C (at current close) + // 2. Low crosses below B (Currentbar.Low < Current.B AND PreviousBar.Low >= Previous.B) + bool longExitSignal = (hmaB_curr < smaC_curr) || + ((low_curr < hmaB_curr) && (low_prev >= hmaB_prev)); + + // --- Short Exit Conditions --- + // 1. B > C (at current close) + // 2. High crosses above B (Currentbar.High > Current.B AND PreviousBar.High <= Previous.B) + bool shortExitSignal = (hmaB_curr > smaC_curr) || + ((high_curr > hmaB_curr) && (high_prev <= hmaB_prev)); + + // Find all positions managed by this bot for the current symbol + var botPositions = GetPositions(null); + + foreach (var position in botPositions) + { + if (position.TradeType == TradeType.Buy && longExitSignal) + { + ClosePosition(position); + } + else if (position.TradeType == TradeType.Sell && shortExitSignal) + { + ClosePosition(position); + } + } + } + + // Checks and executes entry logic based on indicator signals + private void HandleEntries() + { + // --- Time Filter --- + // Use TimeInUtc for a reliable UTC baseline (as Robot TimeZone is UTC) + DateTime germanTime = TimeZoneInfo.ConvertTimeFromUtc(TimeInUtc, _germanZone); + + // Only allow new trades between 7:00 (inclusive) and 17:00 (exclusive) German time + if (germanTime.Hour < 7 || germanTime.Hour >= 17) + { + return; // Outside trading hours + } + // --- End Time Filter --- + + // Get values for signal bar (i-1) and confirmation bar (i) + // Last(0) = i (confirmation bar, just closed) + // Last(1) = i-1 (signal bar) + // Last(2) = i-2 (previous bar) + + double hmaA_confirm = _hmaA.Result.Last(0); + double hmaA_signal = _hmaA.Result.Last(1); + double hmaA_prev = _hmaA.Result.Last(2); + + // Get filter values at the signal bar (i-1) + double hmaB_signal = _hmaB.Result.Last(1); + double smaC_signal = _smaC.Result.Last(1); + + // Peak/Trough detection at i-1 (Last(1)), confirmed by i (Last(0)) + bool isPeak = (hmaA_prev < hmaA_signal) && (hmaA_signal > hmaA_confirm); + bool isTrough = (hmaA_prev > hmaA_signal) && (hmaA_signal < hmaA_confirm); + + // --- Sell Signal Condition (at i-1) --- + // 1. B < C + // 2. A > C + // 3. A forms a peak + if ((hmaB_signal < smaC_signal) && (hmaA_signal > smaC_signal) && isPeak) + { + if (GetPositions(TradeType.Sell).Length < MaxPositions) + { + ExecuteMarketOrder(TradeType.Sell, SymbolName, _volumeInUnits, BotLabel, StopLossPips, null); + } + } + + // --- Buy Signal Condition (at i-1) --- + // 1. B > C + // 2. A < C + // 3. A forms a trough + if ((hmaB_signal > smaC_signal) && (hmaA_signal < smaC_signal) && isTrough) + { + if (GetPositions(TradeType.Buy).Length < MaxPositions) + { + ExecuteMarketOrder(TradeType.Buy, SymbolName, _volumeInUnits, BotLabel, StopLossPips, null); + } + } + } + + // Helper to get positions only for the current symbol and managed by this bot + private Position[] GetPositions(TradeType? tradeType) + { + if (tradeType == null) + { + // Get all Buy or Sell positions for this bot/symbol + return Positions.FindAll(BotLabel, SymbolName); + } + + // Get specific TradeType positions for this bot/symbol + return Positions.FindAll(BotLabel, SymbolName, tradeType.Value); + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.csproj b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/HmaSmaCrossoverBot.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfo.cs b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfo.cs new file mode 100644 index 0000000..7c1148f --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaSmaCrossoverBot")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaSmaCrossoverBot")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaSmaCrossoverBot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfoInputs.cache b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..0462cb7 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4f125f90c408d20a05e42f8a6dc598f9c14b8e6f diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..db5a751 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaSmaCrossoverBot +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\HmaSmaCrossoverBot\HmaSmaCrossoverBot\ diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.assets.cache b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..a1c39b062b1d56cd8b156c27e08d869350fb772c GIT binary patch literal 571 zcmWIWc6a1rU|SL&Wx5&#KH z&lC*53M0#h0iz)^KaUL(z`Oy8B^jQ1P`whs;MRu(w?0a6b2=6mrTQu#^;)rV6>F7MEn^C6)k<4lYdsnaYb|0stypm~8+6 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.csproj.AssemblyReference.cache b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/Debug/net6.0/HmaSmaCrossoverBot.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.dgspec.json b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..7bbd24b --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj", + "projectName": "HmaSmaCrossoverBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.props b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.targets b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/HmaSmaCrossoverBot.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.assets.json b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.assets.json new file mode 100644 index 0000000..0df71b6 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj", + "projectName": "HmaSmaCrossoverBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.nuget.cache b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.nuget.cache new file mode 100644 index 0000000..77b4a60 --- /dev/null +++ b/Sources/Robots/HmaSmaCrossoverBot/HmaSmaCrossoverBot/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "o2zbiJnQ5+mDJlvuxYW8+Qmxo/HzYxOwFc7BUoYdtbMdhQvLGFQJ9gkt6PTVAeX05JrpmDeuNnfj0iTviIs+iQ==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot\\HmaSmaCrossoverBot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot.algo b/Sources/Robots/HmaStructureBot.algo new file mode 100644 index 0000000000000000000000000000000000000000..bbcd495912f20ee1c73811b6781d3ed0a0f2c931 GIT binary patch literal 4374 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 QXy{$y84n7jbk+E4zpU?(vH$=8 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaStructureBot/.vscode/tasks.json b/Sources/Robots/HmaStructureBot/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/HmaStructureBot/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot.sln b/Sources/Robots/HmaStructureBot/HmaStructureBot.sln new file mode 100644 index 0000000..5e683b7 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HmaStructureBot", "HmaStructureBot\HmaStructureBot.csproj", "{9f6f411d-ba95-4e92-853b-10e6a1a8c98c}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9f6f411d-ba95-4e92-853b-10e6a1a8c98c}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9f6f411d-ba95-4e92-853b-10e6a1a8c98c}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9f6f411d-ba95-4e92-853b-10e6a1a8c98c}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9f6f411d-ba95-4e92-853b-10e6a1a8c98c}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.cs b/Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.cs new file mode 100644 index 0000000..b5e1831 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; + +namespace cAlgo.Robots +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class HmaStructureBot : Robot + { + // --- Parameters --- + [Parameter("HMA Period", DefaultValue = 25)] + public int HmaPeriod { get; set; } + + [Parameter("Risk % per Trade", DefaultValue = 1.0, MinValue = 0.01)] + public double RiskPercent { get; set; } + + [Parameter("Order Label", DefaultValue = "HMA_Struct")] + public string OrderLabel { get; set; } + + // Expiration removed + + // --- Indicators --- + private HullMovingAverage _hma; + + // --- State Management --- + private DateTime _lastSetupTime; + + // --- Data Structures --- + private enum ExtremumType { High, Low } + + private struct Extremum + { + public ExtremumType Type; + public double Value; + public int Index; // Index relative to logic + public DateTime Time; // Unique identifier for the extremum + } + + protected override void OnStart() + { + _hma = Indicators.HullMovingAverage(Bars.ClosePrices, HmaPeriod); + } + + protected override void OnBarClosed() + { + // 1. Manage existing pending orders + ManageExistingOrders(); + + // 2. Find Extrema + var extrema = GetExtrema(200, 5); + + if (extrema.Count < 5) + return; + + // 3. Check for duplicate execution on the same setup + // The setup is defined by the latest extremum (extrema[0]) + if (extrema[0].Time == _lastSetupTime) + return; + + bool orderPlaced = false; + + // --- Short Logic --- + // Last extremum must be a Trough (T0) + if (extrema[0].Type == ExtremumType.Low) + { + var t0 = extrema[0].Value; + var h0 = extrema[1].Value; + var t1 = extrema[2].Value; + var h1 = extrema[3].Value; + var t2 = extrema[4].Value; + + // Condition: T1 < T2 and H0 < T2 + if (t1 < t2 && h0 < t2) + { + double entryPrice = 0.5 * (t2 + h0); + double stopLossPrice = h1; + double takeProfitPrice = Math.Max(t0, t1); + + PlaceStructureOrder(TradeType.Sell, entryPrice, stopLossPrice, takeProfitPrice); + orderPlaced = true; + } + } + // --- Long Logic --- + // Last extremum must be a Peak (H0) + else if (extrema[0].Type == ExtremumType.High) + { + var h0 = extrema[0].Value; + var t0 = extrema[1].Value; + var h1 = extrema[2].Value; + var t1 = extrema[3].Value; + var h2 = extrema[4].Value; + + // Condition: H1 > H2 and T0 > H2 + if (h1 > h2 && t0 > h2) + { + double entryPrice = 0.5 * (h2 + t0); + double stopLossPrice = t1; + double takeProfitPrice = Math.Min(h0, h1); + + PlaceStructureOrder(TradeType.Buy, entryPrice, stopLossPrice, takeProfitPrice); + orderPlaced = true; + } + } + + // 4. Mark Setup as handled if we placed an order + if (orderPlaced) + { + _lastSetupTime = extrema[0].Time; + } + } + + private void PlaceStructureOrder(TradeType type, double entryPrice, double slPrice, double tpPrice) + { + // Calculate Risk + double riskAmount = Account.Balance * (RiskPercent / 100.0); + + // Note: VolumeForFixedRisk still requires SL in Pips calculation + double slDistancePips = Math.Abs(entryPrice - slPrice) / Symbol.PipSize; + + if (slDistancePips <= 0) return; + + double volume = Symbol.VolumeForFixedRisk(riskAmount, slDistancePips); + volume = Symbol.NormalizeVolumeInUnits(volume, RoundingMode.Down); + + // Place Limit Order using Absolute Prices + // Expiry is null (GTC - Good Till Cancelled) + PlaceLimitOrder(type, SymbolName, volume, entryPrice, OrderLabel, slPrice, tpPrice, ProtectionType.Absolute, null); + } + + private void ManageExistingOrders() + { + foreach (var order in PendingOrders.ToArray()) + { + if (order.Label != OrderLabel || order.SymbolName != SymbolName) + continue; + + var barLow = Bars.LowPrices.Last(0); + var barHigh = Bars.HighPrices.Last(0); + bool isCancelled = false; + + // --- Check SL Hit --- + if (order.StopLoss.HasValue) + { + if (order.TradeType == TradeType.Buy) + { + if (barLow <= order.StopLoss.Value) + { + order.Cancel(); + isCancelled = true; + } + } + else // Sell + { + if (barHigh >= order.StopLoss.Value) + { + order.Cancel(); + isCancelled = true; + } + } + } + + if (isCancelled) continue; + + // --- Check TP Extension --- + if (order.TakeProfit.HasValue) + { + if (order.TradeType == TradeType.Sell) + { + // If price went lower than TP, move TP to Low + if (barLow < order.TakeProfit.Value) + { + ModifyPendingOrder(order, order.TargetPrice, order.StopLoss, barLow, order.ProtectionType); + } + } + else // Buy + { + // If price went higher than TP, move TP to High + if (barHigh > order.TakeProfit.Value) + { + ModifyPendingOrder(order, order.TargetPrice, order.StopLoss, barHigh, order.ProtectionType); + } + } + } + } + } + + private List GetExtrema(int searchDepth, int minCount) + { + var list = new List(); + var hma = _hma.Result; + + // i starts at 1 to compare with confirmed i+1 and i-1 (where i-1 is closer to closed bar Last(0)) + for (int i = 1; i < searchDepth && i < hma.Count - 1; i++) + { + double current = hma.Last(i); + double prev = hma.Last(i + 1); // Older + double next = hma.Last(i - 1); // Newer + + if (current > prev && current > next) + { + list.Add(new Extremum { + Type = ExtremumType.High, + Value = current, + Index = i, + Time = Bars.OpenTimes.Last(i) + }); + } + else if (current < prev && current < next) + { + list.Add(new Extremum { + Type = ExtremumType.Low, + Value = current, + Index = i, + Time = Bars.OpenTimes.Last(i) + }); + } + + if (list.Count >= minCount) + break; + } + return list; + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.csproj b/Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/HmaStructureBot.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfo.cs b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfo.cs new file mode 100644 index 0000000..1b7a9a6 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaStructureBot")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaStructureBot")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaStructureBot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfoInputs.cache b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..cfb48c4 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7c0c361c93e8c6d8fca2b9bb1c31f57269d6fb5c diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..04388ad --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaStructureBot +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\HmaStructureBot\HmaStructureBot\ diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.assets.cache b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..92fcb420ba3d7b5fad24cfa9b59958e1f1b87533 GIT binary patch literal 571 zcmWIWc6a1rU|?7&kt%wXjomdf;#X*ILV0EQ?&OJ9uV*PW2>r_Ycu?opWJaJOC;%}7 zovmU*i&Kk=W1Nagb8}O3V)XJ#(^E@g3KEmE6Vp?RW0FgX5>rx(^b$);@^ceQQezDD z4D<|5VsbK*V)9Z;%=8Rmk{xr>^Yt79JoQp?a+r}!X9BW8d=?;Pg^D9nAQuQEhd?ZF zgjxVn0FqE7=roW@5TK1m*dT_3O-J_#NRAzdIe?fGh(STm4aCTR2gu>`D|JsT34ny9 zX9|X2g^}gMfYFedpT`CXVBUblk_^v0s9p(RaO*>YTOTF3IUS3OQ%gcB3sTvOO7luG pb5l8;^9w3{@{<#DSW1dYQ-xeoi%T-|5=($a2bU&+Oyxx}0RVHlm?!`M literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.csproj.AssemblyReference.cache b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/Debug/net6.0/HmaStructureBot.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 zcmd^|50n(enZRcdg@B46oEsHfjG9wm+;Mhc7euq{u0UMYWp`QrEq{7vYIj?Dx`&<~ zV7;gK9!8@E^)Qk6=ba=uPvwM*@y{7f6MYb$oL+n<=o5`TqjC^5dbxz>Ma8@7nXdk- zd#YzUW0h~HEbrmsR?XH|zxt}a`o6EKPKs`eL?Y3JO*4BIWs#ZfnPcYCX{7bU^jtr( zdNN9Kjna>@JxR+{Qpk)cIm<{Z7V3$|YGU!)9!>4-(UCPhR@0Mg)cTEBWBdGAO4FiI z{JD|)>o2?Mpk#|mx-?Q?iN3Xc$z1lM; z{bt~i=t$hA+PmMVsj3}$eYDk;acXrp?o8FtXWQL`|4glJ%4t^4M6-32!(FLOt!~ft zYHIRIG}vXVLHg`OZ9_v!Nz}ya6SXz<^)>i|@mF-zx>{U6QIm)_M4~G&rgqclH&GLx*biO_~~o2trf|#|rfWv-dhLv7b~p4xV*FQ3P9@@8u)UZkC6aeM6BTxra$=Jiw8EY8vgQ_ z@2p+)(3ab_U--eXu`mDIj#&?$`o)9K{N!Bi>diAoweCCNlkxM`=ue-!^gI7lKX;OT zbnQ!9{!zI!^3S#0F$$((5-ol-@ZTqimLvTN`JTUplb>XLGo!8we1q>AJ`Kb_85O0R}MVWSrv zbY|SM8REJX1 zYt(haQVLd=OBGD5$*!P5wd94I8d7#a%uT_}n-xo8a-X&M=_d=DrSsXc`)WpUjK=fz zC87mSe16BFVH^8znzVlA?Qh>)|H8!m!*-#cS5I8M^s>A5Y(bO0d*5@HkDu_t6PG_S zHokN8zQnIST0Oac+SaNg@rQOkbIP_67oY$7wY!YHV~#DoZT}l}@3%I5ucc|k;rC|U zaKZT5JNF*FYm>3{g-_yrX1Zp^28Mn=l4+YU)Fc; znBG zf%!Msf_v)8i@h&|^n%Fqizc#Va9M*%H-TAFUb;(|@(SXq@YiI$Pwmf{c@rH}ck`yt zoZ#?yS3Ig9Ps6OTe4vY2;sVUjc32qKC->+Co`bUn?d+Vm;g629lSC(+BJ!#uiB33z z0y?fH)Dr%Bh;yyn*%Wd!M!VzDL}9h=G-}U8c2N24$G=|F)BW|@cW#chQJ)Gu6n=2e zn4#1q>!!yW61AwNzJayL;O-x?_l7udlTI5tbQG8v#6Lt8lXs94{}3fCVB|W`xqI&O zO}78)L{`fN3+Z-_BNb2uLxOnj*){kn1M!rze-HF4SM}gNf#h57P9UHcWCF2&&acnN z1Y&=xpdR8L7;ILRe%;7gYBC=H#woN(iyC;aR+7LVvx2;n3JDA{#RkY+rx$+NQ_hM; zH@+G5=K5i+fYi9Epu+OPT^=N|Ah6tB4j!hBrO8PR$he_Nqc$>zw4EB))=Ul{mz0UyU2D9N@#z^;7{guKZYOTBX7P&{BRrtGydxkTz7qru2ch

    C^KUeAdh?8$EthZ4DhMtVd-rG>G( z^~l5jafmF_3lTKk;4!Og^hDuEsnaT7-D5d5g=7nz1K-;XpTy`( zCdMgt+8wp3BmHAM0D!8S!L@W4jtqzR0k%>y6m<zvmt>f_}Qj1>K&Qpc*#^5+tGa_Z#AcdM4LK03cc{HHhU%#gBDI{bH zwmh2Z_!=onyCcW$FB*Hhr@hkLkl_;?D?@gF*-s!5Om6JCHkhC$*#vrrepYXccLWID zXLBXG>~WcJjmpEx;(vf#gXOxaTtY``4@BX%Fw4{7#_=)Bf(RT6D5n-w5m_Mtk!8hceO>gH~uZJ$&2 zFqYX;U~9o*!!iH1O*5tnDW za445dcd)c8iJ$S?F$^O(ANY@C({Tfu1j`d?6EI-b{p^xGk%lBUq@W#J{R}!(v1xpkP%?#POK09dg}G{adOPg%b;`dK1er zdVg<5e*hg!D;vxMORQ=r#8<=A?rid?-=E>?6pCcFAu%$ygTR0`6;dM%`t1zg9T7~L zi~A0Z+8zPDg?Hvlz>T&5(4~sP|DN5i?&Cm-QsT>=w*$Z~cuIx+t)mxP^r!->X1_UW z{cE317)efZ`YJ^4n+Ym7f|c0ojG29Gc=tKSniwU`u&WK*17PRA9ulh;pFXs$r-JeA zs2P0%letRH~@ttPi|KHJG{!d#zWn*c?P^y5;myG|BT*c3G= zicULn9m_3O!hGm; za)Tptygyd|gyKKD1&{E3$!9R7#OywGfl;OMYmJQlXE@{3gq&Zy|Hx{3^GFAPjGk_U zyJW_)EgsU9py5jYD{fyYfm?PGN+saEwq{GWB*dAA>qGNQA$6?Hq>|@GR9%969Z=We+xGTqPG=6?KkPBK^U?JxSU!PgWhJQlpH=#J^auUuW zk(Xr%;kGnRI0x_q-J#~P)!)AG0-kP#C+X7hT5t^`N2P_%RrAjE(@qKt&ENF(b#6A< zJixzs4r5RBI^DoZ`M9`0rTayvlA;bJRIfNXs4Z24Q!qa6FK^dE!Qr!E`5=Z;CI%^- zQ~l>D>NylVu#)r>A5K$X=OYpH8vWPGXLFx+6h`B1w!@OE=QZWe{Qkg-a^mGQtq_f_ zO=r>V1_|^V%7);x#E^)zhN6id*g#zajstR?>v$t98!h%*cew&=Jfq&cKp2(|6kujn zHUwpOH7n1#NqeJ)@lF! +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; + +namespace cAlgo.Robots +{ + // Defines the trading direction + public enum TradeDirection + { + Both, + Long, + Short + } + + [Robot(AccessRights = AccessRights.None)] + public class HmaTrendTrader : Robot + { + [Parameter("Trade Direction", DefaultValue = TradeDirection.Both)] + public TradeDirection TradeDir { get; set; } + + [Parameter("HMA Period", DefaultValue = 25, MinValue = 2)] + public int HmaPeriod { get; set; } + + [Parameter("Max Positions (per Direction)", DefaultValue = 3, MinValue = 1)] + public int MaxPositions { get; set; } + + [Parameter("Risk (Pips)", DefaultValue = 125, MinValue = 1)] + public double RiskPips { get; set; } + + [Parameter("Volume (Lots)", DefaultValue = 0.1, MinValue = 0.01, Step = 0.01)] + public double VolumeLots { get; set; } + + [Parameter("Enable Grid Take Profit", DefaultValue = true)] + public bool EnableGridTakeProfit { get; set; } + + [Parameter("Enable Opposite Exit", DefaultValue = true)] + public bool EnableOppositeExit { get; set; } + + [Parameter("Enable Volume Scaling", DefaultValue = false)] + public bool EnableVolumeScaling { get; set; } + + [Parameter("Cooldown Bars", DefaultValue = 1, MinValue = 0)] + public int CooldownBars { get; set; } + + private HullMovingAverage _hma; + private double _volumeInUnits; + + // Bias state updated by OnBarClosed + private bool _isShortBias = false; + private bool _isLongBias = false; + + // Cooldown tracking + private int _lastLongExitBarIndex = -1; + private int _lastShortExitBarIndex = -1; + + // Extremum Tracking stores HMA values + private double? _lastPeakPrice = null; + private double? _lastTroughPrice = null; + + // NEW: Index tracking for comparison + private int _lastPeakIndex = -1; + private int _lastTroughIndex = -1; + + protected override void OnStart() + { + _hma = Indicators.HullMovingAverage(Bars.ClosePrices, HmaPeriod); + + _volumeInUnits = Symbol.QuantityToVolumeInUnits(VolumeLots); + _volumeInUnits = Symbol.NormalizeVolumeInUnits(_volumeInUnits, RoundingMode.ToNearest); + + Positions.Closed += OnPositionsClosed; + + Print("HmaTrendTrader started. Managing existing positions:"); + + var positionsToLog = new List(); + + if (TradeDir == TradeDirection.Long || TradeDir == TradeDirection.Both) + { + // Get all existing Long positions for this symbol + positionsToLog.AddRange(GetManagedPositions().Where(p => p.TradeType == TradeType.Buy)); + } + if (TradeDir == TradeDirection.Short || TradeDir == TradeDirection.Both) + { + // Get all existing Short positions for this symbol + positionsToLog.AddRange(GetManagedPositions().Where(p => p.TradeType == TradeType.Sell)); + } + + // Use Distinct() in case TradeDir == Both + foreach (var pos in positionsToLog.Distinct()) + { + Print($" -> Takeover: {pos.TradeType} ID {pos.Id}, Vol: {pos.VolumeInUnits}, Entry: {pos.EntryPrice}, SL: {pos.StopLoss}"); + } + + if (!positionsToLog.Any()) + { + Print(" -> No existing positions found for management."); + } + + // Added: Initial status report after takeover + LogStatusReport(); + } + + // Added: Event handler for position closures (Cooldown logic) + private void OnPositionsClosed(PositionClosedEventArgs args) + { + var position = args.Position; + + // Only track positions managed by this bot + if (position.SymbolName == Symbol.Name) + { + // Store the index of the bar *during which* the exit occurred + int exitBarIndex = Bars.Count - 1; + + if (position.TradeType == TradeType.Buy) + { + _lastLongExitBarIndex = exitBarIndex; + } + else if (position.TradeType == TradeType.Sell) + { + _lastShortExitBarIndex = exitBarIndex; + } + } + } + + protected override void OnTick() + { + HandleEntry(); + HandleExit(); + HandleExtremumCleanup(); // Cleanup logic runs continuously + } + + private void HandleExtremumCleanup() + { + // --- CLEANUP SHORT EXTREMUM (TROUGH) --- + // Trigger: Price hits Trough level + if (_lastTroughPrice.HasValue && Symbol.Bid <= _lastTroughPrice.Value) + { + // Reset Condition: Only reset if the Peak is newer (structural validation) + bool isPeakNewer = _lastPeakPrice.HasValue && (_lastPeakIndex > _lastTroughIndex); + + if (isPeakNewer) + { + Print($"Trough cleanup hit at {_lastTroughPrice}. Resetting Trough (Peak is newer)."); + _lastTroughPrice = null; + _lastTroughIndex = -1; + } + // Optional: We could implement aggressive cleanup here if no Peak exists, + // but sticking strictly to the user's structural rule. + } + + // --- CLEANUP LONG EXTREMUM (PEAK) --- + // Trigger: Price hits Peak level + if (_lastPeakPrice.HasValue && Symbol.Ask >= _lastPeakPrice.Value) + { + // Reset Condition: Only reset if the Trough is newer (structural validation) + bool isTroughNewer = _lastTroughPrice.HasValue && (_lastTroughIndex > _lastPeakIndex); + + if (isTroughNewer) + { + Print($"Peak cleanup hit at {_lastPeakPrice}. Resetting Peak (Trough is newer)."); + _lastPeakPrice = null; + _lastPeakIndex = -1; + } + } + } + + protected override void OnBarClosed() + { + bool wasLongBias = _isLongBias; + bool wasShortBias = _isShortBias; + + // Data for HMA + var hma_T1 = _hma.Result.Last(0); + var hma_T2 = _hma.Result.Last(1); + + _isShortBias = hma_T1 < hma_T2; + _isLongBias = hma_T1 > hma_T2; + + // --- TRACKING EXTREMA (HMA Value at Pivot) --- + + // Index of the bar that just closed (used as the creation index for the extremum) + int currentBarIndex = Bars.Count - 1; + + // 1. Flip from Long to Short (Peak confirmed) + if (wasLongBias && !_isLongBias) + { + _lastPeakPrice = hma_T2; + _lastPeakIndex = currentBarIndex; + } + + // 2. Flip from Short to Long (Trough confirmed) + if (wasShortBias && !_isShortBias) + { + _lastTroughPrice = hma_T2; + _lastTroughIndex = currentBarIndex; + } + + // --- EXIT LOGIC (Grid) --- + + if (EnableGridTakeProfit) + { + if (wasLongBias && !_isLongBias) + { + if (TradeDir == TradeDirection.Short || TradeDir == TradeDirection.Both) + { + var shorts = GetManagedPositions().Where(p => p.TradeType == TradeType.Sell).ToList(); + + if (shorts.Count > 0 && shorts.Sum(p => p.GrossProfit) > 0) + { + Print($"HMA Peak detected. Closing {shorts.Count} Short positions (Total PnL > 0)."); + foreach (var pos in shorts) ClosePosition(pos); + } + } + } + + if (wasShortBias && !_isShortBias) + { + if (TradeDir == TradeDirection.Long || TradeDir == TradeDirection.Both) + { + var longs = GetManagedPositions().Where(p => p.TradeType == TradeType.Buy).ToList(); + + if (longs.Count > 0 && longs.Sum(p => p.GrossProfit) > 0) + { + Print($"HMA Trough detected. Closing {longs.Count} Long positions (Total PnL > 0)."); + foreach (var pos in longs) ClosePosition(pos); + } + } + } + } + + HandleBreakevenMove(); + LogStatusReport(); + } + + private void HandleEntry() + { + if (TradeDir == TradeDirection.Long || TradeDir == TradeDirection.Both) HandleLongEntry(); + if (TradeDir == TradeDirection.Short || TradeDir == TradeDirection.Both) HandleShortEntry(); + } + + private void HandleShortEntry() + { + // Cooldown check + if (_lastShortExitBarIndex > -1 && (Bars.Count - 1 < _lastShortExitBarIndex + CooldownBars)) return; + + // Conditions + if (!_isShortBias) return; + if (Bars.HighPrices.Last(1) > Bars.HighPrices.Last(2)) return; + if (Symbol.Bid <= Bars.HighPrices.Last(1)) return; + if (GetAtRiskPositionsCount(TradeType.Sell) > 0) return; + + int positionCount = GetManagedPositionsCount(TradeType.Sell); + if (positionCount >= MaxPositions) return; + + // Volume + double volumeToExecute = _volumeInUnits; + if (EnableVolumeScaling) volumeToExecute = _volumeInUnits * (positionCount + 1); + volumeToExecute = NormalizeVolume(volumeToExecute); + if (volumeToExecute == 0) return; + + var result = ExecuteMarketOrder(TradeType.Sell, Symbol.Name, volumeToExecute, null, RiskPips, null); + + if (result.IsSuccessful) + { + // TP LOGIC: Set TP for the new position to the last Trough price + if (_lastTroughPrice.HasValue) + { + TrySetTakeProfit( + result.Position, + _lastTroughPrice.Value, + $"TP set for new Short {result.Position.Id} at Trough price: {_lastTroughPrice}"); + } + else + { + Print($"INFO: Short Entry {result.Position.Id} was placed, but _lastTroughPrice is NULL. TP not set."); + } + + if (EnableOppositeExit) ManageOppositePositions(TradeType.Sell); + } + } + + private void HandleLongEntry() + { + if (_lastLongExitBarIndex > -1 && (Bars.Count - 1 < _lastLongExitBarIndex + CooldownBars)) return; + if (!_isLongBias) return; + if (Bars.LowPrices.Last(1) < Bars.LowPrices.Last(2)) return; + if (Symbol.Ask >= Bars.LowPrices.Last(1)) return; + if (GetAtRiskPositionsCount(TradeType.Buy) > 0) return; + + int positionCount = GetManagedPositionsCount(TradeType.Buy); + if (positionCount >= MaxPositions) return; + + double volumeToExecute = _volumeInUnits; + if (EnableVolumeScaling) volumeToExecute = _volumeInUnits * (positionCount + 1); + + volumeToExecute = NormalizeVolume(volumeToExecute); + if (volumeToExecute == 0) return; + + var result = ExecuteMarketOrder(TradeType.Buy, Symbol.Name, volumeToExecute, null, RiskPips, null); + + if (result.IsSuccessful) + { + // TP LOGIC: Set TP for the new position to the last Peak price + if (_lastPeakPrice.HasValue) + { + TrySetTakeProfit( + result.Position, + _lastPeakPrice.Value, + $"TP set for new Long {result.Position.Id} at Peak price: {_lastPeakPrice}"); + } + else + { + Print($"INFO: Long Entry {result.Position.Id} was placed, but _lastPeakPrice is NULL. TP not set."); + } + + if (EnableOppositeExit) ManageOppositePositions(TradeType.Buy); + } + } + + private void TrySetTakeProfit(Position position, double tpPrice, string logMessage) + { + tpPrice = Math.Round(tpPrice, Symbol.Digits); + + try + { + ModifyPosition(position, position.StopLoss, tpPrice, ProtectionType.Absolute); + Print(logMessage); + } + catch (Exception ex) + { + Print($"ERROR: Failed to set TP for {position.Id} to {tpPrice}. Reason: {ex.Message}"); + } + } + + private void ManageOppositePositions(TradeType newEntryDirection) + { + TradeType oppositeType = (newEntryDirection == TradeType.Buy) ? TradeType.Sell : TradeType.Buy; + var oppositePositions = GetManagedPositions().Where(p => p.TradeType == oppositeType).ToList(); + + if (!oppositePositions.Any()) return; + + if (oppositePositions.Sum(p => p.GrossProfit) > 0) + { + Print($"Fresh Entry ({newEntryDirection}) -> Basket Close {oppositeType}."); + foreach (var pos in oppositePositions) ClosePosition(pos); + return; + } + + foreach (var pos in oppositePositions) + { + if (pos.GrossProfit > 0) ClosePosition(pos); + else SetScratchTpOrClose(pos); + } + } + + private void HandleBreakevenMove() + { + var lastClosedHigh = Bars.HighPrices.Last(0); + var lastClosedLow = Bars.LowPrices.Last(0); + var buffer = 2 * Symbol.Spread; + + foreach (var pos in GetManagedPositions()) + { + if (pos.TradeType == TradeType.Sell && (TradeDir == TradeDirection.Short || TradeDir == TradeDirection.Both)) + { + if (pos.StopLoss.HasValue == false || pos.StopLoss > pos.EntryPrice) + { + if (pos.EntryPrice > (lastClosedHigh + buffer)) + { + var newSL = pos.EntryPrice - Symbol.Spread; + if (!pos.StopLoss.HasValue || Math.Abs(pos.StopLoss.Value - newSL) > Symbol.PipSize * 0.1) + ModifyPosition(pos, newSL, pos.TakeProfit, ProtectionType.Absolute); + } + } + } + else if (pos.TradeType == TradeType.Buy && (TradeDir == TradeDirection.Long || TradeDir == TradeDirection.Both)) + { + if (pos.StopLoss.HasValue == false || pos.StopLoss < pos.EntryPrice) + { + if (pos.EntryPrice < (lastClosedLow - buffer)) + { + var newSL = pos.EntryPrice + Symbol.Spread; + if (!pos.StopLoss.HasValue || Math.Abs(pos.StopLoss.Value - newSL) > Symbol.PipSize * 0.1) + ModifyPosition(pos, newSL, pos.TakeProfit, ProtectionType.Absolute); + } + } + } + } + } + + private void HandleExit() + { + if (_isLongBias) + { + if (TradeDir == TradeDirection.Short || TradeDir == TradeDirection.Both) HandleLossPreventionExit(TradeType.Sell); + } + if (_isShortBias) + { + if (TradeDir == TradeDirection.Long || TradeDir == TradeDirection.Both) HandleLossPreventionExit(TradeType.Buy); + } + } + + private void HandleLossPreventionExit(TradeType tradeType) + { + foreach (var pos in GetManagedPositions().Where(p => p.TradeType == tradeType && p.GrossProfit <= 0)) + { + SetScratchTpOrClose(pos); + } + } + + private void SetScratchTpOrClose(Position pos) + { + double scratchTp; + double currentPrice; + bool isBuy = pos.TradeType == TradeType.Buy; + + if (isBuy) + { + scratchTp = pos.EntryPrice + Symbol.Spread; + currentPrice = Symbol.Bid; + } + else + { + scratchTp = pos.EntryPrice - Symbol.Spread; + currentPrice = Symbol.Ask; + } + + scratchTp = Math.Round(scratchTp, Symbol.Digits); + + if ((isBuy && currentPrice >= scratchTp) || (!isBuy && currentPrice <= scratchTp)) + { + ClosePosition(pos); + return; + } + + if (pos.TakeProfit.HasValue && Math.Abs(pos.TakeProfit.Value - scratchTp) < Symbol.PipSize) return; + + try + { + ModifyPosition(pos, pos.StopLoss, scratchTp, ProtectionType.Absolute); + } + catch (Exception) {} + } + + private double NormalizeVolume(double vol) + { + vol = Symbol.NormalizeVolumeInUnits(vol, RoundingMode.ToNearest); + if (vol < Symbol.VolumeInUnitsMin) vol = Symbol.VolumeInUnitsMin; + if (vol > Symbol.VolumeInUnitsMax) vol = Symbol.VolumeInUnitsMax; + return vol; + } + + private void LogStatusReport() + { + int longPositions = 0, shortPositions = 0, longAtRisk = 0, shortAtRisk = 0; + + if (TradeDir != TradeDirection.Short) + { + longPositions = GetManagedPositionsCount(TradeType.Buy); + longAtRisk = GetAtRiskPositionsCount(TradeType.Buy); + } + if (TradeDir != TradeDirection.Long) + { + shortPositions = GetManagedPositionsCount(TradeType.Sell); + shortAtRisk = GetAtRiskPositionsCount(TradeType.Sell); + } + + var activePositions = GetActiveManagedPositions(); + double openPips = activePositions.Sum(p => p.Pips); + double todayPips = History.Where(t => t.ClosingTime.Date == Server.Time.Date && t.SymbolName == Symbol.Name).Sum(t => t.Pips); + + string swingInfo = ""; + if (_lastPeakPrice.HasValue) swingInfo += $"PeakHMA: {_lastPeakPrice} "; + if (_lastTroughPrice.HasValue) swingInfo += $"TroughHMA: {_lastTroughPrice}"; + + Print($"Status: Open: {openPips:F1} Pips | Day: {todayPips:F1} Pips | L:{longPositions}({longAtRisk}) S:{shortPositions}({shortAtRisk}) | {swingInfo}"); + } + + private System.Collections.Generic.IEnumerable GetManagedPositions() + { + return Positions.Where(p => p.SymbolName == Symbol.Name); + } + + private List GetActiveManagedPositions() + { + var managedPositions = new List(); + if (TradeDir != TradeDirection.Short) managedPositions.AddRange(GetManagedPositions().Where(p => p.TradeType == TradeType.Buy)); + if (TradeDir != TradeDirection.Long) managedPositions.AddRange(GetManagedPositions().Where(p => p.TradeType == TradeType.Sell)); + return managedPositions.Distinct().ToList(); + } + + private int GetManagedPositionsCount(TradeType tradeType) => GetManagedPositions().Count(p => p.TradeType == tradeType); + + private int GetAtRiskPositionsCount(TradeType tradeType) + { + if (tradeType == TradeType.Sell) + return GetManagedPositions().Count(p => p.TradeType == TradeType.Sell && p.StopLoss.HasValue && p.StopLoss > p.EntryPrice); + else + return GetManagedPositions().Count(p => p.TradeType == TradeType.Buy && p.StopLoss.HasValue && p.StopLoss < p.EntryPrice); + } + + protected override void OnStop() + { + if (Positions != null) + { + Positions.Closed -= OnPositionsClosed; + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/HmaTrendTrader.csproj b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/HmaTrendTrader.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/HmaTrendTrader.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfo.cs b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfo.cs new file mode 100644 index 0000000..dab0451 --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("HmaTrendTrader")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("HmaTrendTrader")] +[assembly: System.Reflection.AssemblyTitleAttribute("HmaTrendTrader")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfoInputs.cache b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d97f190 --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f6adf706ad1e2096cedfd7bdb9e4f4226c670f98 diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..35605aa --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = HmaTrendTrader +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\HmaTrendTrader\HmaTrendTrader\ diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.assets.cache b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..6c113533b962c316fb01a8642705d3e1dbc43f68 GIT binary patch literal 571 zcmWIWc6a1rU|=u|`L>5!%v`hH^Zc%BZ(_YRDo=7Ll33#|U|9blYbWpQ$&5fnPyk{E zI$Onr7N-^!$2b+0=H{m6#OURfrl*#~6eK2RC#I(s$0U~&C8nen=_QtySL&Wx5&#KH z&lC*53M0#h0iz)^KaUL(z`Oy8B^jQ1P`whs;MRu(w?0a6b2=6mrTQu#^;)rV6>F7MEn^C6)k<4lYdsnaYb|0sw^lmoxwX literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.csproj.AssemblyReference.cache b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/Debug/net6.0/HmaTrendTrader.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 zcmd^|50n(enZRcdg@B46oEsHfjG9wm+;Mhc7euq{u0UMYWp`QrEq{7vYIj?Dx`&<~ zV7;gK9!8@E^)Qk6=ba=uPvwM*@y{7f6MYb$oL+n<=o5`TqjC^5dbxz>Ma8@7nXdk- zd#YzUW0h~HEbrmsR?XH|zxt}a`o6EKPKs`eL?Y3JO*4BIWs#ZfnPcYCX{7bU^jtr( zdNN9Kjna>@JxR+{Qpk)cIm<{Z7V3$|YGU!)9!>4-(UCPhR@0Mg)cTEBWBdGAO4FiI z{JD|)>o2?Mpk#|mx-?Q?iN3Xc$z1lM; z{bt~i=t$hA+PmMVsj3}$eYDk;acXrp?o8FtXWQL`|4glJ%4t^4M6-32!(FLOt!~ft zYHIRIG}vXVLHg`OZ9_v!Nz}ya6SXz<^)>i|@mF-zx>{U6QIm)_M4~G&rgqclH&GLx*biO_~~o2trf|#|rfWv-dhLv7b~p4xV*FQ3P9@@8u)UZkC6aeM6BTxra$=Jiw8EY8vgQ_ z@2p+)(3ab_U--eXu`mDIj#&?$`o)9K{N!Bi>diAoweCCNlkxM`=ue-!^gI7lKX;OT zbnQ!9{!zI!^3S#0F$$((5-ol-@ZTqimLvTN`JTUplb>XLGo!8we1q>AJ`Kb_85O0R}MVWSrv zbY|SM8REJX1 zYt(haQVLd=OBGD5$*!P5wd94I8d7#a%uT_}n-xo8a-X&M=_d=DrSsXc`)WpUjK=fz zC87mSe16BFVH^8znzVlA?Qh>)|H8!m!*-#cS5I8M^s>A5Y(bO0d*5@HkDu_t6PG_S zHokN8zQnIST0Oac+SaNg@rQOkbIP_67oY$7wY!YHV~#DoZT}l}@3%I5ucc|k;rC|U zaKZT5JNF*FYm>3{g-_yrX1Zp^28Mn=l4+YU)Fc; znBG zf%!Msf_v)8i@h&|^n%Fqizc#Va9M*%H-TAFUb;(|@(SXq@YiI$Pwmf{c@rH}ck`yt zoZ#?yS3Ig9Ps6OTe4vY2;sVUjc32qKC->+Co`bUn?d+Vm;g629lSC(+BJ!#uiB33z z0y?fH)Dr%Bh;yyn*%Wd!M!VzDL}9h=G-}U8c2N24$G=|F)BW|@cW#chQJ)Gu6n=2e zn4#1q>!!yW61AwNzJayL;O-x?_l7udlTI5tbQG8v#6Lt8lXs94{}3fCVB|W`xqI&O zO}78)L{`fN3+Z-_BNb2uLxOnj*){kn1M!rze-HF4SM}gNf#h57P9UHcWCF2&&acnN z1Y&=xpdR8L7;ILRe%;7gYBC=H#woN(iyC;aR+7LVvx2;n3JDA{#RkY+rx$+NQ_hM; zH@+G5=K5i+fYi9Epu+OPT^=N|Ah6tB4j!hBrO8PR$he_Nqc$>zw4EB))=Ul{mz0UyU2D9N@#z^;7{guKZYOTBX7P&{BRrtGydxkTz7qru2ch

    #HOoHFi!2B%_e?$7O3Q1v-!uojBvUV-ioB3Xre1*Hf=~;!%xu)E z&fI0QEHkILyogzrnIp6yynWnPY*SfpBZZ6%SfIfw`#M>hib~51w+tO(a6-6bb7q-ew1X@SO_7uMfUsp|bYKBtqy23h2T+_(Po2PjXkwL0w7XGY%a& z-BQ!cozmZs@#!rpuR<qJz0dN_+w=Q!{oS!?1<9 zh(t=*HTaEN5}9EC9_ZKb)^~`0<(|s!YrQ*K!Biuu?B0_6`jMoLdp}=L|8bAY<5pA3 z-k7u_v^eY5G7Sv|C)h$HE?=Tr*q+@M!C%Lf&w)&dC4?^rdk8-S_pOdsgk}@pKjuxv zXm~#A>|cqaKcI@dxXD&0KyX2*xo>s6&1d<8VXh=wouE4M!X{gtAjt*M7GWJz^Z8=M zN)FJmd6>y5>$tdryqqa(y;y8Pkh$+?y@S-Xc>pfi&w2{V3zh6=J>m+2$vsks8$BN% z_`-K-r#dae#J6m-3@;L?D=sZBRuZWzmRS(n0p4y#-0}q|ZJ2`#luQPt>=}p3l>vP{ z%h_zR%FD}lWeKST5f-tpZ&x#zYQWYBZmOg9^^6+wQl|V247mky?h&BLh1R>PEqH9k zz&OsAk(XtMPf|hjMC^eU>1jpBi)*SdA$M9PQqr)}g4>wd12OB!OPAUMF(ns7yIX*+ zx>^c*+poD}S6+gxu8e|MrFgSyRrR&8mJKAFLs>@$-+avpz@Fhq zgPJGRuHg4=G<T^@uA7Cif6azR?SF$Q<-u!VKFN5@PX| zlouxn`FQ0O#FP6a1Nm0FIthjkxn#ipxxDPir3bc@f`~2Sy+{^JR+vZOfb=QOLQyEe zlUik^6}EfiEQ4E^ghKAiU>mYx^DHY9`*xPT?*^WmAj_bqpu7~xGUyRk5KQhK0JqWZ z)Cs;F;sGFKcp|K<{7>QmAd;3rFHFKG_k9LwZ}D-}7xz>o2J!glD<07_%b{TnD(lf9vsUUjXT|0R)j0Z?TJBe$@TT)(<#I@sk?chHeM8lv-j0RqEoqXZ++PPtBCQ~jLUx{= z$Xur;QM;kik5z&jkKTFGWqA^<+?^*aaT!#@>^!+&WNptWoknsEq9tK?8ifZ%1I4x_h13|)*GUn#nQGLJxQY4eDb z;|aC0w3aq>iL_;q45PH%53D!?k*uZunHW@-99Usi;K{bK6qX!VVTxS_7SvZ(UKMnMpFW9!YWS-ULQv)JdME8>XrdeZ zbjpNP$DwcJa9!QbCqr+A*MSfhMR4D+U)6gx9{h#(tlbWSgjBL&r;5ot^2vss5*9FW z9rWB!a&(|R4Rf?(iOp&@W1nyKZ2}-~oSftcsv|F8a*`uRazV7YzZXNbza_0&vH7iY z?YriEv1IUyllNju)svSxc`v4v^n%E9zn8`@L#x_9V68{?-(Y#d^iA%iDN#*c?&MyY z62c3@&i#H|zX*(#n%s};D=IHuazCz5U_nT^J9y}3GoFfs<(fEnm=)y3OB_5*u?0cq z{+a;Q_yx#PQuZ^iuI}EURXG{9hgla$0bqs>Lj`#eGjtfl z76h659iY_s>>A7<)}_d2M9y|JncM*ySV>;kWEI4ayKC3Zowr|4&EmX2JM0as?&hCP^_^?+mz9?%aqapg7DQFRR18!L-z~^r zUP9qry>Uv>R2)!AUd}KT2Z$~RxIi^7Jgo?744g@X1_pJZth{)O)wm$BAgWpJ3#{|X zk9}V~zWU8{5*@R#MS520qwe|J_1kHVGG9PeqS966Wv+(n06{~*`pSktx0=lag?3%m-lFnSbzRn8fdwJGPSm75U&pUp8yR=mb_OZ)Kr7g3ao^-M^ry%>5Ujtr zF9eMd?#bq4!t&E~Jt;6CNV0iA6?y5CWb**Q1)&zUdSle4s%Py)I+rq}ocmXAD9saa zWhI{bS8tHH47Op?&$(wNlcCvac)e$^c#{**-jY0-R#w6}$xQajTL#ZCndbZ*DUQX_ zR+JnGcDCzC@s*XAsq0AbNi2w}uw68^#8h~pweX@YHqog07%2O9(Lr_PrS9KF2larU zQJ{-5%e``V@79BPd$P~;EUqOl`P7iI3u68iX+8wk!4f+`neF&cOKU#Vm6v~M&4(Tk zGz$2~!<==?tHVpu)WvV0_-<-KP$hY}yYa9f(FFnLpK!z!z}cvg)Vf`BDRIW#0mWx_H-EIUI#i`x}LtYJ8=oJ*uaXt3J{W?8z=}pixL)cB}EPmuV zJ$4Ow!IJCr*m4Wv%srUkw!TSI)HJoP0aYcz1Yc2k$&z4#Phdevxm&Q%Y;!PU8U3b` z85oQ;YW)Vj+iQT$m{_nw)s+`Iv0#Vl0YRgHy9LXZqe<_F4GgF_v0wu$$;+Ksuz{i< z=fJZW0A9Rh36MIQ`Ktw<%?JW+^0uzo>{|4sk@DP+`#;xy+cDM7cWlwpHRVM=5K4YQ z{MUXp{IAL&y)#SsDVpOG9sK8&6yK>RFa7>7;tPWR6&ZQpXk$(KrHwqOEAJ2}ZR9}@ z2pR>~d^JZ~pa1%`yNtbKjxD`y{~LAhw>EsQrD??B_h#L2!T8xb z_a41#ld<)MPv*8C+}e|Rx9a|uxBs-}qABC%?%0i{9Nj(g#1#)mM@Ax%_%G|bcT8`q zi;_Grzraq_L@P5}(<^ToJi}yba!;b~LL01@>mqA1Qm9?&r*}wT6_X_TfGYAX zrX-0zKyX0KHG<9k;zn=tSqI^O^*PQiFsP2au*t=ZL6Qri&HY^sZ~I*f3PN1uT@6n` zdATlTjc7qIxo>4XjI#C<8(>Yr>$zkrTU?qa*2+BpQY>>BY{Q&?S;5<7nQyr_h5EBc zPjMm?r_rOPQR#v0E#i8I#7R3Q_PkP857&Z_;O^*HikLZV?q^I;R(00jAV}q zRV;WJsKZ#x{O92T6W{Sc~sl-2eqhE{HbwkYAUt{j3cy%-JO57hH=c@yeRJNysl)_A;1p4u zQ^A+q=3i>d##)Ue&Uti6!p6r98Wff0iL|mdJS6|Et4QWD*oN8YaDRQ<({h(8Bw>)( zx9M_WQ!s{pfwG%8gQ)(4o(rFr6yg<1?oTdsD_Rb9H>|5TP1kS7;FRxiUu ztY&I;Q%)u^y_%Z55)F14Ymh!W%;@KCZP@Y8d6tz~WT~2JQP0mq z;EY%szM}HZX~f#_2@FU>C#Qr#%KbfSPe}XF!DGJntnrUsMZ|iQ|N0V&SXurU@}4yo z5^#l|MMETaa=*x==&`41!EA{k*sP`CM>+6 zO$L(1Og_1s-U?wZaCb=A?Jd0P<9`+eHbcZAMTPlk#qywE0Ua5B9SETw+_MbrzFE?2B=KFZI`u3t z7}O-o&{I%e#UNRR9&rICSFPawglN9e?TR(PLJD5mGpRwl#9Lfmu;d9*Mjr{n%iW;| zO^3;(4Nhyt(`~Vn-B(mzm}J}Q6Ic*ZA%+NUI2yRnnE0q%Cqt%Lg? zE1U&Asn9k2x@CUh0|j--5^i1M_z&hNS;{31XJkiHKM&hE+iVBf5YFhzIv3kUNm&N5 zFlS*GaU+(_CJj?lsY5s`=k0Tb@ksK+u&jpmom@#ivW$-D4Y4caHvJ7-5dn)-Rvj*k!*u034I_tE1$uF^(H3B)dm#qqIhJ`t7w2SjPCJOBUy literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.dgspec.json b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.dgspec.json new file mode 100644 index 0000000..b4df631 --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj", + "projectName": "HmaTrendTrader", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.props b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.targets b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/HmaTrendTrader.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.assets.json b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.assets.json new file mode 100644 index 0000000..26f0b99 --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj", + "projectName": "HmaTrendTrader", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.nuget.cache b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.nuget.cache new file mode 100644 index 0000000..c3ed89a --- /dev/null +++ b/Sources/Robots/HmaTrendTrader/HmaTrendTrader/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "EFmTahP3Dahr3ofgCrrTANByFY6zuVMJxQqTR1zpEqqpJCPx4tg5yc8kuKpi6MJDjxPFMt1JynivpUAWATS4sQ==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaTrendTrader\\HmaTrendTrader\\HmaTrendTrader.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportM1.algo b/Sources/Robots/MS_ExportM1.algo new file mode 100644 index 0000000000000000000000000000000000000000..0cb2074279ec22a3d9155bd82d25fe8298deb2c8 GIT binary patch literal 4826 zcmV<05+&_nY-eu*000AhABzY80000001CubTW{J*5Pq-J|6uWSDkaD`6p~1JASU#n zCXE#nDz#KcYkPnd>s_C{w53)4``y?Wv zDWcv{XuQH=pS9H|L=(0VlIm?bPud!zw?cNr&kDN2zlqw0CT&T5!8LGwRQ6o={dgT+ zxMLEH#$J@T7kN=M>{UnS>h5PIq&{BTDqcz+@fw!guLZcI>wj3!6(0;u z3jf7(e&VZo>c^xodB%OCv`A~3nWVrIw*Q2=w19{3pCaIgK@Almfx3j$h$*j7osDe{ z`gzEzf7;MQDM+J}?#`UDWN)xq?dQz#4bw)#4F{toVP{TYB1YqnuwRHB@EaRS&A6@Y zFM{WWpBH{jGgpt_K{B#$)n2X&0E?4rvVpEPj0uB4LQKnMYTo`Hz5~lM`0Xg1!kS>< z;XaK7J4srJu<_Y`YjAjn0gA z0;0DqWM0rMSO{99f7OD{Rer-IW-wwngsO3)r8y?LBt*rMW_IRSv%RCT=+{#uK2Tl} zIA~gXAU`XOHyDnGmlvbqxCse0WZi?UybNqFzry?+=hFt{E7W5|Gs+;Ozu;r^3iXI} zEZDJV=da!EyFZ+P>Sw+7Nk$^dsHXKP+Rf1cx3Bn`VP7pI&cfF`Ma{ zJwHTGS-F3MJ#IX1`?t1)3*jfw0f~2bs`i4AkK4n_dV+rqHff48(Z*l{tL?1M5G^VE z2$Bo-HftCp$h;R%AskHF72zghQ68QfZykJP$p>GK98ZrHU7~q zF#X3s9rW>DzRjQ*d!2!t_P8FWS86lZby6%^2~cb%E-sp@B*s*31#cF`uk;dw>C;@i zF;haRTS)PGulLzGs^c8=TdJwv0~~iw`-H1C5b{>9EQfFs#nUaL4q>9`qy8>6nmrj) z=lxn!z2cAOEoH+e#x8mP0x^ZhtkOnm$qiZ|%N~VQz#en0?e{W45~%p;fE

    nAj6T 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 _monthlyData; + private double _priceFactor; + + protected override void OnStart() + { + if (!IsBacktesting) + { + Print("This cBot only operates in Backtesting mode."); + Stop(); + return; + } + + if (string.IsNullOrWhiteSpace(DirectoryName)) + { + Print("Error: Output path is not specified."); + Stop(); + return; + } + + _monthlyData = new Dictionary>(); + _priceFactor = Math.Pow(10, Symbol.Digits); + Directory.CreateDirectory(DirectoryName); + Print("Starting M1 data accumulation..."); + } + + protected override void OnBar() + { + var barIndex = Bars.Count - 2; + if (barIndex < 0) return; + + var bar = Bars[barIndex]; + var monthKey = $"{Symbol.Name}_{bar.OpenTime:yyyy_MM}"; + + if (!_monthlyData.ContainsKey(monthKey)) + { + _monthlyData[monthKey] = new List(); + } + + var record = new M1Record + { + OADateTime = bar.OpenTime.ToOADate(), + Open = (long)(bar.Open * _priceFactor), + High = (long)(bar.High * _priceFactor), + Low = (long)(bar.Low * _priceFactor), + Close = (long)(bar.Close * _priceFactor), + Spread = (long)(Symbol.Spread * _priceFactor), + TickVolume = (int)bar.TickVolume, + Digits = Symbol.Digits + }; + + _monthlyData[monthKey].Add(record); + } + + protected override void OnTick() + { + // Not used + } + + // The OnStop method contains the new batching logic. + protected override void OnStop() + { + Print("Backtest finished. Writing accumulated data to batched files..."); + + if (_monthlyData == null || _monthlyData.Count == 0) + { + Print("No data was accumulated to write."); + return; + } + + // The keys (e.g., "EURUSD_2023_01") are sorted to process months chronologically. + var sortedMonthKeys = _monthlyData.Keys.ToList(); + sortedMonthKeys.Sort(); + + var recordBatch = new List(); + string startMonthKey = null; + long maxFileSizeBytes = MaxFileSizeKb * 1024; + var recordSize = Marshal.SizeOf(typeof(M1Record)); + + for (var i = 0; i < sortedMonthKeys.Count; i++) + { + var currentMonthKey = sortedMonthKeys[i]; + + // Set the start month for the new batch. + if (startMonthKey == null) + { + startMonthKey = currentMonthKey; + } + + // Add the entire month's data to the current batch. + recordBatch.AddRange(_monthlyData[currentMonthKey]); + + long currentBatchSizeBytes = recordBatch.Count * recordSize; + bool isLastMonth = (i == sortedMonthKeys.Count - 1); + + // Write the file if the size limit is exceeded OR if it's the last month. + // This ensures a month's data is never split. + if (currentBatchSizeBytes >= maxFileSizeBytes || isLastMonth) + { + var symbol = Symbol.Name; + var startDate = startMonthKey.Substring(symbol.Length + 1).Replace('_', '-'); + var endDate = currentMonthKey.Substring(symbol.Length + 1).Replace('_', '-'); + var fileNameBase = $"{symbol}_{startDate}_{endDate}"; + + WriteCompressedM1File(fileNameBase, recordBatch); + + // Reset for the next batch. + recordBatch.Clear(); + startMonthKey = null; + } + } + + Print("M1 data export completed successfully."); + } + + private void WriteCompressedM1File(string fileNameBase, List records) + { + // The path for the final archive file with an .m1 extension. + var archiveFilePath = Path.Combine(DirectoryName, $"{fileNameBase}.m1"); + // The name for the binary data file inside the archive. + var entryFileName = $"{fileNameBase}.m1"; + + var recordSize = Marshal.SizeOf(typeof(M1Record)); + var data = new byte[records.Count * recordSize]; + var handle = default(GCHandle); + + try + { + // This loop serializes the list of structs into a single byte array. + for (var i = 0; i < records.Count; i++) + { + var record = records[i]; + handle = GCHandle.Alloc(record, GCHandleType.Pinned); + Marshal.Copy(handle.AddrOfPinnedObject(), data, i * recordSize, recordSize); + handle.Free(); + } + } + finally + { + if (handle.IsAllocated) handle.Free(); + } + + // Create the ZIP archive file. + using (var fileStream = new FileStream(archiveFilePath, FileMode.Create)) + using (var archive = new ZipArchive(fileStream, ZipArchiveMode.Create)) + { + // Create a new entry inside the archive for the binary data. + var zipEntry = archive.CreateEntry(entryFileName, CompressionLevel.Optimal); + + // Open the entry's stream and write the serialized byte array to it. + using (var entryStream = zipEntry.Open()) + { + entryStream.Write(data, 0, data.Length); + } + } + + Print($"Created archive: {archiveFilePath} (Uncompressed Size: {data.Length / 1024.0:F2} kB)"); + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/MS_ExportM1.csproj b/Sources/Robots/MS_ExportM1/MS_ExportM1/MS_ExportM1.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/MS_ExportM1.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfo.cs b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfo.cs new file mode 100644 index 0000000..f8ca53f --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MS_ExportM1")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MS_ExportM1")] +[assembly: System.Reflection.AssemblyTitleAttribute("MS_ExportM1")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfoInputs.cache b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7bd95d5 --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ce4c412fa4edea093f10e5541b067b21cdaf492 diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..1360d65 --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MS_ExportM1 +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\MS_ExportM1\MS_ExportM1\ diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.assets.cache b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/Debug/net6.0/MS_ExportM1.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..87a5970408fec09ff197aee36eeb9d83713f23de GIT binary patch literal 571 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.dgspec.json b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.dgspec.json new file mode 100644 index 0000000..b4c50df --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj", + "projectName": "MS_ExportM1", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.props b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.props new file mode 100644 index 0000000..120d227 --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.targets b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/MS_ExportM1.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.assets.json b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.assets.json new file mode 100644 index 0000000..433cfd0 --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj", + "projectName": "MS_ExportM1", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.nuget.cache b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.nuget.cache new file mode 100644 index 0000000..c3ef36c --- /dev/null +++ b/Sources/Robots/MS_ExportM1/MS_ExportM1/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "GRpjVCmBWHgsHRIXVcYSIT2iekBcWzeywsXH//Ydh7cqImEi7KvxnFiQ+DXtKZNmE7kFdxuMJjhjI8Ai+rK6Xw==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportM1\\MS_ExportM1\\MS_ExportM1.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData.algo b/Sources/Robots/MS_ExportTickData.algo new file mode 100644 index 0000000000000000000000000000000000000000..0f85559cbf42f3d7369c8e8976e1e59ef945c745 GIT binary patch literal 18815 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 DateTime.FromOADate(OADateTime); + } + + private List _tickCache; + private int _cachedDataYear = 0; + private int _cachedDataMonth = 0; + private string _dataFolderPath; + private int _systemYearAtStart; + private int _systemMonthAtStart; + private string _outputCurrentModeFileExtension; + private HashSet _sessionOutputMonthsInitialized; + private bool _isDirectoryValid = false; + + private DateTime GetLastTickTimeFromFile(string filePath) { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid) return DateTime.MinValue; + try + { + if (!File.Exists(filePath)) return DateTime.MinValue; + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + if (fs.Length < Marshal.SizeOf(typeof(TickDataRecord))) return DateTime.MinValue; + fs.Seek(-Marshal.SizeOf(typeof(TickDataRecord)), SeekOrigin.End); + using (BinaryReader reader = new BinaryReader(fs)) + { + double oaDate = reader.ReadDouble(); + return DateTime.FromOADate(oaDate); + } + } + } + catch (Exception ex) { Print($"Error reading last tick time from {filePath}: {ex.Message}"); return DateTime.MinValue; } + } + + private void CompressFileAndRemoveOriginal(string sourceTabFilePath, string targetZipFilePath, string entryNameInZip) { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid || !File.Exists(sourceTabFilePath)) + { Print($"Compression skipped: Source file '{sourceTabFilePath}' not found or directory invalid."); return; } + Print($"Attempting to compress '{sourceTabFilePath}' to '{targetZipFilePath}'."); + try + { + if (File.Exists(targetZipFilePath)) { File.Delete(targetZipFilePath); } + using (FileStream originalFileStream = new FileStream(sourceTabFilePath, FileMode.Open, FileAccess.Read, FileShare.None)) + using (FileStream compressedFileStream = new FileStream(targetZipFilePath, FileMode.CreateNew)) + using (ZipArchive archive = new ZipArchive(compressedFileStream, ZipArchiveMode.Create)) + { + ZipArchiveEntry entry = archive.CreateEntry(entryNameInZip); + using (Stream entryStream = entry.Open()) { originalFileStream.CopyTo(entryStream); } + } + Print($"Successfully compressed '{sourceTabFilePath}' to '{targetZipFilePath}'."); + try { File.Delete(sourceTabFilePath); Print($"Deleted original file '{sourceTabFilePath}'."); } + catch (Exception exDel) { Print($"Error deleting original file '{sourceTabFilePath}' after compression: {exDel.Message}"); } + } + catch (IOException ioEx) when (File.Exists(targetZipFilePath) && ioEx.Message.Contains("already exists")) + { Print($"Compressed file '{targetZipFilePath}' conflict during CreateNew. Error: {ioEx.Message}"); } + catch (Exception ex) + { + Print($"Error during compression of '{sourceTabFilePath}': {ex.Message}"); + if (File.Exists(targetZipFilePath) ) { try { using(var fs = File.OpenRead(targetZipFilePath)) { if (fs.Length == 0) File.Delete(targetZipFilePath); } Print("Cleaned up potentially incomplete zip file on error."); } catch {} } + } + } + + private void ArchivePreExistingOldTabFile(int yearToProcess, int monthToProcess) { /* ... (as in v3.17, unchanged, operates on monthly .tab) ... */ + if (!_isDirectoryValid) return; + string tabFileNameOnly = $"{Symbol.Name}_{yearToProcess}_{monthToProcess:D2}.tab"; + string tabFilePath = Path.Combine(_dataFolderPath, tabFileNameOnly); + string zipFilePath = Path.Combine(_dataFolderPath, $"{Symbol.Name}_{yearToProcess}_{monthToProcess:D2}.tab_zip"); + + if (File.Exists(tabFilePath)) + { + if (!File.Exists(zipFilePath)) + { + Print($"Found pre-existing .tab file for old month {yearToProcess}-{monthToProcess:D2}: '{tabFilePath}'. Archiving..."); + CompressFileAndRemoveOriginal(tabFilePath, zipFilePath, tabFileNameOnly); + } else { + Print($"Archive file '{zipFilePath}' already exists. Deleting redundant pre-existing .tab file '{tabFilePath}'."); + try { File.Delete(tabFilePath); } catch (Exception exDel) { Print($"Error deleting redundant .tab file '{tabFilePath}': {exDel.Message}"); } + } + } + } + + private List ReadAllRecordsFromStream(Stream stream) { /* ... (as in v3.17, unchanged) ... */ + var records = new List(); + using (var reader = new BinaryReader(stream)) + { + while (reader.BaseStream.Position < reader.BaseStream.Length) { + try { + records.Add(new TickDataRecord(DateTime.FromOADate(reader.ReadDouble()), reader.ReadSingle(), reader.ReadSingle())); + } catch (EndOfStreamException) { break; } + catch (Exception exRead) { Print($"Error reading record stream: {exRead.Message}"); break;} + } + } + return records; + } + + // Temporary one-time migration from Symbol_YYYY.ext to Symbol_YYYY_MM.tab + private void MigrateYearlyFilesToMonthlyIfNeeded() + { + if (!_isDirectoryValid) return; + Print("Starting one-time check to migrate old yearly files (2017-2025) to monthly .tab format..."); + + for (int yearToMigrate = 2017; yearToMigrate <= 2025; yearToMigrate++) + { + string yearlyTabFileName = $"{Symbol.Name}_{yearToMigrate}.tab"; // Entry name if from zip + string yearlyTabFilePath = Path.Combine(_dataFolderPath, yearlyTabFileName); + string yearlyZipFilePath = Path.Combine(_dataFolderPath, $"{Symbol.Name}_{yearToMigrate}.tab_zip"); + + // Check if monthly files for this year ALREADY exist. + bool monthlyFilesAlreadyExistForThisYear = false; + for (int m = 1; m <= 12; m++) + { + if (File.Exists(Path.Combine(_dataFolderPath, $"{Symbol.Name}_{yearToMigrate}_{m:D2}.tab")) || + File.Exists(Path.Combine(_dataFolderPath, $"{Symbol.Name}_{yearToMigrate}_{m:D2}.tab_zip"))) + { + monthlyFilesAlreadyExistForThisYear = true; + break; + } + } + + if (monthlyFilesAlreadyExistForThisYear) + { + Print($"Monthly files for year {yearToMigrate} already exist."); + // If monthly files exist, delete any remaining original yearly file for cleanup + if (File.Exists(yearlyTabFilePath)) + { + Print($"Deleting obsolete yearly file: {yearlyTabFilePath}"); + try { File.Delete(yearlyTabFilePath); } catch (Exception ex) { Print($"Error deleting {yearlyTabFilePath}: {ex.Message}"); } + } + if (File.Exists(yearlyZipFilePath)) + { + Print($"Deleting obsolete yearly archive: {yearlyZipFilePath}"); + try { File.Delete(yearlyZipFilePath); } catch (Exception ex) { Print($"Error deleting {yearlyZipFilePath}: {ex.Message}"); } + } + continue; // Skip to next year + } + + // If we reach here, no monthly files for yearToMigrate exist yet. + // Now, try to find and process the yearly source file. + List recordsForYear = null; + string sourceYearlyFileProcessed = null; // Path of the file that was read + + if (File.Exists(yearlyZipFilePath)) + { + Print($"Found yearly archive {yearlyZipFilePath} for migration. Decompressing..."); + sourceYearlyFileProcessed = yearlyZipFilePath; + try { + using (FileStream zipToOpen = new FileStream(yearlyZipFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Read)) { + // Assume the entry name inside the zip is the original .tab filename + ZipArchiveEntry entry = archive.Entries.FirstOrDefault(e => e.Name.Equals(yearlyTabFileName, StringComparison.OrdinalIgnoreCase)); + if (entry != null) { + using (Stream entryStream = entry.Open()) { recordsForYear = ReadAllRecordsFromStream(entryStream); } + } else { Print($"Entry '{yearlyTabFileName}' not found in {yearlyZipFilePath}."); } + } + } catch (Exception ex) { Print($"Error decompressing or reading {yearlyZipFilePath}: {ex.Message}"); } + } + else if (File.Exists(yearlyTabFilePath)) + { + Print($"Found yearly .tab file {yearlyTabFilePath} for migration. Reading..."); + sourceYearlyFileProcessed = yearlyTabFilePath; + try { + using (FileStream fs = File.OpenRead(yearlyTabFilePath)) { recordsForYear = ReadAllRecordsFromStream(fs); } + } catch (Exception ex) { Print($"Error reading {yearlyTabFilePath}: {ex.Message}"); } + } + + if (recordsForYear == null || !recordsForYear.Any()) + { + if (sourceYearlyFileProcessed != null) Print($"No records in {sourceYearlyFileProcessed} or read error for year {yearToMigrate}. Source file will not be deleted automatically if it was not processed."); + else Print($"No yearly file (.tab or .tab_zip) found for {yearToMigrate} to convert."); + continue; // Move to next year + } + + Print($"Distributing {recordsForYear.Count} records from year {yearToMigrate} (source: {Path.GetFileName(sourceYearlyFileProcessed)}) into monthly .tab files. WARNING: This may be memory intensive."); + var monthlyGroups = recordsForYear.GroupBy(r => r.RecordTime.Month); + bool conversionSuccessAllMonths = true; + + foreach (var group in monthlyGroups) + { + int month = group.Key; + string monthlyTabTargetName = $"{Symbol.Name}_{yearToMigrate}_{month:D2}.tab"; + string monthlyTabTargetPath = Path.Combine(_dataFolderPath, monthlyTabTargetName); + List monthRecords = group.OrderBy(r => r.RecordTime).ToList(); + + Print($"Writing {monthRecords.Count} records for {yearToMigrate}-{month:D2} to {monthlyTabTargetPath} (Mode: Create)."); + if (!WriteRawCacheDataToFile(monthlyTabTargetPath, FileMode.Create, monthRecords)) + { + conversionSuccessAllMonths = false; + Print($"Failed to write {monthlyTabTargetPath}. Yearly migration for {yearToMigrate} will be considered incomplete."); + break; + } + } + + if (conversionSuccessAllMonths) + { + Print($"Successfully converted all months for year {yearToMigrate} from {sourceYearlyFileProcessed}. Deleting original yearly file."); + try { File.Delete(sourceYearlyFileProcessed); } + catch (Exception ex) { Print($"Error deleting original yearly file {sourceYearlyFileProcessed} after successful conversion: {ex.Message}."); } + } + else + { + Print($"Conversion of {sourceYearlyFileProcessed} for year {yearToMigrate} was incomplete due to errors. Original yearly file NOT deleted."); + } + } + Print("One-time yearly to monthly file migration check finished."); + } + + private void UpdateHistoricalTabFile(int yearToUpdate, int monthToUpdate) { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid) { Print($"Skipping UpdateHistoricalTabFile for {yearToUpdate}-{monthToUpdate:D2} as output directory is invalid."); return; } + Print($"Attempting to update historical .tab file for month {yearToUpdate}-{monthToUpdate:D2} in: '{_dataFolderPath}'"); + string historyTabFilePath = Path.Combine(_dataFolderPath, $"{Symbol.Name}_{yearToUpdate}_{monthToUpdate:D2}.tab"); + string zipFilePath = Path.ChangeExtension(historyTabFilePath, ".tab_zip"); + if (File.Exists(zipFilePath)) { Print($"Skipping update for {historyTabFilePath} as a compressed version '{zipFilePath}' already exists (month likely archived)."); return; } + DateTime lastTickTimeInTabFile = GetLastTickTimeFromFile(historyTabFilePath); + if (lastTickTimeInTabFile != DateTime.MinValue) Print($"Last tick in {historyTabFilePath} is at: {lastTickTimeInTabFile:yyyy-MM-dd HH:mm:ss.fff} UTC"); + else Print($"No existing .tab file found for {yearToUpdate}-{monthToUpdate:D2} or it's empty: {historyTabFilePath}"); + Ticks serverTicks = MarketData.GetTicks(SymbolName); + List recordsToAppendToTab = new List(); + DateTime earliestTickAvailableInCollection = DateTime.MaxValue; + if (serverTicks.Any()) { earliestTickAvailableInCollection = serverTicks.OrderBy(t => t.Time).First().Time; Print($"Earliest tick from server: {earliestTickAvailableInCollection:yyyy-MM-dd HH:mm:ss.fff} UTC"); } + if (lastTickTimeInTabFile != DateTime.MinValue && earliestTickAvailableInCollection > lastTickTimeInTabFile) { + Print($"Attempting to load more history for .tab. Last in file: {lastTickTimeInTabFile:yyyy-MM-dd HH:mm:ss.fff} UTC, earliest from server: {earliestTickAvailableInCollection:yyyy-MM-dd HH:mm:ss.fff} UTC"); + const int maxLoadAttempts = 100; + int totalLoadedHistorically = 0; + for (int i = 0; i < maxLoadAttempts; i++) { + int newlyLoadedCount = 0; + try { newlyLoadedCount = serverTicks.LoadMoreHistory(); } catch(Exception e) { Print($"Error during LoadMoreHistory: {e.Message}"); break; } + if (newlyLoadedCount == 0 && i > 0) { Print("LoadMoreHistory returned 0 new ticks in this attempt."); break; } + totalLoadedHistorically += newlyLoadedCount; + if (!serverTicks.Any()) { Print("Ticks collection became empty after LoadMoreHistory."); break; } + earliestTickAvailableInCollection = serverTicks.OrderBy(t => t.Time).First().Time; + Print($"Total {totalLoadedHistorically} ticks potentially loaded via LoadMoreHistory. Earliest tick now: {earliestTickAvailableInCollection:yyyy-MM-dd HH:mm:ss.fff} UTC"); + if (earliestTickAvailableInCollection <= lastTickTimeInTabFile) { Print("Gap to .tab file successfully bridged or covered by loaded history."); break; } + if (i == maxLoadAttempts - 1) Print("Max history load attempts reached."); + } + if (earliestTickAvailableInCollection > lastTickTimeInTabFile) { + string msg = $"Gap to .tab file for {yearToUpdate}-{monthToUpdate:D2} might still exist. Last in .tab: {lastTickTimeInTabFile:yyyy-MM-dd HH:mm:ss.fff} UTC, Earliest from server: {earliestTickAvailableInCollection:yyyy-MM-dd HH:mm:ss.fff} UTC"; + Print($"WARNING: {msg}"); MessageBox.Show($"{msg}. Run backtest to rebuild history database.", $"Warning for {Symbol.Name}", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK); + } else if (earliestTickAvailableInCollection != DateTime.MaxValue) { Print($"History load seems to cover up to or before last tick in .tab file for {yearToUpdate}-{monthToUpdate:D2}."); } + } + var newHistoricalTicks = serverTicks.Where(t => t.Time.Year == yearToUpdate && t.Time.Month == monthToUpdate && t.Time > lastTickTimeInTabFile).OrderBy(t => t.Time); + foreach (Tick tick in newHistoricalTicks) recordsToAppendToTab.Add(new TickDataRecord(tick.Time, (float)tick.Ask, (float)tick.Bid)); + if (recordsToAppendToTab.Any()) { + Print($"Found {recordsToAppendToTab.Count} new historical records to append to {historyTabFilePath}."); + try { + using (FileStream fs = new FileStream(historyTabFilePath, FileMode.Append, FileAccess.Write, FileShare.Read)) + using (BinaryWriter writer = new BinaryWriter(fs)) { foreach (var record in recordsToAppendToTab) { writer.Write(record.OADateTime); writer.Write(record.Ask); writer.Write(record.Bid); } writer.Flush(); fs.Flush(true); } + Print($"Successfully appended {recordsToAppendToTab.Count} records to {historyTabFilePath}."); + } catch (Exception ex) { Print($"Error appending to historical .tab file {historyTabFilePath}: {ex.Message}"); } + } else { Print($"No new historical records found to append to .tab file for {yearToUpdate}-{monthToUpdate:D2}."); } + } + + // Helper method to write a list of TickDataRecord to a specific file with a specific mode + private bool WriteRawCacheDataToFile(string filePath, FileMode mode, List cacheToFlush) { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid) { Print($"WriteRawCacheDataToFile: Skipped writing to '{filePath}' as output directory is invalid."); return false; } + if (cacheToFlush == null || !cacheToFlush.Any()) { Print($"WriteRawCacheDataToFile: Cache provided for '{filePath}' is empty or null. No data written."); return true; } + Print($"Attempting to write {cacheToFlush.Count} records to '{filePath}' using {mode}."); + try { + string fileDirectory = Path.GetDirectoryName(filePath); + if (!string.IsNullOrEmpty(fileDirectory) && !Directory.Exists(fileDirectory)) { Print($"Attempting to create directory for file: {fileDirectory}"); Directory.CreateDirectory(fileDirectory); } + using (FileStream fileStream = new FileStream(filePath, mode, FileAccess.Write, FileShare.Read)) + using (BinaryWriter writer = new BinaryWriter(fileStream)) { foreach (var recordInCache in cacheToFlush) { writer.Write(recordInCache.OADateTime); writer.Write(recordInCache.Ask); writer.Write(recordInCache.Bid); } writer.Flush(); fileStream.Flush(true); } + Print($"{cacheToFlush.Count} records successfully written to '{filePath}'."); + return true; + } catch (DirectoryNotFoundException dnfe) { Print($"DIRECTORY NOT FOUND while writing to '{filePath}': {dnfe.Message}. Marking directory as invalid."); _isDirectoryValid = false; return false; } + catch (IOException ex) { Print($"IO Error writing cache to '{filePath}' using {mode}: {ex.Message}"); return false; } + catch (Exception ex) { Print($"Unexpected error writing cache to '{filePath}' using {mode}: {ex.Message}"); return false; } + } + + protected override void OnStart() { /* ... (as in v3.17, with MigrateYearlyFilesToMonthlyIfNeeded call first) ... */ + _tickCache = new List(); + _sessionOutputMonthsInitialized = new HashSet(); + _dataFolderPath = DirectoryName; + + if (string.IsNullOrWhiteSpace(_dataFolderPath)) { Print("FATAL ERROR: The 'Output path' parameter is not set."); _isDirectoryValid = false; Stop(); return; } + if (!Directory.Exists(_dataFolderPath)) { Print($"FATAL ERROR: The specified Output path does not exist: '{_dataFolderPath}'. Stopping cBot."); _isDirectoryValid = false; Stop(); return; } + else { _isDirectoryValid = true; Print($"Using output directory: '{_dataFolderPath}'"); } + + _systemYearAtStart = DateTime.Now.Year; + _systemMonthAtStart = DateTime.Now.Month; + _outputCurrentModeFileExtension = IsBacktesting ? ".tab" : ".tab-live"; + + Print("Custom binary tick data saver with caching started."); + Print($"Actual system date at start (for context): {_systemYearAtStart}-{_systemMonthAtStart:D2}"); + Print("Operating Mode: {0}. File extension for output files this session: '{1}'", IsBacktesting ? "Backtesting" : "Live", _outputCurrentModeFileExtension); + + if (_isDirectoryValid) + { + MigrateYearlyFilesToMonthlyIfNeeded(); // Perform one-time migration first + + if (!IsBacktesting) + { + Print("Live mode: Checking for pre-existing old monthly .tab files to archive..."); + for (int year = 2017; year <= _systemYearAtStart; year++) { + for (int month = 1; month <= 12; month++) { + if (year < _systemYearAtStart || (year == _systemYearAtStart && month < _systemMonthAtStart)) { + ArchivePreExistingOldTabFile(year, month); + } + } + } + Print($"Live mode: Initial update of historical .tab file for month {_systemYearAtStart}-{_systemMonthAtStart:D2}..."); + UpdateHistoricalTabFile(_systemYearAtStart, _systemMonthAtStart); + Print("Live mode: Re-initializing cache for .tab-live session file."); + _tickCache.Clear(); _cachedDataYear = 0; _cachedDataMonth = 0; _sessionOutputMonthsInitialized.Clear(); + Print("In live mode, current month's .tab-live data will be flushed on {0} bar close.", TimeFrame); + Print("Hourly timer starting for background updates of current month's .tab historical file."); + Timer.Start(3600); + } + } else { Print("File operations (conversion, live startup) skipped due to invalid output directory."); } + } + + protected override void OnTimer() { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid || IsBacktesting) return; + int currentYear = DateTime.Now.Year; + int currentMonth = DateTime.Now.Month; + Print($"Hourly timer triggered at {Server.Time:yyyy-MM-dd HH:mm:ss} UTC. Attempting to update historical .tab file for month {currentYear}-{currentMonth:D2}..."); + UpdateHistoricalTabFile(currentYear, currentMonth); + } + + protected override void OnBar() { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid || IsBacktesting) return; + int currentProcessingYear = Server.Time.Year; + int currentProcessingMonth = Server.Time.Month; + if (_cachedDataYear == currentProcessingYear && _cachedDataMonth == currentProcessingMonth && _tickCache.Any()) { + Print($"Bar closed on {TimeFrame}. Flushing cache to '{_outputCurrentModeFileExtension}' for live month {_cachedDataYear}-{_cachedDataMonth:D2} ({_tickCache.Count} records) at {Server.Time:yyyy-MM-dd HH:mm:ss.fff} UTC."); + if (FlushOutputCacheToFile(_cachedDataYear, _cachedDataMonth)) { _tickCache.Clear(); Print("Cache successfully flushed and cleared on bar close."); } + else { Print($"Failed to write cache to '{_outputCurrentModeFileExtension}' for month {_cachedDataYear}-{_cachedDataMonth:D2} on bar close. Cache ({_tickCache.Count} records) retained.");} + } + } + + protected override void OnTick() { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid) return; + DateTime tickTime = Server.Time; + float askPrice = (float)Symbol.Ask; + float bidPrice = (float)Symbol.Bid; + int yearOfTick = tickTime.Year; + int monthOfTick = tickTime.Month; + var record = new TickDataRecord(tickTime, askPrice, bidPrice); + bool monthOrYearChanged = (_cachedDataYear != 0 && (_cachedDataYear != yearOfTick || _cachedDataMonth != monthOfTick)); + if (monthOrYearChanged && _tickCache.Any()) { + Print($"Date change for output cache (from {_cachedDataYear}-{_cachedDataMonth:D2} to {yearOfTick}-{monthOfTick:D2}). Flushing cache for {_cachedDataYear}-{_cachedDataMonth:D2} ({_tickCache.Count} records)."); + if (FlushOutputCacheToFile(_cachedDataYear, _cachedDataMonth)) _tickCache.Clear(); + else { Print($"CRITICAL: Failed to flush output cache for {_cachedDataYear}-{_cachedDataMonth:D2}. Data remains in cache. Tick for {yearOfTick}-{monthOfTick:D2} dropped."); return; } + } + _cachedDataYear = yearOfTick; + _cachedDataMonth = monthOfTick; + _tickCache.Add(record); + } + + private bool FlushOutputCacheToFile(int yearToFlush, int monthToFlush) { /* ... (as in v3.17, unchanged) ... */ + if (!_isDirectoryValid) { Print($"Skipping FlushOutputCacheToFile for {yearToFlush}-{monthToFlush:D2}: directory invalid."); return false; } + if (!_tickCache.Any()) { Print($"FlushOutputCacheToFile called for {yearToFlush}-{monthToFlush:D2}, but cache is empty."); return true; } + string fileKey = $"{yearToFlush}{monthToFlush:D2}"; + bool success = false; + if (IsBacktesting) { + string uncompressedTabFileName = $"{Symbol.Name}_{yearToFlush}_{monthToFlush:D2}.tab"; + string uncompressedTabFilePath = Path.Combine(_dataFolderPath, uncompressedTabFileName); + string compressedZipFileName = $"{Symbol.Name}_{yearToFlush}_{monthToFlush:D2}.tab_zip"; + string compressedZipFilePath = Path.Combine(_dataFolderPath, compressedZipFileName); + bool isOlderThanCurrentSystemMonth = yearToFlush < _systemYearAtStart || (yearToFlush == _systemYearAtStart && monthToFlush < _systemMonthAtStart); + if (isOlderThanCurrentSystemMonth) { + if (File.Exists(compressedZipFilePath)) { Print($"Backtesting: Compressed file '{compressedZipFilePath}' for older month {yearToFlush}-{monthToFlush:D2} already exists. No new file created."); success = true; } + else { + Print($"Backtesting: Generating data for older month {yearToFlush}-{monthToFlush:D2} to temporary file '{uncompressedTabFilePath}' for compression."); + if (WriteRawCacheDataToFile(uncompressedTabFilePath, FileMode.Create, _tickCache)) { CompressFileAndRemoveOriginal(uncompressedTabFilePath, compressedZipFilePath, uncompressedTabFileName); success = true; } + else { Print($"Backtesting: Failed to write .tab for {yearToFlush}-{monthToFlush:D2}. Compression skipped."); } + } + } else { + Print($"Backtesting: Generating uncompressed .tab file for current/future system month {yearToFlush}-{monthToFlush:D2}: '{uncompressedTabFilePath}'."); + success = WriteRawCacheDataToFile(uncompressedTabFilePath, FileMode.Create, _tickCache); + } + } else { + string outputFileName = $"{Symbol.Name}_{yearToFlush}_{monthToFlush:D2}{_outputCurrentModeFileExtension}"; + string outputFilePath = Path.Combine(_dataFolderPath, outputFileName); + FileMode mode = _sessionOutputMonthsInitialized.Contains(fileKey) ? FileMode.Append : FileMode.Create; + Print($"Mode for output file {outputFilePath} (Live .tab-live): {mode}."); + success = WriteRawCacheDataToFile(outputFilePath, mode, _tickCache); + if (success && mode == FileMode.Create) { _sessionOutputMonthsInitialized.Add(fileKey); } + } + return success; + } + + protected override void OnStop() { /* ... (as in v3.17, unchanged) ... */ + Print("Stopping cBot..."); + if (!IsBacktesting && _isDirectoryValid) { Timer.Stop(); Print("Hourly timer for .tab file updates stopped."); } + if (_isDirectoryValid && _tickCache.Any()) { + Print($"OnStop: Flushing remaining {_tickCache.Count} records from output cache for month {_cachedDataYear}-{_cachedDataMonth:D2} (Target ext: '{_outputCurrentModeFileExtension}')."); + if (FlushOutputCacheToFile(_cachedDataYear, _cachedDataMonth)) { _tickCache.Clear(); Print("Output cache successfully flushed and cleared."); } + else { Print($"OnStop: Failed to flush remaining output cache for month {_cachedDataYear}-{_cachedDataMonth:D2}. {_tickCache.Count} records may be lost."); } + } else if (!_isDirectoryValid) { Print("OnStop: No data flushed as output directory was invalid."); } + else { Print("OnStop: No data in output cache to flush."); } + _sessionOutputMonthsInitialized.Clear(); + Print("TickDataSaverCustomBinary stopped."); + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/MS_ExportTickData.csproj b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/MS_ExportTickData.csproj new file mode 100644 index 0000000..866383b --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/MS_ExportTickData.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + ..\..\..\Common\MSLib\obj\Debug\net6.0\MSLib.dll + + + \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfo.cs b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfo.cs new file mode 100644 index 0000000..78d6cb3 --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MS_ExportTickData")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MS_ExportTickData")] +[assembly: System.Reflection.AssemblyTitleAttribute("MS_ExportTickData")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfoInputs.cache b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f614a0b --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c3d257cf2f7ddc396be5a92ae68365f0f6daba64 diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..8eb2649 --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MS_ExportTickData +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\MS_ExportTickData\MS_ExportTickData\ diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.assets.cache b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..e97909cd13eb6361a191609d2a97fd62961e6baf GIT binary patch literal 571 zcmWIWc6a1rU|{fkbf5VicgDYvd(Ijyn-YBXXvmizU)a<2yWX_bGuL~?WJaJOC;%}7 zovmU*i&Kk=W1Nagb8}O3V)XJ#(^E@g3KEmE6Vp?RW0FgX5>rx(^b$);@^ceQQezDD z4D<|*VsbK*V)9Z;%=8Rmk{xr>^Yt79JoQp?a+r}!X9BW8d=?;Pg^D9nAQuQEhd?ZF zgjxVn0FqE7=roW@5TK1m*dT_3O-J_#NRAzdIe?fGh(STm4aCTR2gu>`D|JsT34ny9 zX9|X2g^}gMfYFedpT`CXVBUblk_^v0s9p(RaO*>YTOTF3IUS3OQ%gcB3sTvOO7luG pb5l8;^9w3{@{<#DSW1dYQ-xeoi%T-|5=($a2bU&+Oyxx}0RZ)qn92YE literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.csproj.AssemblyReference.cache b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/Debug/net6.0/MS_ExportTickData.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..f4d09161e7376bcf4a37574fad72c8ed651153aa GIT binary patch literal 74006 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 XK6;|(RoW<&z}VDS93RW(lTrD9(AMa{ literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.dgspec.json b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.dgspec.json new file mode 100644 index 0000000..c3b3f9a --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj", + "projectName": "MS_ExportTickData", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.props b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.props new file mode 100644 index 0000000..120d227 --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.targets b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/MS_ExportTickData.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.assets.json b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.assets.json new file mode 100644 index 0000000..e8fe508 --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj", + "projectName": "MS_ExportTickData", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.nuget.cache b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.nuget.cache new file mode 100644 index 0000000..6311bea --- /dev/null +++ b/Sources/Robots/MS_ExportTickData/MS_ExportTickData/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "HudTK3f0N+tNjBJb2A2PyUN32ap0Za5MJN0GkKma6X3CtPxIznL+XMezLx70VyeNs6v0IekOGrY2sHeH8g7KIQ==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_ExportTickData\\MS_ExportTickData\\MS_ExportTickData.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro.algo b/Sources/Robots/MS_HistoryToZorro.algo new file mode 100644 index 0000000000000000000000000000000000000000..fecdcc61214a490c34a461e7236c357681020192 GIT binary patch literal 11694 zcmV;fEm6{8Y-eu*0008fABzY80000001B*CQE%EX5Pq-J{}Ay^QD_@Tk@~=3tY~YC zmXv87)#M}xSas~^Vt0+I{`c7?K$@^=lL`__?!NP#zx(cZIX-fn)-a=Uz?=%+8aS

    %zU&-POdL!oS6 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 E-UU;casU7T literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_HistoryToZorro/.vscode/tasks.json b/Sources/Robots/MS_HistoryToZorro/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro.sln b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro.sln new file mode 100644 index 0000000..ef8c727 --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MS_HistoryToZorro", "MS_HistoryToZorro\MS_HistoryToZorro.csproj", "{95abf5e0-ec18-4558-8e7c-15f99fdc7ec6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {95abf5e0-ec18-4558-8e7c-15f99fdc7ec6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95abf5e0-ec18-4558-8e7c-15f99fdc7ec6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95abf5e0-ec18-4558-8e7c-15f99fdc7ec6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95abf5e0-ec18-4558-8e7c-15f99fdc7ec6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.cs b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.cs new file mode 100644 index 0000000..89d0de7 --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using cAlgo.API; +using cAlgo.API.Internals; +using Zorro; // For ZorroT6 and ZorroT6ArrayBuilder from your ZorroBinaryFiles.cs + +namespace cAlgo.Robots +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)] + public class BacktestYearlyDualExporterWithPrefix : Robot + { + [Parameter("Output Directory Path", DefaultValue = "C:\\Temp\\YearlyDualM1Export")] + public string OutputDirectory { get; set; } + + [Parameter("Filename Prefix", DefaultValue = "cTrader")] + public string FileNamePrefix { get; set; } + + private Dictionary> _yearlyCsvData; + private Dictionary _yearlyT6Builders; + private string _symbolSpecificOutputPath; + + protected override void OnStart() + { + _yearlyCsvData = new Dictionary>(); + _yearlyT6Builders = new Dictionary(); + + // Ensure Bars.Count is sufficient for .Last(1) access in OnBar, + // though OnBar typically isn't called until there are enough bars. + if (Bars.Count < 2 && IsBacktesting) // Check specifically for backtesting context + { + Print("Warning: Not enough bars loaded at OnStart to determine initial data for .Last(1). Will proceed and rely on OnBar calls."); + } + + + try + { + Directory.CreateDirectory(OutputDirectory); + _symbolSpecificOutputPath = Path.Combine(OutputDirectory, Symbol.Name); + Directory.CreateDirectory(_symbolSpecificOutputPath); + } + catch (Exception ex) + { + Print($"Error creating output directories: {ex.Message}. Stopping cBot."); + Stop(); + return; + } + + Print($"cBot started. Data for symbol {Symbol.Name} ({TimeFrame}) during the backtest period will be collected."); + Print($"Output will be saved to yearly files in: {_symbolSpecificOutputPath} with prefix '{FileNamePrefix}'"); + } + + protected override void OnBar() + { + // OnBar is called when a new bar opens. + // We need data from the bar that just *closed*. + // This corresponds to index [Bars.Count - 2] or .Last(1) on DataSeries. + // Check if enough bars exist. In backtesting, OnBar implies at least 2 bars are loaded + // (1 closed, 1 opening). + if (Bars.Count < 2) + { + // This should not happen in a normal OnBar sequence during backtesting + // after the history has started loading. + Print("Warning: OnBar called with Bars.Count < 2. Skipping this bar to prevent index error."); + return; + } + + // Correctly define barCloseTime as the OpenTime of the current, newly forming bar. + // This is the actual closing moment of the previous bar. + DateTime barCloseTime = Bars.OpenTimes.LastValue; // OpenTime of bar at index Bars.Count - 1 + + // The year for file splitting should be based on the timestamp of the bar being recorded. + // If barCloseTime represents the *end* of the period for lastBar, its year is appropriate. + int currentBarYear = barCloseTime.Year; + + // --- Ensure collections exist for the current year --- + if (!_yearlyCsvData.ContainsKey(currentBarYear)) + { + _yearlyCsvData[currentBarYear] = new List(); + _yearlyCsvData[currentBarYear].Add("Timestamp,Open,High,Low,Close,Volume,Spread"); + + _yearlyT6Builders[currentBarYear] = new ZorroT6ArrayBuilder(); + + Print($"Started collecting data for year: {currentBarYear}. Filenames will use prefix '{FileNamePrefix}'."); + } + + // --- Data points from the bar that just closed (using .Last(1) for each series) --- + float open = (float)Bars.OpenPrices.Last(1); // Data from bar at index Bars.Count - 2 + float high = (float)Bars.HighPrices.Last(1); // Data from bar at index Bars.Count - 2 + float low = (float)Bars.LowPrices.Last(1); // Data from bar at index Bars.Count - 2 + float close = (float)Bars.ClosePrices.Last(1); // Data from bar at index Bars.Count - 2 + float tickVolume = (float)Bars.TickVolumes.Last(1); // Data from bar at index Bars.Count - 2 + float spreadPlaceholder = 0.0f; + + // --- Populate CSV Data for the current year --- + string timestampStr = barCloseTime.ToString("yyyy-MM-dd HH:mm:ss"); + string openStr = open.ToString(CultureInfo.InvariantCulture); + string highStr = high.ToString(CultureInfo.InvariantCulture); + string lowStr = low.ToString(CultureInfo.InvariantCulture); + string closeStr = close.ToString(CultureInfo.InvariantCulture); + string volumeStrCsv = tickVolume.ToString(CultureInfo.InvariantCulture); + string spreadStrCsv = spreadPlaceholder.ToString("F1", CultureInfo.InvariantCulture); + + _yearlyCsvData[currentBarYear].Add($"{timestampStr},{openStr},{highStr},{lowStr},{closeStr},{volumeStrCsv},{spreadStrCsv}"); + + // --- Populate T6 Data for the current year --- + _yearlyT6Builders[currentBarYear].Add(barCloseTime, high, low, open, close, spreadPlaceholder, tickVolume); + } + + protected override void OnStop() + { + Print("Backtest finished. Saving collected data to yearly files..."); + + // --- Save CSV data for each year --- + foreach (var yearEntry in _yearlyCsvData) + { + int year = yearEntry.Key; + List csvLines = yearEntry.Value; + string csvFileName = $"{FileNamePrefix}_{Symbol.Name}_{year}.csv"; + string csvFilePath = Path.Combine(_symbolSpecificOutputPath, csvFileName); + + if (csvLines.Count > 1) + { + Print($"Saving {csvLines.Count -1} data records to CSV: {csvFilePath}"); + try + { + File.WriteAllLines(csvFilePath, csvLines, Encoding.UTF8); + Print($"Successfully saved CSV: {csvFilePath}"); + } + catch (Exception ex) + { + Print($"Error writing CSV file '{csvFilePath}': {ex.Message}"); + } + } + else + { + Print($"No data (or only header) collected for CSV for year {year}. Skipping file: {csvFilePath}"); + } + } + + // --- Save T6 binary data for each year --- + foreach (var yearEntry in _yearlyT6Builders) + { + int year = yearEntry.Key; + ZorroT6ArrayBuilder t6Builder = yearEntry.Value; + string t6FileName = $"{FileNamePrefix}_{Symbol.Name}_{year}.t6"; + string t6FilePath = Path.Combine(_symbolSpecificOutputPath, t6FileName); + + if (t6Builder.Count > 0) + { + Print($"Saving {t6Builder.Count} records to T6 binary: {t6FilePath}"); + try + { + t6Builder.SaveToFile(t6FilePath); + Print($"Successfully saved T6: {t6FilePath}"); + } + catch (Exception ex) + { + Print($"Error writing T6 binary file '{t6FilePath}': {ex.Message}"); + } + } + else + { + Print($"No data collected for T6 for year {year}. Skipping file: {t6FilePath}"); + } + } + + Print("Yearly data export process completed."); + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.csproj b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.csproj new file mode 100644 index 0000000..866383b --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/MS_HistoryToZorro.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + + + + + + + ..\..\..\Common\MSLib\obj\Debug\net6.0\MSLib.dll + + + \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfo.cs b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfo.cs new file mode 100644 index 0000000..bd9f428 --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MS_HistoryToZorro")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MS_HistoryToZorro")] +[assembly: System.Reflection.AssemblyTitleAttribute("MS_HistoryToZorro")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfoInputs.cache b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfoInputs.cache new file mode 100644 index 0000000..077a0e1 --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f9f65a61ac9aabeac45ca62c3dc6c6cbe416ef73 diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..fca47a3 --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MS_HistoryToZorro +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\MS_HistoryToZorro\MS_HistoryToZorro\ diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.assets.cache b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..549d37eb566ee97b8777e16da1a3965a848b4a98 GIT binary patch literal 571 zcmWIWc6a1rU|_i7aIb^qz+a0kRWn{~FPJv_^BccAZ&&v2JjG+N{pytKnv)rUil6|* z40N`N2`x@7Dvog~D$UJJ&56;=D@{)=i77}-&Q45EEsjYpDN0O9Ez(OYEy>SKEJ=+q z)HBdCG>XZ|Op3`%EiuzGh)H(LNzd1F4Di%T$;n|xGMx#?2Ju;dm=!9HOo3b=kQ@TB zz!7QzNC8Mfk)YE+DnWoY9$|wR4mKU#BOp0;Am#vKP9O#aJvR^|10EoU&#%-ywIl!% zmYyjXeicTR4+BO+W_}(UB!GDX5=$~X^PqYqfWfT~32uFq;O2BJE>0~8sVqokFDlI| q$;?gVbj~lR^vO?7%wZ`hDoqt~Ni8nP%u6f*8Xa7k1TvKu#RLF2y_~23 literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.csproj.AssemblyReference.cache b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/Debug/net6.0/MS_HistoryToZorro.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..2548430388c1f61c79da26d852aa4619b7c79149 GIT binary patch literal 74006 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 so$uHO^G6gKL + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/MS_HistoryToZorro.csproj.nuget.g.targets b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/MS_HistoryToZorro.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/MS_HistoryToZorro.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.assets.json b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.assets.json new file mode 100644 index 0000000..26360fb --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_HistoryToZorro\\MS_HistoryToZorro\\MS_HistoryToZorro.csproj", + "projectName": "MS_HistoryToZorro", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_HistoryToZorro\\MS_HistoryToZorro\\MS_HistoryToZorro.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_HistoryToZorro\\MS_HistoryToZorro\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.nuget.cache b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.nuget.cache new file mode 100644 index 0000000..b6988ba --- /dev/null +++ b/Sources/Robots/MS_HistoryToZorro/MS_HistoryToZorro/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "qCbXJQB185SwlDQtO1/3MEY82hhK0tNdCN1LG+SQT8gWU4mcxCk3Ng160ITJ+LhnH965XESK835MzjYBT8VANg==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_HistoryToZorro\\MS_HistoryToZorro\\MS_HistoryToZorro.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport.algo b/Sources/Robots/MS_IncrementalExport.algo new file mode 100644 index 0000000000000000000000000000000000000000..2b203fcfd313bebdcfaa6dbc34d23bc66327ef56 GIT binary patch literal 3735 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 BSttMi literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_IncrementalExport/.vscode/tasks.json b/Sources/Robots/MS_IncrementalExport/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport.sln b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport.sln new file mode 100644 index 0000000..031852f --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MS_IncrementalExport", "MS_IncrementalExport\MS_IncrementalExport.csproj", "{c3b052a5-8e47-4bd1-99ba-f114dbdcfa8f}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {c3b052a5-8e47-4bd1-99ba-f114dbdcfa8f}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {c3b052a5-8e47-4bd1-99ba-f114dbdcfa8f}.Debug|Any CPU.Build.0 = Debug|Any CPU + {c3b052a5-8e47-4bd1-99ba-f114dbdcfa8f}.Release|Any CPU.ActiveCfg = Release|Any CPU + {c3b052a5-8e47-4bd1-99ba-f114dbdcfa8f}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.cs b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.cs new file mode 100644 index 0000000..c3dbe3e --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.cs @@ -0,0 +1,186 @@ +/* * MS_IncrementalExport + * High-performance M1 and Tick data exporter. + * Naming: {Symbol}_{Start-YYYY-MM}_{End-YYYY-MM}.{ext} + */ + +using System; +using System.IO; +using System.IO.Compression; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using cAlgo.API; + +namespace cAlgo.Robots +{ + public enum ExportMode { M1, Tick } + + [Robot(AccessRights = AccessRights.FullAccess, AddIndicators = true)] + public class MS_IncrementalExport : Robot + { + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 56)] + private struct M1Record + { + public double OADateTime; // Must be at Offset 0 + public long Open, High, Low, Close, Spread; + public int TickVolume, Digits; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 16)] + private struct TickDataRecord + { + public double OADateTime; // Must be at Offset 0 + public float Ask; + public float Bid; + } + + [Parameter("Export Mode", DefaultValue = ExportMode.M1)] + public ExportMode Mode { get; set; } + + [Parameter("Output Path", DefaultValue = "/mnt/Data")] + public string DirectoryName { get; set; } + + [Parameter("Existing File Path", DefaultValue = "")] + public string ExistingFilePath { get; set; } + + [Parameter("Max File Size (kB)", DefaultValue = 10000)] + public int MaxFileSizeKb { get; set; } + + private List _m1Buffer = new List(); + private List _tickBuffer = new List(); + private double _lastTimestamp = double.MinValue; + private double _priceFactor; + + protected override void OnStart() + { + _priceFactor = Math.Pow(10, Symbol.Digits); + + if (!string.IsNullOrWhiteSpace(ExistingFilePath) && File.Exists(ExistingFilePath)) + { + LoadExistingData(ExistingFilePath); + } + } + + protected override void OnTick() + { + if (Mode != ExportMode.Tick) return; + + var time = Server.TimeInUtc.ToOADate(); + if (time <= _lastTimestamp) return; + + _tickBuffer.Add(new TickDataRecord + { + OADateTime = time, + Ask = (float)Symbol.Ask, + Bid = (float)Symbol.Bid + }); + } + + protected override void OnBar() + { + if (Mode != ExportMode.M1) return; + + var barIndex = Bars.Count - 2; + if (barIndex < 0) return; + + var bar = Bars[barIndex]; + var barTime = bar.OpenTime.ToOADate(); + + if (barTime <= _lastTimestamp) return; + + _m1Buffer.Add(new M1Record + { + OADateTime = barTime, + Open = (long)(bar.Open * _priceFactor), + High = (long)(bar.High * _priceFactor), + Low = (long)(bar.Low * _priceFactor), + Close = (long)(bar.Close * _priceFactor), + Spread = (long)(Symbol.Spread * _priceFactor), + TickVolume = (int)bar.TickVolume, + Digits = Symbol.Digits + }); + } + + protected override void OnStop() + { + if (Mode == ExportMode.M1) + ProcessExport(_m1Buffer, "m1"); + else + ProcessExport(_tickBuffer, "tick"); + } + + private void ProcessExport(List buffer, string extension) where T : unmanaged + { + if (buffer.Count == 0) return; + + int recordSize = Marshal.SizeOf(); + long maxBytes = (long)MaxFileSizeKb * 1024; + int batchSize = (int)(maxBytes / recordSize); + + for (int i = 0; i < buffer.Count; i += batchSize) + { + var count = Math.Min(batchSize, buffer.Count - i); + var batch = buffer.GetRange(i, count); + WriteBatch(batch, extension); + } + } + + private void WriteBatch(List records, string ext) where T : unmanaged + { + ReadOnlySpan span = CollectionsMarshal.AsSpan(records); + + // Extract timestamps via Cast to interpret the first 8 bytes as double + double start = MemoryMarshal.Cast(span)[0]; + double end = MemoryMarshal.Cast(span.Slice(records.Count - 1))[0]; + + string startStr = DateTime.FromOADate(start).ToString("yyyy-MM"); + string endStr = DateTime.FromOADate(end).ToString("yyyy-MM"); + + string fileName = $"{Symbol.Name}_{startStr}_{endStr}.{ext}"; + string archivePath = Path.Combine(DirectoryName, fileName); + + ReadOnlySpan byteSpan = MemoryMarshal.Cast(span); + + using var fileStream = new FileStream(archivePath, FileMode.Create); + using var archive = new ZipArchive(fileStream, ZipArchiveMode.Create); + var entry = archive.CreateEntry($"{Symbol.Name}.bin", CompressionLevel.Fastest); + + using var entryStream = entry.Open(); + entryStream.Write(byteSpan); + + Print("Saved: {0}", archivePath); + } + + private void LoadExistingData(string path) + { + try + { + using var archive = ZipFile.OpenRead(path); + var entry = archive.Entries.FirstOrDefault(); + if (entry == null) return; + + using var stream = entry.Open(); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + + byte[] data = ms.ToArray(); + if (Mode == ExportMode.M1) + { + var records = MemoryMarshal.Cast(data); + foreach (var r in records) if (r.OADateTime > _lastTimestamp) _lastTimestamp = r.OADateTime; + } + else + { + var records = MemoryMarshal.Cast(data); + foreach (var r in records) if (r.OADateTime > _lastTimestamp) _lastTimestamp = r.OADateTime; + } + + Print("Loaded existing data. Last timestamp: {0}", DateTime.FromOADate(_lastTimestamp)); + } + catch (Exception ex) + { + Print("Error loading existing data: {0}", ex.Message); + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.csproj b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/MS_IncrementalExport.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfo.cs b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfo.cs new file mode 100644 index 0000000..5c11940 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MS_IncrementalExport")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MS_IncrementalExport")] +[assembly: System.Reflection.AssemblyTitleAttribute("MS_IncrementalExport")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfoInputs.cache b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfoInputs.cache new file mode 100644 index 0000000..85aaab4 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5773c38d4319cb7f76ca5b658c23774f3fba8ad5 diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..e820204 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MS_IncrementalExport +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\MS_IncrementalExport\MS_IncrementalExport\ diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.assets.cache b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..5ac7128a5ac93035c80c53f6d503ec019279fe8e GIT binary patch literal 571 zcmWIWc6a1rU|_hv?bfFIEm4P1O*^w zptDs>XmM&$ag0+@X>M+6PK;h&X?ki&OhICDc4B&JaZGYaQDRDJkzQhHNq%l(NotIt zo`IgBNlZ>=QcPZIiJ6{3OtNE6dcK}xfTvzcP7X7Y=}bU2h|dDVtWa@e3giNTA)xq%oN@Ble{ex>fIB>|AI z^i09YE9acW6OWkD)?QE6UD qW^O8{bACakPkwS@4ogW+sUSbK*=-|>Mkg2>VCIA2_Aeu`6 literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.csproj.AssemblyReference.cache b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/Debug/net6.0/MS_IncrementalExport.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.dgspec.json b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.dgspec.json new file mode 100644 index 0000000..06fc674 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj", + "projectName": "MS_IncrementalExport", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.props b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.targets b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/MS_IncrementalExport.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.assets.json b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.assets.json new file mode 100644 index 0000000..d4dd616 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj", + "projectName": "MS_IncrementalExport", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.nuget.cache b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.nuget.cache new file mode 100644 index 0000000..fc111a6 --- /dev/null +++ b/Sources/Robots/MS_IncrementalExport/MS_IncrementalExport/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "yjqqJ1FuNh4unJj0bFrEA5zuzdz+mayZe5I9PxwxfOVpWAKWRwhTHWIw6G7wF7IgsOktZDLcmYJEDZ4N/mWgGw==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MS_IncrementalExport\\MS_IncrementalExport\\MS_IncrementalExport.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/MS_SimpleExport.algo b/Sources/Robots/MS_SimpleExport.algo new file mode 100644 index 0000000000000000000000000000000000000000..5f53be1f54c4b4c505d84abe1bb61a69e0e9e43e GIT binary patch literal 3974 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/MS_SimpleExport/MS_SimpleExport.sln b/Sources/Robots/MS_SimpleExport/MS_SimpleExport.sln new file mode 100644 index 0000000..44a9446 --- /dev/null +++ b/Sources/Robots/MS_SimpleExport/MS_SimpleExport.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MS_SimpleExport", "MS_SimpleExport\MS_SimpleExport.csproj", "{51a6e49d-15ea-4fdd-8fac-5d03bfb41241}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {51a6e49d-15ea-4fdd-8fac-5d03bfb41241}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51a6e49d-15ea-4fdd-8fac-5d03bfb41241}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51a6e49d-15ea-4fdd-8fac-5d03bfb41241}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51a6e49d-15ea-4fdd-8fac-5d03bfb41241}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.cs b/Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.cs new file mode 100644 index 0000000..675d067 --- /dev/null +++ b/Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.cs @@ -0,0 +1,108 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using cAlgo.API; + +namespace cAlgo.Robots +{ + public enum ExportMode { M1, Tick } + + [Robot(AccessRights = AccessRights.FullAccess)] + public class MS_SimpleExport : Robot + { + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private struct M1Record { + public double Time; + public double O, H, L, C; + public float S; + public int V; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private struct TickRecord { + public double Time; + public double Ask, Bid; + } + + [Parameter("Export Mode", DefaultValue = ExportMode.M1)] + public ExportMode Mode { get; set; } + + [Parameter("Output File (ZIP)", DefaultValue = "")] + public string OutputFile { get; set; } + + [Parameter("Is Probing", DefaultValue = false)] + public bool IsProbing { get; set; } + + private List _m1Buffer = new List(); + private List _tickBuffer = new List(); + + protected override void OnStart() { + // No price factor needed for double/float export + } + + protected override void OnTick() { + if (Mode != ExportMode.Tick) return; + + if (IsProbing) { + Print("DATA_FOUND"); + Stop(); + return; + } + + _tickBuffer.Add(new TickRecord { + Time = Server.TimeInUtc.ToOADate(), + Ask = Symbol.Ask, + Bid = Symbol.Bid + }); + } + + protected override void OnBar() { + if (Mode != ExportMode.M1) return; + + if (IsProbing) { + Print("DATA_FOUND"); + Stop(); + return; + } + + var bar = Bars.Last(1); + _m1Buffer.Add(new M1Record { + Time = bar.OpenTime.ToOADate(), + O = bar.Open, + H = bar.High, + L = bar.Low, + C = bar.Close, + S = (float)Symbol.Spread, + V = (int)bar.TickVolume + }); + } + + protected override void OnStop() { + if (IsProbing || string.IsNullOrEmpty(OutputFile)) return; + + try { + using var fileStream = new FileStream(OutputFile, FileMode.Create); + using var archive = new ZipArchive(fileStream, ZipArchiveMode.Create); + var entry = archive.CreateEntry($"{Symbol.Name}.bin", CompressionLevel.Fastest); + + using var entryStream = entry.Open(); + + if (Mode == ExportMode.M1) { + ReadOnlySpan span = CollectionsMarshal.AsSpan(_m1Buffer); + ReadOnlySpan byteSpan = MemoryMarshal.Cast(span); + if (!byteSpan.IsEmpty) entryStream.Write(byteSpan); + } else { + ReadOnlySpan span = CollectionsMarshal.AsSpan(_tickBuffer); + ReadOnlySpan byteSpan = MemoryMarshal.Cast(span); + if (!byteSpan.IsEmpty) entryStream.Write(byteSpan); + } + + Print("EXPORT_SUCCESS"); + } catch (Exception ex) { + Print("ERROR: {0}", ex.Message); + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.csproj b/Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/MS_SimpleExport/MS_SimpleExport/MS_SimpleExport.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/Multi-MA-Bot.algo b/Sources/Robots/Multi-MA-Bot.algo new file mode 100644 index 0000000000000000000000000000000000000000..0b901b4d1fe54b64c9fe00d8533c5572790af246 GIT binary patch literal 5415 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 MaxPositions) + { + return; + } + + var hmaSlope = _hma.Result.Last(1) - _hma.Result.Last(2); + var smaSlope = _sma.Result.Last(1) - _sma.Result.Last(2); + var keltnerMainSlope = _keltnerChannels.Main.Last(1) - _keltnerChannels.Main.Last(2); + + var kcMain = _keltnerChannels.Main.Last(1); + + // Long-Entry-Logik + bool isUpTrend = hmaSlope > 0 && smaSlope > 0; + // KORREKTUR: Verwendet den gespeicherten _previousAsk für einen echten Tick-basierten Kreuzungsvergleich. + bool isBuyCross = _previousAsk <= kcMain && Symbol.Ask > kcMain; + + if (isUpTrend && isBuyCross) + { + var stopLossPrice = _keltnerChannels.Bottom.Last(1); + var takeProfitPrice = _keltnerChannels.Top.Last(1); + + if (stopLossPrice >= Symbol.Ask) + { + UpdatePreviousPrices(); + return; + } + + var stopLossInPips = (Symbol.Ask - stopLossPrice) / Symbol.PipSize; + var takeProfitInPips = (takeProfitPrice - Symbol.Ask) / Symbol.PipSize; + + double? volumeInUnits = Symbol.VolumeForProportionalRisk(ProportionalAmountType.Equity, EquityRiskPercent / MaxPositions / 100, stopLossPrice); + if (volumeInUnits.HasValue) + { + var normalizedVolume = Symbol.NormalizeVolumeInUnits(volumeInUnits.Value, RoundingMode.Down); + if (normalizedVolume > 0) + { + ExecuteMarketOrder(TradeType.Buy, SymbolName, normalizedVolume, $"{BotLabelPrefix}_Buy", stopLossInPips, takeProfitInPips); + } + } + } + + // Short-Entry-Logik + bool isDownTrend = hmaSlope < 0 && smaSlope < 0; + // KORREKTUR: Verwendet den gespeicherten _previousBid für einen echten Tick-basierten Kreuzungsvergleich. + bool isSellCross = _previousBid >= kcMain && Symbol.Bid < kcMain; + + if (isDownTrend && isSellCross) + { + var stopLossPrice = _keltnerChannels.Top.Last(1); + var takeProfitPrice = _keltnerChannels.Bottom.Last(1); + + if (stopLossPrice <= Symbol.Bid) + { + UpdatePreviousPrices(); + return; + } + + var stopLossInPips = (stopLossPrice - Symbol.Bid) / Symbol.PipSize; + var takeProfitInPips = (Symbol.Bid - takeProfitPrice) / Symbol.PipSize; + + double? volumeInUnits = Symbol.VolumeForProportionalRisk(ProportionalAmountType.Equity, EquityRiskPercent / MaxPositions / 100, stopLossPrice); + if (volumeInUnits.HasValue) + { + var normalizedVolume = Symbol.NormalizeVolumeInUnits(volumeInUnits.Value, RoundingMode.Down); + if (normalizedVolume > 0) + { + ExecuteMarketOrder(TradeType.Sell, SymbolName, normalizedVolume, $"{BotLabelPrefix}_Sell", stopLossInPips, takeProfitInPips); + } + } + } + + // KORREKTUR: Speichert die aktuellen Preise für den nächsten Tick. + UpdatePreviousPrices(); + } + + private void UpdatePreviousPrices() + { + _previousAsk = Symbol.Ask; + _previousBid = Symbol.Bid; + } + + private void OnPositionOpened(PositionOpenedEventArgs args) + { + var position = args.Position; + + if (!position.Label.StartsWith(BotLabelPrefix)) + { + return; + } + + if (!position.StopLoss.HasValue || !position.TakeProfit.HasValue) + { + Print("KRITISCHER FEHLER: Position {0} ({1}) wurde ohne StopLoss oder TakeProfit eröffnet. Bot wird gestoppt.", position.Id, position.Label); + Stop(); + } + } + + private void DrawIndicators() + { + // Da Indikatorwerte sich nur auf Bar-Basis ändern, ist eine Aktualisierung pro Tick nicht nötig. + // Die Ausführung im OnBar spart daher Rechenleistung. + var previousBarTime = Bars.OpenTimes.Last(2); + var currentBarTime = Bars.OpenTimes.Last(1); + string uniqueSuffix = $"_{currentBarTime:o}"; + + Chart.DrawTrendLine(HmaLinePrefix + uniqueSuffix, previousBarTime, _hma.Result.Last(2), currentBarTime, _hma.Result.Last(1), Color.Purple); + Chart.DrawTrendLine(SmaLinePrefix + uniqueSuffix, previousBarTime, _sma.Result.Last(2), currentBarTime, _sma.Result.Last(1), Color.Orange); + Chart.DrawTrendLine(KcTopLinePrefix + uniqueSuffix, previousBarTime, _keltnerChannels.Top.Last(2), currentBarTime, _keltnerChannels.Top.Last(1), Color.Blue); + Chart.DrawTrendLine(KcMainLinePrefix + uniqueSuffix, previousBarTime, _keltnerChannels.Main.Last(2), currentBarTime, _keltnerChannels.Main.Last(1), Color.Blue, 2, LineStyle.Dots); + Chart.DrawTrendLine(KcBottomLinePrefix + uniqueSuffix, previousBarTime, _keltnerChannels.Bottom.Last(2), currentBarTime, _keltnerChannels.Bottom.Last(1), Color.Blue); + } + + private void RemoveOldSegments() + { + if (Bars.Count <= DrawingHistory) + { + return; + } + + var oldBarTime = Bars.OpenTimes.Last(DrawingHistory); + string oldUniqueSuffix = $"_{oldBarTime:o}"; + + Chart.RemoveObject(HmaLinePrefix + oldUniqueSuffix); + Chart.RemoveObject(SmaLinePrefix + oldUniqueSuffix); + Chart.RemoveObject(KcTopLinePrefix + oldUniqueSuffix); + Chart.RemoveObject(KcMainLinePrefix + oldUniqueSuffix); + Chart.RemoveObject(KcBottomLinePrefix + oldUniqueSuffix); + } + } +} \ No newline at end of file diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/Multi-MA-Bot.csproj b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/Multi-MA-Bot.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/Multi-MA-Bot.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfo.cs b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfo.cs new file mode 100644 index 0000000..a2d0e3a --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Multi-MA-Bot")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("Multi-MA-Bot")] +[assembly: System.Reflection.AssemblyTitleAttribute("Multi-MA-Bot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfoInputs.cache b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..eae11af --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f0e854385f2f3e45c8832fc57c8188402c93f659 diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..577a726 --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Multi-MA-Bot +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\Multi-MA-Bot\Multi-MA-Bot\ diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.assets.cache b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..aa2e987b43a8fa5be0768f8f8a08da14e9aef2b1 GIT binary patch literal 571 zcmWIWc6a1rU|{&mRl0q($AXYdorRCrZ@{7T(ZO9CKa z>6wDzS7BuNFkm!f=I60N0+=@-u_VJY52{xJ7~J}h;MPY8ZcfMI;?$Cm%7Rq(qSCyQ q%-mE?=lp_7pZw&+9F~%z(o`Xr)Z&uNyu=cq(ZQujAX9l!OaK5_XqsdI literal 0 HcmV?d00001 diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.csproj.AssemblyReference.cache b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Debug/net6.0/Multi-MA-Bot.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..76e6da8385c67815702896fcdc466aa3c3ce7e0e GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.dgspec.json b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..4e5fb21 --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj", + "projectName": "Multi-MA-Bot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.props b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.props new file mode 100644 index 0000000..120d227 --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.12 + + \ No newline at end of file diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.targets b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.targets new file mode 100644 index 0000000..29b3c4c --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/Multi-MA-Bot.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.assets.json b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.assets.json new file mode 100644 index 0000000..bcecff3 --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.12": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.12": { + "sha512": "h+HPnbqPTkoSeojoYwWWOo5Jm9ExkmrmsU/WbF/idcgO2auKAPILBghZRP6Qt5mAcE/40YCRMNHT45/kzzs5Sg==", + "type": "package", + "path": "ctrader.automate/1.0.12", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.12.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj", + "projectName": "Multi-MA-Bot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.nuget.cache b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.nuget.cache new file mode 100644 index 0000000..39c63ab --- /dev/null +++ b/Sources/Robots/Multi-MA-Bot/Multi-MA-Bot/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "s24EynUesZSOJz4qpScvhH/N2ttt5lPGd0hG4jf8I3vVmHtQs2Uc8fTWUsUUbz6o6oRXLPvvXBfrOfuejLIKog==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\Multi-MA-Bot\\Multi-MA-Bot\\Multi-MA-Bot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.12\\ctrader.automate.1.0.12.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/MultiSmaHmaNotify.algo b/Sources/Robots/MultiSmaHmaNotify.algo new file mode 100644 index 0000000000000000000000000000000000000000..41c36be3369fdb8425d84a7b2202fcb1d36ebe7d GIT binary patch literal 7445 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 Td?S8LqGnBw$1D{6W{i!vw9;^8 literal 0 HcmV?d00001 diff --git a/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify.sln b/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify.sln new file mode 100644 index 0000000..28ed823 --- /dev/null +++ b/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultiSmaHmaNotify", "MultiSmaHmaNotify\MultiSmaHmaNotify.csproj", "{e0b9776b-46e4-48d5-91c2-ab7e4bde2f14}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {e0b9776b-46e4-48d5-91c2-ab7e4bde2f14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {e0b9776b-46e4-48d5-91c2-ab7e4bde2f14}.Debug|Any CPU.Build.0 = Debug|Any CPU + {e0b9776b-46e4-48d5-91c2-ab7e4bde2f14}.Release|Any CPU.ActiveCfg = Release|Any CPU + {e0b9776b-46e4-48d5-91c2-ab7e4bde2f14}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.cs b/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.cs new file mode 100644 index 0000000..8ab9398 --- /dev/null +++ b/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.cs @@ -0,0 +1,305 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using cAlgo.API; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; + +namespace cAlgo.Robots +{ + public enum TradingDirection + { + Both, + LongOnly, + ShortOnly + } + + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)] + public class MultiSmaHmaNotify : Robot + { + #region Parameters + + [Parameter("SMA Period", DefaultValue = 200, MinValue = 1)] + public int SmaPeriod { get; set; } + + [Parameter("HMA Period", DefaultValue = 250, MinValue = 1)] + public int HmaPeriod { get; set; } + + [Parameter("Trading Direction", DefaultValue = TradingDirection.Both)] + public TradingDirection AllowedDirection { get; set; } + + [Parameter("Sound File Path", DefaultValue = @"C:\Windows\Media\Alarm05.wav")] + public string SoundFilePath { get; set; } + + [Parameter("Telegram Bot Token", DefaultValue = "8569913524:AAE9RGsvkBPa0yhTFCKBjVeST0fuzdOx5w0")] + public string TelegramBotToken { get; set; } + + [Parameter("Telegram Chat ID", DefaultValue = "5171721381")] + public string TelegramChatId { get; set; } + + [Parameter("Symbols (CSV)", DefaultValue = "", Group = "Multi Symbol")] + public string SymbolsCsv { get; set; } + + #endregion + + #region Fields + + private HttpClient _httpClient; + private List _monitors; + + #endregion + + protected override void OnStart() + { + _httpClient = new HttpClient(); + _monitors = new List(); + + // Parse Symbols + var symbolNames = new HashSet(StringComparer.OrdinalIgnoreCase); + + if (!string.IsNullOrWhiteSpace(SymbolsCsv)) + { + var split = SymbolsCsv.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + foreach (var s in split) + { + symbolNames.Add(s.Trim()); + } + } + else + { + // Fallback: Use current symbol if list is empty + symbolNames.Add(SymbolName); + } + + foreach (var name in symbolNames) + { + InitializeSymbolMonitor(name); + } + } + + private void InitializeSymbolMonitor(string symbolName) + { + Symbol symbol = Symbols.GetSymbol(symbolName); + if (symbol == null) + { + Print($"Error: Symbol '{symbolName}' not found."); + return; + } + + // Get Bars for the requested symbol and timeframe matches the instance timeframe + Bars bars = MarketData.GetBars(TimeFrame, symbolName); + + // Create Context + var monitor = new SymbolMonitor(this, symbol, bars); + _monitors.Add(monitor); + + // Subscribe to BarOpened event (triggers when a bar closes and a new one opens) + bars.BarOpened += (args) => monitor.OnBarOpened(); + + // Load enough history to calculate indicators immediately + int maxPeriod = Math.Max(SmaPeriod, HmaPeriod); + if (bars.Count < maxPeriod) + { + bars.LoadMoreHistory(); + } + } + + protected override void OnStop() + { + _httpClient?.Dispose(); + } + + // Expose helper methods for the inner class + public void Log(string message) => Print(message); + + public void PlaySound() + { + try + { + if (!string.IsNullOrWhiteSpace(SoundFilePath)) + { + Notifications.PlaySound(SoundFilePath); + } + } + catch (Exception ex) + { + Print("Error playing sound: {0}", ex.Message); + } + } + + public void SendTelegram(string message) + { + Task.Run(() => SendTelegramMessageAsync(message)); + } + + private async Task SendTelegramMessageAsync(string message) + { + if (string.IsNullOrWhiteSpace(TelegramBotToken) || string.IsNullOrWhiteSpace(TelegramChatId)) + return; + + try + { + string url = $"https://api.telegram.org/bot{TelegramBotToken}/sendMessage?chat_id={TelegramChatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + HttpResponseMessage response = await _httpClient.GetAsync(url); + if (!response.IsSuccessStatusCode) + Print("Telegram Error: {0}", response.StatusCode); + } + catch (Exception ex) + { + Print("Exception sending Telegram message: {0}", ex.Message); + } + } + + ///

    + /// Inner class to handle state per symbol + /// + private class SymbolMonitor + { + private readonly MultiSmaHmaNotify _bot; + private readonly Symbol _symbol; + private readonly Bars _bars; + private readonly SimpleMovingAverage _sma; + private readonly HullMovingAverage _hma; + + private bool _waitingForSmaRise; + private bool _waitingForSmaFall; + + public SymbolMonitor(MultiSmaHmaNotify bot, Symbol symbol, Bars bars) + { + _bot = bot; + _symbol = symbol; + _bars = bars; + + // Create indicators based on the specific bars series + _sma = _bot.Indicators.SimpleMovingAverage(_bars.ClosePrices, _bot.SmaPeriod); + _hma = _bot.Indicators.HullMovingAverage(_bars.ClosePrices, _bot.HmaPeriod); + } + + public void OnBarOpened() + { + // Ensure we have enough data + if (_bars.Count <= Math.Max(_bot.SmaPeriod, _bot.HmaPeriod) + 1) return; + + // Index 1 is the last closed bar, Index 2 is the one before that + double smaClosed = _sma.Result.Last(1); + double smaPrev = _sma.Result.Last(2); + + double hmaClosed = _hma.Result.Last(1); + double hmaPrev = _hma.Result.Last(2); + + bool isSmaRising = smaClosed > smaPrev; + bool isSmaFalling = smaClosed < smaPrev; + + bool isCrossUp = (hmaPrev <= smaPrev) && (hmaClosed > smaClosed); + bool isCrossDown = (hmaPrev >= smaPrev) && (hmaClosed < smaClosed); + + bool isHmaAbove = hmaClosed > smaClosed; + bool isHmaBelow = hmaClosed < smaClosed; + + // Check Long Logic + if (_bot.AllowedDirection == TradingDirection.Both || _bot.AllowedDirection == TradingDirection.LongOnly) + { + if (isCrossUp) + { + _waitingForSmaFall = false; + + if (isSmaRising) + { + TriggerSignal("BUY", "SMA Rising + HMA CrossUp (Immediate)"); + _waitingForSmaRise = false; + } + else + { + _waitingForSmaRise = true; + } + } + else if (_waitingForSmaRise) + { + if (!isHmaAbove) + { + _waitingForSmaRise = false; // Invalidated + } + else if (isSmaRising) + { + TriggerSignal("BUY", "SMA Started Rising after HMA CrossUp (Delayed)"); + _waitingForSmaRise = false; + } + } + } + else + { + _waitingForSmaRise = false; + } + + // Check Short Logic + if (_bot.AllowedDirection == TradingDirection.Both || _bot.AllowedDirection == TradingDirection.ShortOnly) + { + if (isCrossDown) + { + _waitingForSmaRise = false; + + if (isSmaFalling) + { + TriggerSignal("SELL", "SMA Falling + HMA CrossDown (Immediate)"); + _waitingForSmaFall = false; + } + else + { + _waitingForSmaFall = true; + } + } + else if (_waitingForSmaFall) + { + if (!isHmaBelow) + { + _waitingForSmaFall = false; // Invalidated + } + else if (isSmaFalling) + { + TriggerSignal("SELL", "SMA Started Falling after HMA CrossDown (Delayed)"); + _waitingForSmaFall = false; + } + } + } + else + { + _waitingForSmaFall = false; + } + } + + private void TriggerSignal(string type, string reason) + { + // Convert Time + string localTime = TimeZoneInfo.ConvertTimeFromUtc(_bot.TimeInUtc, _bot.TimeZone).ToString("yyyy-MM-dd HH:mm:ss"); + + // Drawing only if this is the chart symbol + if (_symbol.Name == _bot.SymbolName) + { + int index = _bars.Count - 2; // Last closed bar + if (type == "BUY") + _bot.Chart.DrawIcon("BuySignal_" + index, ChartIconType.UpArrow, index, _bars.LowPrices[index] - _symbol.PipSize * 5, Color.Green); + else if (type == "SELL") + _bot.Chart.DrawIcon("SellSignal_" + index, ChartIconType.DownArrow, index, _bars.HighPrices[index] + _symbol.PipSize * 5, Color.Red); + } + + string logMessage = $"[{localTime}] {_symbol.Name} ({_bot.TimeFrame}) {type}: {reason}"; + _bot.Log(logMessage); + + if (!_bot.IsBacktesting) + { + _bot.PlaySound(); + + string emoji = (type == "BUY" ? "🟢" : (type == "SELL" ? "🔴" : "ℹ")); + string htmlMessage = $"{emoji} {_symbol.Name} ({_bot.TimeFrame})\n" + + $"{type} Signal\n" + + $"Reason: {reason}\n" + + $"Time: {localTime}"; + + _bot.SendTelegram(htmlMessage); + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.csproj b/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/MultiSmaHmaNotify/MultiSmaHmaNotify/MultiSmaHmaNotify.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1.algo b/Sources/Robots/MultiTimeframeIndicatorBot_v1.algo new file mode 100644 index 0000000000000000000000000000000000000000..fe49e2098295d15e7058305b23d56aa284ff2e3a GIT binary patch literal 9148 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 G<*R~_Imwj( literal 0 HcmV?d00001 diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/.vscode/tasks.json b/Sources/Robots/MultiTimeframeIndicatorBot_v1/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.sln b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.sln new file mode 100644 index 0000000..e4839e7 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultiTimeframeIndicatorBot_v1", "MultiTimeframeIndicatorBot_v1\MultiTimeframeIndicatorBot_v1.csproj", "{67d006b6-e88a-4f89-b154-988c64d96db5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {67d006b6-e88a-4f89-b154-988c64d96db5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67d006b6-e88a-4f89-b154-988c64d96db5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67d006b6-e88a-4f89-b154-988c64d96db5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67d006b6-e88a-4f89-b154-988c64d96db5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.cs b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.cs new file mode 100644 index 0000000..4b6e298 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.cs @@ -0,0 +1,392 @@ +using System; +using cAlgo.API; +using cAlgo.API.Collections; +using cAlgo.API.Indicators; +using cAlgo.API.Internals; +using System.Collections.Generic; +using System.Linq; + +namespace cAlgo.Robots +{ + [Robot(AccessRights = AccessRights.None, AddIndicators = true)] + public class MultiTimeframeIndicatorBot : Robot + { + #region Identity & Parameters + private const string BotLabel = "MultiTimeframeIndicatorBot_v1"; + + [Parameter("Fast MA Period", DefaultValue = 250, Group = "Periods")] + public int FastMaPeriod { get; set; } + + [Parameter("Slow MA Period", DefaultValue = 200, Group = "Periods")] + public int SlowMaPeriod { get; set; } + + [Parameter("Swing MA Period", DefaultValue = 20, Group = "Periods")] + public int SwingMaPeriod { get; set; } + + [Parameter("Max Risk", DefaultValue = 100.0, Group = "Risk")] + public double MaxRisk { get; set; } + + [Parameter("Min Stop Loss (Pips)", DefaultValue = 10.0, Group = "Risk Management", MinValue = 1)] + public double MinStopLossPips { get; set; } + + [Parameter("Take Profit % of Range", DefaultValue = 75.0, Group = "Risk Management", MinValue = 0.1)] + public double TakeProfitPercentage { get; set; } + + [Parameter("Stop Loss % of Range", DefaultValue = 50.0, Group = "Risk Management", MinValue = 0.1)] + public double StopLossPercentage { get; set; } + + [Parameter("Entry Offset % of Range", DefaultValue = 5.0, Group = "Risk Management", MinValue = 0)] + public double EntryOffsetPercentage { get; set; } + + [Parameter("Pyramiding Threshold (Pips)", DefaultValue = 20.0, Group = "Pyramiding")] + public double PyramidingThresholdPips { get; set; } + + [Parameter("Max Pyramiding Positions", DefaultValue = 3, Group = "Pyramiding")] + public int MaxPyramidingPositions { get; set; } + + [Parameter("Use Trailing Stop", DefaultValue = true, Group = "Risk Management")] + public bool UseTrailingStop { get; set; } + #endregion + + #region Fields + // Holds custom management data for a single trade. + private class TradeInfo + { + public double StopLossPrice { get; set; } + public double? TakeProfitPrice { get; set; } + public double InitialStopLossPips { get; set; } + } + + // Stores management data for all open positions, keyed by position ID. + private readonly Dictionary _managedTrades = new Dictionary(); + private TradeInfo _pendingTradeInfo; + + private enum MarketStructureBias { Neutral, Bullish, Bearish } + + private Bars _dailyBars; + private Color _originalColor; + private HullMovingAverage _fastMaDaily, _swingMaDaily, _fastMaPrimary, _swingMaPrimary; + private SimpleMovingAverage _slowMaDaily, _slowMaPrimary; + private Stack _highestHighs, _lowestLows; + private bool isBullishBias; + private bool isBearishBias; + private double _hh, _ll; + private MarketStructureBias _structureBias = MarketStructureBias.Neutral; + #endregion + + protected override void OnStart() + { + _dailyBars = MarketData.GetBars(TimeFrame.Daily); + _fastMaDaily = Indicators.HullMovingAverage(_dailyBars.ClosePrices, FastMaPeriod); + _slowMaDaily = Indicators.SimpleMovingAverage(_dailyBars.ClosePrices, SlowMaPeriod); + _swingMaDaily = Indicators.HullMovingAverage(_dailyBars.ClosePrices, SwingMaPeriod); + _fastMaPrimary = Indicators.HullMovingAverage(Bars.ClosePrices, FastMaPeriod); + _slowMaPrimary = Indicators.SimpleMovingAverage(Bars.ClosePrices, SlowMaPeriod); + _swingMaPrimary = Indicators.HullMovingAverage(Bars.ClosePrices, SwingMaPeriod); + + _highestHighs = new Stack(); + _lowestLows = new Stack(); + _originalColor = Chart.ColorSettings.GridLinesColor; + + Positions.Opened += OnPositionOpened; + Positions.Closed += OnPositionClosed; + } + + protected override void OnStop() + { + Chart.ColorSettings.GridLinesColor = _originalColor; + Positions.Opened -= OnPositionOpened; + Positions.Closed -= OnPositionClosed; + } + + protected override void OnTick() + { + ManageOpenTrades(); + } + + protected override void OnBar() + { + if (ManagePositions()) return; + + if (Positions.Find(BotLabel, Symbol.Name) != null) return; + if (Bars.Count < 5) return; + + if (_hh == 0 || _ll == 0) + { + _hh = Bars.HighPrices.Last(1); + _ll = Bars.LowPrices.Last(1); + } + + if (Bars.HighPrices.Last(1) > _hh) _hh = Bars.HighPrices.Last(1); + if (Bars.LowPrices.Last(1) < _ll) _ll = Bars.LowPrices.Last(1); + + bool isSwingLow = _swingMaPrimary.Result.Last(3) > _swingMaPrimary.Result.Last(2) && _swingMaPrimary.Result.Last(2) < _swingMaPrimary.Result.Last(1); + bool isSwingHigh = _swingMaPrimary.Result.Last(3) < _swingMaPrimary.Result.Last(2) && _swingMaPrimary.Result.Last(2) > _swingMaPrimary.Result.Last(1); + + if (isSwingLow) { _lowestLows.Push(_ll); _hh = Bars.HighPrices.Last(1); } + if (isSwingHigh) { _highestHighs.Push(_hh); _ll = Bars.LowPrices.Last(1); } + + var dailyIndex = _dailyBars.OpenTimes.GetIndexByTime(Bars.Last(0).OpenTime); + if (dailyIndex < 1) return; + + isBullishBias = _fastMaDaily.Result[dailyIndex] > _fastMaDaily.Result[dailyIndex - 1] && _slowMaDaily.Result[dailyIndex] > _slowMaDaily.Result[dailyIndex - 1] && _fastMaPrimary.Result.Last(1) > _fastMaPrimary.Result.Last(2) && _slowMaPrimary.Result.Last(1) > _slowMaPrimary.Result.Last(2); + isBearishBias = _fastMaDaily.Result[dailyIndex] < _fastMaDaily.Result[dailyIndex - 1] && _slowMaDaily.Result[dailyIndex] < _slowMaDaily.Result[dailyIndex - 1] && _fastMaPrimary.Result.Last(1) < _fastMaPrimary.Result.Last(2) && _slowMaPrimary.Result.Last(1) < _slowMaPrimary.Result.Last(2); + + VisualizeBias(isBullishBias, isBearishBias); + + bool buySignal = _highestHighs.Count > 0 && _lowestLows.Count > 0 && Bars.HighPrices.Last(1) > _highestHighs.Peek(); + bool sellSignal = _highestHighs.Count > 0 && _lowestLows.Count > 0 && Bars.LowPrices.Last(1) < _lowestLows.Peek(); + + if (buySignal) _structureBias = MarketStructureBias.Bullish; + else if (sellSignal) _structureBias = MarketStructureBias.Bearish; + + if (isBullishBias && buySignal && _structureBias == MarketStructureBias.Bullish) + { + var lowPoint = _lowestLows.Peek(); + var highPoint = Math.Max(_hh, _highestHighs.Peek()); + var range = highPoint - lowPoint; + if (range > 0) + { + var entryPrice = lowPoint + range * (EntryOffsetPercentage / 100.0); + var stopLoss = lowPoint - range * (StopLossPercentage / 100.0); + double? takeProfit = UseTrailingStop ? (double?)null : lowPoint + range * (TakeProfitPercentage / 100.0); + + bool isValidOrder = (takeProfit.HasValue && takeProfit > entryPrice && entryPrice > stopLoss) || (!takeProfit.HasValue && entryPrice > stopLoss); + if (isValidOrder) + { + var volume = CalculateVolumeInUnits(entryPrice, stopLoss); + if (volume >= Symbol.VolumeInUnitsMin) + { + _pendingTradeInfo = new TradeInfo { StopLossPrice = stopLoss, TakeProfitPrice = takeProfit, InitialStopLossPips = (entryPrice - stopLoss) / Symbol.PipSize }; + CancelAndPlaceOrder(TradeType.Buy, entryPrice, volume); + } + } + } + } + else if (isBearishBias && sellSignal && _structureBias == MarketStructureBias.Bearish) + { + var highPoint = _highestHighs.Peek(); + var lowPoint = Math.Min(_ll, _lowestLows.Peek()); + var range = highPoint - lowPoint; + if (range > 0) + { + var entryPrice = highPoint - range * (EntryOffsetPercentage / 100.0); + var stopLoss = highPoint + range * (StopLossPercentage / 100.0); + double? takeProfit = UseTrailingStop ? (double?)null : highPoint - range * (TakeProfitPercentage / 100.0); + + bool isValidOrder = (takeProfit.HasValue && stopLoss > entryPrice && entryPrice > takeProfit) || (!takeProfit.HasValue && stopLoss > entryPrice); + if (isValidOrder) + { + var volume = CalculateVolumeInUnits(entryPrice, stopLoss); + if (volume >= Symbol.VolumeInUnitsMin) + { + _pendingTradeInfo = new TradeInfo { StopLossPrice = stopLoss, TakeProfitPrice = takeProfit, InitialStopLossPips = (stopLoss - entryPrice) / Symbol.PipSize }; + CancelAndPlaceOrder(TradeType.Sell, entryPrice, volume); + } + } + } + } + + while (_highestHighs.Count > 0 && _highestHighs.Peek() < Bars.HighPrices.Last(1)) { _highestHighs.Pop(); } + while (_lowestLows.Count > 0 && _lowestLows.Peek() > Bars.LowPrices.Last(1)) { _lowestLows.Pop(); } + + VisualizePeekValues(); + } + + private void OnPositionOpened(PositionOpenedEventArgs args) + { + var position = args.Position; + if (position.Label == BotLabel && position.SymbolName == Symbol.Name) + { + if (_pendingTradeInfo != null && !_managedTrades.ContainsKey(position.Id)) + { + _managedTrades[position.Id] = _pendingTradeInfo; + Print($"Managing new position {position.Id} with custom SL: {_pendingTradeInfo.StopLossPrice:F5}"); + _pendingTradeInfo = null; + } + } + } + + private void OnPositionClosed(PositionClosedEventArgs args) + { + if (_managedTrades.Remove(args.Position.Id)) + { + Print($"Stopped managing closed position {args.Position.Id}. Reason: {args.Reason}"); + } + } + + private void ManageOpenTrades() + { + var managedPositionIds = _managedTrades.Keys.ToList(); + foreach (var positionId in managedPositionIds) + { + var position = Positions.FirstOrDefault(p => p.Id == positionId); + if (position == null) + { + _managedTrades.Remove(positionId); + continue; + } + + var tradeInfo = _managedTrades[positionId]; + if ((position.TradeType == TradeType.Buy && Symbol.Bid <= tradeInfo.StopLossPrice) || (position.TradeType == TradeType.Sell && Symbol.Ask >= tradeInfo.StopLossPrice)) + { + ClosePosition(position); + Print($"Position {position.Id} hit custom SL at {tradeInfo.StopLossPrice:F5}. Closing."); + continue; + } + + if (!UseTrailingStop && tradeInfo.TakeProfitPrice.HasValue) + { + if ((position.TradeType == TradeType.Buy && Symbol.Bid >= tradeInfo.TakeProfitPrice.Value) || (position.TradeType == TradeType.Sell && Symbol.Ask <= tradeInfo.TakeProfitPrice.Value)) + { + ClosePosition(position); + Print($"Position {position.Id} hit custom TP at {tradeInfo.TakeProfitPrice.Value:F5}. Closing."); + continue; + } + } + + if (UseTrailingStop) + { + double newStopLossPrice; + if (position.TradeType == TradeType.Buy) + { + newStopLossPrice = Symbol.Bid - tradeInfo.InitialStopLossPips * Symbol.PipSize; + if (newStopLossPrice > tradeInfo.StopLossPrice) + { + tradeInfo.StopLossPrice = newStopLossPrice; + } + } + else // Sell + { + newStopLossPrice = Symbol.Ask + tradeInfo.InitialStopLossPips * Symbol.PipSize; + if (newStopLossPrice < tradeInfo.StopLossPrice) + { + tradeInfo.StopLossPrice = newStopLossPrice; + } + } + } + } + } + + private void CancelAndPlaceOrder(TradeType tradeType, double entry, double volumeInUnits) + { + var existingOrder = PendingOrders.FirstOrDefault(o => o.Label == BotLabel && o.SymbolName == Symbol.Name); + if (existingOrder != null) + { + CancelPendingOrder(existingOrder); + } + PlaceLimitOrder(tradeType, Symbol.Name, volumeInUnits, entry, BotLabel, null, null, ProtectionType.Absolute); + } + + private double CalculateVolumeInUnits(double entryPrice, double stopLossPrice) + { + var stopLossInPips = Math.Abs(entryPrice - stopLossPrice) / Symbol.PipSize; + + if (stopLossInPips < MinStopLossPips) + { + Print($"Trade volume calculation skipped. Calculated SL of {stopLossInPips:F2} pips is below the minimum of {MinStopLossPips} pips."); + return 0; + } + + if (stopLossInPips <= 0) return 0; + + var volume = Symbol.VolumeForFixedRisk(MaxRisk, stopLossInPips); + return Symbol.NormalizeVolumeInUnits(volume, RoundingMode.Down); + } + + private bool ManagePositions() + { + var openPositions = Positions.Where(p => p.Label == BotLabel && p.SymbolName == Symbol.Name && _managedTrades.ContainsKey(p.Id)).ToList(); + if (!openPositions.Any()) return false; + if (openPositions.Count >= MaxPyramidingPositions) return true; + + var threshold = PyramidingThresholdPips * Symbol.PipSize; + var tradeType = openPositions.First().TradeType; + + bool canPyramid = tradeType == TradeType.Buy ? openPositions.All(p => Symbol.Ask > p.EntryPrice + threshold) : openPositions.All(p => Symbol.Bid < p.EntryPrice - threshold); + if (!canPyramid) return true; + + Print("Pyramiding condition met. Scaling in."); + + double totalRisk = 0; + foreach (var pos in openPositions) + { + var tradeInfo = _managedTrades[pos.Id]; + var stopLossInPips = Math.Abs(pos.EntryPrice - tradeInfo.StopLossPrice) / Symbol.PipSize; + totalRisk += Symbol.AmountRisked(pos.VolumeInUnits, stopLossInPips); + } + + if (totalRisk <= 0) + { + Print("Cannot pyramid. Calculated risk is zero."); + return true; + } + + var lastPosition = openPositions.OrderBy(p => p.EntryTime).Last(); + var lastTradeInfo = _managedTrades[lastPosition.Id]; + var stopLossPipsForNewPosition = lastTradeInfo.InitialStopLossPips; + + var originalPosition = openPositions.OrderBy(p => p.EntryTime).First(); + var originalTradeInfo = _managedTrades[originalPosition.Id]; + + foreach (var pos in openPositions) + { + _managedTrades[pos.Id].StopLossPrice = pos.EntryPrice; + } + Print($"{openPositions.Count} existing position(s) moved to custom break-even."); + + var volumeForNewPosition = Symbol.VolumeForFixedRisk(totalRisk, stopLossPipsForNewPosition); + var normalizedVolume = Symbol.NormalizeVolumeInUnits(volumeForNewPosition, RoundingMode.Down); + + if (normalizedVolume < MinStopLossPips) + { + Print($"Calculated pyramid volume ({normalizedVolume}) is below minimum. Aborting scale-in."); + return true; + } + + var currentPrice = tradeType == TradeType.Buy ? Symbol.Ask : Symbol.Bid; + var newSlPrice = tradeType == TradeType.Buy ? currentPrice - stopLossPipsForNewPosition * Symbol.PipSize : currentPrice + stopLossPipsForNewPosition * Symbol.PipSize; + + var newTradeInfo = new TradeInfo + { + StopLossPrice = newSlPrice, + TakeProfitPrice = UseTrailingStop ? (double?)null : originalTradeInfo.TakeProfitPrice, + InitialStopLossPips = stopLossPipsForNewPosition + }; + + var result = ExecuteMarketOrder(tradeType, Symbol.Name, normalizedVolume, BotLabel, null, null, "Pyramid Position"); + if (result.IsSuccessful) + { + _managedTrades[result.Position.Id] = newTradeInfo; + Print($"Managing new pyramid position {result.Position.Id} with custom SL: {newTradeInfo.StopLossPrice:F5}"); + } + else + { + Print($"Failed to open pyramid position. Error: {result.Error}"); + } + + return true; + } + + private void VisualizeBias(bool isBullish, bool isBearish) + { + Chart.ColorSettings.GridLinesColor = (isBullish || isBearish) ? _originalColor : Chart.ColorSettings.BackgroundColor; + } + + private void VisualizePeekValues() + { + const string highLineName = "peekHighLine", lowLineName = "peekLowLine"; + Chart.RemoveObject(highLineName); Chart.RemoveObject(lowLineName); + if (isBullishBias) + { + if (_hh > 0) Chart.DrawHorizontalLine(highLineName, _hh, Color.Crimson, 1, LineStyle.Dots); + if (_lowestLows.Count > 0) Chart.DrawHorizontalLine(lowLineName, _lowestLows.Peek(), Color.CornflowerBlue, 1, LineStyle.Dots); + } + else if (isBearishBias) + { + if (_highestHighs.Count > 0) Chart.DrawHorizontalLine(highLineName, _highestHighs.Peek(), Color.Crimson, 1, LineStyle.Dots); + if (_ll > 0) Chart.DrawHorizontalLine(lowLineName, _ll, Color.CornflowerBlue, 1, LineStyle.Dots); + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.csproj b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfo.cs b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfo.cs new file mode 100644 index 0000000..82e0e11 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MultiTimeframeIndicatorBot_v1")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("MultiTimeframeIndicatorBot_v1")] +[assembly: System.Reflection.AssemblyTitleAttribute("MultiTimeframeIndicatorBot_v1")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfoInputs.cache b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfoInputs.cache new file mode 100644 index 0000000..915a8f6 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +9b2672a8d2900c6fca08ca32e8f3d901ef4db0e4 diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..164d5a3 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = MultiTimeframeIndicatorBot_v1 +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\MultiTimeframeIndicatorBot_v1\MultiTimeframeIndicatorBot_v1\ diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.assets.cache b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..b97156d145feffd0bce9415b6f50c7fc4506504c GIT binary patch literal 571 zcmWIWc6a1rU|?9-eszu4qYq(ETu>&v z=xh}eTAW%`9OG0}nwy)N6Qh?`nx0w`Q;?XPotU0l9Fts9l$erQq?cG)lAoJck{V;E zXP{?j9Fvoo6qA=)Vy0&hlkAw2p0DQ^;Hj6Alf#T;Iuno$;D0P_YUmSlM5LG?-igIgaG-1;cN&FNTNoLUl6S&+(JRGL?k pnVZV#oL^Aslb@WJ!%|XInkwXyT3nKumskQcI=D0mWGXL;2>^mgnRWmG literal 0 HcmV?d00001 diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.csproj.AssemblyReference.cache b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/Debug/net6.0/MultiTimeframeIndicatorBot_v1.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..4696add5874bf60ad6e5846b782a56818997f178 GIT binary patch literal 73772 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 + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.13 + + \ No newline at end of file diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/MultiTimeframeIndicatorBot_v1.csproj.nuget.g.targets b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/MultiTimeframeIndicatorBot_v1.csproj.nuget.g.targets new file mode 100644 index 0000000..13634e8 --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/MultiTimeframeIndicatorBot_v1.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.assets.json b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.assets.json new file mode 100644 index 0000000..5978a9f --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.13": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.13": { + "sha512": "teFQQhvFb8/1XQsvvGXNlUIkwZ6Ab+FZHqJ8kXiR2AW8IJA0EIue2dRHNglmlRdqSwnMhocSS9EkPZBTXxsHLQ==", + "type": "package", + "path": "ctrader.automate/1.0.13", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.13.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1.csproj", + "projectName": "MultiTimeframeIndicatorBot_v1", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.nuget.cache b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.nuget.cache new file mode 100644 index 0000000..4e1b60e --- /dev/null +++ b/Sources/Robots/MultiTimeframeIndicatorBot_v1/MultiTimeframeIndicatorBot_v1/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "SM9Rn42GTn/x8ySYHA/b4QOq7C9kj6vyI6bzhdQj9r0Xxv3G7phcupg31/F7ZfMQ65LVxaqU5zCmidKth1N4+Q==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1\\MultiTimeframeIndicatorBot_v1.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.13\\ctrader.automate.1.0.13.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout.algo b/Sources/Robots/RoundNumberBreakout.algo new file mode 100644 index 0000000000000000000000000000000000000000..305324df5ed2b6bd7dca4674cd5635bc41149a43 GIT binary patch literal 4806 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/RoundNumberBreakout/.vscode/tasks.json b/Sources/Robots/RoundNumberBreakout/.vscode/tasks.json new file mode 100644 index 0000000..215166e --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/.vscode/tasks.json @@ -0,0 +1 @@ +{"version":"2.0.0","tasks":[{"label":"build","command":"dotnet","type":"process","args":["build","${workspaceFolder}","/property:GenerateFullPaths=true","/consoleLoggerParameters:NoSummary"],"problemMatcher":"$msCompile"}]} \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout.sln b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout.sln new file mode 100644 index 0000000..8e535e5 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RoundNumberBreakout", "RoundNumberBreakout\RoundNumberBreakout.csproj", "{1339461f-b88a-4077-b07b-184bd48cdf2e}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1339461f-b88a-4077-b07b-184bd48cdf2e}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1339461f-b88a-4077-b07b-184bd48cdf2e}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1339461f-b88a-4077-b07b-184bd48cdf2e}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1339461f-b88a-4077-b07b-184bd48cdf2e}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.cs b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.cs new file mode 100644 index 0000000..c94a382 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.cs @@ -0,0 +1,209 @@ +using System; +using System.Linq; +using cAlgo.API; +using cAlgo.API.Internals; + +namespace cAlgo.Robots +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class RoundNumberBreakout : Robot + { + #region Parameters + + [Parameter("Order Volume (Lots)", DefaultValue = 1.0)] + public double VolumeInLots { get; set; } + + [Parameter("Round Number Step (n)", DefaultValue = 50, MinValue = 0.00001)] + public double RoundNumberStep { get; set; } + + [Parameter("SL Factor", DefaultValue = 1.0)] + public double SlFactor { get; set; } + + [Parameter("TP Factor", DefaultValue = 2.0)] + public double TpFactor { get; set; } + + [Parameter("Label", DefaultValue = "RN_Breakout")] + public string Label { get; set; } + + [Parameter("Max Lookback Bars", DefaultValue = 200, Group = "Optimization")] + public int MaxLookback { get; set; } + + #endregion + + #region Fields + + private double _volumeInUnits; + + #endregion + + protected override void OnStart() + { + _volumeInUnits = Symbol.QuantityToVolumeInUnits(VolumeInLots); + } + + protected override void OnBarClosed() + { + double closeCurrent = Bars.ClosePrices.Last(0); + double closePrev = Bars.ClosePrices.Last(1); + + // --- BUY LOGIC --- + double potentialLowerRn = Math.Floor(closeCurrent / RoundNumberStep) * RoundNumberStep; + + if (closeCurrent > potentialLowerRn && closePrev < potentialLowerRn) + { + // 1. Check duplicate RN + // 2. Check virtual history + if (!IsSameAsLastEntry(TradeType.Buy, potentialLowerRn) && + WasLastVirtualTradeSuccessful(TradeType.Buy, potentialLowerRn)) + { + CancelPendingOrders(); + PlaceTrade(TradeType.Buy, potentialLowerRn); + } + } + + // --- SELL LOGIC --- + double potentialUpperRn = Math.Ceiling(closeCurrent / RoundNumberStep) * RoundNumberStep; + + if (closeCurrent < potentialUpperRn && closePrev > potentialUpperRn) + { + // 1. Check duplicate RN + // 2. Check virtual history + if (!IsSameAsLastEntry(TradeType.Sell, potentialUpperRn) && + WasLastVirtualTradeSuccessful(TradeType.Sell, potentialUpperRn)) + { + CancelPendingOrders(); + PlaceTrade(TradeType.Sell, potentialUpperRn); + } + } + } + + private void PlaceTrade(TradeType type, double entryPrice) + { + double slPrice, tpPrice; + CalculateLevels(type, entryPrice, out slPrice, out tpPrice); + + entryPrice = Math.Round(entryPrice, Symbol.Digits); + + PlaceLimitOrder(type, SymbolName, _volumeInUnits, entryPrice, Label, slPrice, tpPrice, ProtectionType.Absolute); + } + + /// + /// Checks if the last executed trade in the given direction was opened at the same RN level. + /// + private bool IsSameAsLastEntry(TradeType type, double currentRn) + { + // We look at actual History to see what we really traded last + var lastTrade = History + .Where(t => t.Label == Label && t.SymbolName == SymbolName && t.TradeType == type) + .OrderByDescending(t => t.EntryTime) // Important: Order by EntryTime, not ClosingTime + .FirstOrDefault(); + + if (lastTrade == null) + return false; + + // Use a small epsilon for double comparison (TickSize / 2) + double epsilon = Symbol.TickSize / 2; + return Math.Abs(lastTrade.EntryPrice - currentRn) < epsilon; + } + + /// + /// Simulates the outcome of the PREVIOUS signal of the same type. + /// + private bool WasLastVirtualTradeSuccessful(TradeType type, double currentRnLevel) + { + int startIndex = 2; + int foundSignalIndex = -1; + double foundRnLevel = 0; + + // 1. Find the previous signal backwards + for (int i = startIndex; i < Math.Min(Bars.Count, MaxLookback); i++) + { + double c = Bars.ClosePrices.Last(i); + double cPrev = Bars.ClosePrices.Last(i + 1); + + if (type == TradeType.Buy) + { + double rn = Math.Floor(c / RoundNumberStep) * RoundNumberStep; + if (c > rn && cPrev < rn) + { + foundSignalIndex = i; + foundRnLevel = rn; + break; + } + } + else // Sell + { + double rn = Math.Ceiling(c / RoundNumberStep) * RoundNumberStep; + if (c < rn && cPrev > rn) + { + foundSignalIndex = i; + foundRnLevel = rn; + break; + } + } + } + + if (foundSignalIndex == -1) return true; + + // 2. Simulate forward + double sl, tp; + CalculateLevels(type, foundRnLevel, out sl, out tp); + + bool isFilled = false; + + for (int j = foundSignalIndex - 1; j >= 0; j--) + { + double high = Bars.HighPrices.Last(j); + double low = Bars.LowPrices.Last(j); + + if (!isFilled) + { + if (type == TradeType.Buy) { if (low <= foundRnLevel) isFilled = true; } + else { if (high >= foundRnLevel) isFilled = true; } + } + + if (isFilled) + { + if (type == TradeType.Buy) + { + if (low <= sl) return false; // LOSS + if (high >= tp) return true; // WIN + } + else + { + if (high >= sl) return false; // LOSS + if (low <= tp) return true; // WIN + } + } + } + + return true; + } + + private void CalculateLevels(TradeType type, double entryPrice, out double sl, out double tp) + { + double riskAmount = RoundNumberStep * SlFactor; + double rewardAmount = RoundNumberStep * TpFactor; + + if (type == TradeType.Buy) + { + sl = Math.Round(entryPrice - riskAmount, Symbol.Digits); + tp = Math.Round(entryPrice + rewardAmount, Symbol.Digits); + } + else + { + sl = Math.Round(entryPrice + riskAmount, Symbol.Digits); + tp = Math.Round(entryPrice - rewardAmount, Symbol.Digits); + } + } + + private void CancelPendingOrders() + { + var ordersToCancel = PendingOrders.Where(o => o.Label == Label && o.SymbolName == SymbolName); + foreach (var order in ordersToCancel) + { + CancelPendingOrder(order); + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.csproj b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/RoundNumberBreakout.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 0000000..32c95f9 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfo.cs b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfo.cs new file mode 100644 index 0000000..52b4da3 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("RoundNumberBreakout")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("RoundNumberBreakout")] +[assembly: System.Reflection.AssemblyTitleAttribute("RoundNumberBreakout")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfoInputs.cache b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfoInputs.cache new file mode 100644 index 0000000..98ce71d --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +97fa14048a771c104ce90affe74e8b1e2d87bfd2 diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.GeneratedMSBuildEditorConfig.editorconfig b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..e6b3908 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,10 @@ +is_global = true +build_property.TargetFramework = net6.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = RoundNumberBreakout +build_property.ProjectDir = C:\Users\Brummel\Documents\cAlgo\Sources\Robots\RoundNumberBreakout\RoundNumberBreakout\ diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.assets.cache b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..f7948b13270fa004dbd50438eca707cdb6fbb3bd GIT binary patch literal 571 zcmWIWc6a1rU|@K{zTG^e-HffX!sK~*a?zTdA*NUQPajiwR++dqH*k;AWJaJOC;%}7 zovmU*i&Kk=W1Nagb8}O3V)XJ#(^E@g3KEmE6Vp?RW0FgX5>rx(^b$);@^ceQQezDD z4D<|5VsbK*V)9Z;%=8Rmk{xr>^Yt79JoQp?a+r}!X9BW8d=?;Pg^D9nAQuQEhd?ZF zgjxVn0FqE7=roW@5TK1m*dT_3O-J_#NRAzdIe?fGh(STm4aCTR2gu>`D|JsT34ny9 zX9|X2g^}gMfYFedpT`CXVBUblk_^v0s9p(RaO*>YTOTF3IUS3OQ%gcB3sTvOO7luG pb5l8;^9w3{@{<#DSW1dYQ-xeoi%T-|5=($a2bU&+Oyxx}0RTyvn1cWS literal 0 HcmV?d00001 diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.csproj.AssemblyReference.cache b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/Debug/net6.0/RoundNumberBreakout.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..50043b72e60e99572907e8bb9919c5476092778d GIT binary patch literal 73772 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.dgspec.json b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.dgspec.json new file mode 100644 index 0000000..38c191a --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj", + "projectName": "RoundNumberBreakout", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.props b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.targets b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/RoundNumberBreakout.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.assets.json b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.assets.json new file mode 100644 index 0000000..84b281e --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj", + "projectName": "RoundNumberBreakout", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.nuget.cache b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.nuget.cache new file mode 100644 index 0000000..054e790 --- /dev/null +++ b/Sources/Robots/RoundNumberBreakout/RoundNumberBreakout/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "G99Qvg+Rf0hVw9376X2H9VP5tcy5DRCmAUc/rfz0z3MvZ72Ic/Ky+j1cLsZrJITjv8ekw+Bo/R3kXzpAqUmmGg==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\RoundNumberBreakout\\RoundNumberBreakout\\RoundNumberBreakout.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/SL-Manager.algo b/Sources/Robots/SL-Manager.algo new file mode 100644 index 0000000000000000000000000000000000000000..e747f1d398302392ee9252aefe68bb804e432110 GIT binary patch literal 3866 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 cXjM4!YAvH2w*UYD literal 0 HcmV?d00001 diff --git a/Sources/Robots/SL-Manager/SL-Manager.sln b/Sources/Robots/SL-Manager/SL-Manager.sln new file mode 100644 index 0000000..50a6dd7 --- /dev/null +++ b/Sources/Robots/SL-Manager/SL-Manager.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SL-Manager", "SL-Manager\SL-Manager.csproj", "{9c5ce502-1255-4944-9785-d0997d792830}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9c5ce502-1255-4944-9785-d0997d792830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9c5ce502-1255-4944-9785-d0997d792830}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9c5ce502-1255-4944-9785-d0997d792830}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9c5ce502-1255-4944-9785-d0997d792830}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sources/Robots/SL-Manager/SL-Manager/SL-Manager.cs b/Sources/Robots/SL-Manager/SL-Manager/SL-Manager.cs new file mode 100644 index 0000000..cbd62c2 --- /dev/null +++ b/Sources/Robots/SL-Manager/SL-Manager/SL-Manager.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using cAlgo.API; +using cAlgo.API.Internals; + +namespace cAlgo.Robots +{ + [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] + public class SimpleLossCloser : Robot + { + [Parameter("Max Loss Amount (EUR)", DefaultValue = 0.95, MinValue = 0.01)] + public double MaxLossAmount { get; set; } + + [Parameter("Use Profit Protection (Rule 2)", DefaultValue = true)] + public bool UseProfitProtection { get; set; } + + [Parameter("Use Drawdown Close (Rule 3)", DefaultValue = true)] + public bool UseDrawdownCloseRule { get; set; } + + // Stores the peak profit (G) achieved for each position (Position.Id) + private readonly Dictionary _maxProfits = new Dictionary(); + + // Stores the max drawdown (D) (lowest negative profit) for each position + private readonly Dictionary _maxDrawdowns = new Dictionary(); + + protected override void OnStart() + { + // Subscribe to position close events to clean up the dictionaries + Positions.Closed += OnPositionClosed; + } + + protected override void OnTick() + { + // Iterate over all open positions for the current symbol + foreach (var position in Positions) + { + if (position.SymbolName != SymbolName) + { + continue; // Only manage positions for the cBot's symbol + } + + // --- Update G (Max Profit) and D (Max Drawdown) --- + _maxProfits.TryGetValue(position.Id, out double maxProfit); + _maxDrawdowns.TryGetValue(position.Id, out double maxDrawdown); + + double currentProfit = position.NetProfit; + + // Update max profit (G) if current profit is higher + if (currentProfit > maxProfit) + { + maxProfit = currentProfit; + _maxProfits[position.Id] = maxProfit; // Store new peak + } + + // Update max drawdown (D) if current profit is lower (more negative) + if (currentProfit < maxDrawdown) + { + maxDrawdown = currentProfit; + _maxDrawdowns[position.Id] = maxDrawdown; // Store new low + } + + // --- Rule 1: Max Loss Close (Hard Stop) --- + // Check if the position has a loss and if that loss exceeds the threshold + if (currentProfit < 0 && Math.Abs(currentProfit) > MaxLossAmount) + { + ClosePosition(position); + continue; // Position is closed, process next position + } + + // --- Rule 2: Profit Protection (Trailing) --- + if (UseProfitProtection) + { + // Check profit protection trigger: + // 1. Max profit (G) must be greater than the MaxLossAmount threshold. + // 2. Current profit must have dropped to 50% (or less) of the max profit (G). + if ((maxProfit > MaxLossAmount) && (currentProfit <= (0.5 * maxProfit))) + { + ClosePosition(position); + continue; // Position is closed, process next position + } + } + + // --- Rule 3: Drawdown Close (New) --- + // If D (absolute value of max drawdown) > G (max profit) AND position is currently in profit + if (UseDrawdownCloseRule) + { + // maxDrawdown is negative (e.g., -5), maxProfit is positive (e.g., 3) + // We check if Abs(-5) > 3, and if current profit is positive. + if ((currentProfit > 0) && (Math.Abs(maxDrawdown) > maxProfit) && (Math.Min(Math.Abs(maxDrawdown), maxProfit) > 0.25 * MaxLossAmount)) + { + ClosePosition(position); + continue; // Position is closed, process next position + } + } + + // --- Rule 4: Set initial Stop Loss (Original Rule 2) --- + // If position is still open and has no SL, set the emergency SL. + if (position.StopLoss == null) + { + // Check required symbol properties before calculation + if (Symbol.PipValue == 0 || Symbol.LotSize == 0) + { + Print("Warning: PipValue or LotSize is zero. Cannot calculate currency-based SL for Position {0}.", position.Id); + continue; // Skip SL calculation for this tick/position + } + + // Convert position volume from units to lots + double positionLots = Symbol.VolumeInUnitsToQuantity(position.VolumeInUnits); + + // Calculate the value of 1 pip for this specific position's quantity + double positionPipValue = Symbol.PipValue * positionLots; + + if (positionPipValue == 0) continue; // Avoid division by zero + + // Calculate the required Stop Loss distance in Pips + double targetLossAmount = 3 * MaxLossAmount; + double slPips = targetLossAmount / positionPipValue; + + double slPrice; + if (position.TradeType == TradeType.Buy) + { + slPrice = position.EntryPrice - (slPips * Symbol.PipSize); + } + else // Sell + { + slPrice = position.EntryPrice + (slPips * Symbol.PipSize); + } + + slPrice = Math.Round(slPrice, Symbol.Digits); + + ModifyPosition(position, slPrice, position.TakeProfit, ProtectionType.Absolute); + } + } + } + + private void OnPositionClosed(PositionClosedEventArgs args) + { + // Remove the position from tracking when it's closed + _maxProfits.Remove(args.Position.Id); + _maxDrawdowns.Remove(args.Position.Id); + } + + protected override void OnStop() + { + // Unsubscribe from events on cBot stop + Positions.Closed -= OnPositionClosed; + } + } +} \ No newline at end of file diff --git a/Sources/Robots/SL-Manager/SL-Manager/SL-Manager.csproj b/Sources/Robots/SL-Manager/SL-Manager/SL-Manager.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/SL-Manager/SL-Manager/SL-Manager.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/SmaHmaBot.algo b/Sources/Robots/SmaHmaBot.algo new file mode 100644 index 0000000000000000000000000000000000000000..42a6068c19fd14ab5af3171a43a5c7a2aa5f3f7c GIT binary patch literal 7405 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 smaPrev); + bool isSmaFalling = (smaClosed < smaPrev); + bool isHmaAboveSma = (hmaClosed > smaClosed); + bool isHmaBelowSma = (hmaClosed < smaClosed); + + var activePosition = Positions.Find(PositionLabel, SymbolName); + + if ((activePosition != null)) + { + if (((activePosition.TradeType == TradeType.Buy) && (isHmaBelowSma)) || + ((activePosition.TradeType == TradeType.Sell) && (isHmaAboveSma))) + { + ClosePosition(activePosition); + _signalState = PendingSignalState.None; + } + } + + if (activePosition == null) + { + if ((AllowedDirection != TradingDirection.ShortOnly) && (isHmaAboveSma) && (isSmaRising)) + { + if (_signalState != PendingSignalState.WaitingForBuyEntry) + { + _signalState = PendingSignalState.WaitingForBuyEntry; + _extremumSinceSignal = Bars.LowPrices.Last(0); + } + } + else if ((AllowedDirection != TradingDirection.LongOnly) && (isHmaBelowSma) && (isSmaFalling)) + { + if (_signalState != PendingSignalState.WaitingForSellEntry) + { + _signalState = PendingSignalState.WaitingForSellEntry; + _extremumSinceSignal = Bars.HighPrices.Last(0); + } + } + else + { + _signalState = PendingSignalState.None; + } + } + } + + private void HandleEntryLogic() + { + if (_signalState == PendingSignalState.None) return; + + double currentClose = Bars.ClosePrices.Last(0); + double smaValue = _sma.Result.Last(0); + + if (_signalState == PendingSignalState.WaitingForBuyEntry) + { + _extremumSinceSignal = Math.Min(_extremumSinceSignal, Bars.LowPrices.Last(0)); + if ((Bars.HighPrices.Last(2) < Bars.LowPrices.Last(0)) && (currentClose <= smaValue)) + { + ExecuteEntry(TradeType.Buy, _extremumSinceSignal); + } + } + else if (_signalState == PendingSignalState.WaitingForSellEntry) + { + _extremumSinceSignal = Math.Max(_extremumSinceSignal, Bars.HighPrices.Last(0)); + if ((Bars.LowPrices.Last(2) > Bars.HighPrices.Last(0)) && (currentClose >= smaValue)) + { + ExecuteEntry(TradeType.Sell, _extremumSinceSignal); + } + } + } + + private void ExecuteEntry(TradeType type, double stopLossPrice) + { + double entryPrice = (type == TradeType.Buy) ? Symbol.Ask : Symbol.Bid; + double slDistPips = Math.Abs(entryPrice - stopLossPrice) / Symbol.PipSize; + + if (slDistPips < MinStopLossPips) + { + slDistPips = MinStopLossPips; + stopLossPrice = (type == TradeType.Buy) + ? (entryPrice - MinStopLossPips * Symbol.PipSize) + : (entryPrice + MinStopLossPips * Symbol.PipSize); + } + + double riskAmount = Account.Balance * (RiskPercentage / 100.0); + double volume = Symbol.VolumeForFixedRisk(riskAmount, slDistPips); + volume = Symbol.NormalizeVolumeInUnits(volume, RoundingMode.ToNearest); + + if (volume < Symbol.VolumeInUnitsMin) return; + + _signalState = PendingSignalState.None; + var result = ExecuteMarketOrder(type, SymbolName, volume, PositionLabel, null, null); + + if (result.IsSuccessful) + { + ModifyPosition(result.Position, stopLossPrice, null, ProtectionType.Absolute); + TriggerNotification(type.ToString().ToUpper() + " ENTRY", $"Vol: {volume}, SL: {stopLossPrice}"); + } + } + + private void ManageProfitTaking() + { + foreach (var position in Positions.Where(p => p.Label == PositionLabel)) + { + double smaValue = _sma.Result.Last(0); + double currentPrice = (position.TradeType == TradeType.Buy) ? Symbol.Bid : Symbol.Ask; + double smaDistPips = Math.Abs(currentPrice - smaValue) / Symbol.PipSize; + + // Close if position in profit AND too far from SMA + if ((position.GrossProfit > 0) && (smaDistPips > MaxSmaDistancePips)) + { + ClosePosition(position); + TriggerNotification("TAKE PROFIT", $"Price far from SMA ({smaDistPips:F1} pips)"); + } + } + } + + private void ManageBreakEven() + { + foreach (var position in Positions.Where(p => p.Label == PositionLabel)) + { + if (position.StopLoss == null) continue; + + double initialRisk = Math.Abs(position.EntryPrice - position.StopLoss.Value); + double currentProfitDist = (position.TradeType == TradeType.Buy) ? (Symbol.Bid - position.EntryPrice) : (position.EntryPrice - Symbol.Ask); + + if (currentProfitDist > initialRisk) + { + double targetSl = (position.TradeType == TradeType.Buy) + ? (position.EntryPrice + BreakEvenOffsetPips * Symbol.PipSize) + : (position.EntryPrice - BreakEvenOffsetPips * Symbol.PipSize); + + bool isAlreadyBE = (position.TradeType == TradeType.Buy) ? (position.StopLoss >= targetSl) : (position.StopLoss <= targetSl); + + if (!isAlreadyBE) ModifyPosition(position, targetSl, null, ProtectionType.Absolute); + } + } + } + + private void TriggerNotification(string type, string reason) + { + if (IsBacktesting) return; + string msg = $"{Symbol.Name}\n{type}\n{reason}"; + Task.Run(() => SendTelegramMessageAsync(msg)); + } + + private async Task SendTelegramMessageAsync(string message) + { + if (string.IsNullOrWhiteSpace(TelegramBotToken)) return; + try + { + string url = $"https://api.telegram.org/bot{TelegramBotToken}/sendMessage?chat_id={TelegramChatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + await _httpClient.GetAsync(url); + } + catch { } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/SmaHmaBot/SmaHmaBot/SmaHmaBot.csproj b/Sources/Robots/SmaHmaBot/SmaHmaBot/SmaHmaBot.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/SmaHmaBot/SmaHmaBot/SmaHmaBot.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/SmaHmaNotification.algo b/Sources/Robots/SmaHmaNotification.algo new file mode 100644 index 0000000000000000000000000000000000000000..520471470775babb30d80d1129c3ff52e546ea55 GIT binary patch literal 6414 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 c$nU~Oh{+52M@azOpV_cMBC* smaPrev; + bool isSmaFalling = smaClosed < smaPrev; + + bool isCrossUp = (hmaPrev <= smaPrev) && (hmaClosed > smaClosed); + bool isCrossDown = (hmaPrev >= smaPrev) && (hmaClosed < smaClosed); + + bool isHmaAbove = hmaClosed > smaClosed; + bool isHmaBelow = hmaClosed < smaClosed; + + if (AllowedDirection == TradingDirection.Both || AllowedDirection == TradingDirection.LongOnly) + { + if (isCrossUp) + { + _waitingForSmaFall = false; + + if (isSmaRising) + { + TriggerSignal("BUY", "SMA Rising + HMA CrossUp (Immediate)"); + _waitingForSmaRise = false; + } + else + { + _waitingForSmaRise = true; + } + } + else if (_waitingForSmaRise) + { + if (!isHmaAbove) + { + _waitingForSmaRise = false; + } + else if (isSmaRising) + { + TriggerSignal("BUY", "SMA Started Rising after HMA CrossUp (Delayed)"); + _waitingForSmaRise = false; + } + } + } + else + { + _waitingForSmaRise = false; + } + + if (AllowedDirection == TradingDirection.Both || AllowedDirection == TradingDirection.ShortOnly) + { + if (isCrossDown) + { + _waitingForSmaRise = false; + + if (isSmaFalling) + { + TriggerSignal("SELL", "SMA Falling + HMA CrossDown (Immediate)"); + _waitingForSmaFall = false; + } + else + { + _waitingForSmaFall = true; + } + } + else if (_waitingForSmaFall) + { + if (!isHmaBelow) + { + _waitingForSmaFall = false; + } + else if (isSmaFalling) + { + TriggerSignal("SELL", "SMA Started Falling after HMA CrossDown (Delayed)"); + _waitingForSmaFall = false; + } + } + } + else + { + _waitingForSmaFall = false; + } + } + + private void TriggerSignal(string type, string reason) + { + int index = Bars.Count - 1; + // Use converted Server Time to respect robot's TimeZone even in backtest. + string localTime = TimeZoneInfo.ConvertTimeFromUtc(TimeInUtc, TimeZone).ToString("yyyy-MM-dd HH:mm:ss"); + + if (type == "BUY") + { + Chart.DrawIcon("BuySignal_" + index, ChartIconType.UpArrow, index, Bars.LowPrices[index] - Symbol.PipSize * 5, Color.Green); + } + else if (type == "SELL") + { + Chart.DrawIcon("SellSignal_" + index, ChartIconType.DownArrow, index, Bars.HighPrices[index] + Symbol.PipSize * 5, Color.Red); + } + + string logMessage = $"[{localTime}] {Symbol.Name} ({TimeFrame}) {type}: {reason}"; + Print(logMessage); + + // Suppress external notifications during backtesting. + if (!IsBacktesting) + { + PlaySoundAlert(); + + string emoji = (type == "BUY" ? "🟢" : (type == "SELL" ? "🔴" : "ℹ")); + string htmlMessage = $"{emoji} {Symbol.Name} ({TimeFrame})\n" + + $"{type} Signal\n" + + $"Reason: {reason}\n" + + $"Time: {localTime}"; + + Task.Run(() => SendTelegramMessageAsync(htmlMessage)); + } + } + + private void PlaySoundAlert() + { + try + { + if (!string.IsNullOrWhiteSpace(SoundFilePath)) + { + Notifications.PlaySound(SoundFilePath); + } + } + catch (Exception ex) + { + Print("Error playing sound: {0}", ex.Message); + } + } + + private async Task SendTelegramMessageAsync(string message) + { + if (string.IsNullOrWhiteSpace(TelegramBotToken) || string.IsNullOrWhiteSpace(TelegramChatId)) + { + return; + } + + try + { + string url = $"https://api.telegram.org/bot{TelegramBotToken}/sendMessage?chat_id={TelegramChatId}&text={Uri.EscapeDataString(message)}&parse_mode=HTML"; + HttpResponseMessage response = await _httpClient.GetAsync(url); + + if (!response.IsSuccessStatusCode) + { + Print("Telegram Error: {0}", response.StatusCode); + } + } + catch (Exception ex) + { + Print("Exception sending Telegram message: {0}", ex.Message); + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/SmaHmaNotification/SmaHmaNotification/SmaHmaNotification.csproj b/Sources/Robots/SmaHmaNotification/SmaHmaNotification/SmaHmaNotification.csproj new file mode 100644 index 0000000..da1fef1 --- /dev/null +++ b/Sources/Robots/SmaHmaNotification/SmaHmaNotification/SmaHmaNotification.csproj @@ -0,0 +1,9 @@ + + + net6.0 + + + + + + diff --git a/Sources/Robots/Web Sockets Sample.algo b/Sources/Robots/Web Sockets Sample.algo new file mode 100644 index 0000000000000000000000000000000000000000..ec2fa3d014023574f245330f18b36a364e2dc0dd GIT binary patch literal 2393 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 literal 0 HcmV?d00001 diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.dgspec.json b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..721d957 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.dgspec.json @@ -0,0 +1,66 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj": {} + }, + "projects": { + "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj", + "projectName": "HmaStructureBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.props b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.props new file mode 100644 index 0000000..0b161ac --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Brummel\.nuget\packages\ + PackageReference + 6.1.0 + + + + + + + + + C:\Users\Brummel\.nuget\packages\ctrader.automate\1.0.14 + + \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.targets b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.targets new file mode 100644 index 0000000..46f142c --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/HmaStructureBot.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.assets.json b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.assets.json new file mode 100644 index 0000000..4b75b33 --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net6.0": { + "cTrader.Automate/1.0.14": { + "type": "package", + "compile": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "runtime": { + "lib/net6.0/cAlgo.API.dll": {} + }, + "build": { + "build/cTrader.Automate.props": {}, + "build/cTrader.Automate.targets": {} + } + } + } + }, + "libraries": { + "cTrader.Automate/1.0.14": { + "sha512": "eNwE7WL90MGBKb5MuLAtZLdQy0vxkI5EVhLWAQ9S83EAdYkGAzdccvGFLk2oqmtSGBtD+gEpyrJUW/ej4dI4jw==", + "type": "package", + "path": "ctrader.automate/1.0.14", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "build/cTrader.Automate.props", + "build/cTrader.Automate.targets", + "ctrader.automate.1.0.14.nupkg.sha512", + "ctrader.automate.nuspec", + "eula.md", + "icon.png", + "lib/net40/cAlgo.API.dll", + "lib/net40/cAlgo.API.xml", + "lib/net6.0/cAlgo.API.dll", + "lib/net6.0/cAlgo.API.xml", + "tools/net472/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net472/Core.AlgoFormat.Writer.dll", + "tools/net472/Core.AlgoFormat.dll", + "tools/net472/Core.Domain.Primitives.dll", + "tools/net472/Newtonsoft.Json.dll", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Reflection.MetadataLoadContext.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/Core.AlgoFormat.Compose.Reflection.dll", + "tools/net6.0/Core.AlgoFormat.Writer.dll", + "tools/net6.0/Core.AlgoFormat.dll", + "tools/net6.0/Core.Connection.Protobuf.Common.dll", + "tools/net6.0/Core.Domain.Primitives.dll", + "tools/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/Newtonsoft.Json.dll", + "tools/net6.0/System.Drawing.Common.dll", + "tools/net6.0/System.Reflection.MetadataLoadContext.dll", + "tools/net6.0/System.Security.Permissions.dll", + "tools/net6.0/System.Windows.Extensions.dll", + "tools/net6.0/cTrader.Automate.Sdk.Tasks.dll", + "tools/net6.0/protobuf-net.Core.dll", + "tools/net6.0/protobuf-net.dll", + "tools/net6.0/runtimes/unix/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/Microsoft.Win32.SystemEvents.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Drawing.Common.dll", + "tools/net6.0/runtimes/win/lib/net6.0/System.Windows.Extensions.dll" + ] + } + }, + "projectFileDependencyGroups": { + "net6.0": [ + "cTrader.Automate >= *" + ] + }, + "packageFolders": { + "C:\\Users\\Brummel\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj", + "projectName": "HmaStructureBot", + "projectPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj", + "packagesPath": "C:\\Users\\Brummel\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\Brummel\\AppData\\Roaming\\NuGet\\NuGet.Config" + ], + "originalTargetFrameworks": [ + "net6.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net6.0": { + "targetAlias": "net6.0", + "dependencies": { + "cTrader.Automate": { + "target": "Package", + "version": "[*, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.200\\RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.nuget.cache b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.nuget.cache new file mode 100644 index 0000000..d0d8d9a --- /dev/null +++ b/Sources/Robots/HmaStructureBot/HmaStructureBot/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "+LfUhmmRyp/da3uLv4sl9ySOIaNqbWkyyWrG6dFoxe2QtHmfBoTXxKOgzeDDVjvn++es3OTLB7yxGQK8b5/qMg==", + "success": true, + "projectFilePath": "C:\\Users\\Brummel\\Documents\\cAlgo\\Sources\\Robots\\HmaStructureBot\\HmaStructureBot\\HmaStructureBot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Brummel\\.nuget\\packages\\ctrader.automate\\1.0.14\\ctrader.automate.1.0.14.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/Sources/Robots/HmaTrendTrader.algo b/Sources/Robots/HmaTrendTrader.algo new file mode 100644 index 0000000000000000000000000000000000000000..060be51d3b61517967fbeecb5784e74fbf8bda25 GIT binary patch literal 8829 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