From 50ed6f6504bd0c0055761bf4d6a820d7de24269f Mon Sep 17 00:00:00 2001 From: Miha Date: Tue, 19 Apr 2022 14:35:10 -0700 Subject: [PATCH] Rebase --- .github/QuanTAlib.png | Bin 0 -> 4936 bytes .github/QuanTAlib2.png | Bin 0 -> 65859 bytes .github/workflows/main_automation.yml | 99 + .gitignore | 354 + Docs/Comparing_w_TALIB.ipynb | 149 + Docs/LICENSE | 201 + Docs/QuanTAlib_Indicators.dib | 21 + Docs/QuantLib_test.ipynb | 305 + Docs/coverage.md | 155 + Docs/getting_started.ipynb | 290 + Docs/ma-comparison.dib | 244 + Docs/macd_example.ipynb | 159 + Docs/readme.md | 36 + QuanTAlib.sln | 71 + Quantower/ADD_Series.cs | 114 + Quantower/Abstract_Indicators.cs | 42 + Quantower/DIV_Series.cs | 125 + Quantower/Indicators/BIAS_chart.cs | 55 + Quantower/Indicators/DEMA_chart.cs | 56 + Quantower/Indicators/EMA_chart.cs | 56 + Quantower/Indicators/ENTP_chart.cs | 57 + Quantower/Indicators/HEMA_chart.cs | 56 + Quantower/Indicators/HMA_chart.cs | 56 + Quantower/Indicators/JMA_chart.cs | 56 + Quantower/Indicators/KURT_chart.cs | 55 + Quantower/Indicators/MAD_chart.cs | 57 + Quantower/Indicators/MAPE_chart.cs | 57 + Quantower/Indicators/MAX_chart.cs | 57 + Quantower/Indicators/MED_chart.cs | 54 + Quantower/Indicators/MIN_chart.cs | 57 + Quantower/Indicators/MSE_chart.cs | 57 + Quantower/Indicators/PSDEV_chart.cs | 57 + Quantower/Indicators/PVAR_chart.cs | 57 + Quantower/Indicators/RMA_chart.cs | 56 + Quantower/Indicators/SDEV_chart.cs | 57 + Quantower/Indicators/SMAPE_chart.cs | 57 + Quantower/Indicators/SMA_chart.cs | 56 + Quantower/Indicators/TEMA_chart.cs | 56 + Quantower/Indicators/VAR_chart.cs | 57 + Quantower/Indicators/WMAPE_chart.cs | 68 + Quantower/Indicators/WMA_chart.cs | 56 + Quantower/Indicators/ZLEMA_chart.cs | 56 + Quantower/MUL_Series.cs | 117 + Quantower/Quantower.csproj | 28 + Quantower/RND_Feed.cs | 20 + Quantower/SUB_Series.cs | 125 + Quantower/TBars.cs | 104 + Quantower/TSeries.cs | 72 + .../dll/TradingPlatform.BusinessLayer.dll | Bin 0 -> 1080224 bytes .../dll/TradingPlatform.BusinessLayer.xml | 9003 +++++++++++++++++ Source/Basics/ADD_Series.cs | 23 + Source/Basics/Abstract_Indicators.cs | 151 + Source/Basics/DIV_Series.cs | 23 + Source/Basics/MUL_Series.cs | 23 + Source/Basics/RND_Feed.cs | 20 + Source/Basics/SUB_Series.cs | 23 + Source/Basics/TBars.cs | 104 + Source/Basics/TSeries.cs | 72 + Source/MovingAvg/DEMA_Series.cs | 73 + Source/MovingAvg/EMA_Series.cs | 63 + Source/MovingAvg/HEMA_Series.cs | 64 + Source/MovingAvg/HMA_Series.cs | 118 + Source/MovingAvg/JMA_Series.cs | 160 + Source/MovingAvg/RMA_Series.cs | 64 + Source/MovingAvg/SMA_Series.cs | 38 + Source/MovingAvg/TEMA_Series.cs | 79 + Source/MovingAvg/WMA_Series.cs | 37 + Source/MovingAvg/ZLEMA_Series.cs | 55 + Source/QuanTAlib.csproj | 70 + Source/Statistics/BIAS_Series.cs | 40 + Source/Statistics/ENTP_Series.cs | 51 + Source/Statistics/KURT_Series.cs | 65 + Source/Statistics/MAD_Series.cs | 43 + Source/Statistics/MAPE_Series.cs | 45 + Source/Statistics/MAX_Series.cs | 33 + Source/Statistics/MED_Series.cs | 48 + Source/Statistics/MIN_Series.cs | 33 + Source/Statistics/MSE_Series.cs | 41 + Source/Statistics/PSDEV_Series.cs | 45 + Source/Statistics/PVAR_Series.cs | 44 + Source/Statistics/SDEV_Series.cs | 46 + Source/Statistics/SMAPE_Series.cs | 39 + Source/Statistics/VAR_Series.cs | 44 + Source/Statistics/WMAPE_Series.cs | 44 + Tests/Basics/ADD_Test.cs | 64 + Tests/Basics/Abstract_Test.cs | 23 + Tests/Basics/DIV_Test.cs | 64 + Tests/Basics/MUL_Test.cs | 64 + Tests/Basics/SUB_Test.cs | 64 + Tests/Basics/TBars_Test.cs | 113 + Tests/Basics/TSeries_Test.cs | 63 + Tests/MovingAvg/DEMA_Test.cs | 33 + Tests/MovingAvg/EMA_Test.cs | 33 + Tests/MovingAvg/HEMA_Test.cs | 33 + Tests/MovingAvg/HMA_Test.cs | 33 + Tests/MovingAvg/JMA_Test.cs | 33 + Tests/MovingAvg/RMA_Test.cs | 33 + Tests/MovingAvg/SMA_Test.cs | 33 + Tests/MovingAvg/TEMA_Test.cs | 33 + Tests/MovingAvg/WMA_Test.cs | 33 + Tests/MovingAvg/ZLEMA_Test.cs | 33 + Tests/Statistics/BIAS_Test.cs | 33 + Tests/Statistics/ENTP_Test.cs | 33 + Tests/Statistics/KURT_Test.cs | 33 + Tests/Statistics/MAD_Test.cs | 33 + Tests/Statistics/MAPE_Test.cs | 33 + Tests/Statistics/MAX_Test.cs | 33 + Tests/Statistics/MED_Test.cs | 33 + Tests/Statistics/MIN_Test.cs | 33 + Tests/Statistics/MSE_Test.cs | 33 + Tests/Statistics/PSDEV_Test.cs | 33 + Tests/Statistics/PVAR_Test .cs | 33 + Tests/Statistics/SDEV_Test .cs | 33 + Tests/Statistics/SMAPE_Test.cs | 33 + Tests/Statistics/VAR_Test.cs | 33 + Tests/Statistics/WMAPE_Test.cs | 33 + Tests/Tests.csproj | 32 + Tests/Validations/Pandas_TA.cs | 120 + Tests/Validations/Skender_Stock.cs | 93 + Tests/Validations/TA_LIB.cs | 88 + 120 files changed, 16787 insertions(+) create mode 100644 .github/QuanTAlib.png create mode 100644 .github/QuanTAlib2.png create mode 100644 .github/workflows/main_automation.yml create mode 100644 .gitignore create mode 100644 Docs/Comparing_w_TALIB.ipynb create mode 100644 Docs/LICENSE create mode 100644 Docs/QuanTAlib_Indicators.dib create mode 100644 Docs/QuantLib_test.ipynb create mode 100644 Docs/coverage.md create mode 100644 Docs/getting_started.ipynb create mode 100644 Docs/ma-comparison.dib create mode 100644 Docs/macd_example.ipynb create mode 100644 Docs/readme.md create mode 100644 QuanTAlib.sln create mode 100644 Quantower/ADD_Series.cs create mode 100644 Quantower/Abstract_Indicators.cs create mode 100644 Quantower/DIV_Series.cs create mode 100644 Quantower/Indicators/BIAS_chart.cs create mode 100644 Quantower/Indicators/DEMA_chart.cs create mode 100644 Quantower/Indicators/EMA_chart.cs create mode 100644 Quantower/Indicators/ENTP_chart.cs create mode 100644 Quantower/Indicators/HEMA_chart.cs create mode 100644 Quantower/Indicators/HMA_chart.cs create mode 100644 Quantower/Indicators/JMA_chart.cs create mode 100644 Quantower/Indicators/KURT_chart.cs create mode 100644 Quantower/Indicators/MAD_chart.cs create mode 100644 Quantower/Indicators/MAPE_chart.cs create mode 100644 Quantower/Indicators/MAX_chart.cs create mode 100644 Quantower/Indicators/MED_chart.cs create mode 100644 Quantower/Indicators/MIN_chart.cs create mode 100644 Quantower/Indicators/MSE_chart.cs create mode 100644 Quantower/Indicators/PSDEV_chart.cs create mode 100644 Quantower/Indicators/PVAR_chart.cs create mode 100644 Quantower/Indicators/RMA_chart.cs create mode 100644 Quantower/Indicators/SDEV_chart.cs create mode 100644 Quantower/Indicators/SMAPE_chart.cs create mode 100644 Quantower/Indicators/SMA_chart.cs create mode 100644 Quantower/Indicators/TEMA_chart.cs create mode 100644 Quantower/Indicators/VAR_chart.cs create mode 100644 Quantower/Indicators/WMAPE_chart.cs create mode 100644 Quantower/Indicators/WMA_chart.cs create mode 100644 Quantower/Indicators/ZLEMA_chart.cs create mode 100644 Quantower/MUL_Series.cs create mode 100644 Quantower/Quantower.csproj create mode 100644 Quantower/RND_Feed.cs create mode 100644 Quantower/SUB_Series.cs create mode 100644 Quantower/TBars.cs create mode 100644 Quantower/TSeries.cs create mode 100644 Quantower/dll/TradingPlatform.BusinessLayer.dll create mode 100644 Quantower/dll/TradingPlatform.BusinessLayer.xml create mode 100644 Source/Basics/ADD_Series.cs create mode 100644 Source/Basics/Abstract_Indicators.cs create mode 100644 Source/Basics/DIV_Series.cs create mode 100644 Source/Basics/MUL_Series.cs create mode 100644 Source/Basics/RND_Feed.cs create mode 100644 Source/Basics/SUB_Series.cs create mode 100644 Source/Basics/TBars.cs create mode 100644 Source/Basics/TSeries.cs create mode 100644 Source/MovingAvg/DEMA_Series.cs create mode 100644 Source/MovingAvg/EMA_Series.cs create mode 100644 Source/MovingAvg/HEMA_Series.cs create mode 100644 Source/MovingAvg/HMA_Series.cs create mode 100644 Source/MovingAvg/JMA_Series.cs create mode 100644 Source/MovingAvg/RMA_Series.cs create mode 100644 Source/MovingAvg/SMA_Series.cs create mode 100644 Source/MovingAvg/TEMA_Series.cs create mode 100644 Source/MovingAvg/WMA_Series.cs create mode 100644 Source/MovingAvg/ZLEMA_Series.cs create mode 100644 Source/QuanTAlib.csproj create mode 100644 Source/Statistics/BIAS_Series.cs create mode 100644 Source/Statistics/ENTP_Series.cs create mode 100644 Source/Statistics/KURT_Series.cs create mode 100644 Source/Statistics/MAD_Series.cs create mode 100644 Source/Statistics/MAPE_Series.cs create mode 100644 Source/Statistics/MAX_Series.cs create mode 100644 Source/Statistics/MED_Series.cs create mode 100644 Source/Statistics/MIN_Series.cs create mode 100644 Source/Statistics/MSE_Series.cs create mode 100644 Source/Statistics/PSDEV_Series.cs create mode 100644 Source/Statistics/PVAR_Series.cs create mode 100644 Source/Statistics/SDEV_Series.cs create mode 100644 Source/Statistics/SMAPE_Series.cs create mode 100644 Source/Statistics/VAR_Series.cs create mode 100644 Source/Statistics/WMAPE_Series.cs create mode 100644 Tests/Basics/ADD_Test.cs create mode 100644 Tests/Basics/Abstract_Test.cs create mode 100644 Tests/Basics/DIV_Test.cs create mode 100644 Tests/Basics/MUL_Test.cs create mode 100644 Tests/Basics/SUB_Test.cs create mode 100644 Tests/Basics/TBars_Test.cs create mode 100644 Tests/Basics/TSeries_Test.cs create mode 100644 Tests/MovingAvg/DEMA_Test.cs create mode 100644 Tests/MovingAvg/EMA_Test.cs create mode 100644 Tests/MovingAvg/HEMA_Test.cs create mode 100644 Tests/MovingAvg/HMA_Test.cs create mode 100644 Tests/MovingAvg/JMA_Test.cs create mode 100644 Tests/MovingAvg/RMA_Test.cs create mode 100644 Tests/MovingAvg/SMA_Test.cs create mode 100644 Tests/MovingAvg/TEMA_Test.cs create mode 100644 Tests/MovingAvg/WMA_Test.cs create mode 100644 Tests/MovingAvg/ZLEMA_Test.cs create mode 100644 Tests/Statistics/BIAS_Test.cs create mode 100644 Tests/Statistics/ENTP_Test.cs create mode 100644 Tests/Statistics/KURT_Test.cs create mode 100644 Tests/Statistics/MAD_Test.cs create mode 100644 Tests/Statistics/MAPE_Test.cs create mode 100644 Tests/Statistics/MAX_Test.cs create mode 100644 Tests/Statistics/MED_Test.cs create mode 100644 Tests/Statistics/MIN_Test.cs create mode 100644 Tests/Statistics/MSE_Test.cs create mode 100644 Tests/Statistics/PSDEV_Test.cs create mode 100644 Tests/Statistics/PVAR_Test .cs create mode 100644 Tests/Statistics/SDEV_Test .cs create mode 100644 Tests/Statistics/SMAPE_Test.cs create mode 100644 Tests/Statistics/VAR_Test.cs create mode 100644 Tests/Statistics/WMAPE_Test.cs create mode 100644 Tests/Tests.csproj create mode 100644 Tests/Validations/Pandas_TA.cs create mode 100644 Tests/Validations/Skender_Stock.cs create mode 100644 Tests/Validations/TA_LIB.cs diff --git a/.github/QuanTAlib.png b/.github/QuanTAlib.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a5c737aa00161384a7ec082dba2f51fb7243f8 GIT binary patch literal 4936 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

#@y6uU)mMY z1mQW}JptAD4hT{SW!0)?R)*lddUoO0YR==ARLh=BJ^v7a1*VQ)AC<)_$; z-F+wrIZD}l$>+~hB5T;vXL*s(qn0dd~r^N2U@j@`&`{_+{J~pC4oQ+Uu^hY|Uy!xzXcjl_h#JREe)d zn3iuEQW!M6Dd3a5f|RD3gT6Uh{9iz_D3M{&j?|4@4z37J*%&i0YRPD%SeJtCXfB}L z90sR4ywRwpWD|a|Twq<9xi)#FWvRtnn=00e_+O}qkw4(b@@vBxfA~XQtQlCr4Dc~k zEmF+;1U}dHG;2n&=o{kTiNGhe&$Kv_x+kfq?8C*+bd zx>oCHG+=r=ueli-5YN4Ltbg~2x#D0k^NIqU!uDCp%;d=Hi{=4Ja%!>_5c8n_ E0_2HVWB>pF literal 0 HcmV?d00001 diff --git a/.github/QuanTAlib2.png b/.github/QuanTAlib2.png new file mode 100644 index 0000000000000000000000000000000000000000..42f02287e8afa034b92ba928f51a61a19c468417 GIT binary patch literal 65859 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

Installed Packages
  • QuantLib, 1.0.7
  • TALib.NETCore, 0.4.4
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#r \"nuget: TALib.NETCore, 0.4.4\" \n", + "#r \"nuget:QuanTAlib\" \n", + "\n", + "using QuanTAlib;\n", + "using TALib;\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
1394
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "YAHOO_Feed aapl = new(2020,\"AAPL\");\n", + "TSeries data = aapl.Close;\n", + "\n", + "data.Count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [], + "source": [ + "int period = 10;\n", + "\n", + "//QuanTAlib SMA algorithm\n", + "SMA_Series e = new(data, period, false); \n", + "\n", + "// direct call to SMA from TA-LIB - with stitching NaNs in front\n", + "int outBegIdx, outNbElement;\n", + "double[] output = new double[data.Count];\n", + "double[] nans = new double[period];\n", + "double[] ta_temp = new double[data.Count-period+1];\n", + "Array.Fill(nans, double.NaN);\n", + "Core.Sma(data.v.ToArray(), 0, data.Count-1, ta_temp, out outBegIdx, out outNbElement, period); //TA-LIB SMA method\n", + "nans.CopyTo(output,0);\n", + "ta_temp.CopyTo(output,period-1);\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "QuantLib\t TA-LIB\n", + "164.31\t\t 164.31\n", + "166.81\t\t 166.81\n", + "169.20\t\t 169.20\n", + "171.01\t\t 171.01\n", + "172.41\t\t 172.41\n", + "173.45\t\t 173.45\n", + "174.75\t\t 174.75\n", + "175.38\t\t 175.38\n", + "175.54\t\t 175.54\n", + "\n", + "1394\t\t 1394\n" + ] + } + ], + "source": [ + "// comparing the tail of QuanTAlib and TA-LIB\n", + "Console.Write($\"QuanTAlib\\t TA-LIB\\n\");\n", + "for (int i=data.Count-10; i
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#r \"nuget:YahooFinanceApi;\" \n", + "#r \"nuget:QuanTAlib;\" \n", + "using YahooFinanceApi;\n", + "using QuanTAlib;\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date\t\t Value\t SMA\t MAD\t STDDEV\t MSE\t MAPE\n", + " 2022-03-14\t 150.62\t 150.62\t 0.00\t 0.00\t 0.00\t 0.00\t\n", + "2022-03-15\t 155.09\t 152.85\t 2.24\t 3.16\t 5.00\t 0.01\t\n", + "2022-03-16\t 159.59\t 155.10\t 2.99\t 4.49\t 13.41\t 0.02\t\n", + "2022-03-17\t 160.62\t 156.48\t 3.62\t 4.59\t 15.77\t 0.02\t\n", + "2022-03-18\t 163.98\t 157.98\t 4.10\t 5.20\t 21.62\t 0.03\t\n", + "2022-03-21\t 165.38\t 160.93\t 3.00\t 4.03\t 13.02\t 0.02\t\n", + "2022-03-22\t 168.82\t 163.68\t 2.86\t 3.72\t 11.10\t 0.02\t\n", + "2022-03-23\t 170.21\t 165.80\t 2.97\t 3.84\t 11.78\t 0.02\t\n", + "2022-03-24\t 174.07\t 168.49\t 3.05\t 4.01\t 12.84\t 0.02\t\n", + "2022-03-25\t 174.72\t 170.64\t 3.00\t 3.86\t 11.92\t 0.02\t\n", + "2022-03-28\t 175.60\t 172.68\t 2.54\t 2.98\t 7.12\t 0.01\t\n", + "2022-03-29\t 178.96\t 174.71\t 2.06\t 3.14\t 7.90\t 0.01\t\n", + "2022-03-30\t 177.77\t 176.22\t 1.71\t 2.07\t 3.43\t 0.01\t\n", + "2022-03-31\t 174.61\t 176.33\t 1.63\t 1.94\t 3.01\t 0.01\t\n" + ] + } + ], + "source": [ + "TSeries data = new();\n", + "var history = await Yahoo.GetHistoricalAsync(\"AAPL\", DateTime.Today.AddDays(-19), DateTime.Now, Period.Daily);\n", + "SMA_Series sma = new(data, 5, false);\n", + "SUB_Series sub = new(sma.STDDEV,sma.MAD);\n", + "Console.Write($\"Date\\t\\t Value\\t SMA\\t MAD\\t STDDEV\\t MSE\\t MAPE\\n \");\n", + "foreach (var i in history) {\n", + " data.Add((i.DateTime, (double)i.Close));\n", + " Console.Write($\"{data[^1].t:yyyy-MM-dd}\\t {(double)data:f2}\\t {(double)sma:f2}\\t {(double)sma.MAD:f2}\\t {(double)sma.STDDEV:f2}\\t {(double)sma.MSE:f2}\\t {(double)sma.MAPE:f2}\\t\\n\");\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "date\t\t Value\t SMA\t WMA\t EMA\t HMA\t DEMA\t TEMA \tZLEMA \tJMA\r\n", + "2022-03-21\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\n", + "2022-03-22\t 168.82\t 167.10\t 167.67\t 166.53\t 166.91\t 167.29\t 167.80\t 167.67\t 168.29\n", + "2022-03-23\t 170.21\t 168.14\t 168.94\t 167.75\t 168.52\t 169.08\t 169.80\t 170.13\t 170.00\n", + "2022-03-24\t 174.07\t 169.62\t 170.99\t 169.86\t 171.53\t 172.15\t 173.27\t 173.19\t 173.30\n", + "2022-03-25\t 174.72\t 170.64\t 172.24\t 171.48\t 174.45\t 174.09\t 175.04\t 175.21\t 174.42\n", + "2022-03-28\t 175.60\t 172.68\t 173.89\t 172.85\t 175.90\t 175.51\t 176.18\t 175.85\t 175.23\n", + "2022-03-29\t 178.96\t 174.71\t 175.98\t 174.89\t 177.60\t 178.01\t 178.78\t 178.30\t 177.49\n", + "2022-03-30\t 177.77\t 176.22\t 177.00\t 175.85\t 178.50\t 178.57\t 178.81\t 178.85\t 177.95\n", + "2022-03-31\t 174.61\t 176.33\t 176.46\t 175.44\t 177.08\t 176.98\t 176.35\t 175.98\t 176.09\n" + ] + } + ], + "source": [ + "TSeries data = new();\n", + "var history = await Yahoo.GetHistoricalAsync(\"AAPL\", DateTime.Today.AddDays(-10), DateTime.Now, Period.Daily);\n", + "SMA_Series sma = new(data, 5);\n", + "WMA_Series wma = new(data, 5);\n", + "EMA_Series ema = new(data, 5);\n", + "HMA_Series hma = new(data, 5);\n", + "DEMA_Series dema = new(data, 5);\n", + "TEMA_Series tema = new(data, 5);\n", + "ZLEMA_Series zlema = new(data, 5);\n", + "JMA_Series jma = new(data, 5);\n", + "\n", + "Console.WriteLine($\"date\\t\\t Value\\t SMA\\t WMA\\t EMA\\t HMA\\t DEMA\\t TEMA \\tZLEMA \\tJMA\");\n", + "foreach (var i in history) {\n", + " data.Add((i.DateTime, (double)i.Close)); // adding data will signal dependant indicators\n", + "\n", + " Console.Write($\"{data[^1].t:yyyy-MM-dd}\\t {(double)data:f2}\\t {(double)sma:f2}\\t {(double)wma:f2}\\t {(double)ema:f2}\\t {(double)hma:f2}\\t {(double)dema:f2}\\t {(double)tema:f2}\\t {(double)zlema:f2}\\t {(double)jma:f2}\\n\");\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
indexItem1Item2
02022-03-21 00:00:00Z
165.380005
12022-03-22 00:00:00Z
167.9823694096766
22022-03-23 00:00:00Z
170.06602047454277
32022-03-24 00:00:00Z
173.24670154378663
42022-03-25 00:00:00Z
174.81344756154755
52022-03-28 00:00:00Z
175.53949324963583
62022-03-29 00:00:00Z
177.89435364830672
72022-03-30 00:00:00Z
178.39609966493987
82022-03-31 00:00:00Z
176.03431272212282
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ADD_Series two = new(zlema, jma); // even when indicator is created later, it will grab the data from its source table\n", + "DIV_Series mean = new(two, 2); // this pair here calculates mean of ZLEMA and JMA indicators\n", + "\n", + "mean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [], + "source": [ + "public class ALMA_Series : TSeries\n", + "{\n", + " private readonly int _p;\n", + " private readonly bool _NaN;\n", + " private readonly TSeries _data;\n", + " private readonly double _offset, _sigma;\n", + " private double _norm;\n", + " private readonly System.Collections.Generic.List _buffer = new();\n", + " private readonly System.Collections.Generic.List _weights = new();\n", + "\n", + " public ALMA_Series(TSeries source, int period, double offset = 0.85, double sigma = 6.0, bool useNaN = false)\n", + " {\n", + " this._p = period;\n", + " this._data = source;\n", + " this._NaN = useNaN;\n", + " _offset = offset;\n", + " _sigma = sigma;\n", + "\n", + " double _m = _offset * (_p - 1);\n", + " double _s = _p / _sigma;\n", + "\n", + " _norm = 0;\n", + " for (int i = 0; i < this._p; i++)\n", + " {\n", + " double wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s));\n", + " this._weights.Add(wt);\n", + " _norm += wt;\n", + " }\n", + "\n", + " source.Pub += this.Sub;\n", + " if (source.Count > 0)\n", + " {\n", + " for (int i = 0; i < source.Count; i++)\n", + " {\n", + " this.Add(source[i], false);\n", + " }\n", + " }\n", + "\n", + " }\n", + " public new void Add((System.DateTime t, double v) data, bool update = false)\n", + " {\n", + " if (update) { this._buffer[this._buffer.Count - 1] = data.v; } else { this._buffer.Add(data.v); }\n", + " if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); }\n", + "\n", + " double _wma = 0;\n", + " for (int i = 0; i < this._buffer.Count; i++) { _wma += this._buffer[i] * this._weights[i]; }\n", + " if (this._buffer.Count < this._p) {\n", + " _norm = 0;\n", + " for (int i = 0; i < this._buffer.Count; i++) { _norm += this._weights[i];}\n", + " }\n", + " _wma /= _norm;\n", + "\n", + " (System.DateTime t, double v) result = (data.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _wma);\n", + " if (update) { base[base.Count - 1] = result; } else { base.Add(result); }\n", + " }\n", + " public void Add(bool update = false)\n", + " {\n", + " this.Add(this._data[this._data.Count - 1], update);\n", + " }\n", + " public new void Sub(object source, TSeriesEventArgs e) { this.Add(this._data[this._data.Count - 1], e.update); }\n", + "\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [], + "source": [ + "TSeries data = new() {212.80, 214.06, 213.89, 214.66, 213.95, 213.95, 214.55, 214.02, 214.51, 213.75, 214.22, 213.43 };\n", + "ALMA_Series alma = new(data, period: 10, offset: 0.0, sigma: 6.0, useNaN: true);\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-03-31\t 212.80\t NaN\t \n", + "2022-03-31\t 214.06\t NaN\t \n", + "2022-03-31\t 213.89\t NaN\t \n", + "2022-03-31\t 214.66\t NaN\t \n", + "2022-03-31\t 213.95\t NaN\t \n", + "2022-03-31\t 213.95\t NaN\t \n", + "2022-03-31\t 214.55\t NaN\t \n", + "2022-03-31\t 214.02\t NaN\t \n", + "2022-03-31\t 214.51\t NaN\t \n", + "2022-03-31\t 213.75\t 213.58\t \n", + "2022-03-31\t 214.22\t 214.11\t \n", + "2022-03-31\t 213.43\t 214.17\t \n" + ] + } + ], + "source": [ + "for (int i=0; iVisual Studio Code\n", + "- Installed .NET 6 SDK\n", + "- Installed .NET Interactive Notebooks extension\n", + "\n", + "**For impatient**, here is a simple example of calculating three moving averages - SMA(data), EMA(SMA(data)) and WMA(EMA(SMA(data))) from 10 days of AAPL stock data using QuanTAlib:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "index\t data\t\t sma(data)\t ema(sma(data))\t wma(ema(sma(data)))\n", + "0\t 2022-03-23\t 170.21\t\t 170.21\t\t NaN\n", + "1\t 2022-03-24\t 172.14\t\t 170.85\t\t NaN\n", + "2\t 2022-03-25\t 173.00\t\t 171.57\t\t NaN\n", + "3\t 2022-03-28\t 173.65\t\t 172.26\t\t NaN\n", + "4\t 2022-03-29\t 174.71\t\t 173.08\t\t 172.07\n", + "5\t 2022-03-30\t 176.22\t\t 174.13\t\t 172.92\n", + "6\t 2022-03-31\t 176.33\t\t 174.86\t\t 173.74\n", + "7\t 2022-04-01\t 176.25\t\t 175.32\t\t 174.46\n", + "8\t 2022-04-04\t 176.82\t\t 175.82\t\t 175.09\n", + "9\t 2022-04-05\t 176.04\t\t 175.89\t\t 175.51\n", + "10\t 2022-04-06\t 174.85\t\t 175.55\t\t 175.62\n", + "11\t 2022-04-07\t 174.36\t\t 175.15\t\t 175.51\n" + ] + } + ], + "source": [ + "#r \"nuget:QuanTAlib;\"\n", + "using QuanTAlib;\n", + "\n", + "YAHOO_Feed aapl = new(15, \"AAPL\");\n", + "TSeries data = aapl.Close;\n", + "SMA_Series sma = new(source: data, period: 5, useNaN: false);\n", + "EMA_Series ema = new(sma, period: 5); // by default, indicators expose all data, no NaN values\n", + "WMA_Series wma = new(ema, 5, useNaN: true); // for the final calculation we can hide early data with NaNs\n", + "\n", + "Console.Write($\"index\\t data\\t\\t sma(data)\\t ema(sma(data))\\t wma(ema(sma(data)))\\n\");\n", + "for (int i=0; iindexItem1Item202022-04-07 00:00:00Z
105.3
12022-04-07 21:57:46Z
293.1
22022-04-07 21:57:46Z
0
32022-04-04 21:57:46Z
10
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "var item1 = (DateTime.Today, 105.3); // (DateTime, Value) tuple\n", + "double item2 = 293.1; // a simple double\n", + "\n", + "TSeries data = new();\n", + "data.Add(item1); // adding tuple variable\n", + "data.Add(item2); // QuanTAlib stamps the (double) with current time\n", + "data.Add(0); // directly adding a number (stamped with current time)\n", + "data.Add((DateTime.Now.AddDays(-3), 10)); // adding a tuple with timestamp 3 days ago\n", + "\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "TSeries list can display only values (without timestamps) or only timestamps (without values) by using `.v` or `.t` properties" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
indexvalue
0
105.3
1
293.1
2
0
3
10
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data.v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The last element on the list can be accessed by .Last() or by [^1] - and using `.t` (time) and `.v` (value) properties. Also, casting a TSeries into (double) will return the value of the last element" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
10
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bool IsTheSame = data.Last().v == data[^1].v;\n", + "double lastvalue = data;\n", + "\n", + "lastvalue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All indicators are just modified TSeries classes; they get all required input during class construction (source of the datafeed, period...) and they automatically subscribe to events of the datafeed. Whenever datafeed gets a new value, indicator will calculate its own value. Indicators are also event publishers, so other indicators can subscribe to their results, chaining indicators together:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
indexvalue
0
Infinity
1
0.6666666666666666
2
0.3076923076923077
3
0.1951219512195122
4
0.1415929203539823
5
0.11072664359861592
6
0.09078014184397164
7
0.07687687687687687
8
0.06664931007550118
9
0.05881677197013211
10
0.2499389797412741
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "TSeries t1 = new() {0,1,2,3,4,5,6,7,8,9}; // t1 is loaded with data and activated as a publisher\n", + "EMA_Series t2 = new(t1, 3); // t2 will auto-load all history of t1 and wait for events from t1\n", + "ADD_Series t3 = new(t1, t2); // t3 is an ADDition of t1 and t2 - will also load history and wait for t2 events\n", + "DIV_Series t4 = new(1, t3); // t4 is calculating 1/t3 - and waiting for t3 events\n", + "\n", + "TSeries t5 = new(); // a wild indicator appeared! And it is empty!\n", + "t4.Pub += t5.Sub; // let us add a manual subscription to events coming from t4 - t5 is now listening to t4\n", + "t1.Add(0); // we add one new value to t1 - and trigger the full cascade of calculation! t5 is now full!\n", + "\n", + "t5.v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# MACD compounded indicator\n", + "\n", + "With QuanTAlib we can chain indicators together, creating complex compounded indicators. For example, we can create Moving Average Convergence/Divergence (MACD) indicators by chaining all required operations in a sequence:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
indexvalue
0
0
1
0.08934530370370339
2
0.3599908358509947
3
0.5984373224068585
4
0.9604679820661939
5
1.17393637722238
6
1.295101583309171
7
1.5073770108948183
8
1.4718244887751928
9
1.1537265475126177
10
0.8550987734004014
11
0.8650928385987653
12
0.5867583008849087
13
0.15053155636913873
14
-0.13622024638714825
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "YAHOO_Feed aapl = new(20, \"AAPL\");\n", + "TSeries close = aapl.Close; // close will get data from history\n", + "EMA_Series slow = new(close,26); // slow gets data from slow through pub-sub eventing\n", + "EMA_Series fast = new(close,12); // fast gets data from slow (via eventing)\n", + "SUB_Series macd = new(fast,slow); // macd is a SUBtraction: fast-slow\n", + "EMA_Series signal = new(macd,9); // signal is EMA of macd\n", + "SUB_Series histogram = new(macd, signal); // histogram is SUBtraction macd-signal\n", + "\n", + "histogram.v\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".NET (C#)", + "language": "C#", + "name": ".net-csharp" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/x-csharp", + "name": "C#", + "pygments_lexer": "csharp", + "version": "9.0" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Docs/ma-comparison.dib b/Docs/ma-comparison.dib new file mode 100644 index 00000000..21dfd75a --- /dev/null +++ b/Docs/ma-comparison.dib @@ -0,0 +1,244 @@ +#!csharp + +#r "nuget: Plotly.NET, 2.0.0-preview.18 " +#r "nuget: Plotly.NET.Interactive, 2.0.0-preview.18 " +#r "nuget: QuanTAlib" + +using Plotly.NET; +using Plotly.NET.LayoutObjects; +using QuanTAlib; + +List x = new() {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96}; +List Spike = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +List Impulse = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; +List Triangle = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2}; +List Sawtooth = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +List Sine = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.39,0.56,0.72,0.84,0.93,0.99,1,0.97,0.91,0.81,0.68,0.52,0.33,0.14,-0.06,-0.26,-0.44,-0.61,-0.76,-0.87,-0.95,-0.99,-1,-0.96,-0.88,-0.77,-0.63,-0.46,-0.28,-0.08,0.12,0.31,0.49,0.66,0.79,0.9,0.97,1,0.99,0.94,0.85,0.73,0.58,0.41,0.22,0.02,-0.17,-0.37,-0.54,-0.7,-0.83,-0.92,-0.98,-1,-0.98,-0.92,-0.82,-0.69,-0.54,-0.36,-0.17,0.03,0.23,0.42,0.59,0.74}; +List Chirp = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.93,0.27,-0.59,-1,-0.71,0.05,0.75,1,0.67,0,-0.67,-0.99,-0.85,-0.34,0.31,0.81,1,0.82,0.35,-0.22,-0.71,-0.98,-0.95,-0.66,-0.2,0.31,0.72,0.96,0.98,0.78,0.43,-0.01,-0.43,-0.77,-0.96,-0.99,-0.85,-0.58,-0.23,0.16,0.51,0.79,0.95,1,0.92,0.73,0.47,0.15,-0.17,-0.47,-0.72,-0.9,-0.99,-0.99,-0.9,-0.74,-0.52,-0.26,0.01,0.28,0.53,0.73,0.88,0.97,1,0.97}; +List White = new() {-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0.03,-0.4,-0.47,0.19,-0.4,-0.23,0.31,0.41,0.19,0.16,-0.5,-0.31,-0.21,0.25,0.18,-0.48,-0.1,0.38,0.29,-0.38,-0.08,-0.21,0.34,0.01,-0.46,0.28,-0.48,0.11,0.02,-0.37,0.19,-0.2,0.1,0.24,0.08,-0.22,-0.12,0.15,0.36,-0.43,-0.03,-0.32,0.45,-0.5,-0.04,-0.04,-0.08,-0.18,0.13,-0.33,-0.19,0.36,-0.39,0.2,-0.31,0.28,-0.13,-0.07,-0.29,0.37,0.03,-0.25,-0.06,-0.3,-0.08,-0.09}; +List Gauss = new() {-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0,0.03,0.11,-0.1,-0.43,-0.08,0.36,-0.04,-0.04,-0.21,-0.3,0.26,0.2,0.28,0.2,0.27,-0.01,-0.1,-0.23,-0.13,-0.41,-0.23,-0.07,-0.21,0.32,-0.18,-0.48,0.3,0.46,-0.2,0.52,-0.81,-0.25,-0.21,-0.12,-0.18,0.18,0.52,0.29,0.44,0.18,-1.2,0.38,0.24,0.06,0.28,0.34,0.3,-0.13,0.19,-0.5,0.59,-0.36,0.22,-0.23,0.24,0.39,0.13,-0.33,-0.57,-0.23,0.49,-0.13,0.76,0.59,0.61}; +List B = new() {-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0,-0.28,0.41,-0.54,0.65,-0.75,0.84,-0.91,0.96,-0.99,1,-0.99,0.96,-0.92,0.85,-0.77,0.67,-0.56,0.44,-0.3,0.17,-0.03,-0.11,0.25,-0.39,0.51,-0.63,0.73,-0.82,0.89,-0.95,0.98,-1,0.99,-0.97,0.93,-0.86,0.78,-0.69,0.58,-0.46,0.33,-0.19,0.05,0.09,-0.23,0.36,-0.49,0.61,-0.71,0.81,-0.88,0.94,-0.98,1,-1,0.98,-0.94,0.88,-0.8,0.71,-0.6,0.48,-0.35,0.22,-0.08,-0.06}; +List HF = new() {-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,0,0.14,-0.76,-0.96,-0.28,0.66,0.99,0.41,-0.54,-1,-0.54,0.42,0.99,0.65,-0.29,-0.96,-0.75,0.15,0.91,0.84,-0.01,-0.85,-0.91,-0.13,0.76,0.96,0.27,-0.66,-0.99,-0.4,0.55,1,0.53,-0.43,-0.99,-0.64,0.3,0.96,0.75,-0.16,-0.92,-0.83,0.02,0.85,0.9,0.12,-0.77,-0.95,-0.26,0.67,0.99,0.4,-0.56,-1,-0.52,0.44,0.99,0.64,-0.3,-0.97,-0.74,0.17,0.92,0.83,-0.03,-0.86}; +List ImpulseHF = new() {-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.05,-0.25,-0.32,-0.09,0.22,0.33,0.14,-0.18,-0.33,-0.18,0.14,0.33,0.22,-0.1,-0.32,-0.25,0.05,0.3,0.28,0,-0.28,-0.3,-0.04,0.25,0.32,0.09,-0.22,-0.33,-0.13,0.18,0.33,0.18,0.86,0.67,0.79,1.1,1.32,1.25,0.95,0.69,0.72,1.01,1.28,1.3,1.04,0.74,0.68,0.91,1.22,1.33,1.13,0.81,0.67,0.83,1.15,1.33,1.21,0.9,0.68,0.75,1.06,1.31,1.28,0.99,0.71}; +List SawtoothHF = new() {-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,2.7,-0.8,-0.8,3.6,9.3,11.95,10.05,6.3,5,8.3,14.1,17.95,17.25,13.55,11.2,13.25,18.75,23.55,24.2,20.95,17.75,18.45,23.35,28.8,30.8,28.35,24.7,24.05,28,33.75,37,35.65,31.85,28.05,-3.2,1.5,4.8,3.75,-0.8,-4.6,-4.15,0.1,4.25,4.5,0.6,-3.85,-4.75,-1.3,3.35,4.95,2,-2.8,-5,-2.6,2.2,4.95,3.2,-1.5,-4.85,-3.7,0.85,4.6,4.15,-0.15,-4.3}; +List SineG = new() {-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.59,0.83,0.74,0.5,0.91,1.36,0.93,0.87,0.6,0.38,0.78,0.53,0.42,0.14,0.01,-0.45,-0.71,-0.99,-1,-1.36,-1.22,-1.07,-1.17,-0.56,-0.95,-1.11,-0.16,0.18,-0.28,0.64,-0.5,0.24,0.45,0.67,0.72,1.15,1.52,1.28,1.38,1.03,-0.47,0.96,0.65,0.28,0.3,0.17,-0.07,-0.67,-0.51,-1.33,-0.33,-1.34,-0.78,-1.21,-0.68,-0.43,-0.56,-0.87,-0.93,-0.4,0.52,0.1,1.18,1.18,1.35}; +List ChirpG = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1.3,0.3,-0.48,-1.1,-1.14,-0.03,1.11,0.96,0.63,-0.21,-0.97,-0.73,-0.65,-0.06,0.51,1.08,0.99,0.72,0.12,-0.35,-1.12,-1.21,-1.02,-0.87,0.12,0.13,0.24,1.26,1.44,0.58,0.95,-0.82,-0.68,-0.98,-1.08,-1.17,-0.67,-0.06,0.06,0.6,0.69,-0.41,1.33,1.24,0.98,1.01,0.81,0.45,-0.3,-0.28,-1.22,-0.31,-1.35,-0.77,-1.13,-0.5,-0.13,-0.13,-0.32,-0.29,0.3,1.22,0.75,1.73,1.59,1.58}; +List Complex = new() {175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.44,176.27,176.04,176.99,175.49,175.68,174.34,176.4,174.05,174.4,174.2,176.16,175,177.72,174.33,176.96,174.62,174.76,170.9,171.12,171.05,170.01,169.24,172.64,171.96,175.72,174.16,175.81,177.3,178.38,176.75,177.19,175.55,178.49,176.52,178.45,178.04,178.25,177.8,176.97,172.94,174.92,173.98,172.29,171.19,172.54,172.11,175.32,175.63,176.65,173.8,176.04,172.74,175.24,171.84,171.54,172.17,171.85,172.38,170.78,173.49,173.69,171.71,174.38,173.99,174.83}; +List Market = new() {68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,67.75,67.75,72.75,74.75,72.25,71.25,71.75,72.75,77.75,76,76,76,74.75,75.5,74.75,73.75,74,74.75,72.25,72.5,72.25,74.5,74.75,75.75,75.75,75.75,74.25,73.75,74.75,72,71.75,72.5,72.25,71,72,71.75,71.75,73.25,72.5,73.75,74,76.75,75.75,75,75.75,74.5,74.25,73.5,71.75,70.5,69,70.5,70,68.75,67.25,68.5,70.75,70,70.5,68.25,68.25,68.25,63.75,64.25}; + +#!csharp + +TSeries data = new(); + +// change these two values - the period and the type of observed indicator +// currently available indicators are: DEMA_Series, EMA_Series, HEMA_Series, HMA_Series, JMA_Series, RMA_Series, SMA_Series, TEMA_Series, WMA_Series and ZLEMA_Series +int Period = 20; +HMA_Series indicator=new(source: data, period: Period); + +//On charts below, blue line is the data input, the green line is a JMA reference + +#!csharp + +var series = Spike; +ZLEMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Spike"); +chart + +#!csharp + +var series = Impulse; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Impulse"); +chart + +#!csharp + +var series = Triangle; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x, series, false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Triangle"); +chart + +#!csharp + +var series = Sawtooth; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Sawtooth"); +chart + +#!csharp + +var series = Sine; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Sine"); +chart + +#!csharp + +var series = Chirp; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Chirp"); +chart + +#!csharp + +var series = White; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("White"); +chart + +#!csharp + +var series = Gauss; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Gauss"); +chart + +#!csharp + +var series = B; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("B"); +chart + +#!csharp + +var series = HF; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("HF"); +chart + +#!csharp + +var series = ImpulseHF; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("ImpulseHF"); +chart + +#!csharp + +var series = SawtoothHF; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("SawtoothHF"); +chart + +#!csharp + +var series = SineG; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("SineG"); +chart + +#!csharp + +var series = ChirpG; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("ChirpG"); +chart + +#!csharp + +var series = Complex; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Complex"); +chart + +#!csharp + +var series = Market; +data = new(); +indicator=new(source: data, period: Period); +JMA_Series reference = new(source: data, period: Period); +for (int i=0; i(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue")); +GenericChart.GenericChart ch2 = Chart2D.Chart.Line(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red")); +GenericChart.GenericChart ch3 = Chart2D.Chart.Line(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green")); +var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle("Maket"); +chart diff --git a/Docs/macd_example.ipynb b/Docs/macd_example.ipynb new file mode 100644 index 00000000..c8667082 --- /dev/null +++ b/Docs/macd_example.ipynb @@ -0,0 +1,159 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
Installed Packages
  • Plotly.NET, 2.0.0-preview.18
  • Plotly.NET.Interactive, 2.0.0-preview.18
  • QuantLib, 1.0.8
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Loading extensions from `Plotly.NET.Interactive.dll`" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// This is .NET Interactive Notebook. It can run in VS.Code with .NET interactive extension installed\n", + "\n", + "#r \"nuget: Plotly.NET, 2.0.0-preview.18\"\n", + "#r \"nuget: Plotly.NET.Interactive, 2.0.0-preview.18\"\n", + "#r \"nuget: QuanTAlib\"\n", + "\n", + "using Plotly.NET;\n", + "using Plotly.NET.LayoutObjects;\n", + "using QuanTAlib;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
265
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "// defining the MACD model through clasess that connect to each other with Events\n", + "\n", + "YAHOO_Feed tsla = new(380, \"TSLA\");\n", + "TSeries close = tsla.Close; // close will get data from YAHOO tsla feed\n", + "EMA_Series slow = new(close,26); // slow gets data from slow through pub-sub eventing\n", + "EMA_Series fast = new(close,12); // fast gets data from slow (via eventing)\n", + "SUB_Series macd = new(fast,slow); // macd is a SUBtraction of fast-slow\n", + "EMA_Series signal = new(macd,9); // signal is EMA of macd\n", + "SUB_Series histogram = new(macd, signal); // histogran is SUBtraction macd-signal\n", + "\n", + "slow.Count" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "vscode": { + "languageId": "dotnet-interactive.csharp" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "//this is just a visualization of MACD using the (preview of) Plotly.NET\n", + "\n", + "var candles = Chart2D.Chart.Candlestick(tsla.Open.v, tsla.High.v, tsla.Low.v, tsla.Close.v, tsla.Open.t, \"candles\");\n", + "var ch1 = Chart2D.Chart.Line(macd.t,macd.v,false,\"macd\").WithLineStyle(Width: 2, Color: Color.fromString(\"red\"));\n", + "var ch2 = Chart2D.Chart.Line(signal.t,signal.v,false,\"signal\").WithLineStyle(Width: 1.5, Color: Color.fromString(\"green\"));\n", + "//GenericChart.GenericChart hist = Chart2D.Chart.Column(histogram.t,histogram.v).WithLineStyle(Width: 1.5, Color: Color.fromString(\"green\"));\n", + "\n", + "var chart = Chart.Combine(new []{candles,ch1,ch2}).WithSize(1200,400).WithMargin(Margin.init(1,1,60,1,1,false)).WithTitle(\"MACD using EMA\");\n", + "\n", + "chart" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".NET (C#)", + "language": "C#", + "name": ".net-csharp" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/x-csharp", + "name": "C#", + "pygments_lexer": "csharp", + "version": "9.0" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Docs/readme.md b/Docs/readme.md new file mode 100644 index 00000000..d4cc156f --- /dev/null +++ b/Docs/readme.md @@ -0,0 +1,36 @@ +# QuanTAlib - quantitative technical indicators for Quantower and other C#-based trading platorms + +![GitHub last commit](https://img.shields.io/github/last-commit/mihakralj/QuanTAlib) +[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=mihakralj_QuanTAlib&metric=ncloc)](https://sonarcloud.io/summary/overall?id=mihakralj_QuanTAlib) +[![Codacy grade](https://img.shields.io/codacy/grade/b1f9109222234c87bce45f1fd4c63aee)](https://app.codacy.com/gh/mihakralj/QuanTAlib/dashboard) +[![codecov](https://codecov.io/gh/mihakralj/QuanTAlib/branch/main/graph/badge.svg?style=flat-square&token=YNMJRGKMTJ)](https://codecov.io/gh/mihakralj/QuanTAlib) +[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=mihakralj_QuanTAlib&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=mihakralj_QuanTAlib) + +[![Nuget](https://img.shields.io/nuget/v/QuanTAlib)](https://www.nuget.org/packages/QuanTAlib/) +[![Nuget](https://img.shields.io/nuget/dt/QuanTAlib)](https://www.nuget.org/packages/QuanTAlib/) +[![GitHub watchers](https://img.shields.io/github/watchers/mihakralj/QuanTAlib)](https://github.com/mihakralj/QuanTAlib/watchers) + +[![.NET7.0](https://img.shields.io/badge/.NET-7.0-yellow)](https://dotnet.microsoft.com/en-us/download/dotnet/7.0) +[![.NET6.0](https://img.shields.io/badge/.NET-6.0-blue)](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) +[![.NET4.8](https://img.shields.io/badge/.NET-4.8-blue)](https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48) +[![GitHub license](https://img.shields.io/github/license/mihakralj/QuanTAlib)](Docs/LICENSE) + +Quantitative TA Library (**QuanTAlib**) is an easy-to-use C# library for quantitative technical analysis with base algorithms, charts, signals and strategies useful for trading securities with [Quantower](https://www.quantower.com/) and other C#-based trading platforms. + +**QuanTAlib** is written with some specific design criteria in mind - this is a list of reasons why there is '_yet another C# TA library_': + +- Written in native C# - no code conversion from TA-LIB or other imported/converted TA libraries +- No usage of Decimal datatypes, LINQ, interface abstractions, or static classes (all for performance reasons) +- Supports both **historical data analysis** (working on bulk of historical arrays) and **real-time analysis** (adding one data item at the time without the need to re-calculate the whole history) +- Separation of calculations (**algos**) and visualizations (**charts**) +- Handle early data right - no hiding of poor calculations with NaN values (unless explicitly requested), data is as valid as mathematically possible from the first value +- Preservation of time-value integrity of each data throughout the calculation chain (each data point has a timestamp) +- Usage of events - each data series is an event publisher, each indicator is a subscriber - this allows seamless data flow between indicators without the need of plumbing (see [MACD example](https://github.com/mihakralj/QuanTAlib/blob/main/Docs/macd_example.ipynb) to understand how events allow chaining of indicators) + +QuanTAlib does not provide OHLCV quotes - but it can easily connect to any data feeds. There are some data feed classess +available (**RND_Feed** for random OHLCV, **YAHOO_Feed** for Yahoo Finance daily stock data) + +See [Getting Started](https://github.com/mihakralj/QuanTAlib/blob/main/Docs/getting_started.ipynb) .NET interactive notebook to get a feel how library works. Developers can use QuanTAlib in .NET interactive or in console apps, but the best +usage of the library is withing C#-enabled trading platforms - see **QuanTower_Charts** folder for Quantower examples. + +[**List of available and planned indicators**](https://github.com/mihakralj/QuanTAlib/blob/main/Docs/coverage.md). **So. Much. To. Do...** diff --git a/QuanTAlib.sln b/QuanTAlib.sln new file mode 100644 index 00000000..9704e0a0 --- /dev/null +++ b/QuanTAlib.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32210.308 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Tests\Tests.csproj", "{283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "QuanTAlib", "Source\QuanTAlib.csproj", "{AAE21F8A-9BC2-4647-A9EB-4DC86C569080}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{3AA87FFE-4EEE-4C1B-82E0-2A5E40E2254D}" + ProjectSection(SolutionItems) = preProject + Docs\bars_and_HMA.dib = Docs\bars_and_HMA.dib + Docs\Comparing_w_TALIB.ipynb = Docs\Comparing_w_TALIB.ipynb + Docs\getting_started.ipynb = Docs\getting_started.ipynb + Docs\Indicators.md = Docs\Indicators.md + Docs\LICENSE = Docs\LICENSE + Docs\ma-comparison.dib = Docs\ma-comparison.dib + Docs\macd_example.ipynb = Docs\macd_example.ipynb + Docs\QuanTAlib_Indicators.dib = Docs\QuanTAlib_Indicators.dib + Docs\QuanTAlib_test.ipynb = Docs\QuanTAlib_test.ipynb + Docs\README.md = Docs\README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{8D8CD223-7A8C-46C4-A326-58E0B735FBA4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quantower", "Quantower\Quantower.csproj", "{5096AEA1-81BC-46E7-9F2B-B408AFAA850C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Debug|Any CPU.Build.0 = Debug|x64 + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Debug|x64.ActiveCfg = Debug|x64 + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Debug|x64.Build.0 = Debug|x64 + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Release|Any CPU.Build.0 = Release|Any CPU + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Release|x64.ActiveCfg = Release|x64 + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D}.Release|x64.Build.0 = Release|x64 + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Debug|Any CPU.Build.0 = Release|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Debug|x64.ActiveCfg = Debug|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Debug|x64.Build.0 = Debug|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Release|Any CPU.Build.0 = Release|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Release|x64.ActiveCfg = Release|Any CPU + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Release|x64.Build.0 = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Debug|Any CPU.Build.0 = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Debug|x64.ActiveCfg = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Debug|x64.Build.0 = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Release|Any CPU.Build.0 = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Release|x64.ActiveCfg = Release|Any CPU + {5096AEA1-81BC-46E7-9F2B-B408AFAA850C}.Release|x64.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {283EACC9-3AF6-4DAE-9C1C-0F7F8C8CD70D} = {8D8CD223-7A8C-46C4-A326-58E0B735FBA4} + {AAE21F8A-9BC2-4647-A9EB-4DC86C569080} = {8D8CD223-7A8C-46C4-A326-58E0B735FBA4} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E5592DC2-0542-45B2-A0CF-C6B1EDC72B87} + EndGlobalSection +EndGlobal diff --git a/Quantower/ADD_Series.cs b/Quantower/ADD_Series.cs new file mode 100644 index 00000000..cd11e250 --- /dev/null +++ b/Quantower/ADD_Series.cs @@ -0,0 +1,114 @@ +// ADD - adding TSeries+TSeries together, or TSeries+double, or double+TSeries +using System; +namespace QuantLib; + +public class ADD_Series : TSeries +{ + readonly TSeries _d1; + readonly TSeries _d2; + readonly double _dd; + readonly byte _type; + + public ADD_Series(TSeries d1, TSeries d2) + { + this._d1 = d1; + this._d2 = d2; + this._dd = 0; + this._type = 1; + d1.Pub += this.Sub; + d2.Pub += this.Sub; + if (d1.Count > 0 && d2.Count > 0) + { + for (int i = 0; i < Math.Min(d1.Count, d2.Count); i++) + { + this.Add(d1[i], d2[i], false); + } + } + } + + public ADD_Series(TSeries d1, double dd) + { + this._d1 = d1; + this._d2 = null; + this._dd = dd; + this._type = 2; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(d1[i], dd, false); + } + } + } + + public ADD_Series(double dd, TSeries d1) + { + this._d1 = d1; + this._d2 = null; + this._dd = dd; + this._type = 3; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(d1[i], dd, false); + } + } + } + + public void Add((System.DateTime t, double v) d1, + (System.DateTime t, double v) d2, bool update = false) + { + (System.DateTime t, double v) result = + ((d1.t > d2.t) ? d1.t : d2.t, d1.v + d2.v); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add((System.DateTime t, double v) d1, double dd, + bool update = false) + { + (System.DateTime t, double v) result = (d1.t, d1.v + dd); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add(double dd, (System.DateTime t, double v) d1, bool update = false) => this.Add(d1, dd, update); + + public void Add(bool update = false) + { + if (update || (this._d1.Count > 0 && this._d1.Count == this._d2.Count && + this.Count != this._d1.Count)) + { + if (this._type == 1) + { + this.Add(this._d1[this._d1.Count - 1], this._d2[this._d2.Count - 1], + update); + } + else if (this._type == 2) + { + this.Add(this._d1[this._d1.Count - 1], this._dd, update); + } + else + { + this.Add(this._dd, this._d1[this._d1.Count - 1], update); + } + } + } + + public new void Sub(object source, TSeriesEventArgs e) => this.Add(e.update); +} diff --git a/Quantower/Abstract_Indicators.cs b/Quantower/Abstract_Indicators.cs new file mode 100644 index 00000000..aae161ab --- /dev/null +++ b/Quantower/Abstract_Indicators.cs @@ -0,0 +1,42 @@ +namespace QuantLib; +using System; + +public abstract class Single_TSeries_Indicator : TSeries +{ + protected readonly int _p; + protected readonly bool _NaN; + protected readonly TSeries _data; + + // Default Constructor + protected Single_TSeries_Indicator(TSeries source, int period, bool useNaN) + { + this._data = source; + this._p = period; + this._NaN = useNaN; + this._data.Pub += this.Sub; + } + + // overridable Add() method for the whole series (should be replaced with faster algo than default) + public virtual void Add(TSeries data) + { + for (int i = 0; i < data.Count; i++) + { + this.Add(data[i], false); + } + } + + // overridable Add() method to add/update a single value at the end of the list + public virtual new void Add((System.DateTime t, double v) tuple, bool update) => base.Add(tuple, update); + + // Add() without update parameter assumes this is an insert of new data (update=false) + public new void Add((System.DateTime t, double v) d) => this.Add(d, update: false); + + // Add() without a tuple assumes add/update using the last item in the source as new data + public void Add(bool update) => this.Add(this._data[this._data.Count - 1], update); + + // Add() without any parameters assumes this is an insert of new data using the last item in the source + public void Add() => this.Add(this._data[this._data.Count - 1], update: false); + + // When event is triggered, call Add(bool update) + public new void Sub(object source, TSeriesEventArgs e) => this.Add(this._data[this._data.Count - 1], e.update); +} \ No newline at end of file diff --git a/Quantower/DIV_Series.cs b/Quantower/DIV_Series.cs new file mode 100644 index 00000000..95b6fcd2 --- /dev/null +++ b/Quantower/DIV_Series.cs @@ -0,0 +1,125 @@ +// DIV - divide TSeries/TSeries , or TSeries/double, or double/TSeries +using System; +namespace QuantLib; + +public class DIV_Series : TSeries +{ + readonly TSeries _d1, _d2; + readonly double _dd; + readonly byte _type; + + public DIV_Series(TSeries d1, TSeries d2) + { + this._d1 = d1; + this._d2 = d2; + this._type = 1; + d1.Pub += this.Sub; + d2.Pub += this.Sub; + if (d1.Count > 0 && d2.Count > 0) + { + for (int i = 0; i < Math.Min(d1.Count, d2.Count); i++) + { + this.Add(d1[i], d2[i], false); + } + } + } + + public DIV_Series(TSeries d1, double dd) + { + this._d1 = d1; + this._d2 = d1; + this._dd = dd; + this._type = 2; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(d1[i], dd, false); + } + } + } + + public DIV_Series(double dd, TSeries d1) + { + this._d1 = d1; + this._d2 = d1; + this._dd = dd; + this._type = 3; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(dd, d1[i], false); + } + } + } + + public void Add((System.DateTime t, double v) d1, + (System.DateTime t, double v) d2, bool update = false) + { + (System.DateTime t, double v) result = + ((d1.t > d2.t) ? d1.t : d2.t, + (d2.v > double.Epsilon) ? d1.v / d2.v : double.PositiveInfinity); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add((System.DateTime t, double v) d1, double dd, + bool update = false) + { + (System.DateTime t, double v) result = + (d1.t, (dd > double.Epsilon) ? d1.v / dd : double.PositiveInfinity); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + public void Add(double dd, (System.DateTime t, double v) d1, + bool update = false) + { + (System.DateTime t, double v) result = + (d1.t, (d1.v > double.Epsilon) ? dd / d1.v : double.PositiveInfinity); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + public void Add(bool update = false) + { + if (update || (this._d1.Count > 0 && this._d1.Count == this._d2.Count && + this.Count != this._d1.Count)) + { + if (this._type == 1) + { + this.Add(this._d1[this._d1.Count - 1], this._d2[this._d2.Count - 1], + update); + } + else if (this._type == 2) + { + this.Add(this._d1[this._d1.Count - 1], this._dd, update); + } + else + { + this.Add(this._dd, this._d1[this._d1.Count - 1], update); + } + } + } + + public new void Sub(object source, TSeriesEventArgs e) { this.Add(e.update); } +} \ No newline at end of file diff --git a/Quantower/Indicators/BIAS_chart.cs b/Quantower/Indicators/BIAS_chart.cs new file mode 100644 index 00000000..9d1adadb --- /dev/null +++ b/Quantower/Indicators/BIAS_chart.cs @@ -0,0 +1,55 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class BIAS_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 1; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private BIAS_Series indicator; + /////// + + public BIAS_chart() + { + this.SeparateWindow = true; + this.Name = "BIAS - Rate of change"; + this.Description = "Bias description"; + this.AddLineSeries("BIAS", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "BIAS (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = + new(source: bars.Select(this.DataSource), period: this.Period); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/DEMA_chart.cs b/Quantower/Indicators/DEMA_chart.cs new file mode 100644 index 00000000..ebca279a --- /dev/null +++ b/Quantower/Indicators/DEMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class DEMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private DEMA_Series indicator; + /////// + + public DEMA_chart() + { + this.SeparateWindow = false; + this.Name = "DEMA - Double Exponential Moving Average"; + this.Description = "Double Exponential Moving Average description"; + this.AddLineSeries("DEMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "DEMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/EMA_chart.cs b/Quantower/Indicators/EMA_chart.cs new file mode 100644 index 00000000..2dcbe4bd --- /dev/null +++ b/Quantower/Indicators/EMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class EMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private EMA_Series indicator; + /////// + + public EMA_chart() + { + this.SeparateWindow = false; + this.Name = "EMA - Exponential Moving Average"; + this.Description = "Exponential Moving Average description"; + this.AddLineSeries("EMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "EMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/ENTP_chart.cs b/Quantower/Indicators/ENTP_chart.cs new file mode 100644 index 00000000..d7e49cb3 --- /dev/null +++ b/Quantower/Indicators/ENTP_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class ENTP_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 5; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private ENTP_Series indicator; + /////// + + public ENTP_chart() + { + this.SeparateWindow = true; + this.Name = "ENTP - Entropy (Unpredictability)"; + this.Description = "Entropy description"; + this.AddLineSeries("ENTROPY", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "ENTP (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/HEMA_chart.cs b/Quantower/Indicators/HEMA_chart.cs new file mode 100644 index 00000000..47b4d369 --- /dev/null +++ b/Quantower/Indicators/HEMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class HEMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private HEMA_Series indicator; + /////// + + public HEMA_chart() + { + this.SeparateWindow = false; + this.Name = "HEMA - Hull-EMA Moving Average"; + this.Description = "Hull-EMA Moving Average description"; + this.AddLineSeries("HEMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "HEMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/HMA_chart.cs b/Quantower/Indicators/HMA_chart.cs new file mode 100644 index 00000000..39aa660d --- /dev/null +++ b/Quantower/Indicators/HMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class HMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private HMA_Series indicator; + /////// + + public HMA_chart() + { + this.SeparateWindow = false; + this.Name = "HMA - Hull Moving Average"; + this.Description = "Hull Moving Average description"; + this.AddLineSeries("HMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "HMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/JMA_chart.cs b/Quantower/Indicators/JMA_chart.cs new file mode 100644 index 00000000..92d811f6 --- /dev/null +++ b/Quantower/Indicators/JMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class JMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private JMA_Series indicator; + /////// + + public JMA_chart() + { + this.SeparateWindow = false; + this.Name = "JMA - Jurik Moving Average"; + this.Description = "Jurik Moving Average description"; + this.AddLineSeries("JMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "JMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/KURT_chart.cs b/Quantower/Indicators/KURT_chart.cs new file mode 100644 index 00000000..aae895d5 --- /dev/null +++ b/Quantower/Indicators/KURT_chart.cs @@ -0,0 +1,55 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class KURT_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 40; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private KURT_Series indicator; + /////// + + public KURT_chart() + { + this.SeparateWindow = true; + this.Name = "KURT - Kurtosis (Flatness)"; + this.Description = "Kurtosis description"; + this.AddLineSeries("KURTOSIS", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "KURT (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/MAD_chart.cs b/Quantower/Indicators/MAD_chart.cs new file mode 100644 index 00000000..668c22c7 --- /dev/null +++ b/Quantower/Indicators/MAD_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class MAD_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private MAD_Series indicator; + /////// + + public MAD_chart() + { + this.SeparateWindow = true; + this.Name = "MAD - Mean Absolute Deviation"; + this.Description = "MAD description"; + this.AddLineSeries("MAD", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "MAD (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/MAPE_chart.cs b/Quantower/Indicators/MAPE_chart.cs new file mode 100644 index 00000000..2c891dab --- /dev/null +++ b/Quantower/Indicators/MAPE_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class MAPE_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + ///////dotnet + private MAPE_Series indicator; + /////// + + public MAPE_chart() + { + this.SeparateWindow = true; + this.Name = "MAPE - Mean Absolute Percentage Error"; + this.Description = "MAPE description"; + this.AddLineSeries("MAPE", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "MAPE (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/MAX_chart.cs b/Quantower/Indicators/MAX_chart.cs new file mode 100644 index 00000000..c1cbc2c6 --- /dev/null +++ b/Quantower/Indicators/MAX_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class MAX_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 1; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private MAX_Series indicator; + /////// + + public MAX_chart() + { + this.SeparateWindow = false; + this.Name = "MAX - Moving Maximum"; + this.Description = "Moving Maximum description"; + this.AddLineSeries("MAX", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "MAX (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = + new(source: bars.Select(this.DataSource), period: this.Period); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/MED_chart.cs b/Quantower/Indicators/MED_chart.cs new file mode 100644 index 00000000..b692a879 --- /dev/null +++ b/Quantower/Indicators/MED_chart.cs @@ -0,0 +1,54 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class MED_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private MED_Series indicator; + /////// + + public MED_chart() + { + this.SeparateWindow = false; + this.Name = "MED - Moving Median"; + this.Description = "Moving Median description"; + this.AddLineSeries("MED", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "MED (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = + new(source: bars.Select(this.DataSource), period: this.Period); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/MIN_chart.cs b/Quantower/Indicators/MIN_chart.cs new file mode 100644 index 00000000..9ee0458d --- /dev/null +++ b/Quantower/Indicators/MIN_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class MIN_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 2; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private MIN_Series indicator; + /////// + + public MIN_chart() + { + this.SeparateWindow = false; + this.Name = "MIN - Moving Minimum"; + this.Description = "Moving Minimum description"; + this.AddLineSeries("MIN", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "MIN (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = + new(source: bars.Select(this.DataSource), period: this.Period); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/MSE_chart.cs b/Quantower/Indicators/MSE_chart.cs new file mode 100644 index 00000000..2bce6b72 --- /dev/null +++ b/Quantower/Indicators/MSE_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class MSE_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private MSE_Series indicator; + /////// + + public MSE_chart() + { + this.SeparateWindow = true; + this.Name = "MSE = Mean Square Error"; + this.Description = "MSE description"; + this.AddLineSeries("MSE", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "MSE (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/PSDEV_chart.cs b/Quantower/Indicators/PSDEV_chart.cs new file mode 100644 index 00000000..5cb89173 --- /dev/null +++ b/Quantower/Indicators/PSDEV_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class PSDEV_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + ///////dotnet + private PSDEV_Series indicator; + /////// + + public PSDEV_chart() + { + this.SeparateWindow = true; + this.Name = "PSDEV - Population Standard Deviation (Biased)"; + this.Description = "PSDEV description"; + this.AddLineSeries("PSDEV", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "PSDEV (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/PVAR_chart.cs b/Quantower/Indicators/PVAR_chart.cs new file mode 100644 index 00000000..20416403 --- /dev/null +++ b/Quantower/Indicators/PVAR_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class PVAR_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + ///////dotnet + private PVAR_Series indicator; + /////// + + public PVAR_chart() + { + this.SeparateWindow = true; + this.Name = "PVAR - Population Variance (Biased)"; + this.Description = "PVAR description"; + this.AddLineSeries("PVAR", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "PVAR (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/RMA_chart.cs b/Quantower/Indicators/RMA_chart.cs new file mode 100644 index 00000000..77f72ba6 --- /dev/null +++ b/Quantower/Indicators/RMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class RMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private RMA_Series indicator; + /////// + + public RMA_chart() + { + this.SeparateWindow = false; + this.Name = "RMA - WildeR Moving Average"; + this.Description = "WildeR Moving Average description"; + this.AddLineSeries("RMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "RMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/SDEV_chart.cs b/Quantower/Indicators/SDEV_chart.cs new file mode 100644 index 00000000..1f528dc9 --- /dev/null +++ b/Quantower/Indicators/SDEV_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class SDEV_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + ///////dotnet + private SDEV_Series indicator; + /////// + + public SDEV_chart() + { + this.SeparateWindow = true; + this.Name = "SDEV - Sample Standard Deviation (Unbiased)"; + this.Description = "SDEV description"; + this.AddLineSeries("SDEV", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "SDEV (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/SMAPE_chart.cs b/Quantower/Indicators/SMAPE_chart.cs new file mode 100644 index 00000000..298226f0 --- /dev/null +++ b/Quantower/Indicators/SMAPE_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class SMAPE_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + ///////dotnet + private SMAPE_Series indicator; + /////// + + public SMAPE_chart() + { + this.SeparateWindow = true; + this.Name = "SMAPE - Symmetric Mean Absolute Percentage Error"; + this.Description = "SMAPE description"; + this.AddLineSeries("SMAPE", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "SMAPE (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/SMA_chart.cs b/Quantower/Indicators/SMA_chart.cs new file mode 100644 index 00000000..baf01aca --- /dev/null +++ b/Quantower/Indicators/SMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class SMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private SMA_Series indicator; + /////// + + public SMA_chart() + { + this.SeparateWindow = false; + this.Name = "SMA - Simple Moving Average"; + this.Description = "Simple Moving Average description"; + this.AddLineSeries("SMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "SMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/TEMA_chart.cs b/Quantower/Indicators/TEMA_chart.cs new file mode 100644 index 00000000..f80261c6 --- /dev/null +++ b/Quantower/Indicators/TEMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class TEMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private TEMA_Series indicator; + /////// + + public TEMA_chart() + { + this.SeparateWindow = false; + this.Name = "TEMA - Triple Exponential Moving Average"; + this.Description = "Triple Exponential Moving Average description"; + this.AddLineSeries("TEMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "TEMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/VAR_chart.cs b/Quantower/Indicators/VAR_chart.cs new file mode 100644 index 00000000..3af3ff87 --- /dev/null +++ b/Quantower/Indicators/VAR_chart.cs @@ -0,0 +1,57 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class VAR_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 8; + + #endregion Parameters + + private readonly TBars bars = new(); + + ///////dotnet + private VAR_Series indicator; + /////// + + public VAR_chart() + { + this.SeparateWindow = true; + this.Name = "VAR - Sample Variance (Unbiased)"; + this.Description = "VAR description"; + this.AddLineSeries("VAR", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "VAR (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + this.SetValue(result, 0); + } +} diff --git a/Quantower/Indicators/WMAPE_chart.cs b/Quantower/Indicators/WMAPE_chart.cs new file mode 100644 index 00000000..321a6d12 --- /dev/null +++ b/Quantower/Indicators/WMAPE_chart.cs @@ -0,0 +1,68 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; + +public class WMAPE_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[]{ + "Open", 0, + "High", 1, + "Low", 2, + "Close", 3, + "HL2", 4, + "OC2", 5, + "OHL3", 6, + "HLC3", 7, + "OHLC4", 8, + "Weighted (HLCC4)", 9 + })] + private int DataSource = 8; + + #endregion Parameters + + private readonly QuanTAlib.TBars bars = new(); + + ///////dotnet + private QuanTAlib.WMAPE_Series indicator; + /////// + + public WMAPE_chart() + { + this.SeparateWindow = true; + this.Name = "WMAPE - Weighted Mean Absolute Percentage Error"; + this.Description = "WMAPE description"; + this.AddLineSeries("WMAPE", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = "WMAPE (" + QuantLib.TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), period: this.Period, useNaN: true); + } + + protected void OnNewData(bool update = false) + { + this.indicator.Add(update); + + } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), this.GetPrice(PriceType.Close), this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + + + this.SetValue(result, 0); + + + + + } +} diff --git a/Quantower/Indicators/WMA_chart.cs b/Quantower/Indicators/WMA_chart.cs new file mode 100644 index 00000000..e40bad95 --- /dev/null +++ b/Quantower/Indicators/WMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class WMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private WMA_Series indicator; + /////// + + public WMA_chart() + { + this.SeparateWindow = false; + this.Name = "WMA - Weighted Moving Average"; + this.Description = "Weighted Moving Average description"; + this.AddLineSeries("WMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "WMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/Indicators/ZLEMA_chart.cs b/Quantower/Indicators/ZLEMA_chart.cs new file mode 100644 index 00000000..f9f7e4c8 --- /dev/null +++ b/Quantower/Indicators/ZLEMA_chart.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using TradingPlatform.BusinessLayer; +namespace QuanTAlib; + +public class ZLEMA_chart : Indicator +{ + #region Parameters + + [InputParameter("Smoothing period", 0, 1, 999, 1, 1)] + private int Period = 10; + + [InputParameter("Data source", 1, variants: new object[] + { "Open", 0, "High", 1, "Low", 2, "Close", 3, "HL2", 4, "OC2", 5, + "OHL3", 6, "HLC3", 7, "OHLC4", 8, "Weighted (HLCC4)", 9 })] + private int DataSource = 3; + + #endregion Parameters + + private readonly TBars bars = new(); + + /////// + private ZLEMA_Series indicator; + /////// + + public ZLEMA_chart() + { + this.SeparateWindow = false; + this.Name = "ZLEMA - Zero-lag Exponential Moving Average"; + this.Description = "Zero-Lag Exponential Moving Average description"; + this.AddLineSeries("ZLEMA", Color.RoyalBlue, 3, LineStyle.Solid); + } + + protected override void OnInit() + { + this.ShortName = + "ZLEMA (" + TBars.SelectStr(this.DataSource) + ", " + this.Period + ")"; + this.indicator = new(source: bars.Select(this.DataSource), + period: this.Period, useNaN: false); + } + + protected void OnNewData(bool update = false) { this.indicator.Add(update); } + + protected override void OnUpdate(UpdateArgs args) + { + bool update = !(args.Reason == UpdateReason.NewBar || + args.Reason == UpdateReason.HistoricalBar); + this.bars.Add(this.Time(), this.GetPrice(PriceType.Open), + this.GetPrice(PriceType.High), this.GetPrice(PriceType.Low), + this.GetPrice(PriceType.Close), + this.GetPrice(PriceType.Volume), update); + this.OnNewData(update); + + double result = this.indicator[this.indicator.Count - 1].v; + this.SetValue(result); + } +} diff --git a/Quantower/MUL_Series.cs b/Quantower/MUL_Series.cs new file mode 100644 index 00000000..75d4aefe --- /dev/null +++ b/Quantower/MUL_Series.cs @@ -0,0 +1,117 @@ +// MUL - multiply TSeries*TSeries together, or TSeries*double, or double*TSeries +using System; +namespace QuantLib; + +public class MUL_Series : TSeries +{ + readonly TSeries _d1, _d2; + readonly double _dd; + readonly byte _type; + + public MUL_Series(TSeries d1, TSeries d2) + { + this._d1 = d1; + this._d2 = d2; + this._dd = 0; + this._type = 1; + d1.Pub += this.Sub; + d2.Pub += this.Sub; + if (d1.Count > 0 && d2.Count > 0) + { + for (int i = 0; i < Math.Min(d1.Count, d2.Count); i++) + { + this.Add(d1[i], d2[i], false); + } + } + } + + public MUL_Series(TSeries d1, double dd) + { + this._d1 = d1; + this._d2 = d1; + this._dd = dd; + this._type = 2; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(d1[i], dd, false); + } + } + } + + public MUL_Series(double dd, TSeries d1) + { + this._d1 = d1; + this._d2 = d1; + this._dd = dd; + this._type = 3; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(d1[i], dd, false); + } + } + } + + public void Add((System.DateTime t, double v) d1, + (System.DateTime t, double v) d2, bool update = false) + { + (System.DateTime t, double v) result = + ((d1.t > d2.t) ? d1.t : d2.t, d1.v * d2.v); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add((System.DateTime t, double v) d1, double dd, + bool update = false) + { + (System.DateTime t, double v) result = (d1.t, d1.v * dd); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add(double dd, (System.DateTime t, double v) d1, + bool update = false) + { + this.Add(d1, dd, update); + } + + public void Add(bool update = false) + { + if (update || (this._d1.Count > 0 && this._d1.Count == this._d2.Count && + this.Count != this._d1.Count)) + { + if (this._type == 1) + { + this.Add(this._d1[this._d1.Count - 1], this._d2[this._d2.Count - 1], + update); + } + else if (this._type == 2) + { + this.Add(this._d1[this._d1.Count - 1], this._dd, update); + } + else + { + this.Add(this._dd, this._d1[this._d1.Count - 1], update); + } + } + } + + public new void Sub(object source, TSeriesEventArgs e) { this.Add(e.update); } +} diff --git a/Quantower/Quantower.csproj b/Quantower/Quantower.csproj new file mode 100644 index 00000000..0fbcbe7d --- /dev/null +++ b/Quantower/Quantower.csproj @@ -0,0 +1,28 @@ + + + + net48 + latest + true + AnyCPU + Indicator + Quantower_QTAlib + QuanTAlib + Release + bin\ + + + + + + + + + + + + + .\dll\TradingPlatform.BusinessLayer.dll + + + diff --git a/Quantower/RND_Feed.cs b/Quantower/RND_Feed.cs new file mode 100644 index 00000000..e22050c0 --- /dev/null +++ b/Quantower/RND_Feed.cs @@ -0,0 +1,20 @@ +using System; +using QuantLib; + +public class RND_Feed : TBars +{ + public RND_Feed(int days, double volatility = 0.05, double startvalue = 100.0) + { + Random rnd = new(); + double c = startvalue; + for (int i = 0; i < days; i++) + { + double o = Math.Round(c + c * (volatility * 0.1 * rnd.NextDouble() - 0.005), 2); + double h = Math.Round(o + c * volatility * rnd.NextDouble(), 2); + double l = Math.Round(o - c * volatility * rnd.NextDouble(), 2); + c = Math.Round(l + (h - l) * rnd.NextDouble(), 2); + double v = Math.Round(1000 * rnd.NextDouble(), 2); + this.Add(DateTime.Today.AddDays(i - days), o, h, l, c, v); + } + } +} \ No newline at end of file diff --git a/Quantower/SUB_Series.cs b/Quantower/SUB_Series.cs new file mode 100644 index 00000000..0828d070 --- /dev/null +++ b/Quantower/SUB_Series.cs @@ -0,0 +1,125 @@ +// SUB - subtracting TSeries-TSeries, or TSeries-double, or double-TSeries +using System; +namespace QuantLib; + +public class SUB_Series : TSeries +{ + readonly TSeries _d1, _d2; + readonly double _dd; + readonly byte _type; + + public SUB_Series(TSeries d1, TSeries d2) + { + this._d1 = d1; + this._d2 = d2; + this._dd = 0; + this._type = 1; + d1.Pub += this.Sub; + d2.Pub += this.Sub; + if (d1.Count > 0 && d2.Count > 0) + { + for (int i = 0; i < Math.Min(d1.Count, d2.Count); i++) + { + this.Add(d1[i], d2[i], false); + } + } + } + + public SUB_Series(TSeries d1, double dd) + { + this._d1 = d1; + this._d2 = d1; + this._dd = dd; + this._type = 2; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(d1[i], dd, false); + } + } + } + + public SUB_Series(double dd, TSeries d1) + { + this._d1 = d1; + this._d2 = d1; + this._dd = dd; + this._type = 3; + d1.Pub += this.Sub; + if (d1.Count > 0) + { + for (int i = 0; i < d1.Count; i++) + { + this.Add(dd, d1[i], false); + } + } + } + + public void Add((System.DateTime t, double v) d1, + (System.DateTime t, double v) d2, bool update = false) + { + (System.DateTime t, double v) result = + ((d1.t > d2.t) ? d1.t : d2.t, d1.v - d2.v); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add((System.DateTime t, double v) d1, double dd, + bool update = false) + { + (System.DateTime t, double v) result = (d1.t, d1.v - dd); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add(double dd, (System.DateTime t, double v) d1, + bool update = false) + { + (System.DateTime t, double v) result = (d1.t, dd - d1.v); + if (update) + { + base[base.Count - 1] = result; + } + else + { + base.Add(result); + } + } + + public void Add(bool update = false) + { + if (update || (this._d1.Count > 0 && this._d1.Count == this._d2.Count && + this.Count != this._d1.Count)) + { + if (this._type == 1) + { + this.Add(this._d1[this._d1.Count - 1], this._d2[this._d2.Count - 1], + update); + } + else if (this._type == 2) + { + this.Add(this._d1[this._d1.Count - 1], this._dd, update); + } + else + { + this.Add(this._dd, this._d1[this._d1.Count - 1], update); + } + } + } + + public new void Sub(object source, TSeriesEventArgs e) { this.Add(e.update); } +} diff --git a/Quantower/TBars.cs b/Quantower/TBars.cs new file mode 100644 index 00000000..453d3f0e --- /dev/null +++ b/Quantower/TBars.cs @@ -0,0 +1,104 @@ +namespace QuantLib; + +using System; + +public class TBars : System.Collections.Generic.List<(DateTime t, double o, double h, double l, double c, double v)> +{ + private readonly TSeries _open = new(); + private readonly TSeries _high = new(); + private readonly TSeries _low = new(); + private readonly TSeries _close = new(); + private readonly TSeries _volume = new(); + private readonly TSeries _hl2 = new(); + private readonly TSeries _oc2 = new(); + private readonly TSeries _ohl3 = new(); + private readonly TSeries _hlc3 = new(); + private readonly TSeries _ohlc4 = new(); + private readonly TSeries _hlcc4 = new(); + + public TSeries Open => this._open; + public TSeries High => this._high; + public TSeries Low => this._low; + public TSeries Close => this._close; + public TSeries Volume => this._volume; + public TSeries HL2 => this._hl2; + public TSeries OC2 => this._oc2; + public TSeries OHL3 => this._ohl3; + public TSeries HLC3 => this._hlc3; + public TSeries OHLC4 => this._ohlc4; + public TSeries HLCC4 => this._hlcc4; + + public TSeries Select(int source) + { + return source switch + { + 0 => _open, + 1 => _high, + 2 => _low, + 3 => _close, + 4 => _hl2, + 5 => _oc2, + 6 => _ohl3, + 7 => _hlc3, + 8 => _ohlc4, + _ => _hlcc4, + }; + } + public static string SelectStr(int source) + { + return source switch + { + 0 => "Open", + 1 => "High", + 2 => "Low", + 3 => "Close", + 4 => "HL2", + 5 => "OC2", + 6 => "OHL3", + 7 => "Typical", + 8 => "Mean", + _ => "Weighted", + }; + } + + public void + Add((DateTime t, double o, double h, double l, double c, double v) i, bool update = false) + => Add(i.t, i.o, i.h, i.l, i.c, i.v, update); + + public void Add(DateTime t, decimal o, decimal h, decimal l, decimal c, decimal v, bool update = false) + => Add(t, (double)o, (double)h, (double)l, (double)c, (double)v, update); + + public void Add(DateTime t, double o, double h, double l, double c, double v, bool update = false) + { + if (update) + { + this[this.Count - 1] = (t, o, h, l, c, v); + _open[_open.Count - 1] = (t, o); + _high[_high.Count - 1] = (t, h); + _low[_low.Count - 1] = (t, l); + _close[_close.Count - 1] = (t, c); + _volume[_volume.Count - 1] = (t, v); + _hl2[_hl2.Count - 1] = (t, (h + l) * 0.5); + _oc2[_oc2.Count - 1] = (t, (o + c) * 0.5); + _ohl3[_ohl3.Count - 1] = (t, (o + h + l) * 0.333333333333333); + _hlc3[_hlc3.Count - 1] = (t, (h + l + c) * 0.333333333333333); + _ohlc4[_ohlc4.Count - 1] = (t, (o + h + l + c) * 0.25); + _hlcc4[_hlcc4.Count - 1] = (t, (h + l + c + c) * 0.25); + } + else + { + base.Add((t, o, h, l, c, v)); + _open.Add((t, o)); + _high.Add((t, h)); + _low.Add((t, l)); + _close.Add((t, c)); + _volume.Add((t, v)); + _hl2.Add((t, (h + l) * 0.5)); + _oc2.Add((t, (o + c) * 0.5)); + _ohl3.Add((t, (o + h + l) * 0.333333333333333)); + _hlc3.Add((t, (h + l + c) * 0.333333333333333)); + _ohlc4.Add((t, (o + h + l + c) * 0.25)); + _hlcc4.Add((t, (h + l + c + c) * 0.25)); + } + } +} diff --git a/Quantower/TSeries.cs b/Quantower/TSeries.cs new file mode 100644 index 00000000..c88a1703 --- /dev/null +++ b/Quantower/TSeries.cs @@ -0,0 +1,72 @@ +namespace QuantLib; + +using System; +using System.Linq; + +public class TSeries : System.Collections.Generic.List<(DateTime t, double v)> +{ + // when asked for a (t,v) tuple, return the last (t,v) on the List + public static implicit operator (DateTime t, double v)(TSeries l) => l[l.Count - 1]; + + // when asked for a (double), return the value part of the last tuple on the list + public static implicit operator double(TSeries l) => l[l.Count - 1].v; + + // when asked for a (DateTime), return the DateTime part of the last tuple on the list + public static implicit operator DateTime(TSeries l) => l[l.Count - 1].t; + + public System.Collections.Generic.List t => + this.Select(x => (DateTime)x.t).ToList(); + + public System.Collections.Generic.List v => + this.Select(x => (double)x.v).ToList(); + + public int Length => this.Count; + + // add/update one (t,v) tuple to/at the end of the list + public void Add((DateTime t, double v) TValue, bool update = false) + { + if (update) { this[this.Count - 1] = TValue; } + else { base.Add(TValue); } + this.OnEvent(update); + } + + public void Add(DateTime t, double v, bool update = false) => this.Add((t, v), update); + + public void Add(double v, bool update = false) => this.Add((DateTime.Now, v), update); + + // Broadcast handler - only to valid targets + protected virtual void OnEvent(bool update = false) + { + if (Pub != null && Pub.Target != this) + { + Pub(this, new TSeriesEventArgs { update = update }); + } + } + + // delegate used by event handler + event handler (Pub == publisher) + public delegate + void NewDataEventHandler(object source, TSeriesEventArgs args); + public event NewDataEventHandler Pub; + + public void Sub(object source, TSeriesEventArgs e) + { + TSeries ss = (TSeries)source; + if (ss.Count > 0) + { + for (int i = 0; i < ss.Count; i++) + { + this.Add(ss[i]); + } + } + else + { + this.Add(ss[ss.Count - 1], e.update); + } + } +} + +// EventArgs extension - carries the update field +public class TSeriesEventArgs : EventArgs +{ + public bool update { get; set; } +} diff --git a/Quantower/dll/TradingPlatform.BusinessLayer.dll b/Quantower/dll/TradingPlatform.BusinessLayer.dll new file mode 100644 index 0000000000000000000000000000000000000000..a85e72dd396f038564ab349bf3bb2595d735db23 GIT binary patch literal 1080224 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 z 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
  • GJIpy~VSNj_=#tY}a1Cm+EkM<)z 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 z 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 literal 0 HcmV?d00001 diff --git a/Quantower/dll/TradingPlatform.BusinessLayer.xml b/Quantower/dll/TradingPlatform.BusinessLayer.xml new file mode 100644 index 00000000..d26ac619 --- /dev/null +++ b/Quantower/dll/TradingPlatform.BusinessLayer.xml @@ -0,0 +1,9003 @@ + + + + TradingPlatform.BusinessLayer + + + + + Access to the chart panel + + + + + Chart panel unique ID + + + + + Collection of chart windows + + + + + Current X scale value - width of the bar in pixels + + + + + Provides time zone of current chart. + + + + + Provides custom sessions of current chart. + + + + + Current tick size of the chart + + + + + Main window of the chart + + + + + Current right offset value + + + + + Collection of chart drawings + + + + + Force chart refreshing + + + + + The MouseDown event occurs when the mouse button is pressed down + + + + + The MouseUp event occurs when the mouse button is released + + + + + The MouseClick event occurs when the mouse button is clicked + + + + + The MouseMove event occurs when the mouse moving over the chart + + + + + The MouseDown event occurs when the user scrolling mouse wheel + + + + + The MouseDown event occurs when the mouse enter the chart + + + + + The MouseDown event occurs when the mouse leave the chart + + + + + + + + + + Access to the chart drawings collection + + + + + Add chart drawing to the collection + + + + + + Remove specified chart drawing from collection + + + + + + Get chart drawing by ID + + + + + + + Get all chart drawings assigned to specified symbol + + + + + + The Added events occured, when new chart drawing was added to collection + + + + + The Moved events occured, when chart drawing was moved + + + + + The Removed events occured, when chart drawing was removed from the collection + + + + + The SelectionChanged events occured, when selected chart drawing was changed + + + + + Access to the particular window from chart panel + + + + + Client rectangle of the chart window + + + + + Determines, whether this window is the main window of the chart + + + + + Chart window number + + + + + Special object, allows you to convert values from x/y scale to Time/Price and back + + + + + + + + + + Converter between x/y and Time/Price scales + + + + + Get the DateTime value that is corresponding to specified x coordinate + + + + + + + Get the Price value that is corresponding to specified y coordinate + + + + + + + Get the X coordinate that is corresponding to specified DateTime value + + + + + + + Get the Y coordinate that is corresponding to specified price value + + + + + + + Get the bar index that is corresponding to specified DateTime value + + + + + + + Access to the chart drawing + + + + + Determines, the way how chart drawing was created: manually or programmatically + + + + + Determines, the availability of drawing - only current chart or all charts with same symbol + + + + + The unique ID of the chart drawing + + + + + Determines, whether chart drawing draws above or below the main chart + + + + + Determines, state of the chart drawing: Locked or Unlocked + + + + + Get time and price of the particular point of the chart drawing + + + + + Set time and price value for particular point of the chart drawing + + + + + + + + + + + + + + + Gets s list + + + + + Gets symbol types list + + + + + Gets s list + + + + + Gets s list + + + + + Gets Exchanges list + + + + + Gets Orders list + + + + + Gets Order Types list + + + + + Represents exist orders history + + + + + Gets Positions list + + + + + Gets Closed Positions list + + + + + Gets Trades list + + + + + Gets Corporate Actions list + + + + + Gets Report Types list + + + + + Gets DealTickets list + + + + + Vendor connection respond bundle + + + + + The connection status + + + + + The respond message + + + + + Ping state dictum + + + + + Ping signals connected + + + + + Ping signals disconnected + + + + + Mediates a history meta data with available data types and intervals on vendor side + + + + + History data types + + + + + History intervals + + + + + Asset id bearer + + + + + Asset name bearer + + + + + Asset description + + + + + Asset id bearer + + + + + Performs a binding with broker or data provider + + + + + Specifies any operation before breaking a connection with broker or data provider + + + + + Called when platform finished retreiving all required informations from vendor during connecting + + + + + Ping processing before its visualization in the terminal + + + + + Retrieves an information about available accounts. Yon need to specify at least one account + + + + + Confirms allowed nonfixed list by vendor + + + + + Retrieves a collection of available exchange markets from vendor + + + + + Retrieves information about available assets. + + + + + Retrieves information about available symbols. + + + + + Gets an available symbols types from vendor + + + + + Derives a non fixed symbol from vendor + + + + + Derives a non-fixed list of symbols from vendor + + + + + Retrieves allowed/supported order types + + + + + Retrieves an information about opened orders at the time of connection. + + + + + Retrieves an information about positions at the time of connection + + + + + Gets trades history from server for requested time range + + + + + Subscribing to quote data: Level1/Level2/Trade + + + + + Unsubscribing from quote data: Level1/Level2/Trade + + + + + Gets a list of supported historical intervals and data types by vendor + + + + + Prepare and sending order placing request to broker + + + + + Sending order modification request to broker + + + + + Sending order cancellation request to broker + + + + + Sending position closing request to broker + + + + + Gets information about available reports from vendor + + + + + Called when platform need to generate particular report + + + + + Ping respond bundle + + + + + Ping time + + + + + Time spent for single request + + + + + Ping state + + + + + Performs a binding with broker or data provider + + + + + Specifies any operation before breaking a connection with broker or data provider + + + + + Called when platform finished retreiving all required informations from vendor during connecting + + + + + Ping processing before its visualization in the terminal + + + + + Retrieves an information about available accounts. Yon need to specify at least one account + + + + + Retrieves a collection of available exchange markets from vendor + + + + + Retrieves information about available assets. + + + + + Retrieves information about available symbols. + + + + + Gets an available symbols types from vendor + + + + + Derives a non fixed symbol from vendor + + + + + Derives a non-fixed list of symbols from vendor + + + + + Retrieves an information about opened orders at the time of connection. + + + + + Retrieves an information about positions at the time of connection + + + + + Retrieves an information about closed positions at the time of connection + + + + + Subscribing to quote data: Level1/Level2/Trade + + + + + Unsubscribing from quote data: Level1/Level2/Trade + + + + + Gets a list of supported historical intervals and data types by vendor + + + + + Prepare and sending order placing request to broker + + + + + Sending order modification request to broker + + + + + Sending order cancellation request to broker + + + + + Sending position closing request to broker + + + + + Gets information about available reports from vendor + + + + + Called when platform need to generate particular report + + + + + Retrieves allowed/supported order types + + + + + Confirms allowed nonfixed list by vendor + + + + + Gets a settings list from a vendor selection of the setup window + + + + + The ID of the order group. This group created when trades done by the MAM account. + + + + + Total quantity of the order + + + + + Gets OrderType + + + + + Gets order price value + + + + + Gets order trigger price value + + + + + Gets order trailing offset value + + + + + Gets orders current status + + + + + Gets orders last update time + + + + + Gets Position Id. + + + + + Gets StopLoss holder for given order + + + + + Gets TakeProfit holder for given order + + + + + Orders Type Id. It is used for the orders type comparing. + + + + + Gets order TIF(Time-In-Force) type + + + + + Gets orders expiration time + + + + + Remaining quantity of the order + + + + + Filled quantity of the order + + + + + Gets open order original status + + + + + Will be triggered on each invocation + + + + + Снапшот для эмулятора + + + + + Текущая версия для сериализации. Если что-то меняем и нужно делать поддержку старого формата + можно использовать версию. + + + + + Version 1.1: изменилась схема работы с коннектами: стали доступны кастомные коннекты + + + + + Defines 'Volume Analysis' calculation result item + + + + + Contains all user's account information + + + + + Gets account unique code. + + + + + Obtaining account name. + + + + + Gets base currency of account. Account CCY is always equal to the server CCY in AlgoStudio + + + + + Gets current balance of the account. + + + + + Gets additional account information + + + + + Will be triggered on each account information updating + + + + + Gets Account name + + + + + + Creates a business object info with an Account data which can be used for the restoring/serialization process. + + + + + + ключ для апи, обязательно для заполнения и должен быть уникальным + + + + + используется в связске с AccountAdditionalInfoItemFormatingType.CustomAsset для форматирования в заданном ассете + + + + + Defines asset entity + + + + + Asset id bearer + + + + + Asset name bearer + + + + + Asset description + + + + + Defines a number precision of the change value + + + + + Gets precision value + + + + + Gets asset ISO 4217 code + + + + + Creates an Asset instance + + given connection Id + + + + Formats price into precision normalized string + + + + + + + Formats price into concatenated string which contains the precision normalized value and Asset's name + + + + + + + Gets Asset name + + + + + + Uses comparison by Assets names + + + + + + + Unique ID during active session. Don't use for serialization + + + + + Договориль использовать множественное число для типа инструмента + + + + + Завели для индийской интеграции + + + + + Represents information about corporate action. + + + + + Get the date and time when trade was executed + + + + + Will be triggered on corporate action updating + + + + + Base class for all Custom symbols: Synthetics, Custom Formulas, etc. + + + + + Создать symbol message, содержащий аггрегированный параметры из нескольких инструменов + + + + + alexb: нам достаточно подставлять правильный HistoricalData - он сделает всю работу + + + + + Расчёт Bid/Ask/BidSize/AskSize для синтетика + + + + + Расчёт Last/LastSize для синтетика + + + + + Расчёт Level2 для синтетика + + + + + Расчёт DayBar для синтетика + + + + + Расчёт бара дял синтетика + + + + + Increment current position + + + + + Will be triggered on each invocation + + + + + Applies an position modificaion or position changing by accepting a message. + + + + + + Contains all information which belong to the given exchange + + + + + Gets Exchange Id + + + + + Gets Exchange name + + + + + Used for the Exchanges comparing + + + + + Compares Exchnges in order by next - SortIndex, Exchange name, Connection Id, Exchange Id. + + + + + + + Provides possibility to group and sort symbols for each connection + + + + + Gets group Id + + + + + Gets group name + + + + + Gets sort index for comparing process + + + + + Represents trading information about pending order + + + + + The ID of the order group. This group created when trades done by the MAM account. + + + + + Gets Position Id. + + + + + Total quantity of the order + + + + + Filled quantity of the order + + + + + Remaining quantity of the order + + + + + Orders Type Id. It is used for the orders type comparing. + + + + + Gets OrderType + + + + + Gets order price value + + + + + Gets order trigger price value + + + + + Gets order trailing offset value + + + + + Gets orders current status + + + + + Gets open order original status + + + + + Gets order TIF(Time-In-Force) type + + + + + Gets orders expiration time + + + + + Gets orders last update time + + + + + Gets StopLoss holder for given order + + + + + Gets TakeProfit holder for given order + + + + + Will be triggered on each invocation + + + + + Creates Order instance + + + + + + Applies an order modificaion or order changing by accepting a message. + + + + + + Cancels pending order + + + + + + Represents an wrapper + + + + + Represents trading information about related position + + + + + Will be triggered on each and invocation + + + + + Gets position quantity value + + + + + Gets position open order price + + + + + Gets position openning time + + + + + Gets Profit/loss (without swaps or commissions) all calculated based on the current broker's price. For open position it shows the profit/loss you would make if you close the position at the current price. If position closed, this parameter show profit/loss what trader have after closing this position. + + + + + Gets Profit/loss calculated based on the current broker's price. For open position it shows the profit/loss you would make if you close the position at the current price. If position closed, this parameter show profit/loss what trader have after closing this position. + + + + + Gets fee amount for the position. + + + + + Gets PnL swaps + + + + + The market price obtainable from your broker. + + + + + Closes position if quantity is not specified else - uses partial closing operation. + + + + + + + Gets StopLoss order which belongs to the position + + + + + Gets TakeProfit order which belongs to the position + + + + + Returns ticks amount between open and current price. + + + + + Represents a report grid which can hold system reports based on s and s content. + + + + + Columns collection + + + + + Rows collection + + + + + Initializes report grid + + + + + Adds coloring column to the report + + + + + Adds default(non-colored) column to the report + + + + + Exposes report cell decoration + + + + + Cell label + + + + + Cell value + + + + + Exposes report column decoration + + + + + Header of the column + + + + + Column value type + + + + + Exposes report row decoration + + + + + A collection of cells + + + + + Initializes cells in the row + + + + + Adds cells to the row by label and value + + + + + Adds cells to the row by value only + + + + + Defines report request parameters from which can be used in + + + + + Gets report Id + + + + + Gets report Name + + + + + report settings + + + + + Represents a permisions checking tool which use next priority order , , and + + + + + Represent access to symbol information and properties. + + + + + Gets symbol Id + + + + + Gets symbol name + + + + + Gets symbol description + + + + + Gets symbol type + + + + + Gets symbol base Asset + + + + + Gets symbol counter Asset + + + + + Gets Exchange of current symbol + + + + + Returns delay with which quote come in platform. + + + + + Gets symbol additional info + + + + + The highest trade allowed + + + + + The lowest trade allowed + + + + + Gets symbol NettingType + + + + + Gets SymbolGroup + + + + + Gets current SymbolQuotingType + + + + + Amount of base asset for one lot. + + + + + Stores list of symbol ticksizes + + + + + Cached value of TickSize (if 1 level) + + + + + Step of the lot changes + + + + + Step of the notional value changes + + + + + Gets derivative expiration date + + + + + Gets derivative last trading date + + + + + Gets derivative maturity date + + + + + Gets derivative strike price + + + + + Gets derivative option style + + + + + Gets derivative option type + + + + + Gets derivative option serie + + + + + Gets derivative underlier name + + + + + Gets derivative underlier symbol + + + + + Gets Ask price + + + + + Gets Ask size + + + + + Gets Bid price + + + + + Gets Bid size + + + + + Gets quote time + + + + + Gets last price + + + + + Gets last size + + + + + Gets last time + + + + + Gets mark price + + + + + Gets mark size + + + + + Gets open price + + + + + Gets previous close price + + + + + Gets high price + + + + + Gets low price + + + + + Gets volume value + + + + + Gets PrevSettlement value + + + + + Gets ticks amount + + + + + Gets trades amount + + + + + Gets Level2 data + + + + + Gets spread value between Bid and Ask + + + + + Gets percentage value + + + + + Gets change value between Bid/Last and Close price + + + + + Gets percentage value + + + + + Default history type + + + + + List of all available history types + + + + + Gets SymbolVolumeType + + + + + Will be triggered when new Level1 quote is comming + + + + + Will be triggered when new Level2 quote is comming + + + + + Will be triggered when new trade quote is comming + + + + + Will be triggered when new correctional quote is comming from the vendor. + + + + + Will be triggered when symbol updated. + + + + + Gets real time calculation setting + + + + + Gets real time calculation setting + + + + + Gets real time calculation setting + + + + + Gets real time calculation setting + + + + + Gets historical data according to period and other parameters + + + + + + + + + Gets historical data according to period and other parameters + + + + + + + + + + Gets historical data according to aggregation and other parameters + + + + + + + + + + Gets historical data according to given history request + + + + + + + Gets historical ticks data according to given parameters + + + + + + + + + Returns rounded to price + + + + + Calculates new price which equal to given price shifted by a number of given ticks + + + + + + + + Calculates ticks between two prices + + + + + + + + Gets cached symbol tick size or retrives it from the list + + + + + + + Gets symbol tick cost retrived from the list by price + + + + + + + Returns VariableTick if it can be retrived from list by price or null + + + + + + + Gets cached tick size if it available, else tries to obtain with Last, Bid, Ask, first element of list otherwise - + + + + + Formats price value to the appropriative string with a counting on tick precision. + + + + + + + Formats price value to the appropriative string with a counting on max tick precision. + + + + + + + Returns string with formatted ticks value + + + + + + + Comparing by value + + + + + + + Gets symbol orders types list which are allowed. + + + + + + + Process order placing with given request parameters + + + + + + + An symbol has possibility to obtain the default account + + + + + Represents information about trade. + + + + + Gets the unique identifier of the order initiating the trade. + + + + + Gets a unique identifier of the position, which is related to this trade. + + + + + Get the price where trade was executed + + + + + Get the trade quantity + + + + + Get the date and time when trade was executed + + + + + Get the trade Gross P&L + + + + + Get the trade Net P&L + + + + + Get the fee value that was charged for this trade + + + + + Get the trade order type + + + + + Will be triggered on trade updating + + + + + Represent access to level2 data. + + + + + Gets Level2 Asks list + + + + + Gets Level2 Bids list + + + + + Gets current Level2 data + + Parameters of DepthOfMarket + + + + + Gets current Level2 data + + Parameters of request for Leve2Item collection + + + + + Leve2 data. Contains Bids and Ask collections + + + + + Represent parameters of DepthOfMarket + + + + + Represent parameters of request for Leve2Item collection + + + + + Aggregation method + + + + + Required amount of level2 + + + + + Use custom tick size + + + + + Calculate cumulative size + + + + + Aggregation method + + + + + Represent access to level2 item. + + + + + Cumulative size + + + + + Imbalance Percent + + + + + Price + + + + + Size + + + + + Time + + + + + MMID + + + + + проверка на вхождение + + + + + Represents information about connection and provides an access to the current trading information(Symbols, Orders, Position, Accounts etc.). + + + + + Provides access to all business objects which are belong to this connection + + + + + Gets connection Id + + + + + Gets connection Name + + + + + Gets connection's vendor name + + + + + Contains list of connection settings. Will be reused on each population time. + + + + + Gets connection's state (Connected/Connecting/Fail etc.) + + + + + Defines connection type + + + + + Will be triggered when changed. + + + + + Will be triggered when changed. + + + + + Represents connection ping time + + + + + Messages count that one is waited to process + + + + + Gets a matched available metadata info with the vendor's side + + + + + Establishes a connection to a specified vendor + + + + + + Closes a connection. + + + + + Только для использования в ConnectionCache + + + + + alexb: "Умный" поиск - разрешаем указывать слова в любом порядке + + + + + Generates a report with given requested parameters + + specifies Report's type + + + + + Gets connection's s list + + + + + Gets connection's symbol types list which are allowed in this connection + + + + + Gets connection's s list + + + + + Gets connection's s list + + + + + Gets all Exchanges which are allowed in this connection + + + + + Gets all Orders which are belong to this connection + + + + + Gets all Order Types which are available on this connection + + + + + Represents all exist orders history which are belong to this connection. + + + + + Gets all Positions which are belong to this connection + + + + + Gets all Closed Positions which are belong to this connection + + + + + Gets all Trades which are belong to this connection + + + + + Gets all Corporate actions which are belong to this connection + + + + + Gets all Report Types which are available on this connection + + + + + Gets all DealTickets which are belong to this connection + + + + + Gets all Account operations which are available on this connection + + + + + Server connection status + + + + + Specifies connection using type. + + + + + Specifies how connection was created: by default or by user + + + + + Represents all needed parameters for the connection constructing process. + + + + + Gets a user friendly name of the connection + + + + + Gets connection group + + + + + Gets vendor's name + + + + + Gets connection Id + + + + + Favorites one will be displayed in Control center toolbar + + + + + Gets ConnectionState + + + + + Gets vendor's settings + + + + + Specifies how connection was created: by default or by user + + + + + realization + + + + + Creates connection info instance + + + + + + Creates connection info instance. + + + + + + + + + дефолтовый период пигования + + + + + Таймер, по которому проходит пинг + + + + + Запускаем таймер + + + + + Останавливаем таймер + + + + + Коннекты, которые нужно подключить + + + + + + Сколько ждем до следующей попытки + + + + + The main entry point in the API. Core keeps access to all business logic entities and their properties: + connections, accounts, symbols, positions, orders, etc. Some of them can be reached through using managers or directly via specified collections. + You can always acces the Core object via static Core.Instance property. + + + + + Gets a singleton instance of . API entry point + + + + + Gets an access to all created connections and manages them + + + + + Gets an access to the system logging mechanism + + + + + Obtains licence rules for the current user + + + + + Obtains metrics service + + + + + Gets an access to all available trading data vendors and creates them + + + + + Gets an access to the all available aggregation types + + + + + Access to Volume Analysis calculations + + + + + Gets an access to the all available indicators and creates them + + + + + Gets an access to the all available trading strategies and manages them + + + + + Gets a permissions checking mechanism + + + + + Gets a time based conversion and synchronization mechanism + + + + + Gets SMTP mail service for sending emails + + + + + Represents current trading status + + + + + Will be triggered when changed + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections + + + + + Gets all available s from open connections. Otherwise returns empty list + > + + + + Gets all available s from open connections + + + + + Starts a initialization process which initializes given Managers, and Utils. And provides a subscribing on events. + + + + + Disposes all previously initialized modules and unsubscribe from events + + + + + Will be triggered when new added to the core + + + + + Gets an instance of exist Account or creates a new one with given info parameter + + + + + + + Will be triggered when new added to the core + + + + + Returns all s from open connections which satisfy given request parameters, otherwise returns empty list + + + + + + + Retrieves any by given request parameters. Otherwise returns null + + + Must be specified if open connections total is more than one. Will search only in Synthetic symbols list if id is equal to + + + + + + Gets an instance of exist symbol or creates a new one with given info parameter + + + + + + + Will be triggered when new placed + + + + + Will be triggered when canceled + + + + + Gets instance by given Id string. Otherwise returns null + + + Must be specified if open connections total is more than one + + + + + Gets instance by given Id string. Otherwise returns null + + + Must be specified if open connections total is more than one + + + + + Will be triggered when new opened + + + + + Will be triggered when closed + + + + + Gets instance by given Id string. Otherwise returns null + + + Must be specified if open connections total is more than one + + + + + Gets Profit'n'Loss with given request parameters from open connection. Otherwise returns null + + + + + + + Will be triggered when new added + + + + + Will be triggered when removed + + + + + Will be triggered when new occured + + + + + Will be triggered when new occured + + + + + Will be triggered when new added + + + + + Places with given request parameters + + + + + + + Modifies by given request parameters + + + + + + + Closes with given request parameters + + + + + + + Cancels with given request parameters + + + + + + + Returns with given request parameters from open connection + + + + + + + Will be triggered when new received + + + + + Sends custom request if connection with given Id is open + + + + + + + Subscribe on custom messages + + custom message handler + custom messages Id + + + + Unsubscribe from custom messages + + custom message handler + custom messages Id + + + + Gets all previously configured s + + + + + Gets an access to s and manages them + + + + + Adds if given parameters are valid + + + + + + + Replaces exist list by new list in if given parameters are valid + + + + + + + Removes with a given name + + + + + + Replaces list name by new given name in if given parameters are valid + + + + + + + Represent all available Historical Symbols + + + + + Will be triggered when custom symbol added + + + + + Will be triggered when custom symbol removed + + + + + Will be triggered when custom symbol updated + + + + + Represent all available Synthetic items + + + + + Adds given Synthetic to the list if it does not contain + + + + + + Removes given Synthetic from the list if it exists + + + + + + Returns current version number + + + + + + Returns the time of last successful build + + + + + + Override to change string representation of aggregation + + + + + Represent access to historical data information and indicators control. + + + + + Gets HistoricalData symbol + + + + + Gets HistoricalData Period + + + + + Gets HistoricalData aggregation + + + + + Gets HistoricalData history type + + + + + Gets HistoricalData left time boundary + + + + + Gets HistoricalData right time boundary + + + + + Gets HistoricalData items amount + + + + + Retrieves HistoricalData item by indexing offset and direction to find. + + + + + + + + Will be triggered when new historical item created + + + + + Will be triggered when current historical item changed or updated + + + + + Gets access to built-in indicators + + + + + Reloads entire HistoricalData + + + + + Gets index by time with counting on search direction + + + + + Creates indicator by it's name and if it successfully created adds it to the HistoricalData + + + + + + + + Adds indicator to the HistoricalData + + + + + + Removes indicator from the HistoricalData + + + + + + Will be triggered when volume analysis of current historical item changed or updated + + + + + Period that can be used as a basis for history aggregations + + + + + + + + + + Represents historical data bar item + + + + + Gets bar's right time border + + + + + Defines bar's ticks count + + + + + Defines Open price + + + + + Defines High price + + + + + Defines Low price + + + + + Defines Close price + + + + + Gets Median (High+Low)/2 price + + + + + Gets Typical (High+Low+Close)/3 price + + + + + Gets Weighted (High+Low+Close+Close)/4 price + + + + + Defines ticks amount + + + + + Defines volume value + + + + + Gets price by indexing + + + + + + + Creates HistoryItemBar instance with default OHLC price = + + + + + Comparing by , OHLC, + + + + + + + Represents historical data trade item + + + + + Defines price value + + + + + Defines volume value + + + + + Defines trade operation side as aggressor flag + + + + + Gets price by indexing + + + + + + + Creates HistoryItemLast instance + + + + + Comparing by , OHLC, + + + + + + + Gets price by indexing + + + + + + + Creates HistoryItemLast instance + + + + + Represents historical data tick item + + + + + Defines Bid price + + + + + Defines Bid size + + + + + Defines Ask price + + + + + Defines Ask size + + + + + Gets price by indexing + + + + + + + Creates HistoryItemBar instance with default Ask/AskSize/Bid/BidSize = + + + + + Comparing by , OHLC, + + + + + + + Resolves a history request parameters per symbol + + + + + Represents mechanism for supporting predefined and custom periods + + + + + Gets period multiplier + + + + + Gets base period type + + + + + Gets ticks value as an result of base period multiplicated by + + + + + Creates Period instance with greater than 0 + + + + + + + True if their base paeriods and are respectively equal. + + + + + + + + True if any of their base paeriods and are respectively not equal. + + + + + + + + True if their ticks values are satisfying initial condition + + + + + + + + True if their ticks values are satisfying initial condition + + + + + + + + True if their ticks values are satisfying initial condition + + + + + + + + True if their ticks values are satisfying initial condition + + + + + + + + True if their base paeriods and are respectively equal. + + + + + + + Formats given value to a specific user friendly string + + + + + + + Returns value in ticks according to base period type + + + + + + + Returns shorted string according to base period type + + + + + + + Converts time gap into dates range + + + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Predefined period + + + + + Проход по диапазону дат с заданным шагом + + + + + Represent access to DayBar quote, which contains summary information about instrument prices. + + + + + High price + + + + + Open price + + + + + Low price + + + + + Previous Close price + + + + + Ticks value + + + + + Volume value + + + + + Previous settlement price + + + + + Bid price + + + + + Bid size + + + + + Ask price + + + + + Ask size + + + + + Last price + + + + + Last size + + + + + Trades value + + + + + Change value + + + + + Change value in percentage + + + + + + + + + + Represent access to DOM2 quote, which contains Bids and Asks. + + + + + Collection of Asks quotes + + + + + Collection of Bids quotes + + + + + Represent access to trade information. + + + + + Price at which trade occured + + + + + Size of the trade + + + + + Information about operation side of the trade + + + + + Shows the direction of price movement, comparing to previous value. + + + + + + + + + + + + + + + + + + + + + + + + + Represent access to Level2 quote. + + + + + Price type of Level2 quote: Bid or Ask + + + + + Price of Level2 quote + + + + + Size of Level2 quote + + + + + Unique ID of Level2 quote + + + + + Shows, whether Level2 quote is using only for removing from depth + + + + + Broker identifier that send level2 quote + + + + + specifies the implied quantity associated with the price for the quote. Subtracting this amount from the Size yields the outright quantity for the price level. A value of zero indicates that the implied size is not available/defined or that it is actually zero. + + + + + Time of the quote + + + + + Represent access to quote information. + + + + + Bid price + + + + + Bid size + + + + + Ask price + + + + + Ask size + + + + + Shows the direction of bid price movement, comparing to previous value. + + + + + Shows the direction of ask price movement, comparing to previous value. + + + + + Constants for licence keys + + + + + User licences info store + + + + + Current state of connection to licence server + + + + + Current connected user info + + + + + All active licences that user have + + + + + Check that user have licence + + + + + Specifies the reason of price data updating. + + + + + Indicates the processing of new historical bar. + + + + + Indicates the coming of new real-time tick. + + + + + Indicates a start of new real-time bar. + + + + + Specifies the type of events when indicator should recalculate itself. + + + + + Specifies the style of indicator line. + + + + + Moving average mode + + + + + Simple Moving Average + + + + + Exponential Moving Average + + + + + Smoothed Moving Average + + + + + Linearly Weighted Moving Average + + + + + + + + + + Displays HV schedule and percentile value. + + + + + Displays the percentile schedule only. + + + + + Returns an instance of the Exponential Moving Average (EMA) indicator. + EMA provides a weighted price calculation for the last N periods. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + namespace Example + { + ]]> + + ]]> + public class EMA : Indicator + { + #region Parameters + + // Period of moving average. + [InputParameter("Period of Exponential Moving Average", 0, 1, 999, 1, 0)] + public int Period = 2; + + // Price type of moving average. + [InputParameter("Sources prices for MA", 1, new object[] + { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted + })] + public PriceType SourcePrice = PriceType.Close; + + // Holds EMA's smoothing values. + private Indicator ema; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public EMA() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "EMA"; + Description = "Exponential moving average example"; + + // Defines line on demand with particular parameters. + AddLineSeries("EMA", Color.DodgerBlue, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbol or timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "EMA (" + Period.ToString() + ": " + SourcePrice.ToString() + ")"; + // Creates an instance of the proper indicator (EMA) from the default indicators list. + ema = Core.Instance.IndicatorManager.BuiltIn.EMA(Period, SourcePrice); + // Adds an auxiliary (EMA) indicator to the current one (EMA Example). + // This will let inner indicator (EMA) to be calculated in advance to the current one (EMA Example). + AddIndicator(ema); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip if count is smaller than period value. + if (Count Period) + return; + + // Sets value for displaying on the chart. + SetValue(ema.GetValue()); + } + } + } + + + Period of Exponential Moving Average + Sources prices for MA + + + + Gets the Linearly Weighted Moving Average + Linear Weighted Moving Average makes the most recent bar more important unlike SMA. + + + + using System; + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + public class TestLWMA : Indicator + { + #region Input params + Indicator slowLWMA, fastLWMA; + #endregion + // Input Parameter with an input field or checkbox (if bolean) + [InputParameter("Period slow LWMA", 0, 1, 9999)] + public int slowPeriod = 12; + [InputParameter("Period fast LWMA", 0, 1, 9999)] + public int fastPeriod = 8; + // Input Parameter with a dropdown + [InputParameter("Sources prices for calculation LWMA", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestLWMA() + : base() + { + // Defines indicator's name and description. + Name = "LWMA test"; + Description = "Example of using built-in LWMA indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("TestLWMA", Color.Blue, 1, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbol or timeframe) updates. + /// ]]> + public override void Init() + { + ShortName = "LWMA ("+slowPeriod.ToString()+":"+fastPeriod.ToString()+")"; + // Creation of an indicator with long period + slowLWMA = Core.Instance.IndicatorManager.BuiltIn.LWMA(slowPeriod, SourcePrice); + AddIndicator(slowLWMA); + // Creation of an indicator with short period + fastLWMA = Core.Instance.IndicatorManager.BuiltIn.LWMA(fastPeriod, SourcePrice); + AddIndicator(fastLWMA); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + if (Count ]]> Math.Max(slowPeriod, fastPeriod)) + SetValue((slowLWMA.GetValue() + fastLWMA.GetValue()) / 2); + } + } + } + + + Moving average period + Type of the price + + + + + Gets the SMA(Simple Moving Average) indicator. + The 'SMA' indicator provides an average price for the last N periods. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestSMA : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("Period of Simple Moving Average", 0, 1, 999, 1, 0)] + public int Period = 2; + + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for MA", 1, new object[] + { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted + })] + public PriceType SourcePrice = PriceType.Close; + + private Indicator sma; + + public TestSMA() + : base() + { + Name = "TestSMA"; + Description = "Example of using SMA indicator"; + + // Define one line with particular parameters. + AddLineSeries("Signal", Color.Green, 5, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serve for identification of related indicators with different parameters. + ShortName = "TestMA (" + Period + ":" + SourcePrice.ToString() + ")"; + + // Get SMA indicator from built-in indicator collection + sma = Core.Instance.IndicatorManager.BuiltIn.SMA(Period, SourcePrice); + + // Add auxiliary SMA indicator to the current. + AddIndicator(sma); + } + + public override void OnUpdate(UpdateArgs args) + { + // Checking, if current amount of bars + // more, than period of moving average. If it is + // then the calculation is possible + if (Count Period) + return; + + // Get SMA values for current and previos bars + var currentSmaValue = sma.GetValue(0); + var previousSmaValue = sma.GetValue(1); + + // Set value to the "Signal" line buffer + if (previousSmaValue currentSmaValue) + SetValue(1); + else if (previousSmaValue ]]> currentSmaValue) + SetValue(-1); + else + SetValue(0); + } + } + } + + + Period of simple moving average. + Sources prices for MA. + + + + + Returns an instance of the Smoothed Moving Average (SMMA) indicator. + SMMA indicator provides a smoothed average price for the last N periods. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Smoothed Moving Average example. + /// ]]> + public class SMMA : Indicator + { + #region Parameters + + // Period of moving average. + [InputParameter("Period of Smoothed Moving Average", 0, 1, 999, 1, 0)] + public int Period = 12; + + // Price type of moving average. + [InputParameter("Sources prices for MA", 1, new object[] + { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted + })] + public PriceType SourcePrice = PriceType.Close; + + // Holds SMMA's smoothing values. + Indicator smma; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public SMMA() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "SMMA"; + Description = "Smoothed moving average example"; + + // Defines line on demand with particular parameters. + AddLineSeries("SMMA", Color.DodgerBlue, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbol or timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "SMMA (" + MaPeriod.ToString() + ": " + SourcePrice.ToString() + ")"; + // Creates an instance of the proper indicator (SMMA) from the default indicators list. + smma = Core.Instance.IndicatorManager.BuiltIn.SMMA(Period, SourcePrice); + // Adds an auxiliary (SMMA) indicator to the current one (SMMA Example). + // This will let inner indicator (SMMA) to be calculated in advance to the current one (SMMA Example). + AddIndicator(smma); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip if count is smaller than period value. + if (Count Period) + return; + + // Sets value for displaying on the chart. + SetValue(smma.GetValue()); + } + } + } + + + Moving average period + Type of the price + + + + + Gets the PPMA(Pivot Point Moving Average) indicator. + The 'PPMA' indicator uses the pivot point calculation as the input a simple moving average. + + + + using TradingPlatform.BusinessLayer; + + namespace Example + { + public class TestPPMA : Indicator + { + //Defines input parameter as input field + [InputParameter("Period of TestPPMA", 0, 1, 999, 1, 0)] + public int Period = 2; + + private Indicator ppma; + private Indicator ema; + + public TestPPMA() + : base() + { + // Defines indicator's name and description. + Name = "TestPPMA"; + Description = "Example of using PPMA indicator"; + + // This example doesn't require indicator lines + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TPPMA (" + Period + ")"; + + // Create PPMA and EMA indicators from built-in indicator collection + ppma = Core.Instance.IndicatorManager.BuiltIn.PPMA(Period); + ema = Core.Instance.IndicatorManager.BuiltIn.EMA(Period, PriceType.Close); + + // Add auxiliary indicators to the current. + AddIndicator(ppma); + AddIndicator(ema); + } + + public override void OnUpdate(UpdateArgs args) + { + //Skip the history. Start calculation only on the real time data. + if (args.Reason == UpdateReason.HistoricalBar) + return; + + // Get EMA and PPMA values of previous bar (1 offset) from first line (line index is 0) + var prevEma = ema.GetValue(1); + var prevPPMA = ppma.GetValue(1, 1); + + // Get EMA and PPMA values of current bar (0 offset) form second line (line index is 1) + var currentPPMA = ppma.GetValue(0, 1); + var currentEma = ema.GetValue(0); + + // Show the alert window with some info + if (prevEma prevPPMA currentEma ]]> currentPPMA) + Alert("The ema crossed ppma from bottom to top"); + else if (prevEma ]]> prevPPMA currentEma currentPPMA) + Alert("The ema crossed ppma from top to bottom"); + } + } + } + + + Period of PPMA indicator + + + + + + Gets the MAS3 (3MASignal) indicator. + The 'MAS3' indicator offers buy and sell signals according to intersections of three moving averages. + + + + using TradingPlatform.BusinessLayer; + + namespace Example + { + public class TestMAS3 : Indicator + { + //Defines input parameters as input fields + [InputParameter("Short Moving Average Period", 0, 1, 999, 1, 0)] + public int ShortMaPeriod = 5; + + [InputParameter("Middle Moving Average Period", 1, 1, 999, 1, 0)] + public int MiddleMaPeriod = 10; + + [InputParameter("Long Moving Average Period", 2, 1, 999, 1, 0)] + public int LongMaPeriod = 25; + + [InputParameter("Amount of bars passed before opening position", 3, 1, 999, 1, 0)] + public int BarsInterval = 1; + + private Indicator mas; + private double trend = 0d; + + public TestMAS3() + : base() + { + // Defines indicator's name and description. + Name = "TestMAS3"; + Description = "Example of using MAS3 indicator"; + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestMAS3 (" + ShortMaPeriod + ":" + MiddleMaPeriod + ":" + LongMaPeriod + ":" + BarsInterval + ")"; + + // Get MAS3 indicator from built-in indicator collection. + mas = Core.Instance.IndicatorManager.BuiltIn.MAS3(ShortMaPeriod, MiddleMaPeriod, LongMaPeriod, BarsInterval); + + // Add auxiliary indicators to the current. + AddIndicator(mas); + } + + public override void OnUpdate(UpdateArgs args) + { + //Skip the history. Start calculation only on the real time data. + if (args.Reason == UpdateReason.HistoricalBar) + return; + + // Get MAS3 value of current bar (0 offset by default) + var currentTrend = mas.GetValue(); + + // The service method, which according to the 'currentTrend' value returns the trend name (as string) + var trendName = GetTrendNameHelper(currentTrend); + + // Show the alert window, with the info about current market trend + if (currentTrend != trend) + Alert($"The market trend was changed. Current trend is: '{ trendName }'"); + + trend = currentTrend; + } + + private string GetTrendNameHelper(double trend) + { + if (trend ]]> 0d) + return "Up"; + else if (trend 0d) + return "Down"; + else + return "None"; + } + } + } + + + Short moving average period. + Middle moving average period. + Long moving average period. + The count of bars. The trend will be determined on this interval. + + + + + + Gets the specific MA indicator, according to selected 'MaMode'. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestMA : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("Period of Moving Average", 0, 1, 999, 1, 0)] + public int Period = 10; + + // Displays Input Parameter as dropdown list. + [InputParameter("MA mode", 1, new object[]{ + "Simple Moving Average", MaMode.SMA, + "Exponential Moving Average", MaMode.EMA, + "Smoothed Moving Average", MaMode.SMMA, + "Linearly Weighted Moving Average", MaMode.LWMA, + })] + public MaMode MaType = MaMode.SMA; + [InputParameter("Sources prices for MA", 2, new object[]{ + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted + })] + public PriceType SourcePrice = PriceType.Close; + + private Indicator testMa; + private Indicator sma; + + public TestMA() + : base() + { + // Defines indicator's name and description. + Name = "TestMA"; + Description = "Test of built-in MA method"; + + // Defines one line with particular parameters. + AddLineSeries("MA", Color.Green, 2, LineStyle.SimpleChart); + } + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TMA (" + Period + ":" + SourcePrice.ToString() + ":" + MaType.ToString() + ")"; + + // Get MA indicator from built-in indicator collection (according to selected 'MaType'). + testMa = HistoricalData.BuiltIn.MA(Period, SourcePrice, MaType); + + // Get SMA indicator from built-in indicator collection. + sma = HistoricalData.BuiltIn.SMA(Period, SourcePrice); + } + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Print name of 'testMa' indicator and its value + // + name of 'sma' indicator (it's always "SMA") and its value + // + 'true' if their values are equal or 'false' if it isn't. + Print($"{testMa.Name}: {testMa.GetValue()}. \n" + + $"{sma.Name}: {sma.GetValue()}. \n" + + $"Indicator values are equal: {testMa.GetValue() sma.GetValue()}."); + + } + } + } + + + Period of moving average. + Type of price. + MA mode. + + + + + + Gets the BB(Bollinger Bands) indicator. + The 'BB' indicator provides a relative definition of high and low based on standard deviation and a simple moving average. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestBB : Indicator + { + //Defines 'Period' input parameters as input field and set allowable range from 1 to 999 + [InputParameter("Period of MA for envelopes", 0, 1, 999)] + public int Period = 5; + + //Defines 'Period' input parameters as input field and set allowable range from 0.1 to 100.0, increment of 0.1 + [InputParameter("Value of confidence interval", 1, 0.1, 100.0, 0.1, 1)] + public double D = 1.0; + + //Defines input parameters as dropdown lists + [InputParameter("Sources prices for MA", 2, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrices = PriceType.Low; + [InputParameter("Type of moving average", 3, new object[]{ + "Simple Moving Average", MaMode.SMA, + "Exponential Moving Average", MaMode.EMA, + "Smoothed Moving Average", MaMode.SMMA, + "Linearly Weighted Moving Average", MaMode.LWMA, + })] + public MaMode MaType = MaMode.SMA; + + private Indicator bb; + + public TestBB() + : base() + { + // Defines indicator's name and description. + Name = "TestBB"; + Description = "Example of using built-in BB indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("Diff", Color.Red, 5, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestBB (" + Period + ":" + D + ":" + SourcePrices.ToString() + ":" + MaType.ToString() + ")"; + + // Get BB indicator from built-in indicator collection. + bb = HistoricalData.BuiltIn.BB(Period, D, SourcePrices, MaType); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get BB values from zero ("Upper Band") and second ("Lower Band") lines. + var upperBand = bb.GetValue(0, 0); + var lowerBand = bb.GetValue(0, 2); + + // Get close price + var closePrice = Close(); + + // Calculates a difference between current close price and specific 'BB' line value. + var diff = 0d; + if (upperBand closePrice lowerBand closePrice) + diff = closePrice - upperBand; + else if (upperBand ]]> closePrice lowerBand ]]> closePrice) + diff = closePrice - lowerBand; + + // Set value to 'Diff' line buffer. + SetValue(diff, 0, 0); + } + } + } + + + Period of MA for envelopes. + Value of confidence interval. + Sources prices for MA. + Type of moving average. + + + + + + Gets the Commodity Channel Index. + Measures the position of price in relation to its moving average. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Indicators + { + public class TestCCI : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("CCI Period", 0, 1, 999, 1, 0)] + public int Period = 14; + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for MA", 0, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Typical; + #endregion Parameters + + private Indicator CCI; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestCCI() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestCCI"; + Description = "Example of using built-in CCI indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("CCI Line", Color.Red, 1, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + ShortName = "TestCCI ("+Period.ToString()+")"; + // Get 'CCI' indicator from built-in indicator collection. + CCI = Core.Instance.IndicatorManager.BuiltIn.CCI(Period, SourcePrice, MAType); + AddIndicator(CCI); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get values from 'CCI' indicator lines. + var cciRecent = CCI.GetValue(); + if(args.Reason != UpdateReason.NewTick cciRecent]]>100 cciRecent150) + Print("Long signal"); + else if(args.Reason != UpdateReason.NewTick cciRecent-100 cciRecent]]>-150) + Print("Short signal"); + } + } + } + + + Period for CCI MA + Sources prices for CCI + MA mode for CCI + + + + + + Returns an instance of the Modified Moving Average (MMA) indicator. + MMA comprises a sloping factor to help it overtake with the growing or declining value of the trading price of the currency. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Modified Moving Average example. + /// ]]> + public class MMA : Indicator + { + #region Parameters + + // Period of moving average. + [InputParameter("Period of Modified Moving Average", 0, 1, 999, 1, 0)] + public int Period = 2; + + // Price type of moving average. + [InputParameter("Sources prices for MA", 1, new object[] + { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted + })] + public PriceType SourcePrice = PriceType.Close; + + // Holds MMA's smoothing values. + private Indicator mma; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public MMA() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "MMA"; + Description = "Modified Moving Average example"; + + // Defines line on demand with particular parameters. + AddLineSeries("MMA", Color.DodgerBlue, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "MMA (" + Period.ToString() + ": "+ SourcePrice.ToString() + ")"; + // Creates an instance of the proper indicator (MMA) from the default indicators list. + mma = Core.Instance.IndicatorManager.BuiltIn.MMA(Period, SourcePrice); + // Adds an auxiliary (MMA) indicator to the current one (MMA Example). + // This will let inner indicator (MMA) to be calculated in advance to the current one (MMA Example). + AddIndicator(mma); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip if count is smaller than period value. + if (Count Period) + return; + + // Sets value for displaying on the chart. + SetValue(mma.GetValue()); + } + } + } + + + Period of Modified Moving Average + Sources prices for MA + + + + + Gets the Regression indicator + The Linear Regression Indicator plots the ending value of a Linear Regression Line for a specified number of bars; showing, statistically, where the price is expected to be. + + + + using System; + using TradingPlatform.BusinessLayer; + + namespace Indicators + { + public class TestRegression : Indicator + { + #region Input params + Indicator slowRL, fastRL; + ///]]> + ///Input Parameter with an input field or checkbox (if bolean) + ///]]> + [InputParameter("Period slow", 0, 1, 9999)] + public int Rlslow = 12; + [InputParameter("Period fast", 2, 1, 9999)] + public int Rlfast = 8; + /// ]]> + /// Input Parameter with a dropdown + /// ]]> + [InputParameter("Sources prices for calculation", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + #endregion + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestRegression() + : base() + { + Name = "Regression test"; + Description = "Example of using built-in Regression indicator"; + AddLineSeries(); + } + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public override void Init() + { + ShortName = "TestRegression ("+Rlslow.ToString()+":"+Rlfast.ToString()+")"; + // Creation of an indicator with long period + slowRL = Core.Instance.IndicatorManager.BuiltIn.Regression(Rlslow, SourcePrice); + AddIndicator(slowRL); + // Creation of an indicator with short period + fastRL = Core.Instance.IndicatorManager.BuiltIn.Regression(Rlfast, SourcePrice); + AddIndicator(fastRL); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + if (Count Math.Max(Rlslow, Rlfast)) + return; + + if (fastRL.GetValue()slowRL.GetValue()) + Alert("Downgoing"); + else if (fastRL.GetValue()]]>slowRL.GetValue()) + Alert("Upgoing"); + } + } + } + + + Moving average period + Type of the price + + + + + Gets the Channel (Price Channel) indicator. + The 'Channel' indicator is based on measurement of min and max prices for the definite number of periods. + + + + using TradingPlatform.BusinessLayer; + + namespace Example + { + public class TestChannel : Indicator + { + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Period of MA for envelopes", 0, 1, 999, 1, 0)] + public int Period = 5; + + private Indicator channel; + + public TestChannel() + : base() + { + // Defines indicator's name and description. + Name = "TestChannel"; + Description = "Example of using built-in Channel indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("Highest", Color.Red, 2, LineStyle.SimpleChart); + AddLineSeries("Lowest", Color.CadetBlue, 2, LineStyle.SimpleChart); + + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestChannel (" + Period + ")"; + + // Get 'Channel' indicator from built-in indicator collection. + channel = HistoricalData.BuiltIn.Channel(Period); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get values from 'Channel' indicator lines. + var highestValue = channel.GetValue(0, 0); + var lowestValue = channel.GetValue(0, 1); + + // Set values to the 'TestChannel' buffers ('Highest' and 'Lowest' lines). + SetValue(highestValue, 0, 0); + SetValue(lowestValue, 0, 1); + } + } + } + + + Period of price channel + + + + + + Gets the AFIRMA indicator + Autoregressive finite impulse response moving average. A digital filter accurately shows the price movement as powered with least square method to minimise time lag + + + + using System; + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Indicators + { + public class TestAfirma : Indicator + { + #region Input params + Indicator Afirma, Windowing; + /// + ///Input Parameter with an input field or checkbox (if bolean) + /// + [InputParameter("Window period", 0, 1, 9999)] + public int Period = 20; + /// + /// Input Parameter with a dropdown + /// + [InputParameter("Sources prices for calculation", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + [InputParameter("Windowing function", 2, new object[]{ + "Hanning", AfirmaMode.Hanning, + "Hamming", AfirmaMode.Hamming, + "Blackman", AfirmaMode.Blackman, + "Blackman - Harris", AfirmaMode.BlackmanHarris} + )] + public AfirmaMode win = AfirmaMode.Hanning; + #endregion + public TestAfirma() + : base() + { + Name = "Afirma GAP"; + Description = "Prints gap between Window function and least-squares method"; + AddLineSeries("Line", Color.Blue, 1, LineStyle.SimpleChart); + } + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public override void Init() + { + // Creation of an indicator Windowing MA with least-squares method overlapping (Afirma) + Afirma = Core.Instance.IndicatorManager.BuiltIn.AFIRMA(Period, SourcePrice, win, true); + AddIndicator(Afirma); + // Creation of an indicator Windowing MA + Windowing = Core.Instance.IndicatorManager.BuiltIn.AFIRMA(Period, SourcePrice, win, false); + AddIndicator(Windowing); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + if (Count Period) + return; + var res = Math.Abs((Afirma.GetValue()-Windowing.GetValue()))/100; + Print(res.ToString()+" %"); + } + } + } + + + Moving average period + Type of the price + Afirma mode + with least squares method overlapping if true + + + + + Gets the RSI indicator. + Relative Strength Index (RSI) is a momentum oscillator that measures the speed and change of price movements. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + namespace Example + { + public class SmoothRSI : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("RSI Period", 0, 1, 999, 1, 0)] + public int Period = 14; + [InputParameter("EMA Period", 0, 1, 999, 1, 0)] + public int emaPeriod = 10; + #endregion Parameters + // Default will be performed on Close prices + [InputParameter("Sources prices for the RSI line", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + // Default will be performed on Simple mode + [InputParameter("Mode for the RSI line", 2, new object[] { + "Simple", RSIMode.Simple, + "Exponential", RSIMode.Exponential} + )] + public RSIMode SourceRSI = RSIMode.Exponential; + private Indicator RSI; + + public SmoothRSI() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "RSItest"; + Description = "Example of using built-in RSI indicator"; + + AddLineSeries("Smooth RSI line", Color.CadetBlue, 2, LineStyle.SimpleChart); + } + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public override void Init() + { + ShortName = "Smooth RSI ("+emaPeriod.ToString()+")"; + // Get 'RSI' indicator from built-in indicator collection. + RSI = Core.Instance.IndicatorManager.BuiltIn.RSI(Period, SourcePrice, SourceRSI); + AddIndicator(RSI); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]>. + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get MA values from 'RSI' indicator lines. + var rsiValue = RSI.GetValue(0, 1); + + // Set values to the 'SmoothRSI' buffers. + SetValue(rsiValue); + } + } + } + + + RSI Period + Price Type + RSI Mode (Simple or Exponential) + + + + + + Returns an instance of the McGinley Dynamic indicator. + McGinley Dynamic avoids of most whipsaws and it rapidly moves up or down according to a quickly changing market. It needs no adjusting because it is dynamic and it adjusts itself. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// McGinley Dynamic example. + /// ]]> + public class MD : Indicator + { + #region Parameters + + // Period of McGinley Dynamic. + [InputParameter("Period", 0, 1, 999, 1, 0)] + public int Period = 2; + + // Smoothing of McGinley Dynamic. + [InputParameter("Smoothing", 1, 1, 999, 1, 0)] + public int Smoothing = 2; + + // Price type of McGinley Dynamic. + [InputParameter("Source price", 2, new object[] + { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted + })] + public PriceType SourcePrice = PriceType.Close; + + // Holds MD's smoothing values. + private Indicator md; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public MD() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "MD"; + Description = "McGinley Dynamic example"; + + // Defines line on demand with particular parameters. + AddLineSeries("MD", Color.DodgerBlue, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "MD (" + Period.ToString() + ": " + Smoothing.ToString() + ": " + SourcePrice.ToString() + ")"; + // Creates an instance of the proper indicator from the default indicators list. + md = Core.Instance.IndicatorManager.BuiltIn.MD(Period, Smoothing, SourcePrice); + // Adds an auxiliary (MD) indicator to the current one (MD). + // This will let inner indicator (MD) to be calculated in advance to the current one (MD). + AddIndicator(md); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip if count is smaller than period value. + if (Count Period) + return; + + // Sets value for displaying on the chart. + SetValue(md.GetValue()); + } + } + } + + + Period of exponential moving average + Dynamic tracking factor + Source price type + + + + + Gets the MAE (Moving Average Envelope) indicator. + The 'MAE' indicator demonstrates a range of the prices discrepancy from a Moving Average. + + + + using TradingPlatform.BusinessLayer; + + namespace Example + { + public class TestMAE : Indicator + { + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Period of MA for envelopes", 0, 1, 999, 1, 0)] + public int Period = 5; + + // Defines the 'SourcePrice' parameter as dropdown list + [InputParameter("Sources prices for MA", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Low; + + // Defines the 'MaType' parameter as dropdown list + [InputParameter("Type of moving average", 2, new object[]{ + "Simple Moving Average", MaMode.SMA, + "Exponential Moving Average", MaMode.EMA, + "Smoothed Moving Average", MaMode.SMMA, + "Linearly Weighted Moving Average", MaMode.LWMA, + })] + public MaMode MaType = MaMode.SMA; + + // Defines the 'UpShift' parameter as input field (where 'min' is 0.1, 'max' is 1.0 and 'increment' is 0.1). + [InputParameter("Upband deviation in %", 3, 0.1, 1.0, 0.1, 1)] + public double UpShift = 0.1; + + // Defines the 'DownShift' parameter as input field (where 'min' is 0.1, 'max' is 1.0 and 'increment' is 0.1). + [InputParameter("Downband deviation in %", 4, 0.1, 1.0, 0.1, 1)] + public double DownShift = 0.1; + + private Indicator mae; + + public TestMAE() + : base() + { + // Defines indicator's name and description. + Name = "TestMAE"; + Description = "Example of using built-in MAE indicator"; + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestMAE (" + Period + ":" + UpShift + ":" + DownShift + ")"; + + // Get MAE indicator from built-in indicator collection. + mae = HistoricalData.BuiltIn.MAE(Period, SourcePrice, MaType, UpShift, DownShift); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip the history. Start calculation only on real-time data (newBar/newTick). + if (args.Reason == UpdateReason.HistoricalBar) + return; + + // Get current close price (0 offset by default) + var closePrice = Close(); + + // Show the alert window with some info. + if (closePrice ]]> mae.GetValue(0, 0)) + Alert($"The current close price is higher than 'Upper Band' line of MAE indicator"); + else if (closePrice mae.GetValue(0, 1)) + Alert($"The current close price is lower than 'Lower Band' line of MAE indicator"); + } + } + } + + + Period of MA for envelopes. + Sources prices for MA. + Type of moving average. + Upband deviation in %. + Downband deviation in %. + + + + + + Returns an instance of the Parabolic Time/Price System (SAR) indicator. + SAR indicator helps to define the direction of the prevailing trend and the moment to close positions opened during the reversal. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Parabolic Time/Price System example. + /// ]]> + public class SAR : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Step of parabolic SAR system", 0, 2)] + public double Step = 0.02; + + [InputParameter("Maximum value for the acceleration factor", 1, 1)] + public double Maximum = 0.2; + + // Holds SAR's smoothing values. + private Indicator sar; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public SAR() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "SAR"; + Description = "Parabolic Time/Price System example"; + + // Defines line on demand with particular parameters. + AddLineSeries("SAR", Color.Firebrick, 4, LineStyle.DotChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "SAR (" + Step.ToString() + ": " + Maximum.ToString() + ")"; + // Creates an instance of the proper indicator (SAR) from the default indicators list. + sar = Core.Instance.IndicatorManager.BuiltIn.SAR(Step, Maximum); + // Adds an auxiliary (SAR) indicator to the current one (SAR Example). + // This will let inner indicator (SAR) to be calculated in advance to the current one (SAR Example). + AddIndicator(sar); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(sar.GetValue()); + } + } + } + + + Step of parabolic SAR system + Maximum value for the acceleration factor + + + + + + Gets the AO (Awesome Oscillator) indicator. + The 'AO' indicator determines market momentum. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestAO : Indicator + { + private Indicator ao; + + public TestAO() + : base() + { + // Defines indicator's name and description. + Name = "Test AO"; + Description = "Example of using built-in AO indicator"; + + // Define two lines (on sub window) with particular parameters + AddLineSeries("AO", Color.Gray, 3, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestAO"; + + // Get 'AO' indicator from built-in indicator collection. + ao = HistoricalData.BuiltIn.AO(); + } + + public override void OnUpdate(UpdateArgs args) + { + // Get AO indicator value. + var aoValue = ao.GetValue(); + + // The AO has fixed periods (9 and 34) in own calculation. + // We check, if 'aoValue' is 'NaN' (That's mean, at this moment, the 'Count' isn't enough for correct calculation of AO) + // then we skip our logic below. + if (aoValue == double.NaN) + return; + + // Set values to 'AO' line buffer. + SetValue(aoValue); + + } + } + } + + + + + + + Gets the CMO (Chande Momentum Oscillator) indicator. + The CMO calculates the dividing of difference between the sum of all recent gains and the sum of all recent losses by the sum of all price movement over the period. + + + + using TradingPlatform.BusinessLayer; + + namespace Example + { + public class TestCMO : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("Period of MA for envelopes", 0, 1, 999, 1, 0)] + public int Period = 8; + + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for MA", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + private Indicator cmo; + + private LineLevel upLevel; + private LineLevel downLevel; + + public TestCMO() + : base() + { + // Defines indicator's name and description. + Name = "Test CMO"; + Description = "Example of using built-in CMO indicator"; + } + + public override void Init() + { + /// Serves for an identification of related indicators with different parameters. + ShortName = "TestCMO (" + Period + ":" + SourcePrice + ")"; + + // Get 'CMO' indicator from built-in indicator collection. + cmo = HistoricalData.BuiltIn.CMO(Period, SourcePrice); + + // Get 'CMO' levels, if indicator was created. + if (cmo null) + { + upLevel = cmo.LinesLevels[0]; + downLevel = cmo.LinesLevels[1]; + } + } + + public override void OnUpdate(UpdateArgs args) + { + // Call the calculation below, only on HistoricalBar of NewBar. + if (args.Reason UpdateReason.NewTick) + return; + + // Check if we got 'CMO' levels. + if (upLevel null downLevel null) + return; + + // Get current 'CMO' value. + var cmoValue = cmo.GetValue(); + + // Show an alert window with some info. + if (cmoValue ]]> upLevel.Level) + Alert($"{Name}. The CMO value is higher than {upLevel.Name} level."); + else if (cmoValue downLevel.Level) + Alert($"{Name}. The CMO value is lower than {downLevel.Name} level."); + } + } + } + + + Period of MA for envelopes. + Sources prices for MA. + + + + + + Returns an instance of the ZigZag indicator. + ZigZag is a trend following indicator that is used to predict when a given symbol's momentum is reversing. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// + /// ZigZag example. + /// + public class ZZ : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Percent Deviation", 0, 0.01, 1.5, 0.01, 2)] + public double deviation = 1; + + // Holds ZigZag's smoothing values. + private Indicator zz; + + #endregion + + /// + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// + public ZZ() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "ZigZag"; + Description = "ZigZag example"; + + // Defines line on demand with particular parameters. + AddLineSeries("ZZ'Line", Color.DarkOrange, 2, LineStyle.DotChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "ZZ (" + deviation.ToString() + ")"; + // Creates an instance of the proper indicator (ZZ) from the default indicators list. + zz = Core.Instance.IndicatorManager.BuiltIn.ZZ(deviation); + // Adds an auxiliary (ZZ) indicator to the current one (ZZ Example). + // This will let inner indicator (ZZ) to be calculated in advance to the current one (ZZ Example). + AddIndicator(zz); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(zz.GetValue()); + } + } + } + + + Percent Deviation + + + + + + Gets the Aroon indicator. + Reveals the beginning of a new trend and determines how strong it is + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class AroonTest : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Aroon Period", 0, 1, 999, 1, 0)] + public int Period = 14; + #endregion Parameters + + private Indicator Aroon; + + public AroonTest() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "AroonTest"; + Description = "Example of using built-in Aroon indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("Up line", Color.Red, 2, LineStyle.SimpleChart); + AddLineSeries("Down line", Color.CadetBlue, 2, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "Arron ("+Period.ToString()+")"; + // Get 'Arron' indicator from built-in indicator collection. + Aroon = Core.Instance.IndicatorManager.BuiltIn.AROON(Period); + AddIndicator(Aroon); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (CountPeriod) + return; + + // Get values from 'Aroon' indicator lines. + var highestValue = Aroon.GetValue(0, 0); + var lowestValue = Aroon.GetValue(0, 1); + + // Set values to the 'AroonTest' buffers ('Highest' and 'Lowest' lines). + SetValue(highestValue, 0, 0); + SetValue(lowestValue, 0, 1); + } + } + } + + + Aroons period + + + + + + Returns an instance of the Standart Deviation (SD) indicator. + The SD shows the difference of the volatility value from the average one. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Standard Deviation example. + /// ]]> + public class SD : Indicator + { + #region Parameters + + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for MA", 0, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period", 2, 1, 999, 1, 0)] + public int Period = 20; + + // Holds SD's smoothing values. + private Indicator sd; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public SD() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Standard Deviation"; + Description = "Standard Deviation example"; + + // Defines line on demand with particular parameters. + AddLineSeries("SD'Line", Color.Blue, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "SD (" + Period.ToString() + ": " + SourcePrice.ToString() + ": " + MAType.ToString() + ")"; + // Creates an instance of the proper indicator (SD) from the default indicators list. + sd = Core.Instance.IndicatorManager.BuiltIn.SD(Period, SourcePrice, MAType); + // Adds an auxiliary (SD) indicator to the current one (SD Example). + // This will let inner indicator (SD) to be calculated in advance to the current one (SD Example). + AddIndicator(sd); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(sd.GetValue()); + } + } + } + + + Period of indicator + Sources prices for MA + Type of Moving Average + + + + + + Gets the MACD (Moving Average Convergence/Divergence) indicator. + The MACD is a trend-following momentum indicator that shows the relationship between two moving averages of prices. + + + + using TradingPlatform.BusinessLayer; + using System.Linq; + + namespace Example + { + public class TestMACD : Indicator + { + // Display input parameters as input fields. + [InputParameter("Period of fast EMA", 0, 1, 999, 1, 0)] + public int FastPeriod = 12; + + [InputParameter("Period of slow EMA", 1, 1, 999, 1, 0)] + public int SlowPeriod = 26; + + [InputParameter("Period of signal EMA", 2, 1, 999, 1, 0)] + public int SignalPeriod = 9; + + private int maxPeriod; + private Indicator macd; + + public TestMACD() + : base() + { + // Defines indicator's name and description. + Name = "Test MACD"; + Description = "Example of using built-in MACD indicator"; + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestMACD (" + FastPeriod + ":" + SlowPeriod + ":" + SignalPeriod + ")"; + + // Find the max period. + maxPeriod = Enumerable.Max(new int[] { FastPeriod, SlowPeriod, SignalPeriod }); + + // Get MACD indicator from built-in indicator collection and add it to the current one as auxiliary. + macd = Core.Instance.IndicatorManager.BuiltIn.MACD(FastPeriod, SlowPeriod, SignalPeriod); + AddIndicator(macd); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip the history. Start calculation only on real-time data (newBar/newTick). + if (args.Reason UpdateReason.HistoricalBar) + return; + + // Get the current and previoud signal line values of MACD indicator (1 line index). + var currSignal = macd.GetValue(0, 1); + var prevSignal = macd.GetValue(1, 1); + + // Show an alert window with some info. + if (prevSignal 0d currSignal ]]> 0d) + Alert("The 'Signal' line crosses of zero line from bottom to top."); + else if (prevSignal ]]> 0d currSignal 0d) + Alert("The 'Signal' line crosses of zero line from top to bottom."); + } + } + } + + + Period of fast EMA. + Period of slow EMA. + Period of signal EMA. + + + + + + Returns an instance of the Kairi Relative Index (KRI) indicator. + KRI calculates deviation of the current price from its simple moving average as a percent of the moving average. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Kairi Relative Index example. + /// ]]> + public class KRI : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period", 2, 1, 999, 1, 0)] + public int Period = 20; + + // Holds KRI's values. + private Indicator kri; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public KRI() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Kairi Relative Index"; + Description = "Kairi Relative Index example"; + + // Defines line on demand with particular parameters. + AddLineSeries("SD'Line", Color.Blue, 1, LineStyle.SimpleChart); + AddLineLevel(0, "0'Line", Color.Gray, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "KRI (" + Period.ToString() + ")"; + // Creates an instance of the proper indicator (KRI) from the default indicators list. + kri = Core.Instance.IndicatorManager.BuiltIn.KRI(Period); + // Adds an auxiliary (KRI) indicator to the current one (KRI Example). + // This will let inner indicator (KRI) to be calculated in advance to the current one (KRI Example). + AddIndicator(kri); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(kri.GetValue()); + } + } + } + + + + + + + + + Returns an instance of the Bollinger Bands Flat (BBF) indicator. + The BBF provides the same data as BB, but drawn in separate field and easier to recognize whether price is in or out of the band. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Bollinger Bands Flat example. + /// ]]> + public class BBF : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period", 0, 1, 999, 1, 0)] + public int Period = 9; + + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for MA", 2, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Deviation", 3, 0.01, 3, 0.01, 2)] + public double Deviation = 1.5; + + // Holds BBF's values. + private Indicator bbf; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public BBF() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Bollinger Bands Flat"; + Description = "Bollinger Bands Flat example"; + + // Defines line on demand with particular parameters. + AddLineSeries("+SD", Color.Red, 1, LineStyle.SimpleChart); + AddLineSeries("-SD", Color.Red, 1, LineStyle.SimpleChart); + AddLineSeries("BBF'Line", Color.FromArgb(0, 51, 252), 1, LineStyle.SimpleChart); + AddLineLevel(0, "0'Line", Color.Aqua, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "BBF (" + Period.ToString() + ")"; + // Creates an instance of the proper indicator (BBF) from the default indicators list. + bbf = Core.Instance.IndicatorManager.BuiltIn.BBF(Period, Deviation, SourcePrice, MAType); + // Adds an auxiliary (BBF) indicator to the current one (BBF Example). + // This will let inner indicator (BBF) to be calculated in advance to the current one (BBF Example). + AddIndicator(bbf); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets relevant values for displaying on the chart. + for (int i = 0; i bbf.LinesSeries.Length; i++) + { + SetValue(bbf.GetValue(0,i),0,i); + } + } + } + } + + + Period + Deviation + Sources prices for MA + Type of Moving Average + + + + + + Gets the ROC (Rate of Change) indicator. + The ROC shows the speed at which price is changing. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestROC : Indicator + { + // Displays 'Period' input parameter as input field. + [InputParameter("Period of momentum", 0, 1, 999, 1, 0)] + public int Period = 20; + + private Indicator roc; + private LineLevel zeroLevel; + + public TestROC() + : base() + { + // Serves for an identification of related indicators. + Name = "Test ROC"; + Description = "Example of using built-in ROC indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("Signal", Color.DodgerBlue, 5, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestROC (" + Period + ")"; + + // Get ROC indicator from built-in indicator collection + roc = Core.Instance.IndicatorManager.BuiltIn.ROC(Period); + + // Get an instance of level line from ROC indicator. + zeroLevel = roc.LinesLevels[0]; + + // Attach the 'ROC' indicator to the current 'TestROC'. + AddIndicator(roc); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Start the calculation only on HistoricalBar or NewBar. + if (args.Reason UpdateReason.NewTick) + return; + + // Get current and previous values of ROC indicator. + var currROC = roc.GetValue(0); + var prevROC = roc.GetValue(1); + + // Assign 0 to a signal variable by default . + var signal = 0; + + // Change the signal value if the crossing of 'ROC' indicator with zero level was happened. + if (currROC ]]> zeroLevel.Level prevROC zeroLevel.Level) + signal = 1; + else if (currROC zeroLevel.Level prevROC ]]> zeroLevel.Level) + signal = -1; + + // Set signal value to a 'Signal' line buffer. + SetValue(signal); + } + } + } + + + Period of momentum. + + + + + + Gets the Momentum indicator. + Momentum compares where the current price is in relation to where the price was in the past. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + namespace Example + { + public class TestMomentum : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Momentum Period", 0, 1, 999, 1, 0)] + public int Period = 20; + #endregion Parameters + + private Indicator Momentum; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestMomentum() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestMomentum"; + Description = "Example of using built-in Momentum indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("Signal", Color.DodgerBlue, 5, LineStyle.HistogrammChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "Momentum ("+Period.ToString()+")"; + // Get 'Momentum' indicator from built-in indicator collection. + Momentum = Core.Instance.IndicatorManager.BuiltIn.Momentum(Period,PriceType.Close); + AddIndicator(Momentum); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get values from 'Momentum' indicator lines. + var MomentumNew = Momentum.GetValue(); + if(MomentumNew>0) + Print("Upward movement"); + else + Print("Downward movement"); + } + } + } + + + Period for Momentum + Sources prices for Momentum + + + + + + Gets the %R Larry Williams. + Uses Stochastic to determine overbought and oversold levels. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestRLW : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("RLW Period", 0, 1, 999, 1, 0)] + public int Period = 20; + #endregion Parameters + + private Indicator RLW; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestRLW() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestRLW"; + Description = "Example of using built-in RLW indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries(); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "RLW ("+Period.ToString()+")"; + // Get 'RLW' indicator from built-in indicator collection. + RLW = Core.Instance.IndicatorManager.BuiltIn.RLW(Period); + AddIndicator(RLW); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get values from 'RLWNew' indicator lines. + var RLWNew = RLW.GetValue(); + if(args.Reason != UpdateReason.NewTick RLWNew]]>70) + Print("Upward movement"); + else if(args.Reason != UpdateReason.NewTick RLWNew 20) + Print("Downward movement"); + } + } + } + + + Period for Momentum + + + + + + Returns an instance of the Price Oscillator (PO) indicator. + PO calculates the variation between price moving averages. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Price Oscillator example. + /// ]]> + public class PO : Indicator + { + #region Parameters + + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Moving Average", 0, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + [InputParameter("Sources prices for MA", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period of MA1", 2)] + public int MAPeriod1 = 2; + + [InputParameter("Period of MA2", 3)] + public int MAPeriod2 = 25; + + // Holds PO's values. + private Indicator po; + + #endregion + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public PO() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Price Oscillator"; + Description = "Price Oscillator example"; + + // Defines line on demand with particular parameters. + AddLineSeries("PO'Line", Color.Blue, 1, LineStyle.SimpleChart); + AddLineLevel(0, "0'Line", Color.Gray, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "PO (" + MAPeriod1.ToString() + ": " + MAPeriod2.ToString() + ": " + SourcePrice.ToString() + ": " + MAType.ToString() + ")"; + // Creates an instance of the proper indicator (PO) from the default indicators list. + po = Core.Instance.IndicatorManager.BuiltIn.PO(MAPeriod1, MAPeriod2, SourcePrice, MAType); + // Adds an auxiliary (PO) indicator to the current one (PO Example). + // This will let inner indicator (PO) to be calculated in advance to the current one (PO Example). + AddIndicator(po); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(po.GetValue()); + } + } + } + + + Period of MA1 + Period of MA2 + Sources prices for MA + Type of Moving Average + + + + + + Gets the OsMA (Moving Average of Oscillator) indicator. + The OsMA reflects the difference between an oscillator (MACD) and its moving average (signal line). + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + using System.Linq; + + namespace Example + { + public class TestOsMA : Indicator + { + // Display input parameters as input fields. + [InputParameter("Period of fast EMA", 0, 1, 999, 1, 0)] + public int FastPeriod = 12; + + [InputParameter("Period of slow EMA", 1, 1, 999, 1, 0)] + public int SlowPeriod = 26; + + [InputParameter("Period of signal EMA", 2, 1, 999, 1, 0)] + public int SignalPeriod = 9; + + private int maxPeriod; + private Indicator osma; + + public TestOsMA() + : base() + { + // Defines indicator's name and description. + Name = "Test OsMA"; + Description = "Example of using built-in OsMA indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("OsMA", Color.Orange, 4, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestOsMA (" + FastPeriod + ":" + SlowPeriod + ":" + SignalPeriod + ")"; + + // Find the max period. + maxPeriod = Enumerable.Max(new int[] { FastPeriod, SlowPeriod, SignalPeriod }); + + // Get OsMA indicator from built-in indicator collection and add it to the current one as auxiliary. + osma = Core.Instance.IndicatorManager.BuiltIn.OsMA(FastPeriod, SlowPeriod, SignalPeriod); + AddIndicator(osma); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip max period for correct calculation. + if (Count maxPeriod) + return; + + // Get value from OsMA indicator. + var value = osma.GetValue(0, 0); + + // Set value to the 'OsMA' line buffer. + SetValue(value); + } + } + } + + + Period of fast EMA. + Period of slow EMA. + Period of signal EMA. + + + + + + Gets On Balance Volume. + On Balance Volume (OBV) measures buying and selling pressure as a cumulative indicator that adds volume on up days and subtracts volume on down days. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestOBV : Indicator + { + #region Paramaters + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for OBV", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + #endregion Parameters + + private Indicator OBV; + + public TestOBV() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestOBV"; + Description = "Example of using built-in OBV indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries(); + } + public override void Init() + { + ShortName = "OBV ("+SourcePrice.ToString()+")"; + // Get 'OBV' indicator from built-in indicator collection. + OBV = Core.Instance.IndicatorManager.BuiltIn.OBV(SourcePrice); + AddIndicator(OBV); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count 1) + return; + + // Get values from 'OBV' indicator lines. + var OBVNew = OBV.GetValue(); + SetValue(OBVNew); + } + } + } + + + Sources prices for OBV + + + + + + Returns an instance of the Positive Volume Index (PVI) indicator. + The PVI value changes on the periods in which value of volume has increased in comparison with the previous period. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Positive Volume Index example. + /// ]]> + public class PVI : Indicator + { + #region Parameters + + // Displays Input Parameter as dropdown list. + [InputParameter("Source price", 0, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + #endregion + + // Holds PVI's values. + private Indicator pvi; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public PVI() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Positive Volume Index"; + Description = "Positive Volume Index example"; + + // Defines line on demand with particular parameters. + AddLineSeries("PVI'Line", Color.Blue, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "PVI (" + SourcePrice.ToString() + ")"; + // Creates an instance of the proper indicator (PVI) from the default indicators list. + pvi = Core.Instance.IndicatorManager.BuiltIn.PVI(SourcePrice); + // Adds an auxiliary (PVI) indicator to the current one (PVI Example). + // This will let inner indicator (PVI) to be calculated in advance to the current one (PVI Example). + AddIndicator(pvi); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(pvi.GetValue()); + } + } + } + + + + + + + + + Returns an instance of the Volume indicator. + Volume allows to confirm the strength of a trend or to suggest about it's weakness. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Volume example. + /// ]]> + public class Volume : Indicator + { + // Holds Volume's values. + private Indicator volume; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public Volume() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Volume"; + Description = "Volume example"; + + // Defines line on demand with particular parameters. + AddLineSeries("Volume'Line", Color.Gray, 1, LineStyle.HistogrammChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "Volume"; + // Creates an instance of the proper indicator (Volume) from the default indicators list. + volume = Core.Instance.IndicatorManager.BuiltIn.Volume(); + // Adds an auxiliary (Volume) indicator to the current one (Volume Example). + // This will let inner indicator (Volume) to be calculated in advance to the current one (Volume Example). + AddIndicator(volume); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(volume.GetValue()); + } + } + } + + + + + + + + Gets the MFI(Money Flow Index) indicator. + The MFI(Money Flow Index) is an oscillator that uses both price and volume to measure buying and selling pressure. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestMFI : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("MFI Period", 0, 1, 999, 1, 0)] + public int Period = 14; + + private Indicator mfi; + private LineLevel upLevel; + private LineLevel downLevel; + + public TestMFI() + : base() + { + // Serves for an identification of related indicators. + Name = "Test MFI"; + Description = "Example of using built-in MFI indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("MFI", Color.Orange, 5, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestMFI (" + Period + ")"; + + // Get MFI indicator from built-in indicator collection + mfi = Core.Instance.IndicatorManager.BuiltIn.MFI(Period); + + // Get an instance of level lines from MFI indicator. + upLevel = mfi.LinesLevels[0]; + downLevel = mfi.LinesLevels[1]; + + // Attach the 'MFI' indicator to the current 'TestMFI'. + AddIndicator(mfi); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Start the calculation only on HistoricalBar or NewBar. + if (args.Reason UpdateReason.NewTick) + return; + + // Get current and previous values of MFI indicator. + var currMFI = mfi.GetValue(0); + var prevMFI = mfi.GetValue(1); + + // Assign 0 to a signal variable by default . + var signal = 0; + + // Change the signal value if the crossing of 'ROC' indicator with zero level was happened. + if (currMFI ]]> upLevel.Level prevMFI upLevel.Level) + signal = 1; + else if (currMFI downLevel.Level prevMFI ]]> downLevel.Level) + signal = -1; + + // Set signal value to a 'Signal' line buffer. + SetValue(signal); + } + } + } + + + Period of MFI. + + + + + + Returns an instance of the Acceleration/Deceleration Oscillator (AC). + AC measures the acceleration and deceleration of the current momentum. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Acceleration Oscillator example. + /// ]]> + public class AC : Indicator + { + // Holds AC's values. + private Indicator ac; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public AC() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Acceleration Oscillator"; + Description = "Acceleration Oscillator example"; + + // Defines line on demand with particular parameters. + AddLineSeries("AC'Line", Color.Gray, 1, LineStyle.HistogrammChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "AC"; + // Creates an instance of the proper indicator (AC) from the default indicators list. + ac = Core.Instance.IndicatorManager.BuiltIn.AC(); + // Adds an auxiliary (AC) indicator to the current one (AC Example). + // This will let inner indicator (AC) to be calculated in advance to the current one (AC Example). + AddIndicator(ac); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(ac.GetValue()); + } + } + } + + + + + + + + Gets the Average True Range (ATR) indicator. + The ATR measures of market volatility. + + + + using TradingPlatform.BusinessLayer; + using System; + + namespace Example + { + public class TestATR : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("Period", 0, 1, 999, 1, 0)] + public int Period = 20; + + // Displays Input Parameter as input field. + [InputParameter("Period of Moving Average (ATR)", 1, 1, 999, 1, 0)] + public int AtrPeriod = 13; + + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Moving Average (ATR)", 2, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Smoothed", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + private Indicator atr; + private int maxPeriod; + + public TestATR() + : base() + { + // Defines indicator's name and description. + Name = "TestATR"; + Description = "Example of using built-in ATR indicator"; + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "My indicator ("+ Period + ":" + AtrPeriod + ":" + MAType.ToString() + ")"; + + // Get ATR indicator from built-in indicator collection. + atr = Core.Instance.IndicatorManager.BuiltIn.ATR(AtrPeriod, MAType); + + maxPeriod = Math.Max(Period, AtrPeriod); + + // Add auxiliary ATR indicator to the current one. + AddIndicator(atr); + } + + public override void OnUpdate(UpdateArgs args) + { + // Launch calculation every NewBar only. + if (args.Reason UpdateReason.NewBar) + return; + + // Skip max period. + if (Count maxPeriod) + return; + + // Get the highest and lowest values of ATR on the interval. + var highestATR = GetHighestATR(0, Period); + var lowestATR = GetLowestATR(0, Period); + + // Show alert window with usefull information. + Alert($"The highest ATR value on the interval is : {highestATR}\n" + + $"The lowest ATR value on the interval is : {lowestATR}"); + } + + private double GetHighestATR(int startOffset, int count) + { + // Find the highest value of ATR indicator on the specific interval. + int maxValueOffset = startOffset; + for (int i = 0; i count; i++) + { + if (atr.GetValue(maxValueOffset) atr.GetValue(startOffset + i)) + maxValueOffset = startOffset + i; + } + return maxValueOffset; + } + + private double GetLowestATR(int startOffset, int count) + { + // Find the lowest value of ATR indicator on the specific interval. + int minValueOffset = startOffset; + for (int i = 0; i count; i++) + { + if (atr.GetValue(minValueOffset) ]]> atr.GetValue(startOffset + i)) + minValueOffset = startOffset + i; + } + return minValueOffset; + } + } + } + + + + Period of Moving Average. + Type of Moving Average + + + + + Returns an instance of the Kaufman Adaptive Moving Average (KAMA) indicator. + KAMA is an exponential style average with a smoothing that varies according to recent data. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Kaufman Adaptive Moving Average example. + /// ]]> + public class KAMA : Indicator + { + #region Parameters + + // Defines initial parameters. + [InputParameter("Period", 0, 1, 9999)] + public int periodAMA = 10; + + [InputParameter("#Fast", 1, 1, 500, 1)] + public double nfast = 2.0; + + [InputParameter("#Slow", 2, 1, 500, 1)] + public double nslow = 30.0; + + [InputParameter("G", 3, 1, 10, 0.1)] + public double G = 2.0; + + [InputParameter("dK", 4, 1, 10, 0.1)] + public double dK = 2.0; + + // Displays Input Parameter as dropdown list. + [InputParameter("Sources prices for MA", 5, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Median", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + // Displays Input Parameter as dropdown list. + [InputParameter("AMA Trend Type", 6, new object[] { + "Fixed", AMATrendType.Fixed, + "Average", AMATrendType.Average } + )] + public AMATrendType AMA_Trend_Type; + + #endregion + + // Holds KAMA's values. + private Indicator kama; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public KAMA() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Kaufman Adaptive Moving Average example"; + Description = "Kaufman Adaptive Moving Average example"; + + // Defines line on demand with particular parameters. + AddLineSeries("KAMA'Line", Color.Gray, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "KAMA (" + periodAMA.ToString() + ": " + nfast.ToString() + ": " + nslow.ToString() + ": " + G.ToString() + ": " + dK.ToString() + ")"; + // Creates an instance of the proper indicator (KAMA) from the default indicators list. + kama = Core.Instance.IndicatorManager.BuiltIn.KAMA(periodAMA,nfast, nslow, G, dK, SourcePrice, AMA_Trend_Type); + // Adds an auxiliary (KAMA) indicator to the current one (KAMA Example). + // This will let inner indicator (KAMA) to be calculated in advance to the current one (KAMA Example). + AddIndicator(kama); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(kama.GetValue()); + } + } + } + + + Period + Fast factor + Slow factor + G coefficient + dK coefficient + Sources prices for MA + AMA Trend Type + + + + + + Returns an instance of the Qstick indicator. + The Qstick is a moving average that shows the difference between the prices at which an issue opens and closes. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Qstick example. + /// ]]> + public class Qstick : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period", 0, 1, 999, 0, 0)] + public int Period = 20; + + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + #endregion + + // Holds Qstick's values. + private Indicator qstick; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public Qstick() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Qstick example"; + Description = "Qstick example"; + + // Defines line on demand with particular parameters. + AddLineSeries("Qstick'Line", Color.Gray, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "Qstick (" + Period.ToString() + ": " + MAType.ToString() + ")"; + // Creates an instance of the proper indicator (Qstick) from the default indicators list. + qstick = Core.Instance.IndicatorManager.BuiltIn.Qstick(Period, MAType); + // Adds an auxiliary (Qstick) indicator to the current one (Qstick Example). + // This will let inner indicator (Qstick) to be calculated in advance to the current one (Qstick Example). + AddIndicator(qstick); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets value for displaying on the chart. + SetValue(qstick.GetValue()); + } + } + } + + + + + + + + + + Get the Swing Index (SI) indicator. + The SI is used to confirm trend line breakouts on price charts. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestSI : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("Divider", 0, 0.1, 9999.0, 0.1, 1)] + public double Divider = 300.0; + + [InputParameter("The interval for calculation of percentile", 1, 1, 999, 1, 0)] + public int PercInterval = 100; + + private Indicator si; + + public TestSI() + : base() + { + // Defines indicator's name and description. + Name = "Test SI"; + Description = "Example of using built-in SI indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("Percentile", Color.HotPink, 1, LineStyle.SimpleChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = $"TestSI (" + Divider + ":"+ PercInterval +")"; + + // Get SI indicator from built-in indicator collection. + si = Core.Instance.IndicatorManager.BuiltIn.SI(Divider); + + // Add auxiliary SI indicator to the current one. + AddIndicator(si); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count PercInterval) + return; + + // Get a current SI value. + double siValue = si.GetValue(); + + // Calculate a percentile of current SI value. + var percentile = CalculatePercentile(0, PercInterval, siValue); + + // Set value to "Percentile" line buffer. + SetValue(percentile, 0, 0); + } + + private double CalculatePercentile(int startOffset, int inteval, double value) + { + // Calculate the count of all SI values, + // which are equal or less than the current SI value on an interval. + double count = 0d; + if (inteval 0) + return 0d; + + for (int i = startOffset; i inteval; i++) + { + if (si.GetValue(i) value) + count = count + 1.0; + } + return count / inteval * 100d; + } + } + } + + + The divider. + + + + + + Get the True Strength Index (TSI) indicator. + + The TSI is a variation of the Relative Strength Indicator which uses a doubly-smoothed + EMA of price momentum to eliminate choppy price changes and spot trend changes. + + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestTSI : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("First MA period", 0, 1, 999, 1, 0)] + public int FirstPeriod = 5; + + // Displays Input Parameter as input field. + [InputParameter("Second MA period", 1, 1, 999, 1, 0)] + public int SecondPeriod = 8; + + [InputParameter("The interval for calculation of percentile", 2, 1, 999, 1, 0)] + public int PercInterval = 100; + + private Indicator tsi; + + public TestTSI() + : base() + { + // Defines indicator's name and description. + Name = "Test TSI"; + Description = "Example of using built-in TSI indicator"; + + // Defines line on demand with particular parameters. + AddLineSeries("Percentile", Color.Orange, 1, LineStyle.HistogrammChart); + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestTSI (" + FirstPeriod + ":" + SecondPeriod + ":" + PercInterval + ")"; + + // Get TSI indicator from built-in indicator collection. + tsi = Core.Instance.IndicatorManager.BuiltIn.TSI(FirstPeriod, SecondPeriod); + + // Add auxiliary TSI indicator to the current one. + AddIndicator(tsi); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count PercInterval) + return; + + // Get a current TSI value. + double tsiValue = tsi.GetValue(); + + // Calculate a percentile of current TSI value. + var percentile = CalculatePercentile(0, PercInterval, tsiValue); + + // Set value to "Percentile" line buffer. + SetValue(percentile, 0, 0); + } + + private double CalculatePercentile(int startOffset, int inteval, double value) + { + // Calculate the count of all TSI values, + // which are equal or less than the current TSI value on an interval. + double count = 0d; + if (inteval 0) + return 0d; + + for (int i = startOffset; i inteval; i++) + { + if (tsi.GetValue(i) value) + count = count + 1.0; + } + return count / inteval * 100d; + } + } + } + + + First MA period. + Second MA period. + + + + + + Returns an instance of the Average Directional Index (ADX) indicator. + The ADX determines the strength of a prevailing trend. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// ADX example. + /// ]]> + public class ADX : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period", 0, 1, 999, 0, 0)] + public int Period = 20; + + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + #endregion + + // Holds ADX's values. + private Indicator adx; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public ADX() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "ADX example"; + Description = "ADX example"; + + // Defines line on demand with particular parameters. + AddLineSeries("ADX'Line", Color.Green, 1, LineStyle.SimpleChart); + AddLineSeries("+DI'Line", Color.Blue, 1, LineStyle.SimpleChart); + AddLineSeries("-DI'Line", Color.Red, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "ADX (" + Period.ToString() + ": " + MAType.ToString() + ")"; + // Creates an instance of the proper indicator (ADX) from the default indicators list. + adx = Core.Instance.IndicatorManager.BuiltIn.ADX(Period, MAType); + // Adds an auxiliary (ADX) indicator to the current one (ADX Example). + // This will let inner indicator (ADX) to be calculated in advance to the current one (ADX Example). + AddIndicator(adx); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets values for the displaying on the chart. + for (int i = 0; i adx.LinesSeries.Length; i++) + { + SetValue(adx.GetValue(0,i),0,i); + } + } + } + } + + + Period + Type of Moving Average + + + + + + Returns an instance of the Keltner Channel indicator. + Keltner Channels are volatility-based envelopes set above and below an exponential moving average. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// Keltner example. + /// ]]> + public class Keltner : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Sources prices for MA", 0, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType SourcePrice = PriceType.Close; + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + // Displays Input Parameter as dropdown list. + [InputParameter("Period of MA for Keltner's Channel", 2, 1, 9999, 1)] + public int Period = 5; + + // Displays Input Parameter as dropdown list. + [InputParameter("Coefficient of channel's width", 3, 1, 100)] + public double Offset = 2; + + #endregion + + // Holds Keltner's values. + private Indicator keltner; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public Keltner() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "Keltner example"; + Description = "Keltner example"; + + // Defines line on demand with particular parameters. + AddLineSeries("MA'Line", Color.Coral, 1, LineStyle.SimpleChart); + AddLineSeries("+ATR'Line", Color.Red, 1, LineStyle.SimpleChart); + AddLineSeries("-ATR'Line", Color.Purple, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "Keltner (" + Period.ToString() + ": " + Offset.ToString() + ": " + SourcePrice.ToString() + ": " + MAType.ToString() + ")"; + // Creates an instance of the proper indicator (Keltner) from the default indicators list. + keltner = Core.Instance.IndicatorManager.BuiltIn.Keltner(Period, Offset, SourcePrice, MAType); + // Adds an auxiliary (Keltner) indicator to the current one (Keltner Example). + // This will let inner indicator (Keltner) to be calculated in advance to the current one (Keltner Example). + AddIndicator(keltner); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets values for the displaying on the chart. + for (int i = 0; i keltner.LinesSeries.Length; i++) + { + SetValue(keltner.GetValue(0,i),0,i); + } + } + } + } + + + Period of MA for Keltner's Channel + Coefficient of channel's width + Sources prices for MA + Type of Moving Average + + + + + + Returns an instance of the Percentage Price Oscillator (PPO). + Percentage Price Oscillator is a momentum indicator. Signal line is EMA of PPO. Formula: (FastEMA-SlowEMA)/SlowEMA. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace IndicatorExample + { + /// ]]> + /// PPO example. + /// ]]> + public class PPO : Indicator + { + #region Parameters + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Fast EMA Period", 0)] + public int fastEmaPeriod = 12; + + [InputParameter("Slow EMA Period", 1)] + public int slowEmaPeriod = 26; + + [InputParameter("Signal EMA Period", 2)] + public int signalEmaPeriod = 9; + + #endregion + + // Holds PPO's values. + private Indicator ppo; + + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public PPO() + : base() + { + // Defines indicator's group, name and description. + Group = "Custom"; + Name = "PPO example"; + Description = "PPO example"; + + // Defines line on demand with particular parameters. + AddLineSeries("PPO'Line", Color.SkyBlue, 2, LineStyle.SimpleChart); + AddLineSeries("Signal'Line", Color.Red, 1, LineStyle.SimpleChart); + } + + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) updates. + /// ]]> + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "PPO (" + fastEmaPeriod.ToString() + ": " + slowEmaPeriod.ToString() + ": " + signalEmaPeriod.ToString() + ")"; + // Creates an instance of the proper indicator (PPO) from the default indicators list. + ppo = Core.Instance.IndicatorManager.BuiltIn.PPO(fastEmaPeriod, slowEmaPeriod, signalEmaPeriod); + // Adds an auxiliary (PPO) indicator to the current one (PPO Example). + // This will let inner indicator (PPO) to be calculated in advance to the current one (PPO Example). + AddIndicator(ppo); + } + + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Sets values for the displaying on the chart. + for (int i = 0; i ppo.LinesSeries.Length; i++) + { + SetValue(ppo.GetValue(0,i),0,i); + } + } + } + } + + + Fast EMA Period + Slow EMA Period + Signal EMA Period + + + + + + Gets the Stochastic Slow. + Shows the location of the current close relative to the high/low range over a set number of periods (Slow). + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + namespace Example + { + public class TestStochastic : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Stochastic Period", 0, 1, 999, 1, 0)] + public int Period = 20; + [InputParameter("Smooth Period", 0, 1, 999, 1, 0)] + public int Smooth = 3; + [InputParameter("DoubleSmooth Period", 0, 1, 999, 1, 0)] + public int DoubleSmooth = 6; + #endregion Parameters + + private Indicator Stoch; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestStochastic() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestStochastic"; + Description = "Example of using built-in Stochastic indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("Stochastic", Color.Green, 1, LineStyle.SimpleChart); + AddLineSeries("Stochastic Smoothed", Color.LightSkyBlue, 1, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "TestStochastic " + Period.ToString(); + // Get 'Stochastic' indicator from built-in indicator collection. + Stoch = Core.Instance.IndicatorManager.BuiltIn.Stochastic(Period, Smooth, DoubleSmooth, MaMode.LWMA); + AddIndicator(Stoch); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get values from 'Stoch' indicator lines. + var StochNew = Stoch.GetValue(); + var StochNewMA = Stoch.GetValue(0,1); + SetValue(StochNew); + SetValue(StochNewMA,0,1); + } + } + } + + + Period + Smoothing + Double smoothing + Moving type + + + + + + Gets the Stochastic x Relative Strength Index. + StochRSI is an oscillator that measures the level of RSI relative to its range. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestStochRSI : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Stochastic Period", 0, 1, 999, 1, 0)] + public int Period = 20; + [InputParameter("Smooth Period", 0, 1, 999, 1, 0)] + public int Smooth = 3; + [InputParameter("DoubleSmooth Period", 0, 1, 999, 1, 0)] + public int DoubleSmooth = 6; + #endregion Parameters + + private Indicator StochRSI; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestStochRSI() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestStochasticxRSI"; + Description = "Example of using built-in Stochastic x Relative Strength Index indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("Stochastic", Color.Green, 1, LineStyle.SimpleChart); + AddLineSeries("Stochastic Smoothed", Color.LightSkyBlue, 1, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "StochasticxRSI"+ "("+Period+")"; + // Get 'StochasticxRSI' indicator from built-in indicator collection. + StochRSI = Core.Instance.IndicatorManager.BuiltIn.StochasticxRSI(Period, Smooth, DoubleSmooth); + AddIndicator(StochRSI); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get values from 'StochasticxRSI' indicator lines. + var StochNew = StochRSI.GetValue(); + var StochNewMA = StochRSI.GetValue(0,1); + SetValue(StochNew); + SetValue(StochNewMA,0,1); + } + } + } + + + Period + Smoothing + Double smoothing + + + + + + Gets the Ichimoku. + Enables to quickly discern and filter 'at a glance' the low-probability trading setups from those of higher probability. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestICH : Indicator + { + #region Paramaters + // Defines the 'Period' parameter as input field (where 'min' is 1 and 'max' is 999). + [InputParameter("Tenkan Sen", 0, 1, 999, 1, 0)] + public int TenkanPeriod = 9; + + [InputParameter("Kijun Sen", 1, 1, 999, 1, 0)] + public int KijunPeriod = 26; + + [InputParameter("Senkou Span B", 2, 1, 999, 1, 0)] + public int SenkouSpanB = 52; + #endregion Parameters + + private Indicator ICH; + /// ]]> + ///Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestICH() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestICH"; + Description = "Example of using built-in Ichimoku indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("Tenkan Sen", Color.Green, 1, LineStyle.SimpleChart); + AddLineSeries("Kijun Sen", Color.LightSkyBlue, 1, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "TestICH :Tenkan" + TenkanPeriod.ToString() + " vs Kijun" + KijunPeriod.ToString(); + // Get 'ICH' indicator from built-in indicator collection. + ICH = Core.Instance.IndicatorManager.BuiltIn.ICH(TenkanPeriod, KijunPeriod, SenkouSpanB); + AddIndicator(ICH); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Get values from 'ICH' indicator lines. + var Tenkan = ICH.GetValue(); + var Kijun = ICH.GetValue(0,1); + SetValue(Tenkan); + SetValue(Kijun, 0,1); + } + } + } + + + Tenkan Period + Kijun Period + Senkou Span B + + + + + + Gets the Directional Movement Index(DMI) indicator. + The DMI іdentifies whether there is a definable trend in the market. + + + + using TradingPlatform.BusinessLayer; + + namespace Example + { + public class TestDMI : Indicator + { + // Displays Input Parameter as input field. + [InputParameter("Period of DMI", 0, 1, 999, 1, 0)] + public int Period = 13; + + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Moving Average", 1, new object[] { + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode MAType = MaMode.SMA; + + private Indicator dmi; + + public TestDMI() + : base() + { + // Defines indicator's name and description. + Name = "Test DMI"; + Description = "Example of using built-in DMI indicator"; + Group = "Test"; + } + + public override void Init() + { + // Serves for an identification of related indicators with different parameters. + ShortName = "TestDMI (" + Period + ":" + MAType.ToString() + ")"; + + // Get DMI and two MA indicators from built-in indicator collection. + dmi = Core.Instance.IndicatorManager.BuiltIn.DMI(Period, MAType); + + // Add auxiliary DMI indicator to the current one. + AddIndicator(dmi); + } + + public override void OnUpdate(UpdateArgs args) + { + // Skip all historical bar and start calculation only when a NewBar comes. + if (args.Reason == UpdateReason.HistoricalBar || args.Reason == UpdateReason.NewTick) + return; + + // Skip some period for correct calculation. + if (Count Period) + return; + + // Get "Plus" and "Minus" line values from the DMI indicator. + double plus = dmi.GetValue(0, 0); + double minus = dmi.GetValue(0, 1); + + string upperLineName = string.Empty; + + // Get the name of upper line. + if (plus ]]> minus) + upperLineName = dmi.LinesSeries[0].Name; + else if (plus minus) + upperLineName = dmi.LinesSeries[1].Name; + + // Show the alert window with some info. + Alert("At this moment, the upper line is : " + upperLineName); + } + } + } + + + Period of Moving Average. + Type of Moving Average. + + + + + + Gets the Alligator. + Three moving averages with different colors, periods and calculation methods. + + + + using TradingPlatform.BusinessLayer; + using System.Drawing; + + namespace Example + { + public class TestAlligator : Indicator + { + #region Paramaters + // Displays Input Parameter as dropdown list. + [InputParameter("Type of Jaw Moving Average", 0, new object[]{ + "Simple", MaMode.SMA, + "Exponential", MaMode.EMA, + "Modified", MaMode.SMMA, + "Linear Weighted", MaMode.LWMA} + )] + public MaMode JawMAType = MaMode.SMA; + + [InputParameter("Source price for Jaw Moving Average", 1, new object[] { + "Close", PriceType.Close, + "Open", PriceType.Open, + "High", PriceType.High, + "Low", PriceType.Low, + "Typical", PriceType.Typical, + "Medium", PriceType.Median, + "Weighted", PriceType.Weighted} + )] + public PriceType JawSourcePrice = PriceType.Close; + + // Displays Input Parameter as input field (or checkbox if value type is bolean). + [InputParameter("Period of Jaw Moving Average", 0, 2, 999, 1, 0)] + public int JawMAPeiod = 13; + #endregion Parameters + + private Indicator Alligator; + /// ]]> + /// Indicator's constructor. Contains general information: name, description, LineSeries etc. + /// ]]> + public TestAlligator() + : base() + { + // Serves for an identification of related indicators with different parameters. + Name = "TestAlligator"; + Description = "Example of using built-in Alligator indicator"; + + // Define two lines (on main window) with particular parameters + AddLineSeries("JAW", Color.Green, 1, LineStyle.SimpleChart); + AddLineSeries("LIPS", Color.LightSkyBlue, 1, LineStyle.SimpleChart); + } + /// ]]> + /// This function will be called after creating an indicator as well as after its input params reset or chart (symbolor timeframe) update + /// ]]> + public override void Init() + { + ShortName = "TestAlligator :JawMAPeiod" + JawMAPeiod.ToString(); + // Get 'Alligator' indicator from built-in indicator collection. Reset only jaw params, the rest is by default. + Alligator = Core.Instance.IndicatorManager.BuiltIn.Alligator(JawMAType, JawSourcePrice, JawMAPeiod, 0, MaMode.SMA,PriceType.Close,8,0, MaMode.SMA, PriceType.Close, 5, 0); + AddIndicator(Alligator); + } + /// ]]> + /// Calculation entry point. This function is called when a price data updates. + /// Will be runing under the HistoricalBar mode during history loading. + /// Under NewTick during realtime. + /// Under NewBar if start of the new bar is required. + /// ]]> + /// Provides data of updating reason and incoming price.]]> + public override void OnUpdate(UpdateArgs args) + { + // Get values from 'Alligator' indicator lines. + var Jaw = Alligator.GetValue(); + var Lips = Alligator.GetValue(0,2); + SetValue(Jaw); + SetValue(Lips, 0,1); + } + } + } + + + Type of Jaw Moving Average. + SourcePrice of Jaw Moving Average. + Period of Jaw Moving Average. + Shift of Jaw Moving Average. + Period of Moving Average. + Type of Moving Average. + Period of Moving Average. + Type of Moving Average. + Period of Moving Average. + Type of Moving Average. + Period of Moving Average. + Type of Moving Average. + + + + + + Base class for all indicators. + + + + + Short name of indicator + + + + + Access to current Symbol of indicator + + + + + Amount of items in internal buffers + + + + + Represent access to current used historical data. + + + + + Represent access indicator series + + + + + + + + + + Specified, whether indicator should use main or additional window on the chart + + + + + Specified, whether indicator should draw on chart background by default. + + + + + Precision amount for formatting price (the count of digits after decimal point); By default = -1, which means to use precision from indicator's symbol + + + + + Indicator's settings + + + + + Represent access to the chart, that created indicator + + + + + Recalculate indicator + + + + + + + + + + + Sets the value of indicator into internal buffer + + Value + Index of indicator line + Offset value + + + + Gets the value of indicator from internal buffer + + Offset value + Index of indicator line + Offset start point + + + + + Set line break point. + + Offset value + Index of indicator line + Offset start point + + + + Remove line break point. + + Offset value + Index of indicator line + Offset start point + + + + Check if the point is a break point. + + Offset value + Index of indicator line + Offset start point + + + + Gets the price from historical data + + + + + + + + Get Bid price + + Offset value + + + + + Get Ask price + + Offset value + + + + + Get Last price + + Offset value + + + + + Get Open price + + Offset value + + + + + Get High price + + Offset value + + + + + Get Low price + + Offset value + + + + + Get Close price + + Offset value + + + + + Get Median price + + Offset value + + + + + Get Typical price + + Offset value + + + + + Get Weighted price + + Offset value + + + + + Get Volume + + Offset value + + + + + Formatting price, using precision from assigned symbol or Digits value if specified + + Price value + + + + + Marks cloud begin between two line series with specific color + + First line series index + Second line series index + Cloud color + Offset + + + + Marks cloud end between two line series with specific color + + First line series index + Second line series index + Cloud color + Offset + + + + Using IndicatorLineMarker class you can mark by color or icon any point of your indicator's line. + + + + + Color of the marker + + + + + Icon that will be drawn above the indicator line + + + + + Icon that will be drawn beyond the indicator line + + + + + Constructor for IndicatorLineMarker + + + + + + + + Constructor for IndicatorLineMarker + + + + + Different type of icons for Indicator marker + + + + + Sets the bar number (from the data beginning) from which the drawing of the given indicator line must start; + + + + + Time shift of indicator's line + + + + + Redraws parts of indicator's line within the interval set by offset + + + + + Removes redrawn parts of indicator's line within the interval set by offset + + + + + + + + + + Fully clears markers from line + + + + + Use this attribute to mark input parameters of your script. You will see them in the settings screen on adding + + + + + Displayed name of input parameter + + + + + Sort index for input paramter + + + + + Minimal value for numeric input parameters + + + + + Maximal value for numeric input parameters + + + + + Increment value for numeric input parameters + + + + + Decimal palces for numeric input parameters + + + + + List of predefined values + + + + + Event occurred when write a new log + + + + + Get logs from the strategy for specified date range + + + + + + + + Write log message + + + + + + + The base class for strategies + + + + + Unique ID of the strategy + + + + + The current state of the strategy + + + + + Event occured when strategy write a new log + + + + + Event occured if any of strategy settings was changed + + + + + Run strategy + + + + + Stop strategy + + + + + Remove the strategy + + + + + Get current metrics from the strategy + + + + + + Get logs from the strategy for specified date range + + + + + + + + Write log message + + + + + + + Gets or sets a value indicating whether the event was handled. + true to bypass the control's default handling; otherwise, false to also pass the event along to the default control handler. + + + + + http://burtleburtle.net/bob/hash/doobs.html + + + + + Defines quote parameters for subscribtion + + + + + Symbol Id + + + + + Quote type + + + + + SubscribeQuotesParameters constructor + + + + + Id of the order + + + + + SettingItem cast type + + + + + SettingItem state + + + + + Specifies the DatePicker time format. + + + + + Date only + + + + + Date and time + + + + + Time only + + + + + Time with seconds + + + + + Typecasts setting as TabControl item + + + + + Typecasts setting as GroupBox item + + + + + Typecasts setting as AccountLookup item + + + + + Typecasts setting as Button item + + + + + Typecasts setting as CheckBox item + + + + + Typecasts setting as CheckBox item + + + + + Typecasts setting as Color item + + + + + Typecasts setting as DateTimePicker item + + + + + Typecasts setting as NumericUpDown item + + + + + Typecasts setting as NumericUpDown item + + + + + Typecasts setting as AccountLookup item + + + + + Typecasts setting as Password item + + + + + Typecasts setting as Period item + + + + + Typecasts setting as ComboBox item + + + + + Typecasts setting as TextBox item + + + + + Typecasts setting as SymbolLookup item + + + + + Typecasts setting as TextBox item + + + + + + + + + + Агрегація, що буде використовуватись як дефолтна для "TimeFrameScreen". + Повинна відповідати агрегації чарта. + + + + + Quote type for subscribtion dictum + + + + + Level 1 quote + + + + + Level 2 quote + + + + + Last + + + + + Mark price + + + + + Trading operation state + + + + + Combines intersecting intervals + + + + + Get all settings or particular settings by provided hierarchy path + + + + + Write info log message + + + + + + Write trading log message + + + + + + Write error log message + + + + + + Variable lifetime + + + + + The variable will be removed on exit + + + + + The variable will be written to file + + + + + Global variable entry + + + + + Variable name + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + List<GlobalVariable> global_List=new List<GlobalVariable>(); + + public override void Init() + { + if(GlobalVariablesManager.Count()>0) + { + global_List=GlobalVariablesManager.GetGlobalVariablesList(); + foreach (var el in global_List) + { + Print(el.Name); + Print(el.Value); + } + } + } + } + } + + + + + + + Variable value + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + List<GlobalVariable> global_List=new List<GlobalVariable>(); + public override void Init() + { + if(GlobalVariablesManager.Count()>0) + { + global_List=GlobalVariablesManager.GetGlobalVariablesList(); + foreach (var el in global_List) + { + Print(el.Name); + Print(el.Value); + } + } + } + } + } + + + + + + + Initializes new variable + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + List<GlobalVariable> global_List=new List<GlobalVariable>(); + public override void Init() + { + if(GlobalVariablesManager.Count()>0) + { + global_List=GlobalVariablesManager.GetGlobalVariablesList(); + foreach (var el in global_List) + { + //Simplified way to retrieve global variable value + el.GlobalVariable("new_global_variable_period", period) + + //However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example. + } + } + } + } + } + + + + Variable name + Variable value + + + + + Sets variable value to a global storage + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + GlobalVariablesManager(){ + base.ProjectName = "GlobalVariablesManager"; + base.Password=GetHashedPassword(ProjectName); + } + + [InputParameter("Period", 0, 1, 9999)] + public int period = 5; + + public override void OnQuote() + { + //Simplified way to store a global variable + + GlobalVariablesManager.SetValue("global_variable_period", period, VariableLifetime.SaveSession); + + //However, to indicate any variable belongs to certain indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. + + GlobalVariablesManager.SetValue("global_variable_period" +Symbols.Current.Name+period+Password, period, VariableLifetime.SaveSession); + } + } + } + + + + Variable name + New value + Variable lifetime + + + + Removes specified variable from global storage + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + public override void Init() + { + //Simplified way to remove a global variable + + GlobalVariablesManager.Remove("global_variable_period"); + + //However, to remove certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example. + } + } + } + + + + Variable name + + + + Returns variables' count in global storage + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + public override void Init() + { + if(GlobalVariablesManager.Count()>0) + { + Print("Your session obtains "+GlobalVariablesManager.Count()+" global variables"); + } + } + } + } + + + + + + + + Removes all variables from global storage + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + public override void Init() + { + GlobalVariablesManager.RemoveAll(); + + if(GlobalVariablesManager.Count()==0) + { + Print("Your session does not have any global variables"); + } + } + } + } + + + + + + + Check if variable with specified name exists in global storage + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + public override void Init() + { + //Simplified way to check an existance of a global variable + + if(GlobalVariablesManager.Exists("global_variable_period")) + Print("Your session has this global variable"); + else + GlobalVariablesManager.SetValue("global_variable_period"); + + //However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example. + } + } + } + + + + Variable name + + + + + Returns variable value by name + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + public override void Init() + { + //Simplified way to retrieve global variable value + + if(GlobalVariablesManager.Exists("global_variable_period")) + //Always perform a type casting before assigning any variable from global storage + period = (int)GlobalVariablesManager.GetValue("global_variable_period"); + + //However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example. + } + } + } + + + + Variable name + Variable value + + + + Performs a variable assigning from a global storage if such name exists in a scope + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + public override void Init() + { + int new_period; + + //Simplified way to retrieve global variable value + + if(GlobalVariablesManager.TryGetValue("global_variable_period")) + Print("New variable is assigned from globals: " + new_period); + if(new_period==period) + Print("Matching, no need to re-assign globals: "); + else + GlobalVariablesManager.SetValue("global_variable_period", period, VariableLifetime.SaveSession); + + //However, to obtain certain variable, which belongs to indicator/strategy and to avoid unexpected erasing of data the best practice is to provide to a key holder multiple details such as name, params, hashed password etc. Follow SetValue() example. + } + } + } + + + + Variable name + Variable value + True if variable exists + + + + Saves all serializable variables to disk + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + Connection myConnection = Connection.CurrentConnection; + public override void OnQuote() + { + if(myConnection.Status==Disconnected) + GlobalVariablesManager.Flush(); + } + } + } + + + + + + + Returns all global variables as list + + + + + using System; + using System.Text; + using PTLRuntime.NETScript; + + namespace GlobalVariablesManager + { + public class GlobalVariablesManager : NETIndicator + { + List <GlobalVariable>global_List=new List<GlobalVariable>(); + public override void Init() + { + if(GlobalVariablesManager.Count()>0) + global_List=GlobalVariablesManager.GetGlobalVariablesList(); + + foreach (var el in global_List) + { + Print(el.Name); + } + } + } + } + + + + Collection of global variables + + + + Object is non-serializable + + + + + Object too big + + + + + Get all available custom resources + + + + + Get custom resource stream by name + + + + + Check whether specified items was hidden by branding specification + + + + + + Current logging level + + + + + Sets logs with custom messag, logging level, connection name + + + + + Sets logs with exception and custom message (optional), logging level, connection name + + + + + Sets logs with objects inherited from ILoggable interface,logging level, connection name + + + + + Sets a log level in case of deep debug + + + + + Remove a log level if one has not needed already + + + + + Все параметры, которые могут использоваться при отправке email + + + + + Отправит сообщение по E-mail + + + + + + + + + + Чисто, як маркер для парсера xgettext.exe + + + + + + + Check, whether current translation equal to hidden + + + + + + + + + + + + + + + + + + + + + + + Allows to save Symbols into named lists + + + + + from: + http://www.codeguru.com/csharp/csharp/cs_date_time/timeroutines/article.php/c4207/C-SNTP-Client.htm + +++ добавлен диспозе, подправлен ToString(), убран лишний метод. + +++ ReceiveTimeoutбSendTimeout + + NTPClient is a C# class designed to connect to time servers on the Internet. + The implementation of the protocol is based on the RFC 2030. + + Public class members: + + LeapIndicator - Warns of an impending leap second to be inserted/deleted in the last + minute of the current day. (See the _LeapIndicator enum) + + VersionNumber - Version number of the protocol (3 or 4). + + Mode - Returns mode. (See the _Mode enum) + + Stratum - Stratum of the clock. (See the _Stratum enum) + + PollInterval - Maximum interval between successive messages. + + Precision - Precision of the clock. + + RootDelay - Round trip time to the primary reference source. + + RootDispersion - Nominal error relative to the primary reference source. + + ReferenceTimestamp - The time at which the clock was last set or corrected. + + OriginateTimestamp - The time at which the request departed the client for the server. + + ReceiveTimestamp - The time at which the request arrived at the server. + + Transmit Timestamp - The time at which the reply departed the server for client. + + RoundTripDelay - The time between the departure of request and arrival of reply. + + LocalClockOffset - The offset of the local clock relative to the primary reference + source. + + Initialize - Sets up data structure and prepares for connection. + + Connect - Connects to the time server and populates the data structure. + + IsResponseValid - Returns true if received data is valid and if comes from + a NTP-compliant time server. + + ToString - Returns a string representation of the object. + + ----------------------------------------------------------------------------- + Structure of the standard NTP header (as described in RFC 2030) + 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |LI | VN |Mode | Stratum | Poll | Precision | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Root Delay | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Root Dispersion | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Reference Identifier | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Reference Timestamp (64) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Originate Timestamp (64) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Receive Timestamp (64) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Transmit Timestamp (64) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Key Identifier (optional) (32) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | | + | Message Digest (optional) (128) | + | | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + ----------------------------------------------------------------------------- + + NTP Timestamp Format (as described in RFC 2030) + 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Seconds | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Seconds Fraction (0-padded) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + + + + + Connect to the time server + + + + + метод для определения рассинхнона + + рассинхрон с первым из серверов времени к которому достучались + + + + Defines a trading operation respond bundle + + + + + Respond operation state + + + + + Respond message + + + + + Respond order id + + + + + Provides VA calculation parameters + + + + + Provides VA calculation request per + + + + + Summary calculated Volume info + + + + + Volume info for each price + + + + + Fire in case of price level was added or existing was updated + + + + + Represent item with Volume Analysis calculation results + + + + + Volume Analysis calculations + + + + + Calculate volume profile for requested time range + + + + + Calculate volume profile for each bar in History Data + + + + + Calculate volume profile for requested time range + + + + + Calculate volume profile for each bar in History Data + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Basics/ADD_Series.cs b/Source/Basics/ADD_Series.cs new file mode 100644 index 00000000..7c6c1959 --- /dev/null +++ b/Source/Basics/ADD_Series.cs @@ -0,0 +1,23 @@ +// ADD - adding TSeries+TSeries together, or TSeries+double, or double+TSeries +using System; +namespace QuanTAlib; + +public class ADD_Series : Pair_TSeries_Indicator +{ + public ADD_Series(TSeries d1, TSeries d2 ) : base(d1, d2) { + if (base._d1.Count > 0 && base._d2.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], base._d2[i], false); } } + } + public ADD_Series(TSeries d1, double dd2 ) : base(d1, dd2) { + if (base._d1.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], (base._d1[i].t, dd2), false); } } + } + public ADD_Series(double dd1, TSeries d2 ) : base(dd1, d2) { + if (base._d2.Count > 0) { for (int i=0; i< base._d2.Count; i++) { this.Add((base._d2[i].t, dd1), base._d2[i], false); } } + } + + public override void Add((System.DateTime t, double v)TValue1, (System.DateTime t, double v)TValue2, bool update) + { + (System.DateTime t, double v) result = ((TValue1.t > TValue2.t) ? TValue1.t : TValue2.t, + TValue1.v+TValue2.v); + if (update) { base[base.Count - 1] = result; } else { base.Add(result); } + } +} diff --git a/Source/Basics/Abstract_Indicators.cs b/Source/Basics/Abstract_Indicators.cs new file mode 100644 index 00000000..99e779a4 --- /dev/null +++ b/Source/Basics/Abstract_Indicators.cs @@ -0,0 +1,151 @@ +namespace QuanTAlib; +using System; + +public abstract class Single_TSeries_Indicator : TSeries +{ + protected readonly int _p; + protected readonly bool _NaN; + protected readonly TSeries _data; + + // Chainable Constructor - add it at the end of primary constructor :base(source: source, period: period, useNaN: useNaN) + protected Single_TSeries_Indicator(TSeries source, int period, bool useNaN) + { + this._data = source; + this._p = period; + this._NaN = useNaN; + this._data.Pub += this.Sub; + } + + // overridable Add() method to add/update a single item at the end of the list + public new virtual void Add((System.DateTime t, double v) TValue, bool update) => base.Add(TValue, update); + + // potentially overridable Add() method for the whole series (could be replaced with faster bulk algo) + public virtual void Add(TSeries data) + { + for (int i = 0; i < data.Count; i++) { this.Add(TValue: data[i], update: false); } + } + + public new void Add((System.DateTime t, double v) TValue) + => this.Add(TValue: TValue, update: false); + public void Add(bool update) + => this.Add(TValue: this._data[this._data.Count - 1], update: update); + public void Add() + => this.Add(TValue: this._data[this._data.Count - 1], update: false); + public new void Sub(object source, TSeriesEventArgs e) + => this.Add(TValue: this._data[this._data.Count - 1], update: e.update); +} + + + +public abstract class Pair_TSeries_Indicator : TSeries +{ + protected readonly TSeries _d1; + protected readonly TSeries _d2; + protected readonly double _dd1, _dd2; + + // Chainable Constructors - add them at the end of primary constructors if needed + protected Pair_TSeries_Indicator(TSeries source1, TSeries source2) + { + this._d1 = source1; + this._d2 = source2; + this._dd1 = double.NaN; + this._dd2 = double.NaN; + this._d1.Pub += this.Sub; + this._d2.Pub += this.Sub; + } + protected Pair_TSeries_Indicator(TSeries source1, double dd2) + { + this._d1 = source1; + this._d2 = new(); + this._dd1 = double.NaN; + this._dd2 = dd2; + this._d1.Pub += this.Sub; + } + protected Pair_TSeries_Indicator(double dd1, TSeries source2) + { + this._d1 = new(); + this._d2 = source2; + this._dd1 = dd1; + this._dd2 = double.NaN; + this._d2.Pub += this.Sub; + } + + // overridable Add(Tvalue, Tvalue) method to add/update a single value at the end of the list + public virtual void Add((System.DateTime t, double v)TValue1, (System.DateTime t, double v)TValue2, bool update) + => base.Add(TValue: (TValue1.t, 0), update: update); // default inserts zeros + + + // potentially overridable Add() bulk variations (could be replaced with faster bulk algos) + public virtual void Add(TSeries d1, TSeries d2) { + for (int i = 0; i < d1.Count; i++) { this.Add(d1[i], d2[i], update: false); } + } + public virtual void Add(TSeries d1, double dd2) { + for (int i = 0; i < d1.Count; i++) { this.Add(d1[i], (d1[i].t, dd2), update: false); } + } + public virtual void Add(double dd1, TSeries d2) { + for (int i = 0; i < d2.Count; i++) { this.Add((d2[i].t, dd1), d2[i], update: false); } + } + + + public void Add((System.DateTime t, double v)TValue1, (System.DateTime t, double v)TValue2) + => this.Add(TValue1, TValue2, update: false); + + public void Add(bool update) + { + if ((this._dd1 is double.NaN) && (this._dd2 is double.NaN)) + { + // (Series, Series) + if (update || (this._d1.Count > this.Count && this._d2.Count > this.Count)) + { this.Add(this._d1[this._d1.Count - 1], this._d2[this._d2.Count - 1], update); } + } + else if ((this._dd2 is not double.NaN) && (this._dd1 is double.NaN)) + { + // (Series, Double) + this.Add(TValue1: this._d1[this._d1.Count - 1], TValue2: (this._d1[this._d1.Count - 1].t, this._dd2), update: update); + } + else + { + // (Double, Series) + this.Add(TValue1: (this._d2[this._d2.Count - 1].t, this._dd1), TValue2: this._d2[this._d2.Count - 1], update: update); + } + } + + public void Add() => this.Add(update: false); + + public new void Sub(object source, TSeriesEventArgs e) + => this.Add(e.update); +} + + +public abstract class Single_TBars_Indicator : TSeries +{ + protected readonly int _p; + protected readonly bool _NaN; + protected readonly TBars _bars; + + // Chainable Constructor - add it at the end of primary constructor :base(source: source, period: period, useNaN: useNaN) + protected Single_TBars_Indicator(TBars source, bool useNaN) + { + this._bars = source; + this._NaN = useNaN; + this._bars.Close.Pub += this.Sub; + } + + // overridable Add() method to add/update a single item at the end of the list + public virtual void Add((System.DateTime t, double o, double h, double l, double c, double v) TBar, bool update) => base.Add(TBar.c, update); + + // potentially overridable Add() method for the whole series (could be replaced with faster bulk algo) + public virtual void Add(TBars bars) + { + for (int i = 0; i < bars.Count; i++) { this.Add(TBar: bars[i], update: false); } + } + + public new void Add((System.DateTime t, double v) TValue) + => this.Add(TValue: TValue, update: false); + public void Add(bool update) + => this.Add(TBar: this._bars[this._bars.Count - 1], update: update); + public void Add() + => this.Add(TBar: this._bars[this._bars.Count - 1], update: false); + public new void Sub(object source, TSeriesEventArgs e) + => this.Add(TBar: this._bars[this._bars.Count - 1], update: e.update); +} diff --git a/Source/Basics/DIV_Series.cs b/Source/Basics/DIV_Series.cs new file mode 100644 index 00000000..11dedb01 --- /dev/null +++ b/Source/Basics/DIV_Series.cs @@ -0,0 +1,23 @@ +// DIV - divide TSeries/TSeries , or TSeries/double, or double/TSeries +using System; +namespace QuanTAlib; + +public class DIV_Series : Pair_TSeries_Indicator +{ + public DIV_Series(TSeries d1, TSeries d2 ) : base(d1, d2) { + if (base._d1.Count > 0 && base._d2.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], base._d2[i], false); } } + } + public DIV_Series(TSeries d1, double dd2 ) : base(d1, dd2) { + if (base._d1.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], (base._d1[i].t, dd2), false); } } + } + public DIV_Series(double dd1, TSeries d2 ) : base(dd1, d2) { + if (base._d2.Count > 0) { for (int i=0; i< base._d2.Count; i++) { this.Add((base._d2[i].t, dd1), base._d2[i], false); } } + } + + public override void Add((System.DateTime t, double v)TValue1, (System.DateTime t, double v)TValue2, bool update) + { + (System.DateTime t, double v) result = ((TValue1.t > TValue2.t) ? TValue1.t : TValue2.t, + (TValue2.v is not 0) ? TValue1.v/TValue2.v : Double.PositiveInfinity); + if (update) { base[base.Count - 1] = result; } else { base.Add(result); } + } +} \ No newline at end of file diff --git a/Source/Basics/MUL_Series.cs b/Source/Basics/MUL_Series.cs new file mode 100644 index 00000000..0965543f --- /dev/null +++ b/Source/Basics/MUL_Series.cs @@ -0,0 +1,23 @@ +// MUL - multiply TSeries*TSeries together, or TSeries*double, or double*TSeries +using System; +namespace QuanTAlib; + +public class MUL_Series : Pair_TSeries_Indicator +{ + public MUL_Series(TSeries d1, TSeries d2 ) : base(d1, d2) { + if (base._d1.Count > 0 && base._d2.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], base._d2[i], false); } } + } + public MUL_Series(TSeries d1, double dd2 ) : base(d1, dd2) { + if (base._d1.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], (base._d1[i].t, dd2), false); } } + } + public MUL_Series(double dd1, TSeries d2 ) : base(dd1, d2) { + if (base._d2.Count > 0) { for (int i=0; i< base._d2.Count; i++) { this.Add((base._d2[i].t, dd1), base._d2[i], false); } } + } + + public override void Add((System.DateTime t, double v)TValue1, (System.DateTime t, double v)TValue2, bool update) + { + (System.DateTime t, double v) result = ((TValue1.t > TValue2.t) ? TValue1.t : TValue2.t, + TValue1.v*TValue2.v); + if (update) { base[base.Count - 1] = result; } else { base.Add(result); } + } +} \ No newline at end of file diff --git a/Source/Basics/RND_Feed.cs b/Source/Basics/RND_Feed.cs new file mode 100644 index 00000000..6c886d02 --- /dev/null +++ b/Source/Basics/RND_Feed.cs @@ -0,0 +1,20 @@ +using System; +namespace QuanTAlib; + +public class RND_Feed : TBars +{ + public RND_Feed(int days, double volatility = 0.05, double startvalue = 100.0) + { + Random rnd = new(); + double c = startvalue; + for (int i = 0; i < days; i++) + { + double o = Math.Round(c + c * (volatility * 0.1 * rnd.NextDouble() - 0.005), 2); + double h = Math.Round(o + c * volatility * rnd.NextDouble(), 2); + double l = Math.Round(o - c * volatility * rnd.NextDouble(), 2); + c = Math.Round(l + (h - l) * rnd.NextDouble(), 2); + double v = Math.Round(1000 * rnd.NextDouble(), 2); + this.Add(DateTime.Today.AddDays(i - days), o, h, l, c, v); + } + } +} \ No newline at end of file diff --git a/Source/Basics/SUB_Series.cs b/Source/Basics/SUB_Series.cs new file mode 100644 index 00000000..abf37a8a --- /dev/null +++ b/Source/Basics/SUB_Series.cs @@ -0,0 +1,23 @@ +// SUB - subtracting TSeries-TSeries, or TSeries-double, or double-TSeries +using System; +namespace QuanTAlib; + +public class SUB_Series : Pair_TSeries_Indicator +{ + public SUB_Series(TSeries d1, TSeries d2 ) : base(d1, d2) { + if (base._d1.Count > 0 && base._d2.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], base._d2[i], false); } } + } + public SUB_Series(TSeries d1, double dd2 ) : base(d1, dd2) { + if (base._d1.Count > 0) { for (int i=0; i< base._d1.Count; i++) { this.Add(base._d1[i], (base._d1[i].t, dd2), false); } } + } + public SUB_Series(double dd1, TSeries d2 ) : base(dd1, d2) { + if (base._d2.Count > 0) { for (int i=0; i< base._d2.Count; i++) { this.Add((base._d2[i].t, dd1), base._d2[i], false); } } + } + + public override void Add((System.DateTime t, double v)TValue1, (System.DateTime t, double v)TValue2, bool update) + { + (System.DateTime t, double v) result = ((TValue1.t > TValue2.t) ? TValue1.t : TValue2.t, + TValue1.v-TValue2.v); + if (update) { base[base.Count - 1] = result; } else { base.Add(result); } + } +} \ No newline at end of file diff --git a/Source/Basics/TBars.cs b/Source/Basics/TBars.cs new file mode 100644 index 00000000..6e79174e --- /dev/null +++ b/Source/Basics/TBars.cs @@ -0,0 +1,104 @@ +namespace QuanTAlib; + +using System; + +public class TBars : System.Collections.Generic.List<(DateTime t, double o, double h, double l, double c, double v)> +{ + private readonly TSeries _open = new(); + private readonly TSeries _high = new(); + private readonly TSeries _low = new(); + private readonly TSeries _close = new(); + private readonly TSeries _volume = new(); + private readonly TSeries _hl2 = new(); + private readonly TSeries _oc2 = new(); + private readonly TSeries _ohl3 = new(); + private readonly TSeries _hlc3 = new(); + private readonly TSeries _ohlc4 = new(); + private readonly TSeries _hlcc4 = new(); + + public TSeries Open => this._open; + public TSeries High => this._high; + public TSeries Low => this._low; + public TSeries Close => this._close; + public TSeries Volume => this._volume; + public TSeries HL2 => this._hl2; + public TSeries OC2 => this._oc2; + public TSeries OHL3 => this._ohl3; + public TSeries HLC3 => this._hlc3; + public TSeries OHLC4 => this._ohlc4; + public TSeries HLCC4 => this._hlcc4; + + public TSeries Select(int source) + { + return source switch + { + 0 => _open, + 1 => _high, + 2 => _low, + 3 => _close, + 4 => _hl2, + 5 => _oc2, + 6 => _ohl3, + 7 => _hlc3, + 8 => _ohlc4, + _ => _hlcc4, + }; + } + public static string SelectStr(int source) + { + return source switch + { + 0 => "Open", + 1 => "High", + 2 => "Low", + 3 => "Close", + 4 => "HL2", + 5 => "OC2", + 6 => "OHL3", + 7 => "Typical", + 8 => "Mean", + _ => "Weighted", + }; + } + + public void + Add((DateTime t, double o, double h, double l, double c, double v) i, bool update = false) + => Add(i.t, i.o, i.h, i.l, i.c, i.v, update); + + public void Add(DateTime t, decimal o, decimal h, decimal l, decimal c, decimal v, bool update = false) + => Add(t, (double)o, (double)h, (double)l, (double)c, (double)v, update); + + public void Add(DateTime t, double o, double h, double l, double c, double v, bool update = false) + { + if (update) + { + this[this.Count - 1] = (t, o, h, l, c, v); + _open[_open.Count - 1] = (t, o); + _high[_high.Count - 1] = (t, h); + _low[_low.Count - 1] = (t, l); + _close[_close.Count - 1] = (t, c); + _volume[_volume.Count - 1] = (t, v); + _hl2[_hl2.Count - 1] = (t, (h + l) * 0.5); + _oc2[_oc2.Count - 1] = (t, (o + c) * 0.5); + _ohl3[_ohl3.Count - 1] = (t, (o + h + l) * 0.333333333333333); + _hlc3[_hlc3.Count - 1] = (t, (h + l + c) * 0.333333333333333); + _ohlc4[_ohlc4.Count - 1] = (t, (o + h + l + c) * 0.25); + _hlcc4[_hlcc4.Count - 1] = (t, (h + l + c + c) * 0.25); + } + else + { + base.Add((t, o, h, l, c, v)); + _open.Add((t, o)); + _high.Add((t, h)); + _low.Add((t, l)); + _close.Add((t, c)); + _volume.Add((t, v)); + _hl2.Add((t, (h + l) * 0.5)); + _oc2.Add((t, (o + c) * 0.5)); + _ohl3.Add((t, (o + h + l) * 0.333333333333333)); + _hlc3.Add((t, (h + l + c) * 0.333333333333333)); + _ohlc4.Add((t, (o + h + l + c) * 0.25)); + _hlcc4.Add((t, (h + l + c + c) * 0.25)); + } + } +} diff --git a/Source/Basics/TSeries.cs b/Source/Basics/TSeries.cs new file mode 100644 index 00000000..ff6f5315 --- /dev/null +++ b/Source/Basics/TSeries.cs @@ -0,0 +1,72 @@ +namespace QuanTAlib; + +using System; +using System.Linq; + +public class TSeries : System.Collections.Generic.List<(DateTime t, double v)> +{ + // when asked for a (t,v) tuple, return the last (t,v) on the List + public static implicit operator (DateTime t, double v)(TSeries l) => l[l.Count - 1]; + + // when asked for a (double), return the value part of the last tuple on the list + public static implicit operator double(TSeries l) => l[l.Count - 1].v; + + // when asked for a (DateTime), return the DateTime part of the last tuple on the list + public static implicit operator DateTime(TSeries l) => l[l.Count - 1].t; + + public System.Collections.Generic.List t => + this.Select(x => (DateTime)x.t).ToList(); + + public System.Collections.Generic.List v => + this.Select(x => (double)x.v).ToList(); + + public int Length => this.Count; + + // add/update one (t,v) tuple to/at the end of the list + public void Add((DateTime t, double v) TValue, bool update = false) + { + if (update) { this[this.Count - 1] = TValue; } + else { base.Add(TValue); } + this.OnEvent(update); + } + + public void Add(DateTime t, double v, bool update = false) => this.Add((t, v), update); + + public void Add(double v, bool update = false) => this.Add((DateTime.Now, v), update); + + // Broadcast handler - only to valid targets + protected virtual void OnEvent(bool update = false) + { + if (Pub != null && Pub.Target != this) + { + Pub(this, new TSeriesEventArgs { update = update }); + } + } + + // delegate used by event handler + event handler (Pub == publisher) + public delegate + void NewDataEventHandler(object source, TSeriesEventArgs args); + public event NewDataEventHandler Pub; + + public void Sub(object source, TSeriesEventArgs e) + { + TSeries ss = (TSeries)source; + if (ss.Count > 0) + { + for (int i = 0; i < ss.Count; i++) + { + this.Add(ss[i]); + } + } + else + { + this.Add(ss[ss.Count - 1], e.update); + } + } +} + +// EventArgs extension - carries the update field +public class TSeriesEventArgs : EventArgs +{ + public bool update { get; set; } +} diff --git a/Source/MovingAvg/DEMA_Series.cs b/Source/MovingAvg/DEMA_Series.cs new file mode 100644 index 00000000..1d740254 --- /dev/null +++ b/Source/MovingAvg/DEMA_Series.cs @@ -0,0 +1,73 @@ +namespace QuanTAlib; + +/** +DEMA: Double Exponential Moving Average +DEMA uses EMA(EMA()) to calculate smoother Exponential moving average. + +Sources: + https://www.tradingtechnologies.com/help/x-study/technical-indicator-definitions/double-exponential-moving-average-dema/ + +Remark: + ema1 = EMA(close, length) + ema2 = EMA(ema1, length) + DEMA = 2 * ema1 - ema2 +**/ + +using System; +using System.Collections.Generic; +public class DEMA_Series : Single_TSeries_Indicator +{ + private readonly List _buffer = new(); + private readonly double _k, _k1m; + private double _lastema1, _lastlastema1; + private double _lastema2, _lastlastema2; + + public DEMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k = 2.0 / (this._p + 1); + this._k1m = 1.0 - this._k; + if (_data.Count > 0) { base.Add(_data); } + } + + public override void Add((DateTime t, double v) d, bool update = false) + { + + if (update) + { + this._lastema1 = this._lastlastema1; + this._lastema2 = this._lastlastema2; + } + + double _ema1, _ema2; + + if (this.Count < this._p) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else + { + _buffer.Add(d.v); + } + if (_buffer.Count > this._p) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + _ema1 = _ema2 = _sma; + + } + else + { + _ema1 = d.v * this._k + this._lastema1 * this._k1m; + _ema2 = _ema1 * this._k + this._lastema2 * this._k1m; + } + + double _dema = 2 * _ema1 - _ema2; + this._lastlastema1 = this._lastema1; + this._lastlastema2 = this._lastema2; + this._lastema1 = _ema1; + this._lastema2 = _ema2; + + var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _dema); + base.Add(ret, update); + } +} diff --git a/Source/MovingAvg/EMA_Series.cs b/Source/MovingAvg/EMA_Series.cs new file mode 100644 index 00000000..a1ba2c14 --- /dev/null +++ b/Source/MovingAvg/EMA_Series.cs @@ -0,0 +1,63 @@ +namespace QuanTAlib; + +/** +EMA: Exponential Moving Average + +EMA needs very short history buffer and calculates the EMA value using just the +previous EMA value. The weight of the new datapoint (k) is k = 2 / (period-1) +Sources: + https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages + https://www.investopedia.com/ask/answers/122314/what-exponential-moving-average-ema-formula-and-how-ema-calculated.asp + https://blog.fugue88.ws/archives/2017-01/The-correct-way-to-start-an-Exponential-Moving-Average-EMA +Issues: + There is no consensus what the first EMA value should be - a zero, a first +datapoint, or an average of the initial Period bars. All three starting methods +converge within 20+ bars to the same moving average. Most implementations (including this one) +use SMA() for the first Period bars as a seeding value for EMA. +**/ + +using System; +using System.Collections.Generic; +public class EMA_Series : Single_TSeries_Indicator +{ + private readonly List _buffer = new(); + private readonly double _k, _k1m; + private double _lastema, _lastlastema; + + public EMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k = 2.0 / (this._p + 1); + this._k1m = 1.0 - this._k; + this._lastema = this._lastlastema = double.NaN; + if (this._data.Count > 0) { base.Add(this._data); } + } + + public override void Add((DateTime t, double v) d, bool update = false) + { + double _ema = 0; + if (update) { this._lastema = this._lastlastema; } + + if (this.Count < this._p) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else + { + this._buffer.Add(d.v); + } + if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); } + + for (int i = 0; i < this._buffer.Count; i++) { _ema += this._buffer[i]; } + _ema /= this._buffer.Count; + } + else + { + _ema = d.v * this._k + this._lastema * this._k1m; + } + + this._lastlastema = this._lastema; + this._lastema = _ema; + + var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _ema); + base.Add(ret, update); + } +} \ No newline at end of file diff --git a/Source/MovingAvg/HEMA_Series.cs b/Source/MovingAvg/HEMA_Series.cs new file mode 100644 index 00000000..3ffe260b --- /dev/null +++ b/Source/MovingAvg/HEMA_Series.cs @@ -0,0 +1,64 @@ +using System; +namespace QuanTAlib; + +/** +HEMA: Hull-EMA Moving Average +Modified HUll Moving Average; instead of using WMA (Weighted MA) for a +calculation, HEMA uses EMA for Hull's formula: + +EMA1 = EMA(n/2) of price - where k = 4/(n/2 +1) +EMA2 = EMA(n) of price - where k = 3/(n+1) +Raw HMA = (2 * EMA1) - EMA2 +EMA3 = EMA(sqrt(n)) of Raw HMA - where k = 2/(sqrt(n)+1) +**/ + +public class HEMA_Series : Single_TSeries_Indicator +{ + public HEMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k1 = 4 / ((period * 0.5) + 1); + this._k2 = 3 / (double)(period + 1); + this._k3 = 2 / (Math.Sqrt(period) + 1); + this._lastema1 = this._lastlastema1 = double.NaN; + this._lastema2 = this._lastlastema2 = double.NaN; + this._lastema3 = this._lastlastema3 = double.NaN; + + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly double _k1, _k2, _k3; + private double _lastema1, _lastlastema1; + private double _lastema2, _lastlastema2; + private double _lastema3, _lastlastema3; + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) + { + this._lastema1 = this._lastlastema1; + this._lastema2 = this._lastlastema2; + this._lastema3 = this._lastlastema3; + } + double _ema1 = System.Double.IsNaN(this._lastema1) + ? d.v + : d.v * this._k1 + this._lastema1 * (1 - this._k1); + double _ema2 = System.Double.IsNaN(this._lastema2) + ? d.v + : d.v * this._k2 + this._lastema2 * (1 - this._k2); + + double _rawhema = (2 * _ema1) - _ema2; + double _ema3 = System.Double.IsNaN(this._lastema3) + ? _rawhema + : _rawhema * this._k3 + this._lastema3 * (1 - this._k3); + + this._lastlastema1 = this._lastema1; + this._lastlastema2 = this._lastema2; + this._lastlastema3 = this._lastema3; + this._lastema1 = _ema1; + this._lastema2 = _ema2; + this._lastema3 = _ema3; + + (System.DateTime t, double v) result = + (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _ema3); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/MovingAvg/HMA_Series.cs b/Source/MovingAvg/HMA_Series.cs new file mode 100644 index 00000000..41250bbe --- /dev/null +++ b/Source/MovingAvg/HMA_Series.cs @@ -0,0 +1,118 @@ +using System; +namespace QuanTAlib; + +/** +HMA: Hull Moving Average +Developed by Alan Hull, an extremely fast and smooth moving average; almost +eliminates lag altogether and manages to improve smoothing at the same time. + +Sources: + https://alanhull.com/hull-moving-average + https://school.stockcharts.com/doku.php?id=technical_indicators:hull_moving_average +WMA1 = WMA(n/2) of price +WMA2 = WMA(n) of price +Raw HMA = (2 * WMA1) - WMA2 +HMA = WMA(sqrt(n)) of Raw HMA +**/ + +public class HMA_Series : TSeries +{ + private readonly int _p; + private readonly bool _NaN; + private readonly TSeries _data; + private double _wma1, _wma2; + private readonly System.Collections.Generic.List _buf1 = new(); + private readonly System.Collections.Generic.List _buf2 = new(); + private readonly System.Collections.Generic.List _buf3 = new(); + private readonly System.Collections.Generic.List _weights = new(); + + public HMA_Series(TSeries source, int period, bool useNaN = false) + { + this._p = period; + this._data = source; + this._NaN = useNaN; + for (int i = 0; i < this._p; i++) + { + this._weights.Add(i + 1); + } + + source.Pub += this.Sub; + if (source.Count > 0) + { + for (int i = 0; i < source.Count; i++) + { + this.Add(source[i], false); + } + } + } + public new void Add((System.DateTime t, double v) data, bool update = false) + { + if (update) + { + this._buf1[this._buf1.Count - 1] = data.v; + this._buf2[this._buf2.Count - 1] = data.v; + } + else + { + this._buf1.Add(data.v); + this._buf2.Add(data.v); + } + if (this._buf1.Count > (int)(Math.Ceiling((double)this._p / 2))) + { + this._buf1.RemoveAt(0); + } + if (this._buf2.Count > this._p) + { + this._buf2.RemoveAt(0); + } + + this._wma1 = 0; + for (int i = 0; i < this._buf1.Count; i++) + { + this._wma1 += this._buf1[i] * this._weights[i]; + } + + this._wma1 /= (this._buf1.Count * (this._buf1.Count + 1)) * 0.5; + + this._wma2 = 0; + for (int i = 0; i < this._buf2.Count; i++) + { + this._wma2 += this._buf2[i] * this._weights[i]; + } + + this._wma2 /= (this._buf2.Count * (this._buf2.Count + 1)) * 0.5; + + if (update) + { + this._buf3[this._buf3.Count - 1] = 2 * this._wma1 - this._wma2; + } + else + { + this._buf3.Add(2 * this._wma1 - this._wma2); + } + if (this._buf3.Count > (int)Math.Sqrt(this._p)) + { + this._buf3.RemoveAt(0); + } + + double _hma = 0; + for (int i = 0; i < this._buf3.Count; i++) + { + _hma += this._buf3[i] * this._weights[i]; + } + + _hma /= (this._buf3.Count * (this._buf3.Count + 1)) * 0.5; + + (System.DateTime t, double v) result = + (data.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _hma); + base.Add(result, update); + } + public void Add(bool update = false) + { + this.Add(this._data[this._data.Count - 1], update); + } + public new void Sub(object source, TSeriesEventArgs e) + { + this.Add(this._data[this._data.Count - 1], e.update); + } +} diff --git a/Source/MovingAvg/JMA_Series.cs b/Source/MovingAvg/JMA_Series.cs new file mode 100644 index 00000000..2e0c4789 --- /dev/null +++ b/Source/MovingAvg/JMA_Series.cs @@ -0,0 +1,160 @@ +using System; +namespace QuanTAlib; + +/** +JMA: Jurik Moving Average +Mark Jurik's Moving Average (JMA) attempts to eliminate noise to see the +underlying activity. It has extremely low lag, is very smooth and is responsive +to market gaps. + +Sources: + https://c.mql5.com/forextsd/forum/164/jurik_1.pdf + https://www.prorealcode.com/prorealtime-indicators/jurik-volatility-bands/ + +Issues: + Real JMA algorithm is not published and this formula is derived through +deduction and reverse analysis of JMA behavior. It is really close, but not +exact - published JMA tests against JMA.CSV fail with small deviation. The +original algo is slightly different, yet this approximation is close enough. +**/ +public class JMA_Series : Single_TSeries_Indicator +{ + private readonly System.Collections.Generic.List vbuffer10; + private readonly System.Collections.Generic.List vsum65; + + private double prev_ma1, prev_det0, prev_det1, prev_jma, bsmax, bsmin; + private double o_prev_ma1, o_prev_det0, o_prev_det1, o_prev_jma, o_bsmax, o_bsmin; + + private readonly double pr, pow1, len2, beta, rvolty; + private readonly int _l; + + public JMA_Series(TSeries source, int period, double phase = 0.0, bool useNaN = false) : base(source, period, useNaN) + { + this.vbuffer10 = new(); + this.vsum65 = new(); + + // constants + this.pr = (phase < -100) ? 0.5 : (phase > 100) ? 2.5 : (phase * 0.01) + 1.5; + double len1 = Math.Max((Math.Log(Math.Sqrt(0.5 * (_p - 1))) / Math.Log(2.0)) + 2.0, 0); + this.pow1 = Math.Max(len1 - 2, 0.5); + this.rvolty = Math.Exp((1 / this.pow1) * Math.Log(len1)); + this.len2 = Math.Sqrt(0.5 * (_p - 1)) * len1; + this.beta = 0.45 * (_p - 1) / (0.45 * (_p - 1) + 2); + this._l = (int)Math.Round(this._p - 1 * 0.5); + + if (base._data.Count > 0) { base.Add(base._data); } + } + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (this.Count == 0) + { + this.prev_ma1 = this.prev_jma = d.v; + this.bsmax = this.bsmin = this.prev_det0 = this.prev_det1 = 0; + } + + if (update) + { + this.prev_jma = this.o_prev_jma; + this.prev_ma1 = this.o_prev_ma1; + this.prev_det0 = this.o_prev_det0; + this.prev_det1 = this.o_prev_det1; + this.bsmax = this.o_bsmax; + this.bsmin = this.o_bsmin; + } + else + { + this.o_prev_jma = this.prev_jma; + this.o_prev_ma1 = this.prev_ma1; + this.o_prev_det0 = this.prev_det0; + this.o_prev_det1 = this.prev_det1; + this.o_bsmax = this.bsmax; + this.o_bsmin = this.bsmin; + } + + double hprice = d.v; + double lprice = d.v; + for (int i = 0; i <= Math.Min(9, this._data.Count - 1); i++) + { + var _item = this._data[this._data.Count - 1 - i].v; + hprice = (_item > hprice) ? _item : hprice; + lprice = (_item < lprice) ? _item : lprice; + } + double del1 = hprice - this.bsmax; + double del2 = lprice - this.bsmin; + + double volty = (Math.Abs(del1) != Math.Abs(del2)) + ? Math.Max(Math.Abs(del1), Math.Abs(del2)) + : 0; + if (update) + { + this.vbuffer10[this.vbuffer10.Count - 1] = volty; + } + else + { + this.vbuffer10.Add(volty); + } + if (this.vbuffer10.Count > 10) + { + this.vbuffer10.RemoveAt(0); + } + + double prevvsum = + (this.vsum65.Count > 0) ? this.vsum65[this.vsum65.Count - 1] : 0; + double vsumitem = prevvsum + 0.1 * (volty - this.vbuffer10[0]); + if (update) + { + this.vsum65[this.vsum65.Count - 1] = vsumitem; + } + else + { + this.vsum65.Add(vsumitem); + } + if (this.vsum65.Count > 65) + { + this.vsum65.RemoveAt(0); + } + + double avolty = 0; + for (int i = 0; i < this.vsum65.Count; i++) + { + avolty += this.vsum65[i]; + } + + avolty /= this.vsum65.Count; + double dvolty = (avolty > 0) ? volty / avolty : 0; + dvolty = Math.Max((dvolty > this.rvolty) ? this.rvolty : dvolty, 1.0); + + double pow2 = Math.Exp(this.pow1 * Math.Log(dvolty)); + double kv = + Math.Exp(Math.Sqrt(pow2) * Math.Log(this.len2 / (this.len2 + 1))); + + this.bsmax = (del1 > 0) ? hprice : hprice - (kv * del1); + this.bsmin = (del2 < 0) ? lprice : lprice - (kv * del2); + + // adaptive EMA dynamic factor + double pow = Math.Pow(dvolty, this.pow1); + double alpha = Math.Pow(this.beta, pow); + + // 1st stage - preliminary smoothing by adaptive EMA + double ma1 = d.v * (1 - alpha) + this.prev_ma1 * alpha; + this.prev_ma1 = ma1; + + // 2nd stage - one more preliminary smoothing by Kalman filter + double det0 = (d.v - ma1) * (1 - this.beta) + this.prev_det0 * this.beta; + this.prev_det0 = det0; + double ma2 = ma1 + (this.pr * det0); + + // 3rd stage - final smoothing by Jurik adaptive filter + double det1 = ((ma2 - this.prev_jma) * (1 - alpha) * (1 - alpha)) + + (this.prev_det1 * alpha * alpha); + this.prev_det1 = det1; + var jma = this.prev_jma + det1; + this.prev_jma = jma; + + (System.DateTime t, double v) result = + (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : jma); + base.Add(result, update); + + } +} \ No newline at end of file diff --git a/Source/MovingAvg/RMA_Series.cs b/Source/MovingAvg/RMA_Series.cs new file mode 100644 index 00000000..5e28083b --- /dev/null +++ b/Source/MovingAvg/RMA_Series.cs @@ -0,0 +1,64 @@ +namespace QuanTAlib; + +/** +RMA: wildeR Moving Average + +J. Welles Wilder introduced RMA as an alternative to EMA. RMA's weight (k) is +set as 1/period, giving less weight to the new data compared to EMA. Sources: + https://archive.org/details/newconceptsintec00wild/page/23/mode/2up + + https://tlc.thinkorswim.com/center/reference/Tech-Indicators/studies-library/V-Z/WildersSmoothing + https://www.incrediblecharts.com/indicators/wilder_moving_average.php + +Issues: + Pandas-TA library calculates RMA using straight Exponential Weighted Mean: + pandas.ewm().mean() and returns incorrect first (period) of bars compared to + published formula. This implementation passess the validation test in Wilder's book. + +**/ + +using System; +using System.Collections.Generic; +public class RMA_Series : Single_TSeries_Indicator +{ + private readonly List _buffer = new(); + private readonly double _k, _k1m; + private double _lastema, _lastlastema; + + public RMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k = 1.0 / (double)(this._p); + this._k1m = 1.0 - this._k; + this._lastema = this._lastlastema = double.NaN; + if (_data.Count > 0) { base.Add(_data); } + } + + public override void Add((DateTime t, double v) d, bool update = false) + { + double _ema = 0; + if (update) { this._lastema = this._lastlastema; } + + if (this.Count < this._p) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else + { + _buffer.Add(d.v); + } + if (_buffer.Count > this._p) { _buffer.RemoveAt(0); } + + for (int i = 0; i < _buffer.Count; i++) { _ema += _buffer[i]; } + _ema /= this._buffer.Count; + } + else + { + _ema = d.v * _k + _lastema * _k1m; + } + + this._lastlastema = this._lastema; + this._lastema = _ema; + + var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _ema); + base.Add(ret, update); + } +} \ No newline at end of file diff --git a/Source/MovingAvg/SMA_Series.cs b/Source/MovingAvg/SMA_Series.cs new file mode 100644 index 00000000..bc6d143c --- /dev/null +++ b/Source/MovingAvg/SMA_Series.cs @@ -0,0 +1,38 @@ +namespace QuanTAlib; + +/** +SMA: Simple Moving Average +The weights are equally distributed across the period, resulting in a mean() of +the data within the period/ + +Sources: + https://www.tradingtechnologies.com/help/x-study/technical-indicator-definitions/simple-moving-average-sma/ + https://stats.stackexchange.com/a/24739 + +Remark: + This calc doesn't use LINQ or SUM() or any of iterative methods. +**/ + +public class SMA_Series : Single_TSeries_Indicator +{ + public SMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _sma); + + base.Add(result, update); + } +} diff --git a/Source/MovingAvg/TEMA_Series.cs b/Source/MovingAvg/TEMA_Series.cs new file mode 100644 index 00000000..7fb9e8e4 --- /dev/null +++ b/Source/MovingAvg/TEMA_Series.cs @@ -0,0 +1,79 @@ +namespace QuanTAlib; + +/** +TEMA: Triple Exponential Moving Average +TEMA uses EMA(EMA(EMA())) to calculate less laggy Exponential moving average. + +Sources: + https://www.tradingtechnologies.com/help/x-study/technical-indicator-definitions/triple-exponential-moving-average-tema/ + +Remark: + ema1 = EMA(close, length) + ema2 = EMA(ema1, length) + ema3 = EMA(ema2, length) + TEMA = 3 * (ema1 - ema2) + ema3 +**/ + +using System; +using System.Collections.Generic; +public class TEMA_Series : Single_TSeries_Indicator +{ + private readonly List _buffer = new(); + private readonly double _k, _k1m; + private double _lastema1, _lastlastema1; + private double _lastema2, _lastlastema2; + private double _lastema3, _lastlastema3; + + public TEMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k = 2.0 / (this._p + 1); + this._k1m = 1.0 - this._k; + if (_data.Count > 0) { base.Add(_data); } + } + + public override void Add((DateTime t, double v) d, bool update = false) + { + + if (update) + { + this._lastema1 = this._lastlastema1; + this._lastema2 = this._lastlastema2; + this._lastema3 = this._lastlastema3; + } + + double _ema1, _ema2, _ema3; + + if (this.Count < this._p) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else + { + _buffer.Add(d.v); + } + if (_buffer.Count > this._p) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + _ema1 = _ema2 = _ema3 = _sma; + } + else + { + _ema1 = d.v * this._k + this._lastema1 * this._k1m; + _ema2 = _ema1 * this._k + this._lastema2 * this._k1m; + _ema3 = _ema2 * this._k + this._lastema3 * this._k1m; + } + + double _tema = 3 * (_ema1 - _ema2) + _ema3; + + this._lastlastema1 = this._lastema1; + this._lastlastema2 = this._lastema2; + this._lastlastema3 = this._lastema3; + this._lastema1 = _ema1; + this._lastema2 = _ema2; + this._lastema3 = _ema3; + + var ret = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _tema); + base.Add(ret, update); + } +} \ No newline at end of file diff --git a/Source/MovingAvg/WMA_Series.cs b/Source/MovingAvg/WMA_Series.cs new file mode 100644 index 00000000..20ec89ef --- /dev/null +++ b/Source/MovingAvg/WMA_Series.cs @@ -0,0 +1,37 @@ +namespace QuanTAlib; + +/** +WMA: (linearly) Weighted Moving Average +The weights are linearly decreasing over the period and the most recent data has +the heaviest weight. + +Sources: + https://corporatefinanceinstitute.com/resources/knowledge/trading-investing/weighted-moving-average-wma/ + https://www.technicalindicators.net/indicators-technical-analysis/83-moving-averages-simple-exponential-weighted +**/ + +public class WMA_Series : Single_TSeries_Indicator +{ + public WMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + for (int i = 0; i < this._p; i++) { this._weights.Add(i + 1); } + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + private readonly System.Collections.Generic.List _weights = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _wma = 0; + for (int i = 0; i < _buffer.Count; i++) { _wma += _buffer[i] * this._weights[i]; } + _wma /= (this._buffer.Count * (this._buffer.Count + 1)) * 0.5; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _wma); + + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/MovingAvg/ZLEMA_Series.cs b/Source/MovingAvg/ZLEMA_Series.cs new file mode 100644 index 00000000..8370b625 --- /dev/null +++ b/Source/MovingAvg/ZLEMA_Series.cs @@ -0,0 +1,55 @@ +using System; +namespace QuanTAlib; + +/** +ZLEMA: Zero Lag Exponential Moving Average + +The Zero lag exponential moving average (ZLEMA) indicator was created by John +Ehlers and Ric Way. + +The formula for a given N-Day period and for a given Data series is: +Lag = (Period-1)/2 +Ema Data = {Data+(Data-Data(Lag days ago)) +ZLEMA = EMA (EmaData,Period) + +The idea is do a regular exponential moving average (EMA) calculation but on a +de-lagged data instead of doing it on the regular data. Data is de-lagged by +removing the data from "lag" days ago thus removing (or attempting to remove) +the cumulative lag effect of the moving average. +**/ + +public class ZLEMA_Series : Single_TSeries_Indicator +{ + private readonly double _k, _k1m; + private double _lastema, _lastlastema; + + public ZLEMA_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + this._k = 2.0 / (double)(period + 1); + this._k1m = 1.0 - this._k; + this._lastema = this._lastlastema = double.NaN; + + + if (base._data.Count > 0) { base.Add(base._data); } + } + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) + { + this._lastema = this._lastlastema; + } + int _lag = (int)(0.5 * (_p - 1)); + int _l = Math.Max(this._data.Count - _lag, 0); + double _lagdata = 1 * d.v - this._data[_l].v; + + double _ema = System.Double.IsNaN(this._lastema) ? _lagdata : _lagdata * this._k + this._lastema * this._k1m; + this._lastlastema = this._lastema; + this._lastema = _ema; + + (System.DateTime t, double v) result = + (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _ema); + base.Add(result, update); + + } +} diff --git a/Source/QuanTAlib.csproj b/Source/QuanTAlib.csproj new file mode 100644 index 00000000..ae809740 --- /dev/null +++ b/Source/QuanTAlib.csproj @@ -0,0 +1,70 @@ + + + 0.1.10-beta + + QuanTAlib + Library of Technical Indicators for .NET + Quantitative Technical Analysis library for both real-time (streaming) and historical data analysis + git + https://github.com/mihakralj/QuanTAlib + true + Miha Kralj + Miha Kralj + readme.md + net7.0;net6.0;net48;netcoreapp3.1;netstandard2.1 + disable + 10.0 + disable + true + en-US + QuanTAlib + QuanTAlib + True + AnyCPU + False + embedded + True + True + + Indicators;Stock;Market;Technical;Analysis;Algorithmic;Trading;Trade;Trend;Momentum;Finance;Algorithm;Algo; + AlgoTrading;Financial;Strategy;Chart;Charting;Oscillator;Overlay;Equity;Bitcoin;Crypto;Cryptocurrency;Forex; + Quantitative;Historical;Quotes; + + Apache-2.0 + + false + + + + True + 4 + True + anycpu + + + + + True + 4 + True + anycpu + + + + images\icon.png + https://raw.githubusercontent.com/mihakralj/QuanTAlib/main/.github/QuanTAlib2.png + + + + + + + + + + + True + + + + diff --git a/Source/Statistics/BIAS_Series.cs b/Source/Statistics/BIAS_Series.cs new file mode 100644 index 00000000..26427a5c --- /dev/null +++ b/Source/Statistics/BIAS_Series.cs @@ -0,0 +1,40 @@ +/** + BIAS: Rate of change between the source and a moving average. + + Bias is a statistical term which means a systematic deviation from the actual value. + + BIAS = (close - SMA) / SMA + = (close / SMA) - 1 + +Sources: + https://en.wikipedia.org/wiki/Bias_of_an_estimator + +**/ + +using System; +namespace QuanTAlib; + +public class BIAS_Series : Single_TSeries_Indicator +{ + public BIAS_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) TValue, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = TValue.v; } + else { this._buffer.Add(TValue.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < this._buffer.Count; i++) { _sma += this._buffer[i]; } + _sma /= this._buffer.Count; + double _bias = (this._buffer[this._buffer.Count - 1] / ((_sma != 0) ? _sma : 1)) - 1; + + var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _bias); + + base.Add(result, update); + } +} diff --git a/Source/Statistics/ENTP_Series.cs b/Source/Statistics/ENTP_Series.cs new file mode 100644 index 00000000..f1d64cfd --- /dev/null +++ b/Source/Statistics/ENTP_Series.cs @@ -0,0 +1,51 @@ +/** +ENTP: Entropy + +Introduced by Claude Shannon in 1948, entropy measures the unpredictability +of the data, or equivalently, of its average information. + +Calculation: + P = close / Σ(close) + ENTP = Σ(-P * Log(P) / Log(base)) + +Sources: + https://en.wikipedia.org/wiki/Entropy_(information_theory) + https://math.stackexchange.com/questions/3428693/how-to-calculate-entropy-from-a-set-of-correlated-samples + +**/ +namespace QuanTAlib; +using System; +public class ENTP_Series : Single_TSeries_Indicator +{ + public ENTP_Series(TSeries source, int period, double logbase = 2.0, bool useNaN = false) : base(source, period, useNaN) + { + this._logbase = logbase; + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly double _logbase = 2.0; + private readonly System.Collections.Generic.List _buffer = new(); + private readonly System.Collections.Generic.List _buff2 = new(); + + public override void Add((System.DateTime t, double v) TValue, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = TValue.v; } + else { this._buffer.Add(TValue.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _sum = 0; + for (int i = 0; i < this._buffer.Count; i++) { _sum += this._buffer[i]; } + + double _pp = this._buffer[this._buffer.Count - 1] / _sum; + double _ppp = -_pp * Math.Log(_pp) / Math.Log(this._logbase); + + if (update) { this._buff2[this._buff2.Count - 1] = _ppp; } + else { this._buff2.Add(_ppp); } + if (this._buff2.Count > this._p && this._p != 0) { this._buff2.RemoveAt(0); } + + double _entp = 0; + for (int i = 0; i < this._buff2.Count; i++) { _entp += this._buff2[i]; } + + var result = (TValue.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _entp); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/KURT_Series.cs b/Source/Statistics/KURT_Series.cs new file mode 100644 index 00000000..cc5a1c63 --- /dev/null +++ b/Source/Statistics/KURT_Series.cs @@ -0,0 +1,65 @@ +/** +KURT: Kurtosis of population + + Kurtosis characterizes the relative peakedness or flatness of a distribution + compared with the normal distribution. Positive kurtosis indicates a relatively + peaked distribution. Negative kurtosis indicates a relatively flat distribution. + + The normal curve is called Mesokurtic curve. If the curve of a distribution is + more outlier prone (or heavier-tailed) than a normal or mesokurtic curve then + it is referred to as a Leptokurtic curve. If a curve is less outlier prone (or + lighter-tailed) than a normal curve, it is called as a platykurtic curve. + +Calculation: + sum4 = Σ(close-SMA)^4 + sum2 = (Σ(close-SMA)^2)^2 + KURT = length * (sum4/sum2) + +Sources: + https://en.wikipedia.org/wiki/Kurtosis + https://stats.oarc.ucla.edu/other/mult-pkg/faq/general/faq-whats-with-the-different-formulas-for-kurtosis/ + +**/ + +using System; +namespace QuanTAlib; + +// https://stats.oarc.ucla.edu/other/mult-pkg/faq/general/faq-whats-with-the-different-formulas-for-kurtosis/ + +public class KURT_Series : Single_TSeries_Indicator +{ + public KURT_Series(TSeries source, int period, double logbase = 2.0, bool useNaN = false) : base(source, period, useNaN) + { + this._logbase = logbase; + if (base._data.Count > 0) { base.Add(base._data); } + } + protected double _logbase = 2.0; + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { this._buffer.Add(d.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _n = this._buffer.Count; + + double _avg = 0; + for (int i = 0; i < this._buffer.Count; i++) { _avg += this._buffer[i]; } + _avg /= _n; + + double _s2 = 0; + double _s4 = 0; + for (int i = 0; i < this._buffer.Count; i++) + { + _s2 += (this._buffer[i] - _avg) * (this._buffer[i] - _avg); + _s4 += (this._buffer[i] - _avg) * (this._buffer[i] - _avg) * (this._buffer[i] - _avg) * (this._buffer[i] - _avg); + } + + double _Vx = _s2 / (_n - 1); + double _kurt = (_n > 3) ? (((_n * (_n + 1)) / ((_n - 1) * (_n - 2) * (_n - 3))) * (_s4 / (_Vx * _Vx)) - (3 * ((_n - 1) * (_n - 1) / ((_n - 2) * (_n - 3))))) : Double.NaN; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? Double.NaN : _kurt); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/MAD_Series.cs b/Source/Statistics/MAD_Series.cs new file mode 100644 index 00000000..72723afe --- /dev/null +++ b/Source/Statistics/MAD_Series.cs @@ -0,0 +1,43 @@ +/** +MAD: Mean Absolute Deviation + +Also known as AAD - Average Absolute Deviation, to differentiate it from Median Absolute Deviation +MAD defines the degree of variation across the series. + +Calculation: + MAD = Σ(|close-SMA|) / period + +Sources: + https://en.wikipedia.org/wiki/Average_absolute_deviation + +**/ + +using System; +namespace QuanTAlib; + +public class MAD_Series : Single_TSeries_Indicator +{ + public MAD_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _mad = 0; + for (int i = 0; i < _buffer.Count; i++) { _mad += Math.Abs(_buffer[i] - _sma); } + _mad /= this._buffer.Count; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _mad); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/MAPE_Series.cs b/Source/Statistics/MAPE_Series.cs new file mode 100644 index 00000000..9b5f9d10 --- /dev/null +++ b/Source/Statistics/MAPE_Series.cs @@ -0,0 +1,45 @@ +/** +MAPE: Mean Absolute Percentage Error + +Measures the size of the error in percentage terms + +Calculation: + MAPE = Σ(|close – SMA| / |close|) / n + +Sources: + https://en.wikipedia.org/wiki/Mean_absolute_percentage_error + +Remark: returns infinity if any of observations is 0. +Use SMAPE or WMAPE instead to avoid division-by-zero in MAPE + +**/ + +using System; +namespace QuanTAlib; + +public class MAPE_Series : Single_TSeries_Indicator +{ + public MAPE_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _mape = 0; + for (int i = 0; i < _buffer.Count; i++) { _mape += (_buffer[i] != 0) ? Math.Abs(_buffer[i] - _sma) / Math.Abs(_buffer[i]) : double.PositiveInfinity; } + _mape /= this._buffer.Count; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _mape); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/MAX_Series.cs b/Source/Statistics/MAX_Series.cs new file mode 100644 index 00000000..150eacd8 --- /dev/null +++ b/Source/Statistics/MAX_Series.cs @@ -0,0 +1,33 @@ +namespace QuanTAlib; +/* +MAX - Maximum value in the given period in the series. + +If period = 0 => period = full length of the series + +*/ + +using System; +using System.Collections.Generic; +public class MAX_Series : Single_TSeries_Indicator +{ + public MAX_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly List _buffer = new(); + + public override void Add((DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { this._buffer.Add(d.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _max = d.v; + for (int i = 0; i < this._buffer.Count; i++) + { _max = this._buffer[i] > _max ? this._buffer[i] : _max; } + + var result = (d.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _max); + + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/MED_Series.cs b/Source/Statistics/MED_Series.cs new file mode 100644 index 00000000..60629067 --- /dev/null +++ b/Source/Statistics/MED_Series.cs @@ -0,0 +1,48 @@ +/* +MED - Median value + +Median of numbers is the middlemost value of the given set of numbers. +It separates the higher half and the lower half of a given data sample. +At least half of the observations are smaller than or equal to median +and at least half of the observations are greater than or equal to the median. + +If the number of values is odd, the middlemost observation of the sorted +list is the median of the given data. If the number of values is even, +median is the average of (n/2)th and [(n/2) + 1]th values of the sorted list. + +If period = 0 => period is max + +Sources: + https://corporatefinanceinstitute.com/resources/knowledge/other/median/ + https://en.wikipedia.org/wiki/Median + +*/ + +using System; +namespace QuanTAlib; + +public class MED_Series : Single_TSeries_Indicator +{ + public MED_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { this._buffer.Add(d.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + System.Collections.Generic.List _s = new(this._buffer); + _s.Sort(); + int _p1 = _s.Count / 2; + int _p2 = Math.Max(0, _s.Count / 2 - 1); + double _med = (_s.Count % 2 != 0) ? _s[_p1] : (_s[_p1] + _s[_p2]) / 2; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _med); + + base.Add(result, update); + } +} diff --git a/Source/Statistics/MIN_Series.cs b/Source/Statistics/MIN_Series.cs new file mode 100644 index 00000000..408bd183 --- /dev/null +++ b/Source/Statistics/MIN_Series.cs @@ -0,0 +1,33 @@ +/* +MIN - Minimum value in the given period in the series. + +If period = 0 => period = full length of the series + +*/ + +using System; +namespace QuanTAlib; + +public class MIN_Series : Single_TSeries_Indicator +{ + public MIN_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { this._buffer.Add(d.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _min = d.v; + for (int i = 0; i < this._buffer.Count; i++) + { _min = (this._buffer[i] < _min) ? this._buffer[i] : _min; } + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _min); + + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/MSE_Series.cs b/Source/Statistics/MSE_Series.cs new file mode 100644 index 00000000..4f634758 --- /dev/null +++ b/Source/Statistics/MSE_Series.cs @@ -0,0 +1,41 @@ +/** +MSE: Mean Square Error + +Defined as a Mean (Average) of the Square of the difference between actual and estimated values. + +Sources: + https://en.wikipedia.org/wiki/Mean_squared_error + +Remark: + +**/ + +using System; +namespace QuanTAlib; + +public class MSE_Series : Single_TSeries_Indicator +{ + public MSE_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _mse = 0; + for (int i = 0; i < _buffer.Count; i++) { _mse += (_buffer[i] - _sma) * (_buffer[i] - _sma); } + _mse /= this._buffer.Count; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _mse); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/PSDEV_Series.cs b/Source/Statistics/PSDEV_Series.cs new file mode 100644 index 00000000..a5567784 --- /dev/null +++ b/Source/Statistics/PSDEV_Series.cs @@ -0,0 +1,45 @@ +/** +PSDEV: Population Standard Deviation + +Population Standard Deviation is the square root of the biased variance, also knons as +Uncorrected Sample Standard Deviation + +Sources: + https://en.wikipedia.org/wiki/Standard_deviation#Uncorrected_sample_standard_deviation + +Remark: + PSDEV (Population Standard Deviation) is also known as a biased/uncorrected Standard Deviation. + For unbiased version that uses Bessel's correction, use SDEV instead. + +**/ + +using System; +namespace QuanTAlib; + +public class PSDEV_Series : Single_TSeries_Indicator +{ + public PSDEV_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _pvar = 0; + for (int i = 0; i < _buffer.Count; i++) { _pvar += (_buffer[i] - _sma) * (_buffer[i] - _sma); } + _pvar /= this._buffer.Count; + double _psdev = Math.Sqrt(_pvar); + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _psdev); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/PVAR_Series.cs b/Source/Statistics/PVAR_Series.cs new file mode 100644 index 00000000..384cc5c4 --- /dev/null +++ b/Source/Statistics/PVAR_Series.cs @@ -0,0 +1,44 @@ +/** +PVAR: Population Variance + +Population variance.... + +Sources: + https://en.wikipedia.org/wiki/Variance + Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction + +Remark: + PVAR (Population Variance) is also known as a biased Sample Variance. For unbiased + sample variance use SVAR instead. + +**/ + +using System; +namespace QuanTAlib; + +public class PVAR_Series : Single_TSeries_Indicator +{ + public PVAR_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _pvar = 0; + for (int i = 0; i < _buffer.Count; i++) { _pvar += (_buffer[i] - _sma) * (_buffer[i] - _sma); } + _pvar /= this._buffer.Count; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _pvar); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/SDEV_Series.cs b/Source/Statistics/SDEV_Series.cs new file mode 100644 index 00000000..c4fe6d79 --- /dev/null +++ b/Source/Statistics/SDEV_Series.cs @@ -0,0 +1,46 @@ +/** +SDEV: (Corrected) Sample Standard Deviation + +Sample Standard Deviaton uses Bessel's correction to correct the bias in the variance. + +Sources: + https://en.wikipedia.org/wiki/Standard_deviation#Corrected_sample_standard_deviation + Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction + +Remark: + + SSDEV (Sample Standard Deviation) is also known as a unbiased/corrected Standard Deviation. + For a population/biased/uncorrected Standard Deviation, use PSDEV instead + +**/ + +using System; +namespace QuanTAlib; + +public class SDEV_Series : Single_TSeries_Indicator +{ + public SDEV_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { this._buffer.Add(d.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < this._buffer.Count; i++) { _sma += this._buffer[i]; } + _sma /= this._buffer.Count; + + double _svar = 0; + for (int i = 0; i < this._buffer.Count; i++) { _svar += (this._buffer[i] - _sma) * (this._buffer[i] - _sma); } + _svar /= (this._buffer.Count > 1) ? this._buffer.Count - 1 : 1; // Bessel's correction + double _ssdev = Math.Sqrt(_svar); + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _ssdev); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/SMAPE_Series.cs b/Source/Statistics/SMAPE_Series.cs new file mode 100644 index 00000000..0674a859 --- /dev/null +++ b/Source/Statistics/SMAPE_Series.cs @@ -0,0 +1,39 @@ +/** +SMAPE: Symmetric Mean Absolute Percentage Error + +Measures the size of the error in percentage terms + +Sources: + https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error + +**/ + +using System; +namespace QuanTAlib; + +public class SMAPE_Series : Single_TSeries_Indicator +{ + public SMAPE_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _smape = 0; + for (int i = 0; i < _buffer.Count; i++) { _smape += Math.Abs(_buffer[i] - _sma) / (Math.Abs(_buffer[i]) + Math.Abs(_sma)); } + _smape /= this._buffer.Count; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _smape); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/VAR_Series.cs b/Source/Statistics/VAR_Series.cs new file mode 100644 index 00000000..2e2a0150 --- /dev/null +++ b/Source/Statistics/VAR_Series.cs @@ -0,0 +1,44 @@ +/** +VAR: Sample Variance + +Sample variance uses Bessel's correction to correct the bias in the estimation of population variance. + +Sources: + https://en.wikipedia.org/wiki/Variance + Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction + +Remark: + VAR is also known as the Unbiased Sample Variance, while PVAR (Population Variance) is known as + the Biased Sample Variance. + +**/ + +using System; +namespace QuanTAlib; + +public class VAR_Series : Single_TSeries_Indicator +{ + public VAR_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { this._buffer[this._buffer.Count - 1] = d.v; } + else { this._buffer.Add(d.v); } + if (this._buffer.Count > this._p && this._p != 0) { this._buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < this._buffer.Count; i++) { _sma += this._buffer[i]; } + _sma /= this._buffer.Count; + + double _svar = 0; + for (int i = 0; i < this._buffer.Count; i++) { _svar += (this._buffer[i] - _sma) * (this._buffer[i] - _sma); } + _svar /= (this._buffer.Count > 1) ? this._buffer.Count - 1 : 1; // Bessel's correction + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _svar); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Source/Statistics/WMAPE_Series.cs b/Source/Statistics/WMAPE_Series.cs new file mode 100644 index 00000000..9ed41183 --- /dev/null +++ b/Source/Statistics/WMAPE_Series.cs @@ -0,0 +1,44 @@ +/** +WMAPE: Weighted Mean Absolute Percentage Error + +Measures the size of the error in percentage terms + +Sources: + https://en.wikipedia.org/wiki/WMAPE + +**/ + +using System; +namespace QuanTAlib; + +public class WMAPE_Series : Single_TSeries_Indicator +{ + public WMAPE_Series(TSeries source, int period, bool useNaN = false) : base(source, period, useNaN) + { + if (base._data.Count > 0) { base.Add(base._data); } + } + private readonly System.Collections.Generic.List _buffer = new(); + + public override void Add((System.DateTime t, double v) d, bool update) + { + if (update) { _buffer[_buffer.Count - 1] = d.v; } + else { _buffer.Add(d.v); } + if (_buffer.Count > this._p && this._p != 0) { _buffer.RemoveAt(0); } + + double _sma = 0; + for (int i = 0; i < _buffer.Count; i++) { _sma += _buffer[i]; } + _sma /= this._buffer.Count; + + double _div = 0; + double _wmape = 0; + for (int i = 0; i < _buffer.Count; i++) + { + _wmape += Math.Abs(_buffer[i] - _sma); + _div += Math.Abs(_buffer[i]); + } + _wmape /= _div; + + var result = (d.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _wmape); + base.Add(result, update); + } +} \ No newline at end of file diff --git a/Tests/Basics/ADD_Test.cs b/Tests/Basics/ADD_Test.cs new file mode 100644 index 00000000..66e2f122 --- /dev/null +++ b/Tests/Basics/ADD_Test.cs @@ -0,0 +1,64 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class ADD_Test +{ + [Fact] + public void ADDSeriesSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + ADD_Series c = new(a, b); + Assert.Equal(5, c.Last().v); + } + + [Fact] + public void ADDSeriesDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + ADD_Series c = new(a, 10.0); + Assert.Equal(15, c.Last().v); + } + + [Fact] + public void ADDDoubleSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + ADD_Series c = new(10.0, a); + Assert.Equal(15, c.Last().v); + } + + [Fact] + public void ADDEventing_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + ADD_Series c = new(a, b); + a.Add(2); + b.Add(2); + Assert.Equal(4, c.Last().v); + } + + [Fact] + public void ADDUpdateDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + double b = 10; + ADD_Series c = new(a, b); + a.Add(0, true); + Assert.Equal(10, c.Last().v); + } + + [Fact] + public void ADDUpdating_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + ADD_Series c = new(a, b); + a.Add(10, true); + b.Add(10, true); + Assert.Equal(20, c.Last().v); + } +} diff --git a/Tests/Basics/Abstract_Test.cs b/Tests/Basics/Abstract_Test.cs new file mode 100644 index 00000000..afd51407 --- /dev/null +++ b/Tests/Basics/Abstract_Test.cs @@ -0,0 +1,23 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class Abstract_Test +{ + [Fact] + public void Single_Add_variations() + { + TSeries s = new() { 1,2,3,4,5 }; + SMA_Series a = new(s, 3) + { + { (DateTime.Today, 10), true } + }; + Assert.Equal(s.Length, a.Length); + a.Add(true); + Assert.Equal(s.Length, a.Length); + a.Add(); + Assert.Equal(s.Length+1, a.Length); + } + +} diff --git a/Tests/Basics/DIV_Test.cs b/Tests/Basics/DIV_Test.cs new file mode 100644 index 00000000..0421bff8 --- /dev/null +++ b/Tests/Basics/DIV_Test.cs @@ -0,0 +1,64 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class DIV_Test +{ + [Fact] + public void DIVSeriesSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 15 }; + TSeries b = new() { 5, 4, 3, 2, 1, 3 }; + DIV_Series c = new(a, b); + Assert.Equal(5, c.Last().v); + } + + [Fact] + public void DIVSeriesDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 15.0 }; + DIV_Series c = new(a, 0); + Assert.Equal(double.PositiveInfinity, c.Last().v); + } + + [Fact] + public void DIVDoubleSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 3.0 }; + DIV_Series c = new(12.0, a); + Assert.Equal(4.0, c.Last().v); + } + + [Fact] + public void DIVEventing_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + DIV_Series c = new(a, b); + a.Add(12.0); + b.Add(2); + Assert.Equal(6.0, c.Last().v); + } + + [Fact] + public void DIVUpdatewDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 15 }; + double b = 2; + DIV_Series c = new(a, b); + a.Add(10, true); + Assert.Equal(5, c.Last().v); + } + + [Fact] + public void DIVUpdating_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 1 }; + DIV_Series c = new(a, b); + a.Add(10, true); + b.Add(2, true); + Assert.Equal(5, c.Last().v); + } +} diff --git a/Tests/Basics/MUL_Test.cs b/Tests/Basics/MUL_Test.cs new file mode 100644 index 00000000..30d1d536 --- /dev/null +++ b/Tests/Basics/MUL_Test.cs @@ -0,0 +1,64 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class MUL_Test +{ + [Fact] + public void MULSeriesSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 1 }; + MUL_Series c = new(a, b); + Assert.Equal(5, c.Last().v); + } + + [Fact] + public void MULSeriesDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MUL_Series c = new(a, 10.0); + Assert.Equal(50, c.Last().v); + } + + [Fact] + public void MULDoubleSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MUL_Series c = new(5.0, a); + Assert.Equal(25, c.Last().v); + } + + [Fact] + public void MULEventing_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + MUL_Series c = new(a, b); + a.Add(2); + b.Add(5); + Assert.Equal(10, c.Last().v); + } + + [Fact] + public void MULUpdateDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + double b = 10; + MUL_Series c = new(a, b); + a.Add(2, true); + Assert.Equal(20, c.Last().v); + } + + [Fact] + public void MULUpdating_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + MUL_Series c = new(a, b); + a.Add(10, true); + b.Add(10, true); + Assert.Equal(100, c.Last().v); + } +} diff --git a/Tests/Basics/SUB_Test.cs b/Tests/Basics/SUB_Test.cs new file mode 100644 index 00000000..b9f18584 --- /dev/null +++ b/Tests/Basics/SUB_Test.cs @@ -0,0 +1,64 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class SUB_Test +{ + [Fact] + public void SUBSeriesSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 1 }; + SUB_Series c = new(a, b); + Assert.Equal(4, c.Last().v); + } + + [Fact] + public void SUBSeriesDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 15.0 }; + SUB_Series c = new(a, 10.0); + Assert.Equal(5.0, c.Last().v); + } + + [Fact] + public void SUBDoubleSeries_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 15.0 }; + SUB_Series c = new(10.0, a); + Assert.Equal(-5.0, c.Last().v); + } + + [Fact] + public void SUBEventing_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 0 }; + SUB_Series c = new(a, b); + a.Add(7.0); + b.Add(2); + Assert.Equal(5.0, c.Last().v); + } + + [Fact] + public void SUBUpdatewDouble_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 15 }; + double b = 10; + SUB_Series c = new(a, b); + a.Add(1, true); + Assert.Equal(-9, c.Last().v); + } + + [Fact] + public void SUBUpdating_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TSeries b = new() { 5, 4, 3, 2, 1, 1 }; + SUB_Series c = new(a, b); + a.Add(10, true); + b.Add(0, true); + Assert.Equal(10, c.Last().v); + } +} diff --git a/Tests/Basics/TBars_Test.cs b/Tests/Basics/TBars_Test.cs new file mode 100644 index 00000000..67b0f121 --- /dev/null +++ b/Tests/Basics/TBars_Test.cs @@ -0,0 +1,113 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class TBars_Test +{ + [Fact] + public void InsertingTuple() + { + TBars s = new() { (t: DateTime.Today, o: double.Epsilon, h: double.NaN, l: Double.MaxValue, c: Double.NegativeInfinity, v: Double.PositiveInfinity) }; + var tup = (t: DateTime.Today, o: double.Epsilon, h: double.NaN, l: Double.MaxValue, + c: Double.NegativeInfinity, v: Double.PositiveInfinity); + Assert.Equal(tup, s[^1]); + } + + [Fact] + public void Casting_Parameters() + { + TBars s = new() + { + { DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1, false } + }; + Assert.Equal(0.1, s[^1].o); + Assert.Equal(1.1, s[^1].h); + Assert.Equal(2.1, s[^1].l); + Assert.Equal(3.1, s[^1].c); + Assert.Equal(4.1, s[^1].v); + Assert.Equal(DateTime.Today, s[^1].t); + Assert.Single(s); + } + + [Fact] + public void Updating_Value() + { + TBars s = new() + { + { DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1 } + }; + s.Add(DateTime.Today, 1.0, 1.0, 1.0, 1.0, 1.0, update: false); + s.Add(DateTime.Today, 0.0, 0.0, 0.0, 0.0, 0.0, update: true); + Assert.Equal(0.0, s[^1].o); + Assert.Equal(0.0, s[^1].h); + Assert.Equal(0.0, s[^1].l); + Assert.Equal(0.0, s[^1].c); + Assert.Equal(0.0, s[^1].v); + Assert.Equal(2, s.Count); + } + [Fact] + public void Extracting_TSeries() + { + TBars s = new() + { + { DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1 }, + { DateTime.Today, 2.1, 3.1, 4.1, 5.1, 6.1 } + }; + + TSeries t = s.Open; + Assert.Equal(t.t, s.Open.t); + Assert.Equal(t.v, s.Open.v); + + t = s.High; + Assert.Equal(t.t, s.High.t); + Assert.Equal(t.v, s.High.v); + + t = s.Low; + Assert.Equal(t.t, s.Low.t); + Assert.Equal(t.v, s.Low.v); + + t = s.Close; + Assert.Equal(t.t, s.Close.t); + Assert.Equal(t.v, s.Close.v); + + t = s.Volume; + Assert.Equal(t.t, s.Volume.t); + Assert.Equal(t.v, s.Volume.v); + + t = s.HL2; + Assert.Equal(t.t, s.HL2.t); + Assert.Equal(t.v, s.HL2.v); + + t = s.OC2; + Assert.Equal(t.t, s.OC2.t); + Assert.Equal(t.v, s.OC2.v); + + t = s.OHL3; + Assert.Equal(t.t, s.OHL3.t); + Assert.Equal(t.v, s.OHL3.v); + + t = s.HLC3; + Assert.Equal(t.t, s.HLC3.t); + Assert.Equal(t.v, s.HLC3.v); + + t = s.OHLC4; + Assert.Equal(t.t, s.OHLC4.t); + Assert.Equal(t.v, s.OHLC4.v); + + t = s.HLCC4; + Assert.Equal(t.t, s.HLCC4.t); + Assert.Equal(t.v, s.HLCC4.v); + } + [Fact] + public void Broadcasting_Events() + { + TBars s = new() { (DateTime.Today, 2.1, 3.1, 4.1, 5.1, 6.1) }; + TSeries t = new(); + s.Close.Pub += t.Sub; + s.Add(DateTime.Today, 0.1, 1.1, 2.1, 3.1, 4.1, false); + Assert.Equal(s.Close.v, t.v); + Assert.Equal(s.Close.Count, t.Count); + + } +} diff --git a/Tests/Basics/TSeries_Test.cs b/Tests/Basics/TSeries_Test.cs new file mode 100644 index 00000000..9ec5a85c --- /dev/null +++ b/Tests/Basics/TSeries_Test.cs @@ -0,0 +1,63 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Basics; +public class TSeries_Test +{ + [Fact] + public void InsertingTuple() + { + TSeries s = new() { (t: DateTime.Today, v: double.Epsilon) }; + Assert.Equal((DateTime.Today, double.Epsilon), s); + } + + [Fact] + public void CastingTwoParameters() + { + TSeries s = new() + { + { DateTime.Today, 0.0 } + }; + Assert.Equal(0.0, s[s.Count - 1].v); + Assert.Equal(DateTime.Today, s[s.Count - 1].t); + } + + [Fact] + public void CastingOneParameter() + { + TSeries s = new() + { + double.PositiveInfinity + }; + Assert.Equal(double.PositiveInfinity, (double)s); + } + + [Fact] + public void UpdatingValue() + { + TSeries s = new() { 1, 2, 3, 4, 5 }; + s.Add(0.0, update: true); + Assert.Equal(0.0, (double)s); + Assert.Equal(5, s.Count); + } + [Fact] + public void ReflectingSeries() + { + TSeries s = new() { 1, 2, 3, 4, 5 }; + TSeries t = s; + Assert.Equal(5, (double)t); + Assert.Equal(5, t.Count); + + } + [Fact] + public void BroadcastingEvents() + { + TSeries s = new() { 1, 2, 3, 4, 5 }; + TSeries t = new(); + s.Pub += t.Sub; + s.Add(0.0, update: true); + Assert.Equal(0.0, (double)t); + + } +} diff --git a/Tests/MovingAvg/DEMA_Test.cs b/Tests/MovingAvg/DEMA_Test.cs new file mode 100644 index 00000000..6d2a5a8c --- /dev/null +++ b/Tests/MovingAvg/DEMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class DEMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + DEMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + DEMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/EMA_Test.cs b/Tests/MovingAvg/EMA_Test.cs new file mode 100644 index 00000000..dc25bb3e --- /dev/null +++ b/Tests/MovingAvg/EMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class EMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + EMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + EMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/HEMA_Test.cs b/Tests/MovingAvg/HEMA_Test.cs new file mode 100644 index 00000000..e68aeed6 --- /dev/null +++ b/Tests/MovingAvg/HEMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class HEMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + HEMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + HEMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/HMA_Test.cs b/Tests/MovingAvg/HMA_Test.cs new file mode 100644 index 00000000..15c98600 --- /dev/null +++ b/Tests/MovingAvg/HMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class HMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + HMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + HMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/JMA_Test.cs b/Tests/MovingAvg/JMA_Test.cs new file mode 100644 index 00000000..c0df4051 --- /dev/null +++ b/Tests/MovingAvg/JMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class JMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + JMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + JMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/RMA_Test.cs b/Tests/MovingAvg/RMA_Test.cs new file mode 100644 index 00000000..396799bd --- /dev/null +++ b/Tests/MovingAvg/RMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class RMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + RMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + RMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/SMA_Test.cs b/Tests/MovingAvg/SMA_Test.cs new file mode 100644 index 00000000..a30a808a --- /dev/null +++ b/Tests/MovingAvg/SMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class SMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + SMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + SMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/TEMA_Test.cs b/Tests/MovingAvg/TEMA_Test.cs new file mode 100644 index 00000000..03960e24 --- /dev/null +++ b/Tests/MovingAvg/TEMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class TEMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + TEMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + TEMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/WMA_Test.cs b/Tests/MovingAvg/WMA_Test.cs new file mode 100644 index 00000000..d1839596 --- /dev/null +++ b/Tests/MovingAvg/WMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class WMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + WMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + WMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/MovingAvg/ZLEMA_Test.cs b/Tests/MovingAvg/ZLEMA_Test.cs new file mode 100644 index 00000000..634988cf --- /dev/null +++ b/Tests/MovingAvg/ZLEMA_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace MovingAvg; +public class ZLEMA_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + ZLEMA_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + ZLEMA_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/BIAS_Test.cs b/Tests/Statistics/BIAS_Test.cs new file mode 100644 index 00000000..e2f97115 --- /dev/null +++ b/Tests/Statistics/BIAS_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class BIAS_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + BIAS_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + BIAS_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/ENTP_Test.cs b/Tests/Statistics/ENTP_Test.cs new file mode 100644 index 00000000..e36f3e76 --- /dev/null +++ b/Tests/Statistics/ENTP_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class KURT_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + KURT_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + KURT_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/KURT_Test.cs b/Tests/Statistics/KURT_Test.cs new file mode 100644 index 00000000..2a09b1d2 --- /dev/null +++ b/Tests/Statistics/KURT_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class ENTP_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + ENTP_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + ENTP_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/MAD_Test.cs b/Tests/Statistics/MAD_Test.cs new file mode 100644 index 00000000..413b2eab --- /dev/null +++ b/Tests/Statistics/MAD_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class MAD_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MAD_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + MAD_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/MAPE_Test.cs b/Tests/Statistics/MAPE_Test.cs new file mode 100644 index 00000000..ade998cd --- /dev/null +++ b/Tests/Statistics/MAPE_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class MAPE_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MAPE_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + MAPE_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/MAX_Test.cs b/Tests/Statistics/MAX_Test.cs new file mode 100644 index 00000000..772c8cb7 --- /dev/null +++ b/Tests/Statistics/MAX_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class MAX_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MAX_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + MAX_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/MED_Test.cs b/Tests/Statistics/MED_Test.cs new file mode 100644 index 00000000..9d1ec409 --- /dev/null +++ b/Tests/Statistics/MED_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class MED_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MED_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + MED_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/MIN_Test.cs b/Tests/Statistics/MIN_Test.cs new file mode 100644 index 00000000..38d41ca0 --- /dev/null +++ b/Tests/Statistics/MIN_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class MIN_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MIN_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + MIN_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/MSE_Test.cs b/Tests/Statistics/MSE_Test.cs new file mode 100644 index 00000000..310ad92b --- /dev/null +++ b/Tests/Statistics/MSE_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class MSE_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + MSE_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + MSE_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/PSDEV_Test.cs b/Tests/Statistics/PSDEV_Test.cs new file mode 100644 index 00000000..29afa83a --- /dev/null +++ b/Tests/Statistics/PSDEV_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class PSDEV_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + PSDEV_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + PSDEV_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/PVAR_Test .cs b/Tests/Statistics/PVAR_Test .cs new file mode 100644 index 00000000..c1ee0d9a --- /dev/null +++ b/Tests/Statistics/PVAR_Test .cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class PVAR_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + PVAR_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + PVAR_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/SDEV_Test .cs b/Tests/Statistics/SDEV_Test .cs new file mode 100644 index 00000000..c1f02a34 --- /dev/null +++ b/Tests/Statistics/SDEV_Test .cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class SDEV_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + SDEV_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + SDEV_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/SMAPE_Test.cs b/Tests/Statistics/SMAPE_Test.cs new file mode 100644 index 00000000..2ac0f171 --- /dev/null +++ b/Tests/Statistics/SMAPE_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class SMAPE_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + SMAPE_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + SMAPE_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/VAR_Test.cs b/Tests/Statistics/VAR_Test.cs new file mode 100644 index 00000000..eea72271 --- /dev/null +++ b/Tests/Statistics/VAR_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class VAR_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + VAR_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + VAR_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Statistics/WMAPE_Test.cs b/Tests/Statistics/WMAPE_Test.cs new file mode 100644 index 00000000..cd1a7276 --- /dev/null +++ b/Tests/Statistics/WMAPE_Test.cs @@ -0,0 +1,33 @@ +using Xunit; +using System; +using QuanTAlib; + +namespace Statistics; +public class WMAPE_Test +{ + [Fact] + public void Add_Test() + { + TSeries a = new() { 0, 1, 2, 3, 4, 5 }; + WMAPE_Series c = new(a, 3); + Assert.Equal(6, c.Count); + a.Add(5); + Assert.Equal(a.Count, c.Count); + a.Add(0, update: true); + Assert.Equal(a.Count, c.Count); + } + + [Fact] + public void Edge_Test() + { + TSeries a = new() { double.NaN, double.Epsilon, double.PositiveInfinity, double.MaxValue }; + WMAPE_Series c = new(a, 3); + Assert.Equal(a.Count, c.Count); + a.Add(double.NaN); + Assert.Equal(a.Count, c.Count); + a.Add(double.PositiveInfinity); + Assert.Equal(a.Count, c.Count); + + } + +} diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj new file mode 100644 index 00000000..8b027b94 --- /dev/null +++ b/Tests/Tests.csproj @@ -0,0 +1,32 @@ + + + + net7.0 + enable + enable + + false + + AnyCPU;x64 + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + diff --git a/Tests/Validations/Pandas_TA.cs b/Tests/Validations/Pandas_TA.cs new file mode 100644 index 00000000..27c2e9b8 --- /dev/null +++ b/Tests/Validations/Pandas_TA.cs @@ -0,0 +1,120 @@ +using Xunit; +using System; +using QuanTAlib; +using Python.Runtime; +using Python.Included; + +namespace Validation; +public class PandasTA +{ + private readonly RND_Feed bars; + private readonly Random rnd = new(); + private readonly int period; + private readonly dynamic ta; + private readonly dynamic df; + + public PandasTA() + { + this.bars = new(1000); + this.period = this.rnd.Next(28) + 3; + + Installer.SetupPython().Wait(); + Installer.TryInstallPip(); + Installer.PipInstallModule("numpy"); + Installer.PipInstallModule("pandas"); + Installer.PipInstallModule("pandas-ta"); + PythonEngine.Initialize(); + this.ta = Py.Import("pandas_ta"); + this.df = this.ta.DataFrame(this.bars.Close.v); + } + + ~PandasTA() + { + PythonEngine.Shutdown(); + } + + [Fact] + void SMA() + { + SMA_Series QL = new(this.bars.Close, this.period, false); + var pta = this.ta.sma(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + +/* + [Fact] + void EMA() + { + EMA_Series QL = new(this.bars.Close, this.period, false); + var pta = this.ta.ema(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + + [Fact] + void TEMA() + { + TEMA_Series QL = new(this.bars.Close, this.period, false); + var pta = this.ta.tema(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + + [Fact] + void ENTP() + { + ENTP_Series QL = new(this.bars.Close, this.period, useNaN:false); + var pta = this.ta.entropy(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + + + [Fact] + void WMA() + { + WMA_Series QL = new(this.bars.Close, this.period, false); + var pta = this.ta.wma(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + + [Fact] + void DEMA() + { + DEMA_Series QL = new(this.bars.Close, this.period, false); + var pta = this.ta.dema(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + + [Fact] + void BIAS() + { + BIAS_Series QL = new(this.bars.Close, this.period, false); + var pta = this.ta.bias(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } + + [Fact] + void KURT() + { + KURT_Series QL = new(this.bars.Close, this.period, useNaN: false); + var pta = this.ta.kurtosis(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 4), Math.Round(QL.Last().v, 4)); + } + + [Fact] + void MAD() + { + MAD_Series QL = new(this.bars.Close, this.period, useNaN: false); + var pta = this.ta.mad(close: this.df[0], length: this.period); + + Assert.Equal(System.Math.Round((double)pta.tail(1), 7), Math.Round(QL.Last().v, 7)); + } +*/ + +} \ No newline at end of file diff --git a/Tests/Validations/Skender_Stock.cs b/Tests/Validations/Skender_Stock.cs new file mode 100644 index 00000000..fb59a3ed --- /dev/null +++ b/Tests/Validations/Skender_Stock.cs @@ -0,0 +1,93 @@ +using Xunit; +using System; +using Skender.Stock.Indicators; +using QuanTAlib; + + +namespace Validation; +public class Skender_Stock +{ + private readonly RND_Feed bars; + private readonly Random rnd = new(); + private readonly int period; + private readonly IEnumerable quotes; + + public Skender_Stock() + { + this.bars = new(1000); + this.period = this.rnd.Next(28) + 3; + this.quotes = this.bars.Select( + q => new Quote + { + Date = q.t, + Open = (decimal)q.o, + High = (decimal)q.h, + Low = (decimal)q.l, + Close = (decimal)q.c, + Volume = (decimal)q.v + }); + } + + [Fact] + public void SMA() + { + SMA_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetSma(this.period, CandlePart.Close); + + Assert.Equal(Math.Round((double)SK.Last().Sma!, 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void EMA() + { + EMA_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetEma(this.period, CandlePart.Close); + + Assert.Equal(Math.Round((double)SK.Last().Ema!, 8), Math.Round(QL.Last().v, 8)); + } + [Fact] + public void WMA() + { + WMA_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetWma(this.period, CandlePart.Close); + + Assert.Equal(Math.Round((double)SK.Last().Wma!, 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void DEMA() + { + DEMA_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetDema(this.period); + + Assert.Equal(Math.Round((double)SK.Last().Dema!, 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void TEMA() + { + TEMA_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetTema(this.period); + + Assert.Equal(Math.Round((double)SK.Last().Tema!, 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void MAD() + { + MAD_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetSmaExtended(this.period); + + Assert.Equal(Math.Round((double)SK.Last().Mad!, 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void MAPE() + { + MAPE_Series QL = new(this.bars.Close, this.period, false); + var SK = this.quotes.GetSmaExtended(this.period); + + Assert.Equal(Math.Round((double)SK.Last().Mape!, 8), Math.Round(QL.Last().v, 8)); + } + +} diff --git a/Tests/Validations/TA_LIB.cs b/Tests/Validations/TA_LIB.cs new file mode 100644 index 00000000..89246cd7 --- /dev/null +++ b/Tests/Validations/TA_LIB.cs @@ -0,0 +1,88 @@ +using Xunit; +using System; +using TALib; +using QuanTAlib; + +namespace Validation; +public class TA_LIB +{ + private readonly RND_Feed bars; + private readonly Random rnd = new(); + private readonly int period; + private readonly double[] TALIB; + private readonly double[] input; + + public TA_LIB() + { + this.bars = new(1000); + this.period = this.rnd.Next(28) + 3; + this.TALIB = new double[this.bars.Count]; + this.input = this.bars.Close.v.ToArray(); + } + +///////////////////////////////////////// + + [Fact] + public void SMA() + { + SMA_Series QL = new(this.bars.Close, this.period, false); + Core.Sma(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void EMA() + { + EMA_Series QL = new(this.bars.Close, this.period, false); + Core.Ema(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void WMA() + { + WMA_Series QL = new(this.bars.Close, this.period, false); + Core.Wma(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void DEMA() + { + DEMA_Series QL = new(this.bars.Close, this.period, false); + Core.Dema(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void TEMA() + { + TEMA_Series QL = new(this.bars.Close, this.period, false); + Core.Tema(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void MAX() + { + MAX_Series QL = new(this.bars.Close, this.period, false); + Core.Max(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + + [Fact] + public void MIN() + { + MIN_Series QL = new(this.bars.Close, this.period, false); + Core.Min(this.input, 0, this.bars.Count - 1, this.TALIB, out int outBegIdx, out _, this.period); + + Assert.Equal(Math.Round(this.TALIB[this.TALIB.Length - outBegIdx - 1], 8), Math.Round(QL.Last().v, 8)); + } + +}