From 58d72c06ca06be83bbb31b68119a41fbe45d3b54 Mon Sep 17 00:00:00 2001 From: Miha Kralj Date: Mon, 23 Sep 2024 22:08:40 -0700 Subject: [PATCH] Squash dotcover s1 .sln s1 s1 s2 s3 s4 s5 s1 s2 x x2 x3 x4 x5 x6 x1 sonarcube cleanup1 sonarcube cleanup2 sonarcube cleanup 3 fixes q q q q q q q q q1 q2 q q1 codacy 1 --- .github/workflows/main_automation.yml | 205 +++---- .gitignore | 5 +- .sonarlint/QuanTAlib.json | 4 + Directory.Build.props | 25 +- GitVersion.yml | 1 + QuanTAlib.sln | 7 +- SyntheticVendor/SyntheticVendor.cs | 536 ++++++++-------- Tests/Tests.csproj | 12 +- Tests/test_Trady.cs | 2 +- Tests/test_Tulip.cs | 7 +- Tests/test_consistency.cs | 30 +- Tests/test_skender.stock.cs | 3 +- Tests/test_talib.cs | 39 +- archive/.editorconfig | 16 - archive/.gitignore | 358 ----------- archive/.refactoring/base.cs | 237 ------- archive/.refactoring/test.dib | 163 ----- archive/.sonarlint/QuanTAlib.ruleset | 5 - archive/.sonarlint/QuanTAlib.slconfig | 19 - .../mihakralj_quantalib/CSharp/SonarLint.xml | 89 --- .../mihakralj_quantalib_secrets_settings.json | 32 - .../mihakralj_quantalibcsharp.ruleset | 390 ------------ archive/.sonarlint/sonar.settings.json | 1 - archive/Calculations/Basics/ADD_Series.cs | 32 - archive/Calculations/Basics/CORR_Series.cs | 52 -- archive/Calculations/Basics/COVAR_Series.cs | 48 -- archive/Calculations/Basics/DIV_Series.cs | 32 - archive/Calculations/Basics/MUL_Series.cs | 30 - archive/Calculations/Basics/SUB_Series.cs | 31 - archive/Calculations/Calculations.csproj | 80 --- .../ClassStructures/Pair_TSeries_Abstract.cs | 157 ----- .../Calculations/Feeds/Alphavantage_Feed.cs | 55 -- archive/Calculations/Feeds/GBM_Feed.cs | 67 -- archive/Calculations/Feeds/RND_Feed.cs | 28 - archive/Calculations/Feeds/Yahoo_Feed.cs | 50 -- archive/Calculations/Logic/COMPARE_Series.cs | 39 -- archive/Calculations/Logic/CROSS_Series.cs | 49 -- archive/Calculations/Logic/EQUITY_Series.cs | 91 --- archive/Calculations/Logic/TOrders.cs | 38 -- archive/Calculations/_Updated/ADL_Series.cs | 79 --- archive/Calculations/_Updated/ADOSC_Series.cs | 100 --- archive/Calculations/_Updated/ALMA_Series.cs | 129 ---- archive/Calculations/_Updated/ATRP_Series.cs | 97 --- archive/Calculations/_Updated/ATR_Series.cs | 98 --- .../Calculations/_Updated/BBANDS_Series.cs | 121 ---- archive/Calculations/_Updated/BIAS_Series.cs | 81 --- archive/Calculations/_Updated/CCI_Series.cs | 97 --- archive/Calculations/_Updated/CMO_Series.cs | 100 --- archive/Calculations/_Updated/CUSUM_Series.cs | 80 --- archive/Calculations/_Updated/DECAY_Series.cs | 93 --- archive/Calculations/_Updated/DEMA_Series.cs | 144 ----- archive/Calculations/_Updated/DWMA_Series.cs | 143 ----- archive/Calculations/_Updated/EMA_Series.cs | 136 ----- .../Calculations/_Updated/ENTROPY_Series.cs | 97 --- archive/Calculations/_Updated/FWMA_Series.cs | 105 ---- archive/Calculations/_Updated/HEMA_Series.cs | 133 ---- archive/Calculations/_Updated/HMA_Series.cs | 98 --- archive/Calculations/_Updated/HWMA_Series.cs | 146 ----- archive/Calculations/_Updated/JMA_Series.cs | 176 ------ archive/Calculations/_Updated/KAMA_Series.cs | 118 ---- .../Calculations/_Updated/KURTOSIS_Series.cs | 107 ---- archive/Calculations/_Updated/MACD_Series.cs | 88 --- archive/Calculations/_Updated/MAD_Series.cs | 88 --- archive/Calculations/_Updated/MAE_Series.cs | 86 --- archive/Calculations/_Updated/MAMA_Series.cs | 207 ------- archive/Calculations/_Updated/MAPE_Series.cs | 95 --- archive/Calculations/_Updated/MAX_Series.cs | 77 --- .../Calculations/_Updated/MEDIAN_Series.cs | 95 --- .../Calculations/_Updated/MIDPOINT_Series.cs | 81 --- .../Calculations/_Updated/MIDPRICE_Series.cs | 74 --- archive/Calculations/_Updated/MIN_Series.cs | 77 --- archive/Calculations/_Updated/MSE_Series.cs | 85 --- archive/Calculations/_Updated/OBV_Series.cs | 106 ---- archive/Calculations/_Updated/RMA_Series.cs | 133 ---- archive/Calculations/_Updated/RSI_Series.cs | 134 ---- archive/Calculations/_Updated/SDEV_Series.cs | 91 --- archive/Calculations/_Updated/SLOPE_Series.cs | 130 ---- archive/Calculations/_Updated/SMAPE_Series.cs | 84 --- archive/Calculations/_Updated/SMA_Series.cs | 112 ---- archive/Calculations/_Updated/SMMA_Series.cs | 105 ---- archive/Calculations/_Updated/SSDEV_Series.cs | 91 --- archive/Calculations/_Updated/SVAR_Series.cs | 90 --- archive/Calculations/_Updated/T3_Series.cs | 173 ------ archive/Calculations/_Updated/TBars.cs | 153 ----- archive/Calculations/_Updated/TEMA_Series.cs | 134 ---- archive/Calculations/_Updated/TRIMA_Series.cs | 94 --- archive/Calculations/_Updated/TRIX_Series.cs | 132 ---- archive/Calculations/_Updated/TR_Series.cs | 91 --- archive/Calculations/_Updated/TSeries.cs | 137 ----- archive/Calculations/_Updated/VAR_Series.cs | 90 --- archive/Calculations/_Updated/WMAPE_Series.cs | 92 --- archive/Calculations/_Updated/WMA_Series.cs | 117 ---- archive/Calculations/_Updated/ZLEMA_Series.cs | 105 ---- archive/Calculations/_Updated/ZL_Series.cs | 100 --- .../Calculations/_Updated/ZSCORE_Series.cs | 97 --- archive/Indicators/Charts/2MACross_chart.cs | 298 --------- archive/Indicators/Charts/2MASlope_chart.cs | 320 ---------- archive/Indicators/Charts/JMA_chart.cs | 104 ---- archive/Indicators/Charts/TrailingStop.cs | 102 ---- archive/Indicators/Indicators.csproj | 56 -- archive/QuanTAlib.sln_old | 24 - archive/Strategies/Strategies.csproj | 53 -- archive/Tests/Basic tests/Indicators.cs | 156 ----- archive/Tests/Basic tests/Oscillators.cs | 161 ----- archive/Tests/Basic tests/TBars_input.cs | 97 --- archive/Tests/Pairs/ADD_Test.cs | 64 -- archive/Tests/Pairs/DIV_Test.cs | 64 -- archive/Tests/Pairs/MUL_Test.cs | 64 -- archive/Tests/Pairs/SUB_Test.cs | 64 -- archive/Tests/Pairs/TBars_Test.cs | 112 ---- archive/Tests/Tests.csproj | 45 -- archive/Tests/Validations/Trends/Pandas_TA.cs | 484 --------------- archive/Tests/Validations/Trends/Skender.cs | 489 --------------- archive/Tests/Validations/Trends/TA_LIB.cs | 487 --------------- archive/Tests/Validations/Trends/Tulip.cs | 578 ------------------ archive/Tests/requirements.txt | 6 - archive/docs/.nojekyll | 1 - archive/docs/ALMA.md | 5 - archive/docs/DEMA.md | 5 - archive/docs/DWMA.md | 5 - archive/docs/EMA.md | 50 -- archive/docs/FMA.md | 4 - archive/docs/HEMA.md | 4 - archive/docs/HMA.md | 4 - archive/docs/HWMA.md | 4 - archive/docs/JMA.md | 4 - archive/docs/KAMA.md | 4 - archive/docs/MAMA.md | 4 - archive/docs/QA.md | 40 -- archive/docs/RMA.md | 5 - archive/docs/SMA.md | 57 -- archive/docs/SMMA.md | 5 - archive/docs/T3.md | 5 - archive/docs/TEMA.md | 5 - archive/docs/TRIMA.md | 5 - archive/docs/Trading_example.ipynb | 458 -------------- archive/docs/WMA.md | 49 -- archive/docs/ZLEMA.md | 5 - archive/docs/_sidebar.md | 24 - archive/docs/getting_started.ipynb | 445 -------------- archive/docs/img/ALMA_chart.svg | 1 - archive/docs/img/DEMA_chart.svg | 1 - archive/docs/img/DWMA_chart.svg | 1 - archive/docs/img/EMA_chart.svg | 1 - archive/docs/img/FMA_chart.svg | 1 - archive/docs/img/HEMA_chart.svg | 1 - archive/docs/img/HMA_chart.svg | 1 - archive/docs/img/HWMA_chart.svg | 1 - archive/docs/img/JMA_chart.svg | 1 - archive/docs/img/KAMA_chart.svg | 1 - archive/docs/img/MAMA_chart.svg | 1 - archive/docs/img/RMA_chart.svg | 1 - archive/docs/img/SMA_chart.svg | 1 - archive/docs/img/SMMA_chart.svg | 1 - archive/docs/img/T3_chart.svg | 1 - archive/docs/img/TEMA_chart.svg | 1 - archive/docs/img/TRIMA_chart.svg | 1 - archive/docs/img/WMA_chart.svg | 1 - archive/docs/img/ZLEMA_chart.svg | 1 - archive/docs/img/quotes.gif | Bin 780780 -> 0 bytes archive/docs/index.html | 34 -- archive/docs/indicators.md | 175 ------ archive/docs/readme.md | 44 -- lib/averages/Alma.cs | 8 +- lib/averages/Convolution.cs | 4 +- lib/averages/Dsma.cs | 6 +- lib/averages/Ema.cs | 12 +- lib/averages/Frama.cs | 14 +- lib/averages/Htit.cs | 6 +- lib/averages/Jma.cs | 30 +- lib/averages/Kama.cs | 5 +- lib/averages/Ltma.cs | 4 +- lib/averages/Maaf.cs | 10 +- lib/averages/Mama.cs | 8 +- lib/averages/Qema.cs | 16 +- lib/averages/Rema.cs | 6 +- lib/averages/Rma.cs | 2 +- lib/averages/Sma.cs | 4 +- lib/averages/Smma.cs | 6 +- lib/averages/T3.cs | 17 +- lib/averages/Vidya.cs | 12 +- lib/averages/Wma.cs | 8 +- lib/averages/Zlema.cs | 10 +- lib/core/circularbuffer.cs | 8 +- lib/core/tbar.cs | 10 +- lib/core/tvalue.cs | 6 - lib/feeds/GbmFeed.cs | 5 +- lib/quantalib.csproj | 57 +- lib/statistics/Entropy.cs | 4 +- lib/statistics/Kurtosis.cs | 4 +- lib/statistics/Max.cs | 4 +- lib/statistics/Median.cs | 4 +- lib/statistics/Min.cs | 4 +- lib/statistics/Mode.cs | 4 +- lib/statistics/Percentile.cs | 4 +- lib/statistics/Skew.cs | 4 +- lib/statistics/Stddev.cs | 4 +- lib/statistics/Variance.cs | 4 +- lib/statistics/Zscore.cs | 4 +- quantower/AbstractIndicatorBase.cs | 11 +- quantower/Averages/AlmaIndicator.cs | 9 +- quantower/Averages/DemaIndicator.cs | 5 +- quantower/Averages/DsmaIndicator.cs | 5 +- quantower/Averages/DwmaIndicator.cs | 5 +- quantower/Averages/EmaIndicator.cs | 5 +- quantower/Averages/EpmaIndicator.cs | 5 +- quantower/Averages/FramaIndicator.cs | 5 +- quantower/Averages/FwmaIndicator.cs | 5 +- quantower/Averages/GmaIndicator.cs | 5 +- quantower/Averages/HmaIndicator.cs | 3 +- quantower/Averages/HtitIndicator.cs | 3 +- quantower/Averages/HwmaIndicator.cs | 6 +- quantower/Averages/JmaIndicator.cs | 5 +- quantower/Averages/KamaIndicator.cs | 3 +- quantower/Averages/LtmaIndicator.cs | 3 +- quantower/Averages/MaafIndicator.cs | 5 +- quantower/Averages/MamaIndicator.cs | 3 +- quantower/Averages/MgdiIndicator.cs | 3 +- quantower/Averages/MmaIndicator.cs | 3 +- quantower/Averages/QemaIndicator.cs | 3 +- quantower/Averages/RemaIndicator.cs | 3 +- quantower/Averages/RmaIndicator.cs | 3 +- quantower/Averages/SinemaIndicator.cs | 3 +- quantower/Averages/SmaIndicator.cs | 3 +- quantower/Averages/SmmaIndicator.cs | 3 +- quantower/Averages/T3Indicator.cs | 5 +- quantower/Averages/TemaIndicator.cs | 3 +- quantower/Averages/TrimaIndicator.cs | 3 +- quantower/Averages/VidyaIndicator.cs | 3 +- quantower/Averages/WmaIndicator.cs | 3 +- quantower/Averages/ZlemaIndicator.cs | 3 +- quantower/Averages/_IndicatorBase.cs | 23 +- quantower/Statistics/EntropyIndicator.cs | 3 +- quantower/Statistics/KurtosisIndicator.cs | 3 +- quantower/Statistics/MaxIndicator.cs | 3 +- quantower/Statistics/MedianIndicator.cs | 3 +- quantower/Statistics/MinIndicator.cs | 3 +- quantower/Statistics/ModeIndicator.cs | 3 +- quantower/Statistics/PercentileIndicator.cs | 3 +- quantower/Statistics/SkewIndicator.cs | 3 +- quantower/Statistics/StddevIndicator.cs | 5 +- quantower/Statistics/VarianceIndictor.cs | 5 +- quantower/Statistics/ZscoreIndicator.cs | 3 +- quantower/Statistics/_IndicatorBase.cs | 21 +- 244 files changed, 621 insertions(+), 14397 deletions(-) create mode 100644 .sonarlint/QuanTAlib.json delete mode 100644 archive/.editorconfig delete mode 100644 archive/.gitignore delete mode 100644 archive/.refactoring/base.cs delete mode 100644 archive/.refactoring/test.dib delete mode 100644 archive/.sonarlint/QuanTAlib.ruleset delete mode 100644 archive/.sonarlint/QuanTAlib.slconfig delete mode 100644 archive/.sonarlint/mihakralj_quantalib/CSharp/SonarLint.xml delete mode 100644 archive/.sonarlint/mihakralj_quantalib_secrets_settings.json delete mode 100644 archive/.sonarlint/mihakralj_quantalibcsharp.ruleset delete mode 100644 archive/.sonarlint/sonar.settings.json delete mode 100644 archive/Calculations/Basics/ADD_Series.cs delete mode 100644 archive/Calculations/Basics/CORR_Series.cs delete mode 100644 archive/Calculations/Basics/COVAR_Series.cs delete mode 100644 archive/Calculations/Basics/DIV_Series.cs delete mode 100644 archive/Calculations/Basics/MUL_Series.cs delete mode 100644 archive/Calculations/Basics/SUB_Series.cs delete mode 100644 archive/Calculations/Calculations.csproj delete mode 100644 archive/Calculations/ClassStructures/Pair_TSeries_Abstract.cs delete mode 100644 archive/Calculations/Feeds/Alphavantage_Feed.cs delete mode 100644 archive/Calculations/Feeds/GBM_Feed.cs delete mode 100644 archive/Calculations/Feeds/RND_Feed.cs delete mode 100644 archive/Calculations/Feeds/Yahoo_Feed.cs delete mode 100644 archive/Calculations/Logic/COMPARE_Series.cs delete mode 100644 archive/Calculations/Logic/CROSS_Series.cs delete mode 100644 archive/Calculations/Logic/EQUITY_Series.cs delete mode 100644 archive/Calculations/Logic/TOrders.cs delete mode 100644 archive/Calculations/_Updated/ADL_Series.cs delete mode 100644 archive/Calculations/_Updated/ADOSC_Series.cs delete mode 100644 archive/Calculations/_Updated/ALMA_Series.cs delete mode 100644 archive/Calculations/_Updated/ATRP_Series.cs delete mode 100644 archive/Calculations/_Updated/ATR_Series.cs delete mode 100644 archive/Calculations/_Updated/BBANDS_Series.cs delete mode 100644 archive/Calculations/_Updated/BIAS_Series.cs delete mode 100644 archive/Calculations/_Updated/CCI_Series.cs delete mode 100644 archive/Calculations/_Updated/CMO_Series.cs delete mode 100644 archive/Calculations/_Updated/CUSUM_Series.cs delete mode 100644 archive/Calculations/_Updated/DECAY_Series.cs delete mode 100644 archive/Calculations/_Updated/DEMA_Series.cs delete mode 100644 archive/Calculations/_Updated/DWMA_Series.cs delete mode 100644 archive/Calculations/_Updated/EMA_Series.cs delete mode 100644 archive/Calculations/_Updated/ENTROPY_Series.cs delete mode 100644 archive/Calculations/_Updated/FWMA_Series.cs delete mode 100644 archive/Calculations/_Updated/HEMA_Series.cs delete mode 100644 archive/Calculations/_Updated/HMA_Series.cs delete mode 100644 archive/Calculations/_Updated/HWMA_Series.cs delete mode 100644 archive/Calculations/_Updated/JMA_Series.cs delete mode 100644 archive/Calculations/_Updated/KAMA_Series.cs delete mode 100644 archive/Calculations/_Updated/KURTOSIS_Series.cs delete mode 100644 archive/Calculations/_Updated/MACD_Series.cs delete mode 100644 archive/Calculations/_Updated/MAD_Series.cs delete mode 100644 archive/Calculations/_Updated/MAE_Series.cs delete mode 100644 archive/Calculations/_Updated/MAMA_Series.cs delete mode 100644 archive/Calculations/_Updated/MAPE_Series.cs delete mode 100644 archive/Calculations/_Updated/MAX_Series.cs delete mode 100644 archive/Calculations/_Updated/MEDIAN_Series.cs delete mode 100644 archive/Calculations/_Updated/MIDPOINT_Series.cs delete mode 100644 archive/Calculations/_Updated/MIDPRICE_Series.cs delete mode 100644 archive/Calculations/_Updated/MIN_Series.cs delete mode 100644 archive/Calculations/_Updated/MSE_Series.cs delete mode 100644 archive/Calculations/_Updated/OBV_Series.cs delete mode 100644 archive/Calculations/_Updated/RMA_Series.cs delete mode 100644 archive/Calculations/_Updated/RSI_Series.cs delete mode 100644 archive/Calculations/_Updated/SDEV_Series.cs delete mode 100644 archive/Calculations/_Updated/SLOPE_Series.cs delete mode 100644 archive/Calculations/_Updated/SMAPE_Series.cs delete mode 100644 archive/Calculations/_Updated/SMA_Series.cs delete mode 100644 archive/Calculations/_Updated/SMMA_Series.cs delete mode 100644 archive/Calculations/_Updated/SSDEV_Series.cs delete mode 100644 archive/Calculations/_Updated/SVAR_Series.cs delete mode 100644 archive/Calculations/_Updated/T3_Series.cs delete mode 100644 archive/Calculations/_Updated/TBars.cs delete mode 100644 archive/Calculations/_Updated/TEMA_Series.cs delete mode 100644 archive/Calculations/_Updated/TRIMA_Series.cs delete mode 100644 archive/Calculations/_Updated/TRIX_Series.cs delete mode 100644 archive/Calculations/_Updated/TR_Series.cs delete mode 100644 archive/Calculations/_Updated/TSeries.cs delete mode 100644 archive/Calculations/_Updated/VAR_Series.cs delete mode 100644 archive/Calculations/_Updated/WMAPE_Series.cs delete mode 100644 archive/Calculations/_Updated/WMA_Series.cs delete mode 100644 archive/Calculations/_Updated/ZLEMA_Series.cs delete mode 100644 archive/Calculations/_Updated/ZL_Series.cs delete mode 100644 archive/Calculations/_Updated/ZSCORE_Series.cs delete mode 100644 archive/Indicators/Charts/2MACross_chart.cs delete mode 100644 archive/Indicators/Charts/2MASlope_chart.cs delete mode 100644 archive/Indicators/Charts/JMA_chart.cs delete mode 100644 archive/Indicators/Charts/TrailingStop.cs delete mode 100644 archive/Indicators/Indicators.csproj delete mode 100644 archive/QuanTAlib.sln_old delete mode 100644 archive/Strategies/Strategies.csproj delete mode 100644 archive/Tests/Basic tests/Indicators.cs delete mode 100644 archive/Tests/Basic tests/Oscillators.cs delete mode 100644 archive/Tests/Basic tests/TBars_input.cs delete mode 100644 archive/Tests/Pairs/ADD_Test.cs delete mode 100644 archive/Tests/Pairs/DIV_Test.cs delete mode 100644 archive/Tests/Pairs/MUL_Test.cs delete mode 100644 archive/Tests/Pairs/SUB_Test.cs delete mode 100644 archive/Tests/Pairs/TBars_Test.cs delete mode 100644 archive/Tests/Tests.csproj delete mode 100644 archive/Tests/Validations/Trends/Pandas_TA.cs delete mode 100644 archive/Tests/Validations/Trends/Skender.cs delete mode 100644 archive/Tests/Validations/Trends/TA_LIB.cs delete mode 100644 archive/Tests/Validations/Trends/Tulip.cs delete mode 100644 archive/Tests/requirements.txt delete mode 100644 archive/docs/.nojekyll delete mode 100644 archive/docs/ALMA.md delete mode 100644 archive/docs/DEMA.md delete mode 100644 archive/docs/DWMA.md delete mode 100644 archive/docs/EMA.md delete mode 100644 archive/docs/FMA.md delete mode 100644 archive/docs/HEMA.md delete mode 100644 archive/docs/HMA.md delete mode 100644 archive/docs/HWMA.md delete mode 100644 archive/docs/JMA.md delete mode 100644 archive/docs/KAMA.md delete mode 100644 archive/docs/MAMA.md delete mode 100644 archive/docs/QA.md delete mode 100644 archive/docs/RMA.md delete mode 100644 archive/docs/SMA.md delete mode 100644 archive/docs/SMMA.md delete mode 100644 archive/docs/T3.md delete mode 100644 archive/docs/TEMA.md delete mode 100644 archive/docs/TRIMA.md delete mode 100644 archive/docs/Trading_example.ipynb delete mode 100644 archive/docs/WMA.md delete mode 100644 archive/docs/ZLEMA.md delete mode 100644 archive/docs/_sidebar.md delete mode 100644 archive/docs/getting_started.ipynb delete mode 100644 archive/docs/img/ALMA_chart.svg delete mode 100644 archive/docs/img/DEMA_chart.svg delete mode 100644 archive/docs/img/DWMA_chart.svg delete mode 100644 archive/docs/img/EMA_chart.svg delete mode 100644 archive/docs/img/FMA_chart.svg delete mode 100644 archive/docs/img/HEMA_chart.svg delete mode 100644 archive/docs/img/HMA_chart.svg delete mode 100644 archive/docs/img/HWMA_chart.svg delete mode 100644 archive/docs/img/JMA_chart.svg delete mode 100644 archive/docs/img/KAMA_chart.svg delete mode 100644 archive/docs/img/MAMA_chart.svg delete mode 100644 archive/docs/img/RMA_chart.svg delete mode 100644 archive/docs/img/SMA_chart.svg delete mode 100644 archive/docs/img/SMMA_chart.svg delete mode 100644 archive/docs/img/T3_chart.svg delete mode 100644 archive/docs/img/TEMA_chart.svg delete mode 100644 archive/docs/img/TRIMA_chart.svg delete mode 100644 archive/docs/img/WMA_chart.svg delete mode 100644 archive/docs/img/ZLEMA_chart.svg delete mode 100644 archive/docs/img/quotes.gif delete mode 100644 archive/docs/index.html delete mode 100644 archive/docs/indicators.md delete mode 100644 archive/docs/readme.md diff --git a/.github/workflows/main_automation.yml b/.github/workflows/main_automation.yml index 4aa9524e..f8450eee 100644 --- a/.github/workflows/main_automation.yml +++ b/.github/workflows/main_automation.yml @@ -1,174 +1,137 @@ -name: Stage/build/test/release/publish +name: CI/CD Pipeline + on: workflow_dispatch: push: - branches: - - main - - dev + branches: [main, dev] pull_request: - branches: - - main - - dev + branches: [main, dev] + +env: + DOTNET_VERSION: '8.0.x' + JAVA_VERSION: '11' + JAVA_DISTRIBUTION: 'zulu' jobs: - build_test: - #runs-on: windows-latest + build_test_publish: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v3 + - uses: actions/checkout@v3 with: fetch-depth: 0 -############## Install tools - - - name: Create Quantower folder at root + - name: Setup environment run: | sudo mkdir -p /Quantower/ sudo chmod -R 777 /Quantower - - name: Install .NET + - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: '8.x' - dotnet-quality: 'preview' + dotnet-version: ${{ env.DOTNET_VERSION }} - - name: Install GitVersion - uses: gittools/actions/gitversion/setup@v0 - with: - versionSpec: '6.x' - includePrerelease: true - - - name: Determine Version - id: gitversion - uses: gittools/actions/gitversion/execute@v0 - with: - useConfigFile: true - #configFilePath: GitVersion.yml - updateAssemblyInfo: true - -############## Install more tools - - - name: Install JDK11 for Sonar Scanner + - name: Setup Java uses: actions/setup-java@v3 with: - java-version: 11 - distribution: 'zulu' + java-version: ${{ env.JAVA_VERSION }} + distribution: ${{ env.JAVA_DISTRIBUTION }} - - name: Install JetBrains - run: dotnet tool install JetBrains.dotCover.GlobalTool --global - - name: Install Sonar Scanner - run: dotnet tool install dotnet-sonarscanner --global - - name: Install dotnet-coverage - run: dotnet tool install dotnet-coverage --global + - name: Install tools + run: | + dotnet tool install --global GitVersion.Tool + dotnet tool install --global dotnet-sonarscanner --version 8.0.3 + dotnet tool install --global dotnet-coverage - - name: Sonar start + - name: Determine Version + id: gitversion + run: | + dotnet-gitversion + echo "::set-output name=MajorMinorPatch::$(dotnet-gitversion /output json /showvariable MajorMinorPatch)" + echo "::set-output name=FullSemVer::$(dotnet-gitversion /output json /showvariable FullSemVer)" + echo "::set-output name=SemVer::$(dotnet-gitversion /output json /showvariable SemVer)" + + - name: Start Sonar analysis + if: github.ref == 'refs/heads/dev' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: dotnet sonarscanner begin /o:"mihakralj" /k:"mihakralj_QuanTAlib" - /d:sonar.login="${{ secrets.SONAR_TOKEN }}" - /d:sonar.host.url="https://sonarcloud.io" - /d:sonar.cs.dotcover.reportsPaths=dotcover* - -############# Build and test - - - name: Build Main branch of QuanTAlib DLL - if: ${{ github.ref != 'refs/heads/dev' }} - run: dotnet build ./lib/quantalib.csproj --configuration Release --nologo -p:PackageVersion=${{ steps.gitversion.outputs.MajorMinorPatch }} - - name: Build dev branch of QuanTAlib DLL - if: ${{ github.ref == 'refs/heads/dev' }} - run: dotnet build ./lib/quantalib.csproj --configuration Release --nologo -p:PackageVersion=${{ steps.gitversion.outputs.FullSemVer }} - - name: Build Averages DLL - run: dotnet build ./quantower/Averages/Averages.csproj --configuration Release --nologo - - name: Build Statistics DLL - run: dotnet build ./quantower/Statistics/Statistics.csproj --configuration Release --nologo - - name: Build SyntheticVendor DLL - run: dotnet build ./SyntheticVendor/SyntheticVendor.csproj --configuration Release --nologo - - - name: DotCover Test HTML - if: ${{ github.ref == 'refs/heads/dev' }} - run: dotnet dotcover test tests/tests.csproj --dcReportType=HTML --dcoutput=./dotcover.html - - name: DotCover Test XML - if: ${{ github.ref == 'refs/heads/dev' }} - run: dotnet dotcover test tests/tests.csproj --dcReportType=DetailedXML --dcoutput=./dotcover.xml --verbosity=Detailed - - name: Coverlet Test - if: ${{ github.ref == 'refs/heads/dev' }} - run: dotnet test -p:CollectCoverage=true --collect:"XPlat Code Coverage" --results-directory "./" - -############## Report to Sonar/CodeCov/Codacy - - - name: Move coverage report to project root - if: ${{ github.ref == 'refs/heads/dev' }} run: | - report=$(find . -name '*coverage.cobertura.xml' | head -1) - mv "$report" ./coverage.cobertura.xml + dotnet sonarscanner begin /o:"mihakralj" /k:"mihakralj_QuanTAlib" \ + /d:sonar.token="${{ secrets.SONAR_TOKEN }}" \ + /d:sonar.scanner.scanAll=false \ + /d:sonar.host.url="https://sonarcloud.io" \ + /d:sonar.cs.opencover.reportsPaths="**/TestResults/coverage.opencover.xml" \ + /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml - - name: Upload to Codacy - if: ${{ github.ref == 'refs/heads/dev' }} + + - name: Build projects + run: | + dotnet build ./lib/quantalib.csproj --configuration Release --nologo \ + -p:PackageVersion=${{ github.ref == 'refs/heads/dev' && steps.gitversion.outputs.FullSemVer || steps.gitversion.outputs.MajorMinorPatch }} + dotnet build ./quantower/Averages/Averages.csproj --configuration Release --nologo + dotnet build ./quantower/Statistics/Statistics.csproj --configuration Release --nologo + dotnet build ./SyntheticVendor/SyntheticVendor.csproj --configuration Release --nologo + + - name: Run tests with coverage + if: github.ref == 'refs/heads/dev' + run: | + dotnet test --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput="./TestResults/" + dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml" + + - name: Generate and process coverage report + if: github.ref == 'refs/heads/dev' + uses: danielpalme/ReportGenerator-GitHub-Action@5.1.26 + with: + reports: '**/TestResults/coverage.opencover.xml' + targetdir: 'coveragereport' + reporttypes: 'HtmlInline;Cobertura' + + - name: Upload coverage to Codacy + if: github.ref == 'refs/heads/dev' uses: codacy/codacy-coverage-reporter-action@v1 with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: "*cover*.xml" + coverage-reports: "coveragereport/Cobertura.xml" - - name: Upload to Codecov - if: ${{ github.ref == 'refs/heads/dev' }} + - name: Upload coverage to Codecov + if: github.ref == 'refs/heads/dev' uses: codecov/codecov-action@v3 with: - files: cover* + files: coveragereport/Cobertura.xml verbose: true - - name: Upload to Sonar - if: ${{ github.ref == 'refs/heads/dev' }} + - name: Finish Sonar analysis + if: github.ref == 'refs/heads/dev' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: dotnet sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}" -############## Publish dev release - - - name: Publish dev release assets - if: ${{ github.ref == 'refs/heads/dev' }} + - name: Publish release assets uses: SourceSprint/upload-multiple-releases@1.0.7 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - prerelease: true + prerelease: ${{ github.ref == 'refs/heads/dev' }} overwrite: true - release_name: ${{ steps.gitversion.outputs.SemVer }} + release_name: ${{ github.ref == 'refs/heads/dev' && steps.gitversion.outputs.SemVer || steps.gitversion.outputs.MajorMinorPatch }} tag_name: ${{ steps.gitversion.outputs.SemVer }} release_config: | quantower/Averages/bin/Release/Averages.dll quantower/Statistics/bin/Release/Statistics.dll SyntheticVendor/bin/Release/SyntheticVendor.dll - - name: Push package to myget.org - run: dotnet nuget push 'lib/bin/Release/QuanTAlib.*.nupkg' - --api-key ${{ secrets.MYGET_DEPLOY_KEY_QUANTALIB }} - --source https://www.myget.org/F/quantalib/api/v2/package - --skip-duplicate - -############## Publish main release - - - name: Publish main release assets - if: ${{ github.ref == 'refs/heads/main' }} - uses: SourceSprint/upload-multiple-releases@1.0.7 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - prerelease: false - overwrite: true - release_name: ${{ steps.gitversion.outputs.MajorMinorPatch }} - tag_name: ${{ steps.gitversion.outputs.SemVer }} - release_config: | - quantower/Averages/bin/Release/Averages.dll - quantower/Statistics/bin/Release/Statistics.dll - SyntheticVendor/bin/Release/SyntheticVendor.dll - - - name: Push package to nuget.org - if: ${{ github.ref == 'refs/heads/main' }} - run: dotnet nuget push 'lib/bin/Release/QuanTAlib.*.nupkg' - --api-key ${{ secrets.NUGET_DEPLOY_KEY_QUANTLIB }} - --source https://api.nuget.org/v3/index.json + - name: Push package to myget.org + run: | + dotnet nuget push 'lib/bin/Release/QuanTAlib.*.nupkg' \ + --api-key ${{ secrets.MYGET_DEPLOY_KEY_QUANTALIB }} \ + --source https://www.myget.org/F/quantalib/api/v2/package \ --skip-duplicate + - name: Push package to nuget.org + if: github.ref == 'refs/heads/main' + run: | + dotnet nuget push 'lib/bin/Release/QuanTAlib.*.nupkg' \ + --api-key ${{ secrets.NUGET_DEPLOY_KEY_QUANTLIB }} \ + --source https://api.nuget.org/v3/index.json \ + --skip-duplicate \ No newline at end of file diff --git a/.gitignore b/.gitignore index dc4496da..97c271bd 100644 --- a/.gitignore +++ b/.gitignore @@ -395,4 +395,7 @@ FodyWeavers.xsd *.msp # JetBrains Rider -*.sln.iml \ No newline at end of file +*.sln.iml +*.dcvr + +dotcover.html diff --git a/.sonarlint/QuanTAlib.json b/.sonarlint/QuanTAlib.json new file mode 100644 index 00000000..482e31c0 --- /dev/null +++ b/.sonarlint/QuanTAlib.json @@ -0,0 +1,4 @@ +{ + "SonarCloudOrganization": "mihakralj", + "ProjectKey": "mihakralj_QuanTAlib" +} \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index 5d40b927..48962b26 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -7,31 +7,38 @@ true preview false - false true AnyCPU False bin\$(Configuration)\ - False full true true true snupkg - AnyCPU true + + + true + true + true + true + true + false + true + true + - - - all - runtime; build; native; contentfiles; analyzers - + + + all + runtime; build; native; contentfiles; analyzers + D:\Quantower $([System.IO.Directory]::GetDirectories("$(QuantowerRoot)\TradingPlatform", "v1*")[0]) - \ No newline at end of file diff --git a/GitVersion.yml b/GitVersion.yml index e78a6270..28af0a49 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,3 +1,4 @@ +semantic-version-format: Loose mode: ContinuousDelivery branches: main: diff --git a/QuanTAlib.sln b/QuanTAlib.sln index 44dd6e71..a6ac4ee3 100644 --- a/QuanTAlib.sln +++ b/QuanTAlib.sln @@ -1,13 +1,13 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "quantalib", "lib\quantalib.csproj", "{584E06A9-CEB4-476A-85CC-6A8FF3974AE2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{D85FEBB4-B651-466F-85CC-FD902378D4D2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{D85FEBB4-B651-466F-85CC-FD902378D4D2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MovingAverages", "quantower\averages\Averages.csproj", "{32CC09CC-26E3-4FCE-8932-C0513C4AD766}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MovingAverages", "quantower\Averages\Averages.csproj", "{32CC09CC-26E3-4FCE-8932-C0513C4AD766}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntheticVendor", "SyntheticVendor\SyntheticVendor.csproj", "{20B1B5F1-8C36-4668-B0AE-951C13AE197B}" EndProject @@ -49,3 +49,4 @@ Global {B6D3EB11-63B6-430F-B526-E1981B3D8214} = {A8D9AE68-24E3-476C-BB98-244541BB4B43} EndGlobalSection EndGlobal + diff --git a/SyntheticVendor/SyntheticVendor.cs b/SyntheticVendor/SyntheticVendor.cs index 1e2d143e..bc61a736 100644 --- a/SyntheticVendor/SyntheticVendor.cs +++ b/SyntheticVendor/SyntheticVendor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading; +using System.Security.Cryptography; using TradingPlatform.BusinessLayer; using TradingPlatform.BusinessLayer.Integration; @@ -73,31 +74,50 @@ namespace SyntheticVendorNamespace CreateMessageSymbol("W17", "2 Geometric Brownian motion", "QT", "USD", SymbolType.Synthetic) }; -/* - Bond, - CFD, - Crypto, - Debentures, - Equities, - ETF, - FixedIncome, - Forex, - Forward, - Futures, - Indexes, - Options, - Spot, - Synthetic, - Swap, - Warrants, + /* + Bond, + CFD, + Crypto, + Debentures, + Equities, + ETF, + FixedIncome, + Forex, + Forward, + Futures, + Indexes, + Options, + Spot, + Synthetic, + Swap, + Warrants, -*/ + */ } - private MessageSymbol CreateMessageSymbol( + public static VendorMetaData GetVendorMetaData() + { + return new VendorMetaData + { + VendorName = "Synthetic Vendor", + VendorDescription = "A synthetic vendor for testing and demonstration purposes", + GetDefaultConnections = () => + { + var defaultConnection = Vendor.CreateDefaultConnectionInfo( + "Synthetic Connection", + "Synthetic Vendor", + "", // Replace with actual path if you have a logo + allowCreateCustomConnections: true + ); + return new List { defaultConnection }; + } + }; + } + + private static MessageSymbol CreateMessageSymbol( string id, string name, string exchangeId, @@ -127,27 +147,7 @@ namespace SyntheticVendorNamespace return messageSymbol; } - public static VendorMetaData GetVendorMetaData() - { - return new VendorMetaData() - { - VendorName = "Synthetic Vendor", - VendorDescription = "A synthetic vendor for testing and demonstration purposes", - GetDefaultConnections = () => - { - var defaultConnection = Vendor.CreateDefaultConnectionInfo( - "Synthetic Connection", - "Synthetic Vendor", - "", // Replace with actual path if you have a logo - allowCreateCustomConnections: true - ); - return new List { defaultConnection }; - } - }; - } - - - private MessageSymbol CreateMessageSymbol(string id, string name, string exchangeId, string assetId, SymbolType type) + private static MessageSymbol CreateMessageSymbol(string id, string name, string exchangeId, string assetId, SymbolType type) { return new MessageSymbol(id) { @@ -173,26 +173,26 @@ namespace SyntheticVendorNamespace LotStep = 0.01, MaxLot = 1000000, SymbolType = type -/* - SymbolType.Unknown, - [EnumMember] Forex, - [EnumMember] Equities, - [EnumMember] CFD, - [EnumMember] Indexes, - [EnumMember] Futures, - [EnumMember] Options, - [EnumMember] ETF, - [EnumMember] Crypto, - [EnumMember] Synthetic, - [EnumMember] Spot, - [EnumMember] Forward, - [EnumMember] FixedIncome, - [EnumMember] Warrants, + /* + SymbolType.Unknown, + [EnumMember] Forex, + [EnumMember] Equities, + [EnumMember] CFD, + [EnumMember] Indexes, + [EnumMember] Futures, + [EnumMember] Options, + [EnumMember] ETF, + [EnumMember] Crypto, + [EnumMember] Synthetic, + [EnumMember] Spot, + [EnumMember] Forward, + [EnumMember] FixedIncome, + [EnumMember] Warrants, - [EnumMember] Debentures, - [EnumMember] Bond, - [EnumMember] Swap, -*/ + [EnumMember] Debentures, + [EnumMember] Bond, + [EnumMember] Swap, + */ }; } @@ -213,7 +213,7 @@ namespace SyntheticVendorNamespace public override PingResult Ping() { - return new PingResult() + return new PingResult { State = PingEnum.Connected, PingTime = TimeSpan.FromMilliseconds(2), @@ -226,12 +226,7 @@ namespace SyntheticVendorNamespace public override void OnConnected(CancellationToken token) { - // This method is called after a successful connection - // You can initialize resources or start any necessary processes here - base.OnConnected(token); - - // For example, you might want to push some initial messages or data - // PushMessage(new MessageVendorEvent("SyntheticVendor connected successfully")); + throw new NotImplementedException(); } @@ -267,7 +262,10 @@ namespace SyntheticVendorNamespace var historyItems = new List(); var symbolId = requestParameters.SymbolId; - if (string.IsNullOrEmpty(symbolId)) return historyItems; + if (string.IsNullOrEmpty(symbolId)) + { + return historyItems; + } DateTime from = requestParameters.FromTime; DateTime to = requestParameters.ToTime; @@ -284,7 +282,9 @@ namespace SyntheticVendorNamespace { DateTime intervalEnd = currentTime.AddTicks(periodTimeSpan.Ticks * MAX_ITEMS_PER_REQUEST); if (intervalEnd > to) + { intervalEnd = to; + } while (currentTime <= intervalEnd) { @@ -293,7 +293,10 @@ namespace SyntheticVendorNamespace currentTime = currentTime.Add(periodTimeSpan); - if (requestParameters.CancellationToken.IsCancellationRequested) return historyItems; + if (requestParameters.CancellationToken.IsCancellationRequested) + { + return historyItems; + } } currentTime = intervalEnd; @@ -306,7 +309,6 @@ namespace SyntheticVendorNamespace { switch (symbolId) { - //case "W0": return GenerateConstant; case "W1": return GenerateSpike; case "W2": return GenerateDiracDelta; case "W3": return GenerateSquareWave; @@ -331,7 +333,7 @@ namespace SyntheticVendorNamespace public override HistoryMetadata GetHistoryMetadata(CancellationToken cancellationToken) { - return new HistoryMetadata() + return new HistoryMetadata { AllowedHistoryTypes = new HistoryType[] { @@ -360,71 +362,58 @@ namespace SyntheticVendorNamespace } -/*******************************************************************************************************************************************/ -/*******************************************************************************************************************************************/ -/*******************************************************************************************************************************************/ -/*******************************************************************************************************************************************/ -/*******************************************************************************************************************************************/ -/*******************************************************************************************************************************************/ -/*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ + /*******************************************************************************************************************************************/ - private HistoryItemBar GenerateSpike(DateTime time, TimeSpan slice) - { - // Ensure we're working with UTC time - DateTime utcTime = time.ToUniversalTime(); - - // Calculate the number of hours since the epoch - double hoursSinceEpoch = (utcTime - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalHours; - - // Calculate the position within the 25-hour cycle - int cyclePosition = (int)Math.Floor(hoursSinceEpoch % 25); - - // Determine if this is a spike hour (hour 24 in the cycle) or the hour after - bool isSpike = cyclePosition == 24; - bool isAfterSpike = cyclePosition == 0; - - double openValue, closeValue; - if (isSpike) + private HistoryItemBar GenerateSpike(DateTime time, TimeSpan slice) { - openValue = 0; - closeValue = 100; - } - else if (isAfterSpike) - { - openValue = 100; - closeValue = 0; - } - else - { - openValue = closeValue = 0.000001; + // Ensure we're working with UTC time + DateTime utcTime = time.ToUniversalTime(); + + // Calculate the number of hours since the epoch + double hoursSinceEpoch = (utcTime - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalHours; + + // Calculate the position within the 25-hour cycle + int cyclePosition = (int)Math.Floor(hoursSinceEpoch % 25); + + // Determine if this is a spike hour (hour 24 in the cycle) or the hour after + bool isSpike = cyclePosition == 24; + bool isAfterSpike = cyclePosition == 0; + + double openValue, closeValue; + if (isSpike) + { + openValue = 0; + closeValue = 100; + } + else if (isAfterSpike) + { + openValue = 100; + closeValue = 0; + } + else + { + openValue = closeValue = 0.000001; + } + + return new HistoryItemBar + { + TicksLeft = time.Ticks, + TicksRight = time.Add(slice).Ticks - 1, + Open = openValue, + High = Math.Max(openValue, closeValue), + Low = Math.Min(openValue, closeValue), + Close = closeValue, + Volume = Math.Abs(closeValue - openValue), + Ticks = time.Add(slice).Ticks - time.Ticks + }; } - return new HistoryItemBar - { - TicksLeft = time.Ticks, - TicksRight = time.Add(slice).Ticks - 1, - Open = openValue, - High = Math.Max(openValue, closeValue), - Low = Math.Min(openValue, closeValue), - Close = closeValue, - Volume = Math.Abs(closeValue - openValue), - Ticks = time.Add(slice).Ticks - time.Ticks - }; - } - - - - - private static readonly double[] distributionValues = new double[] - { - 0.010, // Extreme left tail - 0.050, // Left tail - 0.200, // Left of center - 0.480, // Center (peak) - 0.200, // Right of center - 0.050, // Right tail - 0.010 // Extreme right tail - }; private HistoryItemBar GenerateDiracDelta(DateTime time, TimeSpan slice) { @@ -497,7 +486,7 @@ namespace SyntheticVendorNamespace double value = 50 + 50 * Math.Sin(cyclePosition * frequency); // Oscillate between 0 and 100 double nextValue = 50 + 50 * Math.Sin((cyclePosition + slice.TotalMinutes) * frequency); - double factor = 0.6 * Math.Abs (nextValue - value); + double factor = 0.6 * Math.Abs(nextValue - value); return new HistoryItemBar { @@ -505,8 +494,8 @@ namespace SyntheticVendorNamespace TicksRight = time.Add(slice).Ticks - 1, Open = value, - High = Math.Max(value, nextValue)+factor, - Low = Math.Min(value, nextValue)-factor, + High = Math.Max(value, nextValue) + factor, + Low = Math.Min(value, nextValue) - factor, Close = nextValue, Volume = Math.Abs(nextValue - value) * 100, // Volume proportional to price change @@ -607,26 +596,6 @@ namespace SyntheticVendorNamespace }; } - private HistoryItemBar GeneratePulseWave(DateTime time, TimeSpan slice) - { - double hours = (time - DateTime.UnixEpoch).TotalHours; - double period = 24; // 24-hour period - double position = hours % period; - double value = position < period / 5 ? 100 : -100; // 20% duty cycle - - return new HistoryItemBar - { - TicksLeft = time.Ticks, - TicksRight = time.Add(slice).Ticks - 1, - Open = value, - High = 100, - Low = -100, - Close = value, - Volume = 100, - Ticks = 100 - }; - } - private HistoryItemBar GenerateTriangleWave(DateTime time, TimeSpan slice) { double hours = (time - DateTime.UnixEpoch).TotalHours; @@ -787,9 +756,6 @@ namespace SyntheticVendorNamespace double period = 12.0; double frequency = 2 * Math.PI / period; // Frequency for a 5-hour period - // Determine the start of the current 5-hour cycle - double cycleStartTime = Math.Floor(hours / period) * period; - // Calculate the phase of the signal within the current 5-hour cycle double phase = frequency * (hours % period); @@ -824,8 +790,8 @@ namespace SyntheticVendorNamespace private double currentFrequency = Math.PI / 220.0; // Initial frequency - private double accumulatedPhase = 0; - private double lastCloseValue = 0; // To store the last close value + private double accumulatedPhase; + private double lastCloseValue; // To store the last close value private HistoryItemBar GenerateFMSignal(DateTime time, TimeSpan slice) { @@ -915,81 +881,81 @@ namespace SyntheticVendorNamespace -private double previousClose = 50; -private const double meanPrice = 50; + private double previousClose = 50; + private const double meanPrice = 50; -private HistoryItemBar GeneratePinkNoise(DateTime time, TimeSpan slice) -{ - double volatility = 2; - double meanReversionStrength = 0.1; - - // Generate open price - double openNoise = GeneratePinkNoiseValue(); - double open = previousClose + volatility * openNoise + meanReversionStrength * (meanPrice - previousClose); - - // Generate close price - double closeNoise = GeneratePinkNoiseValue(); - double close = open + volatility * closeNoise + meanReversionStrength * (meanPrice - open); - - // Determine High and Low - double high = Math.Max(open, close); - double low = Math.Min(open, close); - - // Add variation to High and Low - double highNoise = Math.Abs(GeneratePinkNoiseValue()); - high += volatility * highNoise; - - double lowNoise = Math.Abs(GeneratePinkNoiseValue()); - low -= volatility * lowNoise; - - double volume = Math.Abs(GeneratePinkNoiseValue()) * 1000 + 100; - - // Update previous close for the next iteration - previousClose = close; - - return new HistoryItemBar - { - TicksLeft = time.Ticks, - TicksRight = time.Add(slice).Ticks - 1, - Open = open, - High = high, - Low = low, - Close = close, - Volume = volume, - Ticks = slice.Ticks - }; -} - - - private const int NumOctaves = 6; - private double[] pinkNoiseState = new double[NumOctaves]; - private double GeneratePinkNoiseValue() - { - double total = 0; - - for (int i = 0; i < NumOctaves; i++) + private HistoryItemBar GeneratePinkNoise(DateTime time, TimeSpan slice) { - double white = random.NextDouble() * 2 - 1; - pinkNoiseState[i] = (pinkNoiseState[i] + white) * 0.5; - total += pinkNoiseState[i] * Math.Pow(2, -i); + double volatility = 2; + double meanReversionStrength = 0.1; + + // Generate open price + double openNoise = GeneratePinkNoiseValue(); + double open = previousClose + volatility * openNoise + meanReversionStrength * (meanPrice - previousClose); + + // Generate close price + double closeNoise = GeneratePinkNoiseValue(); + double close = open + volatility * closeNoise + meanReversionStrength * (meanPrice - open); + + // Determine High and Low + double high = Math.Max(open, close); + double low = Math.Min(open, close); + + // Add variation to High and Low + double highNoise = Math.Abs(GeneratePinkNoiseValue()); + high += volatility * highNoise; + + double lowNoise = Math.Abs(GeneratePinkNoiseValue()); + low -= volatility * lowNoise; + + double volume = Math.Abs(GeneratePinkNoiseValue()) * 1000 + 100; + + // Update previous close for the next iteration + previousClose = close; + + return new HistoryItemBar + { + TicksLeft = time.Ticks, + TicksRight = time.Add(slice).Ticks - 1, + Open = open, + High = high, + Low = low, + Close = close, + Volume = volume, + Ticks = slice.Ticks + }; } - // Normalize - return total / NumOctaves; - } + + private const int NumOctaves = 6; + private readonly double[] pinkNoiseState = new double[NumOctaves]; + private double GeneratePinkNoiseValue() + { + double total = 0; + + for (int i = 0; i < NumOctaves; i++) + { + double white = random.NextDouble() * 2 - 1; + pinkNoiseState[i] = (pinkNoiseState[i] + white) * 0.5; + total += pinkNoiseState[i] * Math.Pow(2, -i); + } + + // Normalize + return total / NumOctaves; + } -private double lastValue = 0; + private double lastValue; -private HistoryItemBar GenerateBrownNoise(DateTime time, TimeSpan slice) -{ - double dt = slice.TotalDays / 365.0; // Time step in years - double sigma = 25.0; // Annual volatility + private HistoryItemBar GenerateBrownNoise(DateTime time, TimeSpan slice) + { + double dt = slice.TotalDays / 365.0; // Time step in years + double sigma = 25.0; // Annual volatility - double increment = GenerateGaussian(0, sigma * Math.Sqrt(dt)); - double open = lastValue * (1 + GenerateGaussian(0, 0.05)); - double close = open + increment; + double increment = GenerateGaussian(0, sigma * Math.Sqrt(dt)); + double open = lastValue * (1 + GenerateGaussian(0, 0.05)); + double close = open + increment; // Simulate intra-period high and low double high = Math.Max(open, close); @@ -997,81 +963,81 @@ private HistoryItemBar GenerateBrownNoise(DateTime time, TimeSpan slice) double low = Math.Min(open, close); low -= low * Math.Abs(GenerateGaussian(0, 0.06)); - lastValue = close; + lastValue = close; - return new HistoryItemBar - { - TicksLeft = time.Ticks, - TicksRight = time.Add(slice).Ticks - 1, - Open = open, - High = high, - Low = low, - Close = close, - Volume = Math.Abs(close - open) * 1000, // Simplified volume calculation - Ticks = slice.Ticks - }; -} -// Helper method to generate Gaussian distributed random numbers -private double GenerateGaussian(double mean, double stdDev) -{ - double u1 = 1.0 - random.NextDouble(); // Uniform(0,1] random doubles - double u2 = 1.0 - random.NextDouble(); - double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); - return mean + stdDev * randStdNormal; -} + return new HistoryItemBar + { + TicksLeft = time.Ticks, + TicksRight = time.Add(slice).Ticks - 1, + Open = open, + High = high, + Low = low, + Close = close, + Volume = Math.Abs(close - open) * 1000, // Simplified volume calculation + Ticks = slice.Ticks + }; + } + // Helper method to generate Gaussian distributed random numbers + private double GenerateGaussian(double mean, double stdDev) + { + double u1 = 1.0 - random.NextDouble(); // Uniform(0,1] random doubles + double u2 = 1.0 - random.NextDouble(); + double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); + return mean + stdDev * randStdNormal; + } -private double GBMLastClose = 100; // Starting price -private readonly double GBMMu = 0.05; // Annual drift -private readonly double GBMSigma = 0.2; // Annual volatility + private double GBMLastClose = 100; // Starting price + private readonly double GBMMu = 0.05; // Annual drift + private readonly double GBMSigma = 0.2; // Annual volatility -private HistoryItemBar GenerateGBM(DateTime time, TimeSpan slice) -{ - // Convert time slice to years - double dt = slice.TotalDays / 365.0; + private HistoryItemBar GenerateGBM(DateTime time, TimeSpan slice) + { + // Convert time slice to years + double dt = slice.TotalDays / 365.0; - // Generate a random normal variable for the main price movement - double epsilon = GenerateGaussian(0, 1); + // Generate a random normal variable for the main price movement + double epsilon = GenerateGaussian(0, 1); - // Calculate the price movement using GBM equation - double drift = (GBMMu - 0.5 * GBMSigma * GBMSigma) * dt; - double diffusion = GBMSigma * Math.Sqrt(dt) * epsilon; - double returnValue = Math.Exp(drift + diffusion); + // Calculate the price movement using GBM equation + double drift = (GBMMu - 0.5 * GBMSigma * GBMSigma) * dt; + double diffusion = GBMSigma * Math.Sqrt(dt) * epsilon; + double returnValue = Math.Exp(drift + diffusion); - // Add variability between previous close and current open - double openVariability = GBMLastClose * GBMSigma * Math.Sqrt(dt) * GenerateGaussian(0, 1) * 0.1; - double open = GBMLastClose + openVariability; + // Add variability between previous close and current open + double openVariability = GBMLastClose * GBMSigma * Math.Sqrt(dt) * GenerateGaussian(0, 1) * 0.1; + double open = GBMLastClose + openVariability; - // Calculate new close price - double close = open * returnValue; + // Calculate new close price + double close = open * returnValue; - // Generate High and Low values - double highLowRange = Math.Max(Math.Abs(close - open), GBMLastClose * GBMSigma * Math.Sqrt(dt) * Math.Abs(GenerateGaussian(0, 1))); - double high = Math.Max(open, close) + highLowRange * 0.5; - double low = Math.Min(open, close) - highLowRange * 0.5; + // Generate High and Low values + double highLowRange = Math.Max(Math.Abs(close - open), GBMLastClose * GBMSigma * Math.Sqrt(dt) * Math.Abs(GenerateGaussian(0, 1))); + double high = Math.Max(open, close) + highLowRange * 0.5; + double low = Math.Min(open, close) - highLowRange * 0.5; - // Generate volume (you may want to adjust this based on your needs) - double volume = Math.Max(100, 1000 * Math.Abs(close - open) + 500 * GenerateGaussian(0, 1)); + // Generate volume (you may want to adjust this based on your needs) + double volume = Math.Max(100, 1000 * Math.Abs(close - open) + 500 * GenerateGaussian(0, 1)); - // Update last close for next iteration - GBMLastClose = close; + // Update last close for next iteration + GBMLastClose = close; - return new HistoryItemBar - { - TicksLeft = time.Ticks, - TicksRight = time.Add(slice).Ticks - 1, - Open = open, - High = high, - Low = low, - Close = close, - Volume = volume, - Ticks = slice.Ticks - }; -} + return new HistoryItemBar + { + TicksLeft = time.Ticks, + TicksRight = time.Add(slice).Ticks - 1, + Open = open, + High = high, + Low = low, + Close = close, + Volume = volume, + Ticks = slice.Ticks + }; + } private double FBMLastClose = 100; // Starting price - private double FBMHurst = 0.85; // Hurst parameter (0.5 < H < 1 for persistent fBm) + private readonly double FBMHurst = 0.85; // Hurst parameter (0.5 < H < 1 for persistent fBm) private readonly double FBMSigma = 0.25; // Volatility parameter private readonly double FBMDrift = 0.001; // drift diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index 22780089..ff7867e3 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -4,7 +4,15 @@ QuanTAlib.Tests QuanTAlib.Tests - + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers + all @@ -12,11 +20,11 @@ + - diff --git a/Tests/test_Trady.cs b/Tests/test_Trady.cs index 95e9e9b1..8037b8e3 100644 --- a/Tests/test_Trady.cs +++ b/Tests/test_Trady.cs @@ -2,7 +2,7 @@ using Xunit; using Trady.Analysis.Indicator; using Trady.Core; using Trady.Core.Infrastructure; -using QuanTAlib; +namespace QuanTAlib; public class TradyTests { diff --git a/Tests/test_Tulip.cs b/Tests/test_Tulip.cs index 5b7cb558..159902ae 100644 --- a/Tests/test_Tulip.cs +++ b/Tests/test_Tulip.cs @@ -1,6 +1,6 @@ using Xunit; using Tulip; -using QuanTAlib; +namespace QuanTAlib; public class TulipTests { @@ -23,7 +23,7 @@ public class TulipTests iterations = 3; skip = 500; data = feed.Close.v.ToArray(); - outdata = new double[data.Count()]; + outdata = new double[data.Length]; } [Fact] @@ -66,12 +66,11 @@ public class TulipTests double[][] arrout = [outdata]; Tulip.Indicators.ema.Run(inputs: arrin, options: [period], outputs: arrout); - Assert.Equal(QL.Length, arrout[0].Count()); + Assert.Equal(QL.Length, arrout[0].Length); for (int i = QL.Length - 1; i > skip*2; i--) //Initial Tulip Ema value is (wrongly) set to the first input value - therefore large skip { double QL_item = QL[i].Value; double TU = arrout[0][i]; - //Assert.InRange(TU - QL_item, -range, range); Assert.True(Math.Abs(TU - QL_item) <= range, $"Assertion failed at index {i} for period {period}: TU = {TU}, QL_item = {QL_item}, delta = {TU-QL_item}"); } diff --git a/Tests/test_consistency.cs b/Tests/test_consistency.cs index 72d482cd..ea6ae40d 100644 --- a/Tests/test_consistency.cs +++ b/Tests/test_consistency.cs @@ -1,5 +1,5 @@ using Xunit; -using QuanTAlib; +namespace QuanTAlib; public class Consistency { @@ -312,31 +312,6 @@ public class Consistency } } - /* - [Fact] - public void Jma_isNew() - { - int p = (int)rnd.Next(2, 100); - Jma ma1 = new(p); - Jma ma2 = new(p); - for (int i = 0; i < series_len; i++) - { - TValue item1 = new(Time: DateTime.Now, Value: rnd.Next(-100, 100), IsNew: true); - ma1.Calc(item1); - for (int j = 0; j < corrections; j++) - { - item1 = new(Time: DateTime.Now, Value: rnd.Next(-100, 100), IsNew: false); - ma1.Calc(item1); - } - ma2.Calc(new TValue(item1.Time, item1.Value, IsNew: true)); - - //Assert.Equal(ma1.Value, ma2.Value); - Assert.True(ma1.Value == ma2.Value, $"Assertion failed at p={p}, Value={item1.Value}. ma1.Value={ma1.Value}, ma2.Value={ma2.Value}"); - } - } - */ - - [Fact] public void Kama_isNew() { @@ -442,7 +417,6 @@ public class Consistency [Fact] public void Qema_isNew() { - int p = (int)rnd.Next(2, 100); Qema ma1 = new(); Qema ma2 = new(); for (int i = 0; i < series_len; i++) @@ -683,7 +657,7 @@ public class Consistency [Fact] public void Kurtosis_isNew() { - int p = (int)rnd.Next(2, 100); + int p = (int)rnd.Next(5, 100); Kurtosis ma1 = new(p); Kurtosis ma2 = new(p); for (int i = 0; i < series_len; i++) diff --git a/Tests/test_skender.stock.cs b/Tests/test_skender.stock.cs index a0932094..9602b2d5 100644 --- a/Tests/test_skender.stock.cs +++ b/Tests/test_skender.stock.cs @@ -1,6 +1,6 @@ using Xunit; using Skender.Stock.Indicators; -using QuanTAlib; +namespace QuanTAlib; public class SkenderTests { @@ -284,7 +284,6 @@ public class SkenderTests { for (int run = 0; run < iterations; run++) { - //period = rnd.Next(50) + 5; Mama ma = new(fastLimit: 0.5, slowLimit: 0.05); TSeries QL = new(); foreach (TBar item in feed) diff --git a/Tests/test_talib.cs b/Tests/test_talib.cs index 82e267c9..3d57d44a 100644 --- a/Tests/test_talib.cs +++ b/Tests/test_talib.cs @@ -1,6 +1,6 @@ using Xunit; using TALib; -using QuanTAlib; +namespace QuanTAlib; public class TAlibTests { @@ -22,7 +22,7 @@ public class TAlibTests feed.Add(10000); iterations = 3; data = feed.Close.v.ToArray(); - TALIB = new double[data.Count()]; + TALIB = new double[data.Length]; } @@ -37,11 +37,11 @@ public class TAlibTests foreach (TBar item in feed) { QL.Add(ma.Calc(new TValue(item.Time, item.Close))); } Core.Sma(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period); - Assert.Equal(QL.Length, TALIB.Count()); + Assert.Equal(QL.Length, TALIB.Length); for (int i = QL.Length - 1; i > period; i--) { double TL = i < outBegIdx ? double.NaN : TALIB[i - outBegIdx]; - Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range); + Assert.InRange(TL - QL[i].Value, -range, range); } } } @@ -57,7 +57,7 @@ public class TAlibTests foreach (TBar item in feed) { QL.Add(ma.Calc(new TValue(item.Time, item.Close))); } Core.Ema(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period); - Assert.Equal(QL.Length, TALIB.Count()); + Assert.Equal(QL.Length, TALIB.Length); for (int i = QL.Length - 1; i > period; i--) { double TL = i < outBegIdx ? double.NaN : TALIB[i - outBegIdx]; @@ -77,7 +77,7 @@ public class TAlibTests foreach (TBar item in feed) { QL.Add(ma.Calc(new TValue(item.Time, item.Close))); } Core.Dema(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period); - Assert.Equal(QL.Length, TALIB.Count()); + Assert.Equal(QL.Length, TALIB.Length); for (int i = QL.Length - 1; i > period*20; i--) { double TL = i < outBegIdx ? double.NaN : TALIB[i - outBegIdx]; @@ -97,7 +97,7 @@ public class TAlibTests foreach (TBar item in feed) { QL.Add(ma.Calc(new TValue(item.Time, item.Close))); } Core.Tema(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period); - Assert.Equal(QL.Length, TALIB.Count()); + Assert.Equal(QL.Length, TALIB.Length); for (int i = QL.Length - 1; i > period*20; i--) { double TL = i < outBegIdx ? double.NaN : TALIB[i - outBegIdx]; @@ -106,29 +106,6 @@ public class TAlibTests } } -//TODO fix WMA -/* - [Fact] - public void WMA() - { - for (int run = 0; run < iterations; run++) - { - period = rnd.Next(50) + 5; - Wma ma = new(period); - TSeries QL = new(); - foreach (TBar item in feed) - { QL.Add(ma.Calc(new TValue(item.Time, item.Close))); } - Core.Wma(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, period); - Assert.Equal(QL.Length, TALIB.Count()); - for (int i = QL.Length - 1; i > period*3; i--) - { - double TL = i < outBegIdx ? double.NaN : TALIB[i - outBegIdx]; - Assert.InRange(TALIB[i - outBegIdx] - QL[i].Value, -range, range); - } - } - } - */ - [Fact] public void T3() { @@ -140,7 +117,7 @@ public class TAlibTests foreach (TBar item in feed) { QL.Add(ma.Calc(new TValue(item.Time, item.Close))); } Core.T3(data, 0, QL.Length - 1, TALIB, out int outBegIdx, out _, optInTimePeriod: period, optInVFactor: 0.7); - Assert.Equal(QL.Length, TALIB.Count()); + Assert.Equal(QL.Length, TALIB.Length); for (int i = QL.Length - 1; i > period*20; i--) { double TL = i < outBegIdx ? double.NaN : TALIB[i - outBegIdx]; diff --git a/archive/.editorconfig b/archive/.editorconfig deleted file mode 100644 index b99bec2f..00000000 --- a/archive/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -# Top-most EditorConfig file -root = true - -[*.{cs,vb}] -# Suppress S3776 (Cognitive Complexity) -dotnet_diagnostic.S3776.severity = none -# Suppress CA1416 (Platform Compatibility) -dotnet_diagnostic.CA1416.severity = none -dotnet_style_parentheses_in_control_flow_statements = always_for_clarity:suggestion -csharp_new_line_before_open_brace = none -csharp_new_line_before_else = false -csharp_new_line_before_catch = false -csharp_new_line_before_finally = false -csharp_new_line_before_members_in_object_initializers = false -csharp_new_line_before_members_in_anonymous_types = false -csharp_new_line_between_query_expression_clauses = false \ No newline at end of file diff --git a/archive/.gitignore b/archive/.gitignore deleted file mode 100644 index f7e3d0a2..00000000 --- a/archive/.gitignore +++ /dev/null @@ -1,358 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates -.vscode/ -.fleet/ -*.deps.json -.Sandbox/ -#.sonarlint/ -.DS_Store - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ -dotCover.Output.dcvr -/Tests/GlobalSuppressions.cs diff --git a/archive/.refactoring/base.cs b/archive/.refactoring/base.cs deleted file mode 100644 index 530d38d2..00000000 --- a/archive/.refactoring/base.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; - -public readonly record struct TValue(DateTime Time, double Value, bool IsNew = true, bool IsHot = true) -{ - public DateTime Time { get; init; } = Time; - public double Value { get; init; } = Value; - public bool IsNew { get; init; } = IsNew; - public bool IsHot { get; init; } = IsHot; - - public TValue() : this(DateTime.UtcNow, 0) { } - public TValue(double value) : this(DateTime.UtcNow, value) { } - public TValue((DateTime time, double value) tuple) : this(tuple.time, tuple.value) { } - - public static implicit operator double(TValue tv) => tv.Value; - public static implicit operator DateTime(TValue tv) => tv.Time; - public static implicit operator TValue(double value) => new TValue(DateTime.UtcNow, value); - - public override string ToString() => $"[{Time:yyyy-MM-dd HH:mm:ss}: {Value:F2}]"; -} - - -public readonly record struct TBar(DateTime Time, double Open, double High, double Low, double Close, double Volume, bool IsNew = true) -{ - public DateTime Time { get; init; } = Time; - public double Open { get; init; } = Open; - public double High { get; init; } = High; - public double Low { get; init; } = Low; - public double Close { get; init; } = Close; - public double Volume { get; init; } = Volume; - public bool IsNew { get; init; } = IsNew; - - public TBar() : this(DateTime.UtcNow, 0, 0, 0, 0, 0) { } - public TBar(double open, double high, double low, double close, double volume) : this(DateTime.UtcNow, open, high, low, close, volume) { } - public TBar((DateTime time, double open, double high, double low, double close, double volume) tuple) : this(tuple.time, tuple.open, tuple.high, tuple.low, tuple.close, tuple.volume) { } - - public override string ToString() => $"[{Time:yyyy-MM-dd HH:mm:ss}: O={Open:F2}, H={High:F2}, L={Low:F2}, C={Close:F2}, V={Volume:F2}]"; -} - -///////////////////// -/// -///////////////////// - -public class GBM_Feed -{ - private readonly double _mu; - private readonly double _sigma; - private readonly Random _random; - private double _lastClose; - private double _lastHigh; - private double _lastLow; - - public GBM_Feed(double initialPrice, double mu, double sigma) - { - _lastClose = initialPrice; - _lastHigh = initialPrice; - _lastLow = initialPrice; - _mu = mu; - _sigma = sigma; - _random = Random.Shared; - } - - public TBar Generate(bool IsNew = true) - { - DateTime time = DateTime.UtcNow; - double dt = 1.0 / 252; // Assuming daily steps in a trading year of 252 days - double drift = (_mu - 0.5 * _sigma * _sigma) * dt; - double diffusion = _sigma * Math.Sqrt(dt) * NormalRandom(); - double newClose = _lastClose * Math.Exp(drift + diffusion); - - double open = _lastClose; - double high = Math.Max(open, newClose) * (1 + _random.NextDouble() * 0.01); - double low = Math.Min(open, newClose) * (1 - _random.NextDouble() * 0.01); - double volume = 1000 + _random.NextDouble() * 1000; // Random volume between 1000 and 2000 - - if (!IsNew) - { - high = Math.Max(_lastHigh, high); - low = Math.Min(_lastLow, low); - } - else - { - _lastClose = newClose; - } - - _lastHigh = high; - _lastLow = low; - - return new TBar(time, open, high, low, newClose, volume, IsNew); - } - - private double NormalRandom() - { - // Box-Muller transform to generate standard normal random variable - double u1 = 1.0 - _random.NextDouble(); // Uniform(0,1] random doubles - double u2 = 1.0 - _random.NextDouble(); - return Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); - } -} - - -/// -/// //////////////// -/// - -public class EMA -{ - private double lastEma, lastEmaCandidate, k; - private int period, i; - public TValue Value { get; private set; } - public bool IsHot { get; private set; } - - public EMA(int period) { - Init(period); - } - - public void Init(int period) - { - this.period = period; - this.k = 2.0 / (period + 1); - this.lastEma = this.lastEmaCandidate = double.NaN; - this.i = 0; - } - public TValue Update(TValue input, bool IsNew = true) { - double ema; - - if (double.IsNaN(lastEma)) { lastEma = input.Value; } - - if (IsNew) { - lastEma = lastEmaCandidate; - i++; - } - - double kk = (i= period; - Value = new TValue(input.Time, ema, IsNew, IsHot); - return Value; - } -} - -///////////////// -/// - -public class SMA -{ - private CircularBuffer buffer; - private int period; - private double sum; - public TValue Value { get; private set; } - public bool IsHot { get; private set; } - - public SMA(int period) - { - Init(period); - } - - public void Init(int period) - { - this.period = period; - this.buffer = new CircularBuffer(period); - this.sum = 0; - this.IsHot = false; - this.Value = default; - } - - public TValue Update(TValue input, bool IsNew = true) - { - if (IsNew) - { - if (buffer.Count == period) { - sum -= buffer[0]; - } - buffer.Add(input); - sum += input.Value; - } else { - if (buffer.Count > 0) { - sum -= buffer[buffer.Count - 1]; - sum += input.Value; - buffer[buffer.Count - 1] = input; - } else { - buffer.Add(input); - sum += input.Value; - } - } - - double sma = buffer.Count > 0 ? sum / buffer.Count : double.NaN; - IsHot = buffer.Count >= period; - Value = new TValue(input.Time, sma, IsNew, IsHot); - return Value; - } -} - -///////////////////// -/// -///////////////////// - - -public class CircularBuffer -{ - private double[] _buffer; - private int _start; - private int _size; - - public CircularBuffer(int capacity) { - _buffer = new double[capacity]; - _start = 0; - _size = 0; - } - - public int Capacity => _buffer.Length; - public int Count => _size; - - public void Add(double item) { - if (_size < Capacity) { - _buffer[(_start + _size) % Capacity] = item; - _size++; - } else { - _buffer[_start] = item; - _start = (_start + 1) % Capacity; - } - } - - public double this[int index] { - get { - if (index < 0 || index >= _size) - throw new IndexOutOfRangeException(); - return _buffer[(_start + index) % Capacity]; - } - set { - if (index < 0 || index >= _size) - throw new IndexOutOfRangeException(); - _buffer[(_start + index) % Capacity] = value; - } - } -} \ No newline at end of file diff --git a/archive/.refactoring/test.dib b/archive/.refactoring/test.dib deleted file mode 100644 index d2277e66..00000000 --- a/archive/.refactoring/test.dib +++ /dev/null @@ -1,163 +0,0 @@ -#!meta - -{"kernelInfo":{"defaultKernelName":"csharp","items":[{"aliases":[],"name":"csharp"}]}} - -#!csharp - -#r "\bin\Debug\calculations.dll" -using QuanTAlib; - -#!csharp - -TValue vv = new(10); -display(vv.ToString()); -display(vv.IsHot); - -TBar bb = new(1,1,1,1,10); -display(bb.ToString()); -display(bb.IsNew); - -#!csharp - -int i=10; -SMA sma = new(i); -Console.WriteLine($"{"Close",10} {"SMA(" + i + ")",10}"); -for (int i = 0; i < 20; i++) -{ - TValue c =(double)i+1; - sma.Update(10000,true); - sma.Update(1,false); - sma.Update(-1000,false); - sma.Update(c,false); - - Console.WriteLine($"{i+1} {(double)c,10:F2} {(double)sma.Value,10:F2} {sma.Value.IsHot}"); -} - -#!csharp - -public class Emitter { - private Random random = new Random(); - public event EventHandler> Pub; - public void Emit() { - DateTime now = DateTime.Now; - double randomValue = random.NextDouble() * 100; // Generates a random number between 0 and 100 - TValue value = new TValue(now, randomValue); - - EventArg eventArg = new EventArg(value, true, true); - OnValuePub(eventArg); - } - protected virtual void OnValuePub(EventArg eventArg) { - Pub?.Invoke(this, eventArg); - } -} - -public class BarEmitter -{ - private Random random = new Random(); - public event EventHandler> Pub; - private double lastClose = 100.0; // Starting price - - public void Emit() - { - double open = lastClose; - double close = open * (1 + (random.NextDouble() - 0.5) * 0.02); // +/- 1% change - double high = Math.Max(open, close) * (1 + random.NextDouble() * 0.005); // Up to 0.5% higher - double low = Math.Min(open, close) * (1 - random.NextDouble() * 0.005); // Up to 0.5% lower - double volume = random.NextDouble() * 1000000; // Random volume between 0 and 1,000,000 - - TBar bar = new TBar(DateTime.Now, open, high, low, close, volume); - lastClose = close; - - EventArg eventArg = new EventArg(bar, true, true); - OnBarPub(eventArg); - } - - protected virtual void OnBarPub(EventArg eventArg) - { - Pub?.Invoke(this, eventArg); - } -} - - -public class Listener -{ - public void Sub(object sender, EventArgs e) - { - if (e is EventArg tValueArg) { - Console.WriteLine($"TValue: {tValueArg.Data.Value:F2}"); - } else if (e is EventArg tBarArg) { - Console.WriteLine($"TBar: o={tBarArg.Data.Open:F2}, v={tBarArg.Data.Volume:F2}"); - } else { - Console.WriteLine($"Unknown type: {e.GetType().Name}"); - } - } -} - -#!csharp - -Emitter em1 = new(); -BarEmitter em2 = new(); -Listener list = new(); - -em1.Pub += list.Sub; -em2.Pub += list.Sub; - -// Emit 5 random values -for (int i = 0; i < 3; i++) { - em1.Emit(); - em2.Emit(); -} - -#!csharp - -public abstract class Indicator { - protected Indicator() { - Init(); } - public virtual void Init() {} - public virtual TValue Calc(TValue input, bool isNew=true, bool isHot=true) { - return new TValue(); - } -} - -public class EMA : Indicator -{ - private double lastEma, lastEmaCandidate, k; - private int period, i; - - public EMA(int period) { - Init(period); - } - - public void Init(int period) - { - this.period = period; - this.k = 2.0 / (period + 1); - this.lastEma = this.lastEmaCandidate = double.NaN; - this.i = 0; - } - - public override TValue Calc(TValue input, bool isNew = true, bool isHot = true) { - double ema; - - if (double.IsNaN(lastEma)) { lastEma = lastEmaCandidate = input.Value; } - - if (isNew) { - lastEma = lastEmaCandidate; - i++; - } - - double kk = (i>=period)?k:(2.0/(i+1)); - ema = lastEma + kk * (input.Value - lastEma); - lastEmaCandidate = ema; - - return new TValue(input.Timestamp, ema); - } -} - -#!csharp - -EMA ema = new(3); -display(ema.Calc(100)); -display(ema.Calc(0,false)); -display(ema.Calc(100,false)); -display(ema.Calc(0)); diff --git a/archive/.sonarlint/QuanTAlib.ruleset b/archive/.sonarlint/QuanTAlib.ruleset deleted file mode 100644 index c546ccdb..00000000 --- a/archive/.sonarlint/QuanTAlib.ruleset +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/archive/.sonarlint/QuanTAlib.slconfig b/archive/.sonarlint/QuanTAlib.slconfig deleted file mode 100644 index 601908c4..00000000 --- a/archive/.sonarlint/QuanTAlib.slconfig +++ /dev/null @@ -1,19 +0,0 @@ -{ - "ServerUri": "https://sonarcloud.io/", - "Organization": { - "Key": "mihakralj", - "Name": "Miha Kralj" - }, - "ProjectKey": "mihakralj_QuanTAlib", - "ProjectName": "QuanTAlib", - "Profiles": { - "CSharp": { - "ProfileKey": "AYBIHuVX3Y_jZnooaQv1", - "ProfileTimestamp": "2022-04-20T17:57:57Z" - }, - "Secrets": { - "ProfileKey": "AYXoTKve9Ao2yLWbNVCT", - "ProfileTimestamp": "2023-01-25T09:40:14Z" - } - } -} \ No newline at end of file diff --git a/archive/.sonarlint/mihakralj_quantalib/CSharp/SonarLint.xml b/archive/.sonarlint/mihakralj_quantalib/CSharp/SonarLint.xml deleted file mode 100644 index 90bc98df..00000000 --- a/archive/.sonarlint/mihakralj_quantalib/CSharp/SonarLint.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - sonar.cs.analyzeGeneratedCode - false - - - sonar.cs.file.suffixes - .cs - - - sonar.cs.ignoreHeaderComments - true - - - sonar.cs.roslyn.ignoreIssues - false - - - - - S107 - - - max - 7 - - - - - S110 - - - max - 5 - - - - - S1479 - - - maximum - 30 - - - - - S2342 - - - flagsAttributeFormat - ^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$ - - - format - ^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$ - - - - - S2436 - - - max - 2 - - - maxMethod - 3 - - - - - S3776 - - - propertyThreshold - 3 - - - threshold - 15 - - - - - \ No newline at end of file diff --git a/archive/.sonarlint/mihakralj_quantalib_secrets_settings.json b/archive/.sonarlint/mihakralj_quantalib_secrets_settings.json deleted file mode 100644 index 1a0a4ae7..00000000 --- a/archive/.sonarlint/mihakralj_quantalib_secrets_settings.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "sonarlint.rules": { - "secrets:S6338": { - "level": "On", - "severity": "Blocker" - }, - "secrets:S6337": { - "level": "On", - "severity": "Blocker" - }, - "secrets:S6290": { - "level": "On", - "severity": "Blocker" - }, - "secrets:S6334": { - "level": "On", - "severity": "Blocker" - }, - "secrets:S6336": { - "level": "On", - "severity": "Blocker" - }, - "secrets:S6335": { - "level": "On", - "severity": "Blocker" - }, - "secrets:S6292": { - "level": "On", - "severity": "Blocker" - } - } -} \ No newline at end of file diff --git a/archive/.sonarlint/mihakralj_quantalibcsharp.ruleset b/archive/.sonarlint/mihakralj_quantalibcsharp.ruleset deleted file mode 100644 index 5ad478ec..00000000 --- a/archive/.sonarlint/mihakralj_quantalibcsharp.ruleset +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/archive/.sonarlint/sonar.settings.json b/archive/.sonarlint/sonar.settings.json deleted file mode 100644 index 10d827d5..00000000 --- a/archive/.sonarlint/sonar.settings.json +++ /dev/null @@ -1 +0,0 @@ -{"sonar.exclusions":[],"sonar.global.exclusions":["**/build-wrapper-dump.json"],"sonar.inclusions":[]} \ No newline at end of file diff --git a/archive/Calculations/Basics/ADD_Series.cs b/archive/Calculations/Basics/ADD_Series.cs deleted file mode 100644 index 6d0436fe..00000000 --- a/archive/Calculations/Basics/ADD_Series.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -ADD - adding TSeries+TSeries together, or TSeries+double, or double+TSeries - -Remarks: - Most of scaffolding is packaged in abstracty class Pair_TSeries_Indicator. - - */ - -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/archive/Calculations/Basics/CORR_Series.cs b/archive/Calculations/Basics/CORR_Series.cs deleted file mode 100644 index b5209361..00000000 --- a/archive/Calculations/Basics/CORR_Series.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -CORR: Pearson's Correlation Coefficient - PCC is a measure of linear correlation between two sets of data. - It is the ratio between the covariance of two variables and the product of - their standard deviations; it is essentially a normalized measurement of - the covariance, such that the result always has a value between −1 and 1. - -Sources: - https://en.wikipedia.org/wiki/Pearson_correlation_coefficient - - */ - -public class CORR_Series : Pair_TSeries_Indicator -{ - public CORR_Series(TSeries d1, TSeries d2, int period, bool useNaN = false) : base(d1, d2, period, useNaN) - { - 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); } } - } - - private readonly System.Collections.Generic.List _x = new(); - private readonly System.Collections.Generic.List _xx = new(); - private readonly System.Collections.Generic.List _y = new(); - private readonly System.Collections.Generic.List _yy = new(); - private readonly System.Collections.Generic.List _xy = new(); - - public override void Add((System.DateTime t, double v) TValue1, (System.DateTime t, double v) TValue2, bool update) - { - Add_Replace_Trim(_x, TValue1.v, _p, update); - Add_Replace_Trim(_xx, TValue1.v * TValue1.v, _p, update); - Add_Replace_Trim(_y, TValue2.v, _p, update); - Add_Replace_Trim(_yy, TValue2.v * TValue2.v, _p, update); - Add_Replace_Trim(_xy, TValue1.v * TValue2.v, _p, update); - - double _sumx = _x.Sum(); - double _sumxx = _xx.Sum(); - double _sumy = _y.Sum(); - double _sumyy = _yy.Sum(); - double _sumxy = _xy.Sum(); - - double _covar = (_sumxx - _sumx * _sumx / _p) * (_sumyy - _sumy * _sumy / _p); - double _cor = (_covar != 0) ? (_sumxy - _sumx * _sumy / _p) / Math.Sqrt(_covar) : 0.0; - - var result = (TValue1.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _cor); - if (update) { base[base.Count - 1] = result; } else { base.Add(result); } - - } -} diff --git a/archive/Calculations/Basics/COVAR_Series.cs b/archive/Calculations/Basics/COVAR_Series.cs deleted file mode 100644 index ee700873..00000000 --- a/archive/Calculations/Basics/COVAR_Series.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -COVAR: Covariance - Covariance is defined as the expected value (or mean) of the product - of their deviations from their individual expected values. - -Sources: - https://en.wikipedia.org/wiki/Covariance - - */ - - -public class COVAR_Series : Pair_TSeries_Indicator -{ - public COVAR_Series(TSeries d1, TSeries d2, int period, bool useNaN = false) : base(d1, d2, period, useNaN) - { - 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); - } - } - } - - private readonly System.Collections.Generic.List _x = new(); - private readonly System.Collections.Generic.List _y = new(); - private readonly System.Collections.Generic.List _xy = new(); - - public override void Add((System.DateTime t, double v) TValue1, (System.DateTime t, double v) TValue2, bool update) - { - BufferTrim(_x, TValue1.v, _p, update); - BufferTrim(_y, TValue2.v, _p, update); - BufferTrim(_xy, TValue1.v * TValue2.v, _p, update); - - double _avgx = _x.Average(); - double _avgy = _y.Average(); - double _avgxy = _xy.Average(); - double _covar = _avgxy - (_avgx * _avgy); - - var result = (TValue1.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _covar); - if (update) { base[base.Count - 1] = result; } else { base.Add(result); } - } -} diff --git a/archive/Calculations/Basics/DIV_Series.cs b/archive/Calculations/Basics/DIV_Series.cs deleted file mode 100644 index 962e4f6f..00000000 --- a/archive/Calculations/Basics/DIV_Series.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -DIV - divide TSeries/TSeries , or TSeries/double, or double/TSeries - -Remarks: - Most of scaffolding is packaged in abstracty class Pair_TSeries_Indicator. - */ - -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/archive/Calculations/Basics/MUL_Series.cs b/archive/Calculations/Basics/MUL_Series.cs deleted file mode 100644 index b2bae613..00000000 --- a/archive/Calculations/Basics/MUL_Series.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -MUL - multiply TSeries*TSeries together, or TSeries*double, or double*TSeries - - */ - -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/archive/Calculations/Basics/SUB_Series.cs b/archive/Calculations/Basics/SUB_Series.cs deleted file mode 100644 index e4333ec6..00000000 --- a/archive/Calculations/Basics/SUB_Series.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -SUB - subtracting TSeries-TSeries, or TSeries-double, or double-TSeries - - */ - - -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/archive/Calculations/Calculations.csproj b/archive/Calculations/Calculations.csproj deleted file mode 100644 index 701f67f7..00000000 --- a/archive/Calculations/Calculations.csproj +++ /dev/null @@ -1,80 +0,0 @@ - - - - QuanTAlib - 0.2.30 - 0.2.30 - 0.2.30 - Library of TA Calculations, Charts and Strategies for Quantower - Quantitative Technical Analysis Library in C# for Quantower - git - https://github.com/mihakralj/QuanTAlib - true - Miha Kralj - Miha Kralj - Apache-2.0 - readme.md - net8.0;net7.0 - disable - preview - disable - true - en-US - QuanTAlib - QuanTAlib - True - AnyCPU - False - full - 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; - - - - - - - - - - full - True - 7 - True - anycpu - - - full - True - 7 - True - anycpu - - - QuanTAlib2.png - https://raw.githubusercontent.com/mihakralj/QuanTAlib/main/.github/QuanTAlib2.png - True - ..\.sonarlint\mihakralj_quantalibcsharp.ruleset - 0.2.1-dev.2 - - - - - - - True - - - - - True - False - - - - - \ No newline at end of file diff --git a/archive/Calculations/ClassStructures/Pair_TSeries_Abstract.cs b/archive/Calculations/ClassStructures/Pair_TSeries_Abstract.cs deleted file mode 100644 index 5d1dc59f..00000000 --- a/archive/Calculations/ClassStructures/Pair_TSeries_Abstract.cs +++ /dev/null @@ -1,157 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -Abstract classes with all scaffolding required to build indicators. - All abstracts support period, NaN, and all permutations of Add() methods. - Indicator classess need to implement: - - Chaining constructor (Abstract's constructor executes first) - - Default Add(value) class - - optional Add(series) bulk insert class (for optimization of historical analysis) - - Single_TSeries_Indicator - one single-value TSeries in, one TSeries out. - Pair_TSeries_Indicator - Two TSeries in, one TSeries out. (includes simple semaphoring) - Single_TBars_Indicator - One OHLCV TBars in, one TSeries out. - - */ - -public abstract class Pair_TSeries_Indicator : TSeries -{ - protected readonly int _p; - protected readonly bool _NaN; - 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, int period, bool useNaN) - { - _p = period; - _NaN = useNaN; - _d1 = source1; - _d2 = source2; - _dd1 = double.NaN; - _dd2 = double.NaN; - _d1.Pub += Sub; - _d2.Pub += Sub; - } - - protected Pair_TSeries_Indicator(TSeries source1, TSeries source2) - { - _d1 = source1; - _d2 = source2; - _dd1 = double.NaN; - _dd2 = double.NaN; - _d1.Pub += Sub; - _d2.Pub += Sub; - } - - protected Pair_TSeries_Indicator(TSeries source1, double dd2) - { - _d1 = source1; - _d2 = new TSeries(); - _dd1 = double.NaN; - _dd2 = dd2; - _d1.Pub += Sub; - } - - protected Pair_TSeries_Indicator(double dd1, TSeries source2) - { - _d1 = new TSeries(); - _d2 = source2; - _dd1 = dd1; - _dd2 = double.NaN; - _d2.Pub += Sub; - } - - // overridable Add(Tvalue, Tvalue) method to add/update a single value at the end of the list - public virtual void Add((DateTime t, double v) TValue1, (DateTime t, double v) TValue2, bool update) - { - base.Add((TValue1.t, 0), 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 (var i = 0; i < d1.Count; i++) - { - Add(d1[i], d2[i], false); - } - } - - public virtual void Add(TSeries d1, double dd2) - { - for (var i = 0; i < d1.Count; i++) - { - Add(d1[i], (d1[i].t, dd2), false); - } - } - - public virtual void Add(double dd1, TSeries d2) - { - for (var i = 0; i < d2.Count; i++) - { - Add((d2[i].t, dd1), d2[i], false); - } - } - - public void Add((DateTime t, double v) TValue1, (DateTime t, double v) TValue2) - { - Add(TValue1, TValue2, false); - } - - public void Add(bool update) - { - if (_dd1 is double.NaN && _dd2 is double.NaN) - { - // (Series, Series) - if (update || (_d1.Count > Count && _d2.Count > Count)) - { - Add(_d1[_d1.Count - 1], _d2[_d2.Count - 1], update); - } - } - else if (_dd2 is not double.NaN && _dd1 is double.NaN) - { - // (Series, Double) - Add(_d1[_d1.Count - 1], (_d1[_d1.Count - 1].t, _dd2), update); - } - else - { - // (Double, Series) - Add((_d2[_d2.Count - 1].t, _dd1), _d2[_d2.Count - 1], update); - } - } - - public void Add() - { - Add(false); - } - - public new void Sub(object source, TSeriesEventArgs e) - { - Add(e.update); - } - - protected static void Add_Replace(List l, double v, bool update) - { - if (update) - { - l[l.Count - 1] = v; - } - else - { - l.Add(v); - } - } - - protected static void Add_Replace_Trim(List l, double v, int p, bool update) - { - Add_Replace(l, v, update); - if (l.Count > p && p != 0) - { - l.RemoveAt(0); - } - } -} diff --git a/archive/Calculations/Feeds/Alphavantage_Feed.cs b/archive/Calculations/Feeds/Alphavantage_Feed.cs deleted file mode 100644 index f2bcc60e..00000000 --- a/archive/Calculations/Feeds/Alphavantage_Feed.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Text.Json; - -/* -Alphavantage - Free API to collect 100 recent daily quotes. It requires a (free) API key - Get API key at https://www.alphavantage.co/support/#api-key - Parameters: - Symbol: stock ("AAPL"), - APIkey: unique Alphavantage API key - - -*/ -public class Alphavantage_Feed : TBars -{ - public enum Interval { Month, Week, Day, Hour, Min30, Min15, Min5, Min1 } - public Alphavantage_Feed(string Symbol = "IBM", string APIkey = "demo") - { - System.Net.Http.HttpClient client = new(); - - string req = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED" + "&symbol=" + Symbol + "&apikey=" + APIkey; - var msg = client.GetStringAsync(req).Result; - var jres = JsonSerializer.Deserialize(msg).RootElement; - jres.TryGetProperty("Time Series (Daily)", out JsonElement json); - - if (json.ValueKind == JsonValueKind.Undefined) { throw new InvalidOperationException("Stock symbol " + Symbol + " not found"); } - foreach (var val in json.EnumerateObject()) { base.Add(GetOHLC(val)); } - base.Reverse(); - } - private static (DateTime t, double o, double h, double l, double c, double v) GetOHLC(JsonProperty json) - { - double o, h, l, c, v; - o = h = l = c = v = 0; - DateTime date = Convert.ToDateTime(json.Name); - foreach (var val in json.Value.EnumerateObject()) - { - switch (val.Name) - { - case "1. open": o = Convert.ToDouble(val.Value.ToString()); break; - case "1b. open (USD)": o = Convert.ToDouble(val.Value.ToString()); break; - case "2. high": h = Convert.ToDouble(val.Value.ToString()); break; - case "2b. high (USD)": h = Convert.ToDouble(val.Value.ToString()); break; - case "3. low": l = Convert.ToDouble(val.Value.ToString()); break; - case "3b. low (USD)": l = Convert.ToDouble(val.Value.ToString()); break; - case "4. close": c = Convert.ToDouble(val.Value.ToString()); break; - case "4b. close (USD)": c = Convert.ToDouble(val.Value.ToString()); break; - case "5. adjusted close": c = Convert.ToDouble(val.Value.ToString()); break; - case "5. volume": v = Convert.ToDouble(val.Value.ToString()); break; - case "6. volume": v = Convert.ToDouble(val.Value.ToString()); break; - default: o = 0; h = 0; l = 0; c = 0; v = 0; break; - } - } - return (date, o, h, l, c, v); - } -} \ No newline at end of file diff --git a/archive/Calculations/Feeds/GBM_Feed.cs b/archive/Calculations/Feeds/GBM_Feed.cs deleted file mode 100644 index c99a282f..00000000 --- a/archive/Calculations/Feeds/GBM_Feed.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -GBM - Geometric Brownian Motion is a random simulator of market movement, returning List - GBM can be used for testing indicators, validation and Monte Carlo simulations of strategies. - - Sample usage: - GBM-Random data = new(); // generates 1 year (252) list of bars - GBM-Random data = new(Bars: 1000); // generates 1,000 bars - GBM-Random data = new(Bars: 252, Volatility: 0.05, Drift: 0.0005, Seed: 100.0) - - Parameters - Bars: number of bars (quotes) requested - Volatility: how dymamic/volatile the series should be; default is 1 - Drift: incremental drift due to annual interest rate; default is 5% - Seed: starting value of the random series; should not be 0 - - */ - -public class GBM_Feed : TBars -{ - private double seed; - readonly double drift, volatility; - readonly int precision; - public GBM_Feed(int Bars = 252, double Volatility = 1.0, double Drift = 0.05, double Seed = 100.0, int Precision = 2) - { - this.seed = Seed; - volatility = Volatility * 0.01; - drift = Drift * 0.01; - precision = Precision; - for (int i = 0; i < Bars; i++) - { - DateTime Timestamp = DateTime.Today.AddDays(i - Bars); - this.Add(Timestamp); - } - } - - public void Add(bool update = false) { this.Add(DateTime.Now, update); } - public void Add(DateTime timestamp, bool update = false) - { - double Open = GBM_value(seed, volatility * volatility, drift, precision); - double Close = GBM_value(Open, volatility, drift, precision); - - double OCMax = Math.Max(Open, Close); - double High = (GBM_value(seed, volatility * 0.5, 0, precision)); - High = (High < OCMax) ? (2 * OCMax) - High : High; - - double OCMin = Math.Min(Open, Close); - double Low = (GBM_value(seed, volatility * 0.5, 0, precision)); - Low = (Low > OCMin) ? (2 * OCMin) - Low : Low; - - double Volume = GBM_value(seed * 10, volatility * 2, Drift: 0, precision: 1); - - base.Add((timestamp, Open, High, Low, Close, Volume), update); - seed = Close; - } - - private static double GBM_value(double Seed, double Volatility, double Drift, int precision) - { - Random rnd = new(); - double U1 = 1.0 - rnd.NextDouble(); - double U2 = 1.0 - rnd.NextDouble(); - double Z = Math.Sqrt(-2.0 * Math.Log(U1)) * Math.Sin(2.0 * Math.PI * U2); - return Math.Round(Seed * Math.Exp(Drift - (Volatility * Volatility * 0.5) + (Volatility * Z)), digits: precision); - } -} \ No newline at end of file diff --git a/archive/Calculations/Feeds/RND_Feed.cs b/archive/Calculations/Feeds/RND_Feed.cs deleted file mode 100644 index c6e311af..00000000 --- a/archive/Calculations/Feeds/RND_Feed.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -Random Bars generator - used for testing, validation and fun - Returns 'bars' number of candles that follow common market movement. - volatility defines how 'jumpy' is the series of - startvalue defines beginning closing price that then guides the rest of series - - */ - -public class RND_Feed : TBars -{ - public RND_Feed(int Bars, double Volatility = 0.05, double Startvalue = 100.0) - { - Random rnd = new(); - double c = Startvalue; - for (int i = 0; i < Bars; 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 - Bars), o, h, l, c, v); - } - } -} \ No newline at end of file diff --git a/archive/Calculations/Feeds/Yahoo_Feed.cs b/archive/Calculations/Feeds/Yahoo_Feed.cs deleted file mode 100644 index 1d87e97d..00000000 --- a/archive/Calculations/Feeds/Yahoo_Feed.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Text.Json; - -/* -Yahoo Finance - Free API feed to collect daily market quotes - Parameters: - Symbol: stock symbol (default: "IBM") - Period: number of days of collected history (default: 252) - Usage: - Yahoo_Feed ticker = new("MSFT", 20) - - -*/ -public class Yahoo_Feed : TBars -{ - public Yahoo_Feed(string Symbol = "IBM", int Period = 252) - { - Period = (int)(Period * 1.45); - string requestUrl = "https://query1.finance.yahoo.com/v8/finance/chart/" + - Symbol + "?interval=1d&period1=" + - (int)new DateTimeOffset(DateTime.UtcNow.AddDays(-Period + 1)).ToUnixTimeSeconds() + "&period2=" + - (int)new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); - System.Net.Http.HttpClient client = new(); - var msg = client.GetStringAsync(requestUrl).Result; - var jresult = JsonSerializer.Deserialize(msg).RootElement; - - jresult.TryGetProperty("chart", out JsonElement json); - json.TryGetProperty("result", out json); - json[0].TryGetProperty("timestamp", out JsonElement datetime); - json[0].TryGetProperty("indicators", out json); - json.TryGetProperty("quote", out json); - json[0].TryGetProperty("open", out JsonElement open); - json[0].TryGetProperty("high", out JsonElement high); - json[0].TryGetProperty("low", out JsonElement low); - json[0].TryGetProperty("close", out JsonElement close); - json[0].TryGetProperty("volume", out JsonElement volume); - - for (int i = 0; i < datetime.GetArrayLength(); i++) - { - DateTime d = DateTimeOffset.FromUnixTimeSeconds(long.Parse(datetime[i].GetRawText())).DateTime; - double o = Math.Round(double.Parse(open[i].GetRawText()), 3); - double h = Math.Round(double.Parse(high[i].GetRawText()), 3); - double l = Math.Round(double.Parse(low[i].GetRawText()), 3); - double c = Math.Round(double.Parse(close[i].GetRawText()), 3); - double v = Math.Round(double.Parse(volume[i].GetRawText()), 3); - base.Add(d, o, h, l, c, v); - } - } -} diff --git a/archive/Calculations/Logic/COMPARE_Series.cs b/archive/Calculations/Logic/COMPARE_Series.cs deleted file mode 100644 index 70d26902..00000000 --- a/archive/Calculations/Logic/COMPARE_Series.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -COMPARE - Generates +1 if A is above B, -1 if A is below B and 0 if A=B - - - */ - -public class COMPARE_Series : Pair_TSeries_Indicator -{ - - public COMPARE_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 COMPARE_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 COMPARE_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) - { - - double val = TValue1.v > TValue2.v ? 1 : -1; - val = TValue1.v == TValue2.v ? 0 : val; - (System.DateTime t, double v) over = ((TValue1.t > TValue2.t) ? TValue1.t : TValue2.t, TValue1.v > TValue2.v ? 1 : val); - if (update) { base[^1] = over; } - else { base.Add(over); } - - - } -} - - diff --git a/archive/Calculations/Logic/CROSS_Series.cs b/archive/Calculations/Logic/CROSS_Series.cs deleted file mode 100644 index b9a40d9b..00000000 --- a/archive/Calculations/Logic/CROSS_Series.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -OVER - Generates +1 if A is above B, -1 if A is below B and 0 if A=B - -Remarks: - OVER.Cross generates 1 when A breaks B from below and -1 when A breaks B from above - - */ - -public class CROSS_Series : Pair_TSeries_Indicator -{ - public TSeries Cross { get; set; } = new(); - - private double _previous = double.NaN; - public CROSS_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 CROSS_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 CROSS_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) - { - - double val = TValue1.v > TValue2.v ? 1 : -1; - val = TValue1.v == TValue2.v ? 0 : val; - double over = TValue1.v > TValue2.v ? 1 : val; - - val = (_previous < over) ? 1 : -1; - val = ((_previous == over) || Double.IsNaN(this._previous) || (this._previous == 0)) ? 0 : val; - (System.DateTime t, double v) result = ((TValue1.t > TValue2.t) ? TValue1.t : TValue2.t, val); - - this._previous = over; - - if (update) { base[^1] = result; } - else { base.Add(result); } - - } -} - - diff --git a/archive/Calculations/Logic/EQUITY_Series.cs b/archive/Calculations/Logic/EQUITY_Series.cs deleted file mode 100644 index 8323feb7..00000000 --- a/archive/Calculations/Logic/EQUITY_Series.cs +++ /dev/null @@ -1,91 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -EQUITY - Generates P&L portfolio based on trades signals and equity prices - - */ - - -//base prices: bars.close -//trade signals: trades -//optional: long, short, long&short -//optional: warmup period: warmup - -/* - -public class EQUITY_Series : Single_TSeries_Indicator { - readonly TSeries inmarket; //for every bar - private readonly TSeries _price; - private double _equity; - private readonly double _capital; - - readonly int _warmup; - double _cash; - int _units; - private bool _longbuy, _longsell; - double _long_order, _open_order; - double _investment_value; - short _inmarket; - - public EQUITY_Series(TSeries signal, TSeries price, int warmup = 0, double capital = 1000) : base(signal, period: 0, useNaN: false) { - _capital = capital; - _cash = _capital; - _investment_value = 0; - _warmup = (warmup > 0) ? warmup : 1; - - inmarket = new(); - _longbuy = _longsell = false; - _open_order = 0; - _inmarket = 0; - _units = 0; - _long_order = 0; - - _price = price; //we buy on the Open price of the NEXT bar - _long_order = 0; - - if (base._data.Count > 0) { base.Add(base._data); } - } - - public override void Add((System.DateTime t, double v) TValue, bool update) { - - if (this.Count > _warmup) { - - // harvest the gain-loss from previous day - _investment_value = _units * _price[this.Count - 1].v; - _equity = _cash + _investment_value; - - - //execute orders from previous bar - if (_longbuy && _inmarket == 0) { //time to execute the long buy - _units = (int)(_cash / _price[this.Count - 1].v); - _long_order = _units * _price[this.Count - 1].v; - _cash -= _long_order; - _open_order = _long_order; - _equity = _cash + _open_order; - _inmarket = 1; - _longbuy = false; - } - - if (_longsell && _inmarket == 1) { //time to execute the long sell - _long_order = (_units * _price[this.Count - 1].v); - _cash += _long_order; - _units = 0; - - _open_order = 0; - _equity = _cash + _open_order; - _inmarket = 0; - _longsell = false; - } - - if (_inmarket == 0 && TValue.v == 1) { _longbuy = true; } //out of market, enter long - if (_inmarket == 1 && TValue.v == -1) { _longsell = true; } //long market, exit long - - //Console.WriteLine($"{TValue.v,3}\t {(_inmarket)} : {_cash,10:f2} + {_units*_price[^1].v,7:f2} = {_equity-_capital:f2}"); - } - inmarket.Add((TValue.t, (double)_inmarket)); - base.Add((TValue.t, _equity), update, _NaN); - } -} - -*/ \ No newline at end of file diff --git a/archive/Calculations/Logic/TOrders.cs b/archive/Calculations/Logic/TOrders.cs deleted file mode 100644 index ec681ec5..00000000 --- a/archive/Calculations/Logic/TOrders.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Data; -using System.Linq; - - -public enum OType -{ - NIL = 0, // No position - BTO = 1, // Buy to Open - STC = 2, // Sell to Close - STO = 3, // Sell to Open - BTC = 4, // Buy to Close - END = 5, // Exit the trade -} - - -public class TOrders : List<(DateTime t, OType o)> -{ - - public void Add((DateTime t, OType o) TOrder, bool update = false) - { - if (update) { this[^1] = TOrder; } - else { base.Add(TOrder); } - OnEvent(update); - } - - - protected virtual void OnEvent(bool update = false) - { - Pub?.Invoke(this, new TSeriesEventArgs { update = update }); - } - public delegate void NewDataEventHandler(object source, TSeriesEventArgs args); - public event NewDataEventHandler Pub; - -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ADL_Series.cs b/archive/Calculations/_Updated/ADL_Series.cs deleted file mode 100644 index 9873a1cc..00000000 --- a/archive/Calculations/_Updated/ADL_Series.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -ADL: Chaikin Accumulation/Distribution Line - ADL is a volume-based indicator that measures the cumulative Money Flow Volume: - - 1. Money Flow Multiplier = [(Close - Low) - (High - Close)] /(High - Low) - 2. Money Flow Volume = Money Flow Multiplier x Volume for the Period - 3. ADL = Previous ADL + Current Period's Money Flow Volume - -Sources: - https://school.stockcharts.com/doku.php?id=technical_indicators:accumulation_distribution_line - - */ - -public class ADL_Series : TSeries -{ - protected readonly TBars _data; - private double _lastadl, _lastlastadl; - - //core constructors - public ADL_Series() - { - Name = $"ADL()"; - _lastadl = _lastlastadl = 0; - } - public ADL_Series(TBars source) - { - _data = source; - Name = $"ADL({(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _lastadl = _lastlastadl = 0; - _data.Pub += Sub; - Add(data: _data); - } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - if (update) { this._lastadl = this._lastlastadl; } - else { this._lastlastadl = this._lastadl; } - - double _adl = 0; - double tmp = TBar.h - TBar.l; - if (tmp > 0.0) - { - _adl = _lastadl + ((2 * TBar.c - TBar.l - TBar.h) / tmp * TBar.v); - } - _lastadl = _adl; - - var ret = (TBar.t, _adl); - return base.Add(ret, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _lastadl = _lastlastadl = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ADOSC_Series.cs b/archive/Calculations/_Updated/ADOSC_Series.cs deleted file mode 100644 index b3ebc2c1..00000000 --- a/archive/Calculations/_Updated/ADOSC_Series.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -ADOSC: Chaikin Accumulation/Distribution Oscillator - ADO measures the momentum of ADL using the difference between slow (10-day) EMA(ADL) - and fast (3-day) EMA(ADL): - - Chaikin A/D Oscillator is defined as 3-day EMA of ADL minus 10-day EMA of ADL - -Sources: - https://school.stockcharts.com/doku.php?id=technical_indicators:chaikin_oscillator - - */ - -public class ADOSC_Series : TSeries -{ - protected readonly TBars _data; - private readonly double _k1, _k2; - private double _lastema1, _lastlastema1, _lastema2, _lastlastema2; - private double _lastadl, _lastlastadl; - - //core constructors - public ADOSC_Series(int shortPeriod, int longPeriod, bool useNaN = false) - { - Name = $"ADOSC()"; - _k1 = 2.0 / (shortPeriod + 1); - _k2 = 2.0 / (longPeriod + 1); - _lastadl = _lastlastadl = _lastema1 = _lastlastema1 = _lastema2 = _lastlastema2 = 0; - } - public ADOSC_Series(TBars source, int shortPeriod, int longPeriod, bool useNaN = false) : this(shortPeriod, longPeriod, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _lastadl = _lastlastadl = 0; - _data.Pub += Sub; - Add(data: _data); - } - - public ADOSC_Series() : this(shortPeriod: 3, longPeriod: 10, useNaN: false) { } - - public ADOSC_Series(TBars source) : this(source, shortPeriod: 3, longPeriod: 10, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - - if (update) - { - _lastadl = _lastlastadl; - _lastema1 = _lastlastema1; - _lastema2 = _lastlastema2; - } - - double _adl = 0; - double tmp = TBar.h - TBar.l; - if (tmp > 0.0) { _adl = _lastadl + ((2 * TBar.c - TBar.l - TBar.h) / tmp * TBar.v); } - if (this.Count == 0) { _lastema1 = _lastema2 = _adl; } - - double _ema1 = (_adl - _lastema1) * _k1 + _lastema1; - double _ema2 = (_adl - _lastema2) * _k2 + _lastema2; - - _lastlastadl = _lastadl; - _lastadl = _adl; - _lastlastema1 = _lastema1; - _lastema1 = _ema1; - _lastlastema2 = _lastema2; - _lastema2 = _ema2; - - double _adosc = _ema1 - _ema2; - - var ret = (TBar.t, _adosc); - return base.Add(ret, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _lastadl = _lastlastadl = _lastema1 = _lastlastema1 = _lastema2 = _lastlastema2 = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ALMA_Series.cs b/archive/Calculations/_Updated/ALMA_Series.cs deleted file mode 100644 index 5c62c0dd..00000000 --- a/archive/Calculations/_Updated/ALMA_Series.cs +++ /dev/null @@ -1,129 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -ALMA: Arnaud Legoux Moving Average - The ALMA moving average uses the curve of the Normal (Gauss) distribution, which - can be shifted from 0 to 1. This allows regulating the smoothness and high - sensitivity of the indicator. Sigma is another parameter that is responsible for - the shape of the curve coefficients. This moving average reduces lag of the data - in conjunction with smoothing to reduce noise. - - -Sources: - https://phemex.com/academy/what-is-arnaud-legoux-moving-averages - https://www.prorealcode.com/prorealtime-indicators/alma-arnaud-legoux-moving-average/ - - Discrepancy with Pandas-TA (but passes the validation with Skender.GetAlma) - */ - -public class ALMA_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - private readonly System.Collections.Generic.List _buffer = new(); - private readonly System.Collections.Generic.List _weight; - private double _norm; - private readonly double _offset, _sigma; - - //core constructors - public ALMA_Series(int period, double offset, double sigma, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"ALMA({period})"; - _offset = offset; - _sigma = sigma; - _weight = new(); - } - public ALMA_Series(TSeries source, int period, double offset, double sigma, bool useNaN) : this(period, offset, sigma, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - public ALMA_Series() : this(period: 0, offset: 0.85, sigma: 6.0, useNaN: false) { } - public ALMA_Series(int period) : this(period: period, offset: 0.85, sigma: 6.0, useNaN: false) { } - public ALMA_Series(TBars source) : this(source: source.Close, period: 0, offset: 0.85, sigma: 6.0, useNaN: false) { } - public ALMA_Series(TBars source, int period) : this(source: source.Close, period: period, offset: 0.85, sigma: 6.0, useNaN: false) { } - public ALMA_Series(TBars source, int period, double offset, double sigma, bool useNaN) : this(source.Close, period: period, offset: offset, sigma: sigma, useNaN: false) { } - public ALMA_Series(TSeries source) : this(source, period: 0, offset: 0.85, sigma: 6.0, useNaN: false) { } - public ALMA_Series(TSeries source, int period) : this(source: source, period: period, offset: 0.85, sigma: 6.0, useNaN: false) { } - public ALMA_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, offset: 0.85, sigma: 6.0, useNaN: useNaN) { } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, double.NaN), update); - } - - BufferTrim(_buffer, TValue.v, _period, update); - if (_weight.Count < _buffer.Count) - { - for (var i = 0; i < _buffer.Count - _weight.Count; i++) - { - _weight.Add(0.0); - } - } - - - if (_buffer.Count <= _period || _period == 0) - { - var _len = _buffer.Count; - _norm = 0; - var _m = _offset * (_len - 1); - var _s = _len / _sigma; - for (var i = 0; i < _len; i++) - { - var _wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s)); - _weight[i] = _wt; - _norm += _wt; - } - } - - double _weightedSum = 0; - for (var i = 0; i < _buffer.Count; i++) - { - _weightedSum += _weight[i] * _buffer[i]; - } - - var _alma = _weightedSum / _norm; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _alma); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - //reset calculation - public override void Reset() - { - _buffer.Clear(); - _weight.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ATRP_Series.cs b/archive/Calculations/_Updated/ATRP_Series.cs deleted file mode 100644 index 9a4fee50..00000000 --- a/archive/Calculations/_Updated/ATRP_Series.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -ATRP: Average True Range Percent - Average True Range Percent is (ATR/Close Price)*100. - This normalizes so it can be compared to other stocks. - -Sources: - https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/atrp - - */ - -public class ATRP_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TBars _data; - private double _k; - private int _len; - private double _lastatr, _lastlastatr, _cm1, _lastcm1, _sum, _oldsum; - - //core constructors - public ATRP_Series(int period, bool useNaN) - { - _period = period; - _k = 1.0 / (double)(_period); - _NaN = useNaN; - _len = 0; - Name = $"ATRP({period})"; - } - public ATRP_Series(TBars source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(data: _data); - } - public ATRP_Series() : this(period: 1, useNaN: false) { } - public ATRP_Series(int period) : this(period: period, useNaN: false) { } - public ATRP_Series(TBars source) : this(source, period: 1, useNaN: false) { } - public ATRP_Series(TBars source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - if (update) { _lastatr = _lastlastatr; _cm1 = _lastcm1; _sum = _oldsum; } - else - { - _lastlastatr = _lastatr; _lastcm1 = _cm1; _oldsum = _sum; - _k = (_period == 0) ? 1 / (double)_len : _k; - _len++; - } - - if (_len == 1) { _cm1 = TBar.c; } - double d1 = Math.Abs(TBar.h - TBar.l); - double d2 = Math.Abs(_cm1 - TBar.h); - double d3 = Math.Abs(_cm1 - TBar.l); - (DateTime t, double v) d = (TBar.t, Math.Max(d1, Math.Max(d2, d3))); - _cm1 = TBar.c; - - double _atr = 0; - if (this.Count == 0) { _atr = d.v; } - else if (this.Count < _period + 1) { _sum += d.v; _atr = _sum / (this.Count); } - else { _atr = _k * (d.v - _lastatr) + _lastatr; } - _lastatr = _atr; - double _atrp = 100 * (_atr / TBar.c); - - var res = (TBar.t, Count < _period - 1 && _NaN ? double.NaN : _atrp); - return base.Add(res, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ATR_Series.cs b/archive/Calculations/_Updated/ATR_Series.cs deleted file mode 100644 index c7e36b0a..00000000 --- a/archive/Calculations/_Updated/ATR_Series.cs +++ /dev/null @@ -1,98 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -ATR: wildeR Moving Average - The average true range (ATR) is a price volatility indicator - showing the average price variation of assets within a given time period. - -Sources: - https://en.wikipedia.org/wiki/Average_true_range - https://www.tradingview.com/wiki/Average_True_Range_(ATR) - https://www.investopedia.com/terms/a/atr.asp - - */ - -public class ATR_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TBars _data; - private double _k; - private int _len; - private double _lastatr, _lastlastatr, _cm1, _lastcm1, _sum, _oldsum; - - //core constructors - public ATR_Series(int period, bool useNaN) - { - _period = period; - _k = 1.0 / (double)(_period); - _NaN = useNaN; - _len = 0; - Name = $"ATR({period})"; - } - public ATR_Series(TBars source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(data: _data); - } - public ATR_Series() : this(period: 1, useNaN: false) { } - public ATR_Series(int period) : this(period: period, useNaN: false) { } - public ATR_Series(TBars source) : this(source, period: 1, useNaN: false) { } - public ATR_Series(TBars source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - if (update) { _lastatr = _lastlastatr; _cm1 = _lastcm1; _sum = _oldsum; } - else - { - _lastlastatr = _lastatr; _lastcm1 = _cm1; _oldsum = _sum; - _k = (_period == 0) ? 1 / (double)_len : _k; - _len++; - } - - if (_len == 1) { _cm1 = TBar.c; } - double d1 = Math.Abs(TBar.h - TBar.l); - double d2 = Math.Abs(_cm1 - TBar.h); - double d3 = Math.Abs(_cm1 - TBar.l); - (DateTime t, double v) d = (TBar.t, Math.Max(d1, Math.Max(d2, d3))); - _cm1 = TBar.c; - - double _atr = 0; - if (this.Count == 0) { _atr = d.v; } - else if (this.Count < _period + 1) { _sum += d.v; _atr = _sum / (this.Count); } - else { _atr = _k * (d.v - _lastatr) + _lastatr; } - _lastatr = _atr; - - var res = (TBar.t, Count < _period - 1 && _NaN ? double.NaN : _atr); - return base.Add(res, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/BBANDS_Series.cs b/archive/Calculations/_Updated/BBANDS_Series.cs deleted file mode 100644 index 1750def4..00000000 --- a/archive/Calculations/_Updated/BBANDS_Series.cs +++ /dev/null @@ -1,121 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -BBANDS: Bollinger Bands® - Price channels created by John Bollinger, depict volatility as standard deviation boundary - line range from a moving average of price. The bands automatically widen when volatility - increases and contract when volatility decreases. Their dynamic nature allows them to be - used on different securities with the standard settings. - - Mid Band = simple moving average (SMA) - Upper Band = SMA + (standard deviation of price x multiplier) - Lower Band = SMA - (standard deviation of price x multiplier) - Bandwidth = Width of the channel: (Upper-Lower)/SMA - %B = The location of the data point within the channel: (Price-Lower)/(Upper/Lower) - Z-Score = number of standard deviations of the data point from SMA - -Sources: - https://www.investopedia.com/terms/b/bollingerbands.asp - https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_bands - -Note: - Bollinger Bands® is a registered trademark of John A. Bollinger. - - */ - -public class BBANDS_Series : TSeries -{ - protected readonly int _period; - protected readonly double _multiplier; - protected readonly bool _NaN; - protected readonly TSeries _data; - public SMA_Series Mid { get; } - public TSeries Upper { get; } - public TSeries Lower { get; } - public TSeries PercentB { get; } - public TSeries Bandwidth { get; } - public TSeries Zscore { get; } - private readonly SDEV_Series _sdev; - - //core constructors - public BBANDS_Series(int period, double multiplier, bool useNaN) - { - _period = period; - _multiplier = multiplier; - _NaN = useNaN; - Name = $"BBANDS({period})"; - } - public BBANDS_Series(TSeries source, int period, double multiplier, bool useNaN) : this(period, multiplier, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - Upper = new("BB_Up"); - Lower = new("BB_Low"); - Bandwidth = new("BBandwidth"); - PercentB = new("%BBandwidth"); - Zscore = new("Zscore"); - - Mid = new(period, false); - _sdev = new(period, false); - - _data.Pub += Sub; - Add(_data); - } - - public BBANDS_Series() : this(period: 0, multiplier: 2.0, useNaN: false) { } - public BBANDS_Series(int period) : this(period: period, multiplier: 2.0, useNaN: false) { } - public BBANDS_Series(TBars source) : this(source: source.Close, period: 0, multiplier: 2.0, useNaN: false) { } - public BBANDS_Series(TBars source, int period) : this(source: source.Close, period: period, multiplier: 2.0, useNaN: false) { } - public BBANDS_Series(TBars source, int period, double multiplier, bool useNaN) : this(source.Close, period: period, multiplier: multiplier, useNaN: false) { } - public BBANDS_Series(TSeries source) : this(source, period: 0, useNaN: false) { } - public BBANDS_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - public BBANDS_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, multiplier: 2.0, useNaN: useNaN) { } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - var _mid = Mid.Add(TValue, update); - var _sd = this._sdev.Add(TValue, update); - var _upper = Upper.Add((TValue.t, _mid.v + _sd.v * _multiplier), update); - var _lower = Lower.Add((TValue.t, _mid.v - _sd.v * _multiplier), update); - double _pbdnd = TValue.v - _lower.v; - double _pbdvr = _upper.v - _lower.v; - PercentB.Add((TValue.t, _pbdnd / _pbdvr), update); - Zscore.Add((TValue.t, (TValue.v - _mid.v) / _sd.v), update); - Bandwidth.Add((TValue.t, _pbdvr / _mid.v), update); - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _pbdvr / _mid.v); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - //reset calculation - public override void Reset() - { - Mid.Clear(); - _sdev.Clear(); - Upper.Clear(); - Lower.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/BIAS_Series.cs b/archive/Calculations/_Updated/BIAS_Series.cs deleted file mode 100644 index f8bcb0a3..00000000 --- a/archive/Calculations/_Updated/BIAS_Series.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -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 - - */ - -public class BIAS_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly SMA_Series _sma; - - //core constructors - public BIAS_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"BIAS({period})"; - _sma = new(period, false); - } - public BIAS_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public BIAS_Series() : this(period: 0, useNaN: false) { } - public BIAS_Series(int period) : this(period: period, useNaN: false) { } - public BIAS_Series(TBars source) : this(source.Close, 0, false) { } - public BIAS_Series(TBars source, int period) : this(source.Close, period, false) { } - public BIAS_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public BIAS_Series(TSeries source) : this(source, 0, false) { } - public BIAS_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - var _s = _sma.Add(TValue, update); - double _bias = (TValue.v / ((_s.v != 0) ? _s.v : 1)) - 1; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _bias); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _sma.Reset(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/CCI_Series.cs b/archive/Calculations/_Updated/CCI_Series.cs deleted file mode 100644 index 4ee2d959..00000000 --- a/archive/Calculations/_Updated/CCI_Series.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -CCI: Commodity Channel Index - Commodity Channel Index is a momentum oscillator used to primarily identify overbought - and oversold levels relative to a mean. CCI measures the current price level relative - to an average price level over a given period of time: - - CCI is relatively high when prices are far above their average. - - CCI is relatively low when prices are far below their average. - Using this method, CCI can be used to identify overbought and oversold levels. - -Sources: - https://www.investopedia.com/terms/c/commoditychannelindex.asp - https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/cci - - */ - -public class CCI_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TBars _data; - private readonly System.Collections.Generic.List _tp = new(); - - //core constructors - public CCI_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"CCI({period})"; - } - public CCI_Series(TBars source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(data: _data); - } - public CCI_Series() : this(period: 2, useNaN: false) { } - public CCI_Series(int period) : this(period: period, useNaN: false) { } - public CCI_Series(TBars source) : this(source, period: 2, useNaN: false) { } - public CCI_Series(TBars source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - double _tpItem = (TBar.h + TBar.l + TBar.c) / 3.0; - if (update) - { - this._tp[this._tp.Count - 1] = _tpItem; - } - else - { - this._tp.Add(_tpItem); - } - if (this._tp.Count > this._period) { this._tp.RemoveAt(0); } - - // average TP over _tp buffer - double _avgTp = _tp.Average(); - - // average Deviation over _tp buffer - double _avgDv = 0; - for (int i = 0; i < this._tp.Count; i++) { _avgDv += Math.Abs(_avgTp - this._tp[i]); } - _avgDv /= this._tp.Count; - - double _cci = (_avgDv == 0) ? 0 : (this._tp[this._tp.Count - 1] - _avgTp) / (0.015 * _avgDv); - var res = (TBar.t, Count < _period - 1 && _NaN ? double.NaN : _cci); - return base.Add(res, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _tp.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/CMO_Series.cs b/archive/Calculations/_Updated/CMO_Series.cs deleted file mode 100644 index 36476603..00000000 --- a/archive/Calculations/_Updated/CMO_Series.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -CMO: Chande Momentum Oscillator - Chande Momentum Oscillator (also known as CMO indicator) was developed by Tushar S. Chande - CMO is similar to other momentum oscillators (e.g. RSI or Stochastics). Alike RSI oscillator, - the CMO values move in the range from -100 to +100 points and its aim is to detect the - overbought and oversold market conditions. CMO calculates the price momentum on both the up - days as well as the down days. The CMO calculation is based on non-smoothed price values - meaning that it can reach its extremes more frequently and the short-time swings are more visible. - -Sources: - https://www.technicalindicators.net/indicators-technical-analysis/144-cmo-chande-momentum-oscillator - - */ - -public class CMO_Series : TSeries -{ - private readonly System.Collections.Generic.List _buff_up = new(); - private readonly System.Collections.Generic.List _buff_dn = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private double _plast_value, _last_value; - - //core constructors - public CMO_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"CMO({period})"; - } - public CMO_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public CMO_Series() : this(period: 0, useNaN: false) { } - public CMO_Series(int period) : this(period: period, useNaN: false) { } - public CMO_Series(TBars source) : this(source.Close, 0, false) { } - public CMO_Series(TBars source, int period) : this(source.Close, period, false) { } - public CMO_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public CMO_Series(TSeries source) : this(source, 0, false) { } - public CMO_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) { _last_value = _plast_value; } else { _plast_value = _last_value; } - BufferTrim(buffer: _buff_up, (TValue.v > _last_value) ? TValue.v - _last_value : 0, period: _period, update: update); - BufferTrim(buffer: _buff_dn, (TValue.v < _last_value) ? _last_value - TValue.v : 0, period: _period, update: update); - _last_value = TValue.v; - double _cmo_up = 0; - double _cmo_dn = 0; - for (int i = 0; i < Math.Min(_buff_up.Count, _buff_dn.Count); i++) - { - _cmo_up += _buff_up[i]; - _cmo_dn += _buff_dn[i]; - } - double _cmo = 100 * (_cmo_up - _cmo_dn) / (_cmo_up + _cmo_dn); - if (_cmo_up + _cmo_dn == 0) { _cmo = 0; } - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _cmo); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buff_up.Clear(); - _buff_dn.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/CUSUM_Series.cs b/archive/Calculations/_Updated/CUSUM_Series.cs deleted file mode 100644 index eef69d44..00000000 --- a/archive/Calculations/_Updated/CUSUM_Series.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -CUSUM: Cumulative Sum (aka Running Total) - SUM across a period provides a rolling sum of all values across the period. - If SUM values would be divided with period, the output would be SMA() - -Sources: - https://en.wikipedia.org/wiki/CUSUM - */ - -public class CUSUM_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public CUSUM_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"CUSUM({period})"; - } - public CUSUM_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public CUSUM_Series() : this(period: 0, useNaN: false) { } - public CUSUM_Series(int period) : this(period: period, useNaN: false) { } - public CUSUM_Series(TBars source) : this(source.Close, 0, false) { } - public CUSUM_Series(TBars source, int period) : this(source.Close, period, false) { } - public CUSUM_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public CUSUM_Series(TSeries source) : this(source, period: 0, useNaN: false) { } - public CUSUM_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sum = 0; - for (int i = 0; i < _buffer.Count; i++) { _sum += _buffer[i]; } - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _sum); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/DECAY_Series.cs b/archive/Calculations/_Updated/DECAY_Series.cs deleted file mode 100644 index 287b3f45..00000000 --- a/archive/Calculations/_Updated/DECAY_Series.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -DECAY: - Linear decay can be modeled by a straight line with a negative slope of 1/period. - The value decreases in a straight line from the last maximum to 0. - Decay = Last Max - distance/period - - Exponential decay is modeled as an exponential curve with diminishing factor of - 1-1/p - - */ - -public class DECAY_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly bool _exp; - private double _pdecay, _ppdecay; - private readonly double _dfactor; - - //core constructors - public DECAY_Series(int period, bool exponential, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"DECAY({period})"; - _exp = exponential; - _dfactor = (_exp) ? 1.0 - 1.0 / (double)_period : 1 / (double)_period; - _pdecay = _ppdecay = 0; - } - public DECAY_Series(TSeries source, int period, bool exponential, bool useNaN) : this(period, exponential, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public DECAY_Series() : this(period: 0, exponential: false, useNaN: false) { } - public DECAY_Series(int period) : this(period: period, exponential: false, useNaN: false) { } - public DECAY_Series(TBars source) : this(source.Close, period: 0, exponential: false, useNaN: false) { } - public DECAY_Series(TBars source, int period) : this(source.Close, period: period, exponential: false, useNaN: false) { } - public DECAY_Series(TBars source, int period, bool useNaN) : this(source.Close, period: period, exponential: false, useNaN) { } - public DECAY_Series(TSeries source) : this(source, period: 0, exponential: false, useNaN: false) { } - public DECAY_Series(TSeries source, int period) : this(source: source, period: period, exponential: false, useNaN: false) { } - public DECAY_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, exponential: false, useNaN: useNaN) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - if (update) { _pdecay = _ppdecay; } - else { _ppdecay = _pdecay; } - - if (this.Count == 0) { _pdecay = TValue.v; } - double _decay = Math.Max(TValue.v, Math.Max((_exp) ? _pdecay * _dfactor : _pdecay - _dfactor, 0)); - _pdecay = _decay; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _decay); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _pdecay = _ppdecay = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/DEMA_Series.cs b/archive/Calculations/_Updated/DEMA_Series.cs deleted file mode 100644 index 1288d666..00000000 --- a/archive/Calculations/_Updated/DEMA_Series.cs +++ /dev/null @@ -1,144 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -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 - - */ - -public class DEMA_Series : TSeries -{ - private double _k; - private double _sum, _oldsum; - private double _lastema1, _oldema1, _lastema2, _oldema2; - private int _len; - private readonly bool _useSMA; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructor - public DEMA_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - _useSMA = useSMA; - Name = $"DEMA({period})"; - _k = 2.0 / (_period + 1); - _len = 0; - _sum = _oldsum = _lastema1 = _lastema2 = 0; - } - //generic constructors (source) - - public DEMA_Series() : this(0, false, true) { } - public DEMA_Series(int period) : this(period, false, true) { } - public DEMA_Series(TBars source) : this(source.Close, 0, false) { } - public DEMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public DEMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public DEMA_Series(TSeries source, int period) : this(source, period, false, true) { } - public DEMA_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - public DEMA_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) - { - _lastema1 = _oldema1; - _lastema2 = _oldema2; - _sum = _oldsum; - } - else - { - _oldema1 = _lastema1; - _oldema2 = _lastema2; - _oldsum = _sum; - _len++; - } - - if (_period == 0) - { - _k = 2.0 / (_len + 1); - } - - double _ema1, _ema2, _dema; - if (Count == 0) - { - _ema1 = _ema2 = _sum = TValue.v; - } - else if (_len <= _period && _useSMA && _period != 0) - { - _sum += TValue.v; - _ema1 = _sum / Math.Min(_len, _period); - _ema2 = _ema1; - } - else - { - _ema1 = (TValue.v - _lastema1) * _k + _lastema1; - _ema2 = (_ema1 - _lastema2) * _k + _lastema2; - } - - _dema = 2 * _ema1 - _ema2; - - _lastema1 = double.IsNaN(_ema1) ? _lastema1 : _ema1; - _lastema2 = double.IsNaN(_ema2) ? _lastema2 : _ema2; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _dema); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) - { - return (DateTime.Today, double.NaN); - } - - foreach (var item in data) - { - Add(item, false); - } - - return _data.Last; - } - - public (DateTime t, double v) Add(bool update) - { - return Add(_data.Last, update); - } - - public (DateTime t, double v) Add() - { - return Add(_data.Last, false); - } - - private new void Sub(object source, TSeriesEventArgs e) - { - Add(_data.Last, e.update); - } - - //reset calculation - public override void Reset() - { - _sum = _oldsum = _lastema1 = _lastema2 = 0; - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/DWMA_Series.cs b/archive/Calculations/_Updated/DWMA_Series.cs deleted file mode 100644 index 7c03b8a9..00000000 --- a/archive/Calculations/_Updated/DWMA_Series.cs +++ /dev/null @@ -1,143 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -/* -DWMA: Double Weighted Moving Average - The weights are decreasing over the period with p^2 decay - and the most recent data has the heaviest weight. - - */ - -public class DWMA_Series : TSeries -{ - private readonly List _buffer = new(); - private List _weights; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - protected int _len; - - //core constructors - public DWMA_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"DWMA({period})"; - _len = 0; - _weights = CalculateWeights(_period); - } - - public DWMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - public DWMA_Series() : this(0, false) - { - } - - public DWMA_Series(int period) : this(period, false) - { - } - - public DWMA_Series(TBars source) : this(source.Close, 0, false) - { - } - - public DWMA_Series(TBars source, int period) : this(source.Close, period, false) - { - } - - public DWMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) - { - } - - public DWMA_Series(TSeries source, int period) : this(source, period, false) - { - } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(_buffer, TValue.v, _period, update); - if (_period == 0) - { - _len++; - _weights = CalculateWeights(_len); - } - - double _dwma = 0, _wsum = 0; - var bufferCount = _buffer.Count; - - var lockObj = new object(); - Parallel.For(0, bufferCount, i => - { - var temp = _buffer[i] * _weights[i]; - lock (lockObj) - { - _dwma += temp; - _wsum += _weights[i]; - } - }); - _dwma /= _wsum; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _dwma); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) - { - return (DateTime.Today, double.NaN); - } - - foreach (var item in data) - { - Add(item, false); - } - - return _data.Last; - } - - public (DateTime t, double v) Add(bool update) - { - return Add(_data.Last, update); - } - - public (DateTime t, double v) Add() - { - return Add(_data.Last, false); - } - - private new void Sub(object source, TSeriesEventArgs e) - { - Add(_data.Last, e.update); - } - - //calculating weights - private static List CalculateWeights(int period) - { - var weights = new List(period); - for (var i = 0; i < period; i++) - { - weights.Add((i + 1) * (i + 1)); - } - - return weights; - } - - //reset calculation - public override void Reset() - { - _len = 0; - _buffer.Clear(); - _weights = CalculateWeights(_period); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/EMA_Series.cs b/archive/Calculations/_Updated/EMA_Series.cs deleted file mode 100644 index 7f49566d..00000000 --- a/archive/Calculations/_Updated/EMA_Series.cs +++ /dev/null @@ -1,136 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -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. - - */ - -public class EMA_Series : TSeries -{ - private double _k; - private double _lastema, _oldema; - private double _sum, _oldsum; - private int _len; - private readonly bool _useSMA; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - - public EMA_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - _useSMA = useSMA; - Name = $"EMA({period})"; - _k = 2.0 / (_period + 1); - _len = 0; - _sum = _oldsum = _lastema = _oldema = 0; - } - public EMA_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public EMA_Series() : this(0, false, true) { } - public EMA_Series(int period) : this(period, false, true) { } - public EMA_Series(TBars source) : this(source.Close, 0, false) { } - public EMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public EMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public EMA_Series(TSeries source, int period) : this(source, period, false, true) { } - public EMA_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) - { - _lastema = _oldema; - _sum = _oldsum; - } - else - { - _oldema = _lastema; - _oldsum = _sum; - _len++; - } - - double _ema = 0; - if (_period == 0) - { - _k = 2.0 / (_len + 1); - } - - if (Count == 0) - { - _ema = _sum = TValue.v; - } - else if (_len <= _period && _useSMA && _period != 0) - { - _sum += TValue.v; - if (_period != 0 && _len > _period) - { - _sum -= _data[Count - _period - (update ? 1 : 0)].v; - } - - _ema = _sum / Math.Min(_len, _period); - } - else - { - _ema = _k * (TValue.v - _lastema) + _lastema; - } - - _lastema = double.IsNaN(_ema) ? _lastema : _ema; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _ema); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _sum = _oldsum = _lastema = _oldema = 0; - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ENTROPY_Series.cs b/archive/Calculations/_Updated/ENTROPY_Series.cs deleted file mode 100644 index 14da1862..00000000 --- a/archive/Calculations/_Updated/ENTROPY_Series.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -ENTROPY: - Introduced by Claude Shannon in 1948, entropy measures the unpredictability - of the data, or equivalently, of its average information. - -Calculation: - P = close / Σ(close) - ENTROPY = Σ(-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 - - */ - -public class ENTROPY_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly double _logbase; - private readonly System.Collections.Generic.List _buffer = new(); - private readonly System.Collections.Generic.List _buff2 = new(); - - //core constructors - public ENTROPY_Series(int period, double logbase, bool useNaN) - { - _period = period; - _NaN = useNaN; - _logbase = logbase; - Name = $"ENTROPY({period})"; - } - public ENTROPY_Series(TSeries source, int period, double logbase, bool useNaN) : this(period, logbase, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public ENTROPY_Series() : this(period: 0, logbase: 2.0, useNaN: false) { } - public ENTROPY_Series(int period) : this(period: period, logbase: 2.0, useNaN: false) { } - public ENTROPY_Series(TBars source) : this(source.Close, period: 0, logbase: 2.0, useNaN: false) { } - public ENTROPY_Series(TBars source, int period) : this(source.Close, period, logbase: 2.0, useNaN: false) { } - public ENTROPY_Series(TBars source, int period, bool useNaN) : this(source.Close, period: period, logbase: 2.0, useNaN: useNaN) { } - public ENTROPY_Series(TSeries source) : this(source, period: 0, logbase: 2.0, useNaN: false) { } - public ENTROPY_Series(TSeries source, int period) : this(source: source, period: period, logbase: 2.0, useNaN: false) { } - public ENTROPY_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, logbase: 2.0, useNaN: useNaN) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - double _sum = _buffer.Sum(); - double _pp = this._buffer[^1] / _sum; - double _ppp = -_pp * Math.Log(_pp) / Math.Log(this._logbase); - BufferTrim(_buff2, _ppp, _period, update); - double _entp = _buff2.Sum(); - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _entp); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - _buff2.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/FWMA_Series.cs b/archive/Calculations/_Updated/FWMA_Series.cs deleted file mode 100644 index eceecc6b..00000000 --- a/archive/Calculations/_Updated/FWMA_Series.cs +++ /dev/null @@ -1,105 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Numerics; -using System.Linq; - -/* -FWMA: Fibonacci's Weighted Moving Average is similar to a Weighted Moving Average - (WMA) where the weights are based on the Fibonacci Sequence. - - */ -public class FWMA_Series : TSeries -{ - private readonly List _buffer = new(); - private List _weights; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - protected int _len; - - public FWMA_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"FWMA({period})"; - _len = 0; - _weights = CalculateWeights(_period); - } - - public FWMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - public FWMA_Series() : this(period: 0, useNaN: false) { } - public FWMA_Series(int period) : this(period: period, useNaN: false) { } - public FWMA_Series(TBars source) : this(source.Close, 0, false) { } - public FWMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public FWMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public FWMA_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - if (_period == 0) - { - _len++; - _weights = CalculateWeights(_len); - } - double _fwma = 0; - double totalWeights = _weights.Sum(); - object lockObj = new object(); - Parallel.For(0, _buffer.Count, i => - { - double temp = _buffer[i] * _weights[i]; - lock (lockObj) { _fwma += temp; } - }); - _fwma /= totalWeights; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _fwma); - return base.Add(res, update); - } - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - private static List CalculateWeights(int period) - { - //to prevent overflow, max period can be no more than 1476 - period = (period > 1476) ? 1476 : period; - List weights = new List(period); - BigInteger a = 0; - BigInteger b = 1; - for (int i = 0; i < period; i++) - { - BigInteger temp = a; - a = b; - b = temp + b; - weights.Add((double)Decimal.Parse(a.ToString())); - } - return weights; - } - - public override void Reset() - { - _weights = CalculateWeights(_period); - _buffer.Clear(); - } -} diff --git a/archive/Calculations/_Updated/HEMA_Series.cs b/archive/Calculations/_Updated/HEMA_Series.cs deleted file mode 100644 index 0d45962f..00000000 --- a/archive/Calculations/_Updated/HEMA_Series.cs +++ /dev/null @@ -1,133 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -HEMA: Hull-EMA Moving Average - a hybrid indicator - Modified HUll Moving Average; instead of using WMA (Weighted MA) for 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 : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private double _k1, _k2, _k3; - private int _len; - private double _lastema1, _oldema1; - private double _lastema2, _oldema2; - private double _lasthema, _oldhema; - - //core constructors - public HEMA_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"HEMA({period})"; - (_k1, _k2, _k3) = CalculateK(_period); - _len = 0; - _lastema1 = _oldema1 = _lastema2 = _oldema2 = _lasthema = _oldhema = 0; - } - public HEMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public HEMA_Series() : this(period: 0, useNaN: false) { } - public HEMA_Series(int period) : this(period: period, useNaN: false) { } - public HEMA_Series(TBars source) : this(source.Close, 0, false) { } - public HEMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public HEMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public HEMA_Series(TSeries source) : this(source, 0, false) { } - public HEMA_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) - { - _lastema1 = _oldema1; - _lastema2 = _oldema2; - _lasthema = _oldhema; - } - else - { - _oldema1 = _lastema1; - _oldema2 = _lastema2; - _oldhema = _lasthema; - } - double _ema1, _ema2, _hema; - if (_period == 0) - { - _len++; - (_k1, _k2, _k3) = CalculateK(_len); - } - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, double.NaN), update); - } - else if (this.Count == 0) - { - _ema1 = _ema2 = _hema = TValue.v; - } - else - { - _ema1 = _k1 * (TValue.v - _lastema1) + _lastema1; - _ema2 = _k2 * (TValue.v - _lastema2) + _lastema2; - _hema = _k3 * (((2 * _ema1) - _ema2) - _lasthema) + _lasthema; - } - - _lastema1 = _ema1; - _lastema2 = _ema2; - _lasthema = _hema; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _hema); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _lastema1 = _lastema2 = _lasthema = 0; - _oldema1 = _oldema2 = _oldhema = 0; - _len = 0; - } - - public static (double k1, double k2, double k3) CalculateK(int len) - { - double k1 = 8 / (double)(len + 7); - double k2 = 3 / (double)(len + 2); - double k3 = 2 / Math.Sqrt(len + 3); - - return (k1, k2, k3); - } - -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/HMA_Series.cs b/archive/Calculations/_Updated/HMA_Series.cs deleted file mode 100644 index 30d9087a..00000000 --- a/archive/Calculations/_Updated/HMA_Series.cs +++ /dev/null @@ -1,98 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 -{ - protected int _period, _period2, _psqrt; - protected readonly bool _NaN; - protected readonly TSeries _data; - protected WMA_Series _wma1, _wma2, _wma3; - - //core constructors - public HMA_Series(int period, bool useNaN) - { - _period = period; - _period2 = period / 2; - _psqrt = (int)Math.Sqrt(period); - _NaN = useNaN; - _wma1 = new(Math.Max(_period2, 1), false); - _wma2 = new(Math.Max(_period, 1), false); - _wma3 = new(Math.Max(_psqrt, 1), useNaN); - Name = $"HMA({period})"; - } - public HMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public HMA_Series() : this(period: 0, useNaN: false) { } - public HMA_Series(int period) : this(period: period, useNaN: false) { } - public HMA_Series(TBars source) : this(source.Close, 0, false) { } - public HMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public HMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public HMA_Series(TSeries source) : this(source, 0, false) { } - public HMA_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (_period == 0) - { - _wma1.Len = this.Count / 2; - _wma2.Len = this.Count; - _wma1.Len = (int)Math.Sqrt(this.Count); - } - double _w1 = _wma1.Add(TValue, update).v; - double _w2 = _wma2.Add(TValue, update).v; - double _hma = _wma3.Add((2 * _w1) - _w2, update).v; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _hma); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _wma1.Reset(); - _wma2.Reset(); - _wma3.Reset(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/HWMA_Series.cs b/archive/Calculations/_Updated/HWMA_Series.cs deleted file mode 100644 index b58ea0b2..00000000 --- a/archive/Calculations/_Updated/HWMA_Series.cs +++ /dev/null @@ -1,146 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -HWMA: Holt-Winter Moving Average - Indicator HWMA (Holt-Winter Moving Average) is a three-parameter moving - average by the Holt-Winter method; Holt-Winters Exponential Smoothing is - used for forecasting time series data that exhibits both a trend and a - seasonal variation. - - -Sources: - https://timeseriesreasoning.com/contents/holt-winters-exponential-smoothing/ - https://www.mql5.com/en/code/20856 - -nA - smoothed series (from 0 to 1) -nB - assess the trend (from 0 to 1) -nC - assess seasonality (from 0 to 1) - -Heuristic for determining alpha, beta, and gamma from period: - alpha = 2 / (1 + period) - beta = 1 / period - gamma = 1 / period - -F[i] = (1-nA) * (F[i-1] + V[i-1] + 0.5 * A[i-1]) + nA * Price[i] -V[i] = (1-nB) * (V[i-1] + A[i-1]) + nB * (F[i] - F[i-1]) -A[i] = (1-nC) * A[i-1] + nC * (V[i] - V[i-1]) -HWMA[i] = F[i] + V[i] + 0.5 * A[i] - - */ - -public class HWMA_Series : TSeries -{ - private int _len; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - double _nA, _nB, _nC; - double _pF, _pV, _pA; - double _ppF, _ppV, _ppA; - - //core constructors - - public HWMA_Series(double nA, double nB, double nC, bool useNaN) - { - _period = (int)((2 - nA) / nA); - _nA = nA; - _nB = nB; - _nC = nC; - _NaN = useNaN; - Name = $"HWMA({_period})"; - _len = 0; - } - public HWMA_Series(TSeries source, double nA, double nB, double nC, bool useNaN = false) : this(nA, nB, nC, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public HWMA_Series() : this(period: 0, useNaN: false) { } - public HWMA_Series(int period) : this(period, useNaN: false) { } - public HWMA_Series(int period, bool useNaN) : this(nA: 2 / (1 + (double)period), nB: 1 / (double)period, nC: 1 / (double)period, useNaN) - { - _period = period; - } - public HWMA_Series(TBars source) : this(source.Close, period: 0, useNaN: false) { } - public HWMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public HWMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public HWMA_Series(TSeries source, int period) : this(source, period, false) { } - public HWMA_Series(TSeries source, int period, bool useNaN) : this(source, nA: 2 / (1 + (double)period), nB: 1 / (double)period, nC: 1 / (double)period, useNaN: useNaN) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - double _F, _V, _A; - if (_len == 0) { _pF = TValue.v; _pA = _pV = 0; } - - if (update) { _pF = _ppF; _pV = _ppV; _pA = _ppA; } - else - { - _ppF = _pF; - _ppV = _pV; - _ppA = _pA; - _len++; - } - - if (_period == 0) - { - _nA = 2 / (1 + (double)_len); - _nB = 1 / (double)_len; - _nC = 1 / (double)_len; - } - if (_period == 1) - { - _nA = 1; - _nB = 0; - _nC = 0; - } - - _F = (1 - _nA) * (_pF + _pV + 0.5 * _pA) + _nA * TValue.v; - _V = (1 - _nB) * (_pV + _pA) + _nB * (_F - _pF); - _A = (1 - _nC) * _pA + _nC * (_V - _pV); - - double _hwma = _F + _V + 0.5 * _A; - _pF = _F; - _pV = _V; - _pA = _A; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _hwma); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/JMA_Series.cs b/archive/Calculations/_Updated/JMA_Series.cs deleted file mode 100644 index 8d5b9af0..00000000 --- a/archive/Calculations/_Updated/JMA_Series.cs +++ /dev/null @@ -1,176 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -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 : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly System.Collections.Generic.List volty_short = new(); - private readonly System.Collections.Generic.List vsum_buff = new(); - private readonly double pr; - private double upperBand, lowerBand, vsum, Kv; - private double prev_ma1, prev_det0, prev_det1, prev_vsum, prev_jma; - private double p_upperBand, p_lowerBand, p_Kv, p_prev_ma1, p_prev_det0, p_prev_det1, p_prev_vsum, p_prev_jma; - private readonly int _voltyS, _voltyL; - - //core constructors - public JMA_Series(int period, double phase, int vshort, int vlong, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"JMA({period})"; - upperBand = lowerBand = prev_ma1 = prev_det0 = prev_det1 = prev_vsum = prev_jma = Kv = 0.0; - pr = (phase * 0.01) + 1.5; - if (phase < -100) { pr = 0.5; } - if (phase > 100) { pr = 2.5; } - _voltyS = vshort; - _voltyL = vlong; - } - - public JMA_Series(TSeries source, int period, double phase, int vshort, int vlong, bool useNaN) : this(period, phase, vshort, vlong, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public JMA_Series() : this(period: 0, phase: 0, vshort: 10, vlong: 65, useNaN: false) { } - public JMA_Series(int period) : this(period: period, phase: 0, vshort: 10, vlong: 65, useNaN: false) { } - public JMA_Series(TBars source) : this(source.Close, period: 0, phase: 0.0, vshort: 10, vlong: 65, useNaN: false) { } - public JMA_Series(TBars source, int period) : this(source.Close, period, phase: 0.0, vshort: 10, vlong: 65, useNaN: false) { } - public JMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, phase: 0.0, vshort: 10, vlong: 65, useNaN: useNaN) { } - public JMA_Series(TSeries source) : this(source, period: 0, phase: 0.0, vshort: 10, vlong: 65, useNaN: false) { } - public JMA_Series(TSeries source, int period) : this(source: source, period: period, phase: 0.0, vshort: 10, vlong: 65, useNaN: false) { } - public JMA_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, phase: 0.0, vshort: 10, vlong: 65, useNaN: useNaN) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (this.Count == 0) { prev_ma1 = prev_jma = TValue.v; } - if (update) - { - upperBand = p_upperBand; - lowerBand = p_lowerBand; - Kv = p_Kv; - prev_vsum = p_prev_vsum; - prev_ma1 = p_prev_ma1; - prev_det0 = p_prev_det0; - prev_det1 = p_prev_det1; - prev_jma = p_prev_jma; - } - else - { - p_upperBand = upperBand; - p_lowerBand = lowerBand; - p_Kv = Kv; - p_prev_vsum = prev_vsum; - p_prev_ma1 = prev_ma1; - p_prev_det0 = prev_det0; - p_prev_det1 = prev_det1; - p_prev_jma = prev_jma; - } - - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, double.NaN), update); - } - - // from Tvalue to volty - double del1 = TValue.v - upperBand; - double del2 = TValue.v - lowerBand; - upperBand = (del1 > 0) ? TValue.v : TValue.v - (Kv * del1); - lowerBand = (del2 < 0) ? TValue.v : TValue.v - (Kv * del2); - double volty = Math.Abs(del1) > Math.Abs(del2) ? Math.Abs(del1) : - (Math.Abs(del1) < Math.Abs(del2) ? Math.Abs(del2) : - Math.Abs(0.5 * (del1 + del2))); - - //// from volty to avolty - if (update) { volty_short[volty_short.Count - 1] = volty; } - else { volty_short.Add(volty); } - if (volty_short.Count > _voltyS) { volty_short.RemoveAt(0); } - vsum = prev_vsum + 0.1 * (volty - volty_short.First()); - prev_vsum = vsum; - if (update) { vsum_buff[vsum_buff.Count - 1] = vsum; } - else { vsum_buff.Add(vsum); } - if (vsum_buff.Count > _voltyL) { vsum_buff.RemoveAt(0); } - double avolty = 0; - for (int i = 0; i < vsum_buff.Count; i++) { avolty += vsum_buff[i]; } - avolty /= vsum_buff.Count; - - /// from avolty to rolty - double rvolty = (avolty != 0) ? volty / avolty : 0; - double len1 = (Math.Log(Math.Sqrt(_period)) / Math.Log(2.0)) + 2; - if (len1 < 0) { len1 = 0; } - - double pow1 = Math.Max(len1 - 2.0, 0.5); - if (rvolty > Math.Pow(len1, 1.0 / pow1)) { rvolty = Math.Pow(len1, 1.0 / pow1); } - if (rvolty < 1) { rvolty = 1; } - - //// from rvolty to second smoothing - double pow2 = Math.Pow(rvolty, pow1); - double beta = 0.45 * (_period - 1) / (0.45 * (_period - 1) + 2); - Kv = Math.Pow(beta, Math.Sqrt(pow2)); - double alpha = Math.Pow(beta, pow2); - double ma1 = (1 - alpha) * TValue.v + alpha * prev_ma1; - prev_ma1 = ma1; - - double det0 = (1 - beta) * (TValue.v - ma1) + beta * prev_det0; - prev_det0 = det0; - double ma2 = ma1 + pr * det0; - - double det1 = ((1 - alpha) * (1 - alpha) * (ma2 - prev_jma)) + (alpha * alpha * prev_det1); - prev_det1 = det1; - double jma = prev_jma + det1; - prev_jma = jma; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : jma); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - upperBand = lowerBand = prev_ma1 = prev_det0 = prev_det1 = prev_vsum = prev_jma = Kv = 0.0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/KAMA_Series.cs b/archive/Calculations/_Updated/KAMA_Series.cs deleted file mode 100644 index f839d4aa..00000000 --- a/archive/Calculations/_Updated/KAMA_Series.cs +++ /dev/null @@ -1,118 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -KAMA: Kaufman's Adaptive Moving Average - Created in 1988 by American quantitative finance theorist Perry J. Kaufman and is known as - Kaufman's Adaptive Moving Average (KAMA). Even though the method was developed as early as 1972, - it was not until the popular book titled "Trading Systems and Methods" that it was made widely - available to the public. Unlike other conventional moving averages systems, the Kaufman's Adaptive - Moving Average, considers market volatility apart from price fluctuations. - - KAMA[i] = KAMA[i-1] + SC * ( price - KAMA[i-1] ) - -Sources: - https://www.tutorialspoint.com/kaufman-s-adaptive-moving-average-kama-formula-and-how-does-it-work - https://corporatefinanceinstitute.com/resources/knowledge/trading-investing/kaufmans-adaptive-moving-average-kama/ - https://www.technicalindicators.net/indicators-technical-analysis/152-kama-kaufman-adaptive-moving-average - -Remark: - If useNaN:true argument is provided, KAMA starts calculating values from [period] bar onwards. - Without useNaN argument (default setting), KAMA starts calculating values from bar 1 - and yields - slightly different results for the first 50 bars - and then converges with the other one. - - */ - -public class KAMA_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - private double _lastkama, _lastlastkama; - private readonly double _scFast, _scSlow; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public KAMA_Series(int period, int fast, int slow, bool useNaN) - { - _period = period; - _NaN = useNaN; - _scFast = 2.0 / (((period < fast) ? period : fast) + 1); - _scSlow = 2.0 / (slow + 1); - _lastkama = _lastlastkama = 0; - Name = $"KAMA({period})"; - } - public KAMA_Series(TSeries source, int period, int fast, int slow, bool useNaN) : this(period, fast, slow, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public KAMA_Series() : this(period: 0, fast: 2, slow: 30, useNaN: false) { } - public KAMA_Series(int period) : this(period: period, fast: 2, slow: 30, useNaN: false) { } - public KAMA_Series(TBars source) : this(source.Close, period: 0, fast: 2, slow: 30, useNaN: false) { } - public KAMA_Series(TBars source, int period) : this(source.Close, period: period, fast: 2, slow: 30, useNaN: false) { } - public KAMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period: period, fast: 2, slow: 30, useNaN: useNaN) { } - public KAMA_Series(TSeries source) : this(source, period: 0, fast: 2, slow: 30, useNaN: false) { } - public KAMA_Series(TSeries source, int period) : this(source: source, period: period, fast: 2, slow: 30, useNaN: false) { } - public KAMA_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, fast: 2, slow: 30, useNaN: useNaN) { } - public KAMA_Series(TSeries source, int period, int fast, int slow) : this(source: source, period: period, fast: fast, slow: slow, useNaN: false) { } - - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - - if (update) { _lastkama = _lastlastkama; } - else { _lastlastkama = _lastkama; } - BufferTrim(buffer: _buffer, value: TValue.v, period: _period + 1, update: update); - - double _kama = 0; - if (this.Count < _period) { _kama = TValue.v; } - else - { - double _change = Math.Abs(_buffer[^1] - _buffer[(_buffer.Count > _period + 1) ? 1 : 0]); - double _sumpv = 0; - for (int i = 1; i < _buffer.Count; i++) { _sumpv += Math.Abs(_buffer[(_buffer.Count > 0) ? i : 0] - _buffer[i - 1]); } - double _er = (_sumpv == 0) ? 0 : _change / _sumpv; - double _sc = (_er * (_scFast - _scSlow)) + _scSlow; - _kama = (_lastkama + (_sc * _sc * (TValue.v - _lastkama))); - } - _lastkama = _kama; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _kama); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - _lastkama = _lastlastkama = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/KURTOSIS_Series.cs b/archive/Calculations/_Updated/KURTOSIS_Series.cs deleted file mode 100644 index f632407a..00000000 --- a/archive/Calculations/_Updated/KURTOSIS_Series.cs +++ /dev/null @@ -1,107 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -KURTOSIS: 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 - KURTOSIS = 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/ - - */ - -public class KURTOSIS_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly System.Collections.Generic.List _buffer = new(); - - //core constructors - public KURTOSIS_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"KURTOSIS({period})"; - } - public KURTOSIS_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public KURTOSIS_Series() : this(period: 0, useNaN: false) { } - public KURTOSIS_Series(int period) : this(period: period, useNaN: false) { } - public KURTOSIS_Series(TSeries source) : this(source, period: 0, useNaN: false) { } - public KURTOSIS_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - double _n = _buffer.Count; - double _avg = _buffer.Average(); - - double _s2 = 0; - double _s4 = 0; - for (int i = 0; i < this._buffer.Count; i++) - { - _s2 += (_buffer[i] - _avg) * (_buffer[i] - _avg); - _s4 += (_buffer[i] - _avg) * (_buffer[i] - _avg) * (_buffer[i] - _avg) * (_buffer[i] - _avg); - } - - double _Vx = _s2 / (_n - 1); - double _kurt = (_n > 3) ? - (_n * (_n + 1) * _s4) / (_Vx * _Vx * (_n - 3) * (_n - 1) * (_n - 2)) - (3 * (_n - 1) * (_n - 1) / ((_n - 2) * (_n - 3))) //using Sheskin Algo - : (_s2 * _s2) / _n - 3; //using Snedecor and Cochran (1967) algo - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _kurt); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MACD_Series.cs b/archive/Calculations/_Updated/MACD_Series.cs deleted file mode 100644 index c23e1eca..00000000 --- a/archive/Calculations/_Updated/MACD_Series.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -MACD: Moving Average Convergence/Divergence - Moving average convergence divergence (MACD) is a trend-following momentum - indicator that shows the relationship between two moving averages of a series. - The MACD is calculated by subtracting the 26-period exponential moving average (EMA) - from the 12-period EMA. MACD Signal is 9-day EMA of MACD. - - */ - -public class MACD_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - - protected readonly int _slow, _fast, _signal; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly EMA_Series _TSlow; - private readonly EMA_Series _TFast; - public EMA_Series Signal { get; } - - //core constructors - public MACD_Series(int slow = 26, int fast = 12, int signal = 9, bool useNaN = false) - { - _slow = slow; - _fast = fast; - _signal = signal; - _NaN = useNaN; - Name = $"MACD({slow},{fast},{signal})"; - _TSlow = new(slow, useNaN: false, useSMA: true); - _TFast = new(fast, useNaN: false, useSMA: true); - Signal = new(signal, useNaN: false, useSMA: true); - } - public MACD_Series(TSeries source, int slow, int fast, int signal, bool useNaN) : this(slow, fast, signal, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MACD_Series(TSeries source) : this(source: source, slow: 26, fast: 12, signal: 9, useNaN: false) { } - public MACD_Series(TSeries source, int slow, int fast, int signal) : this(source: source, slow: slow, fast: fast, signal: signal, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - - var _sslow = _TSlow.Add(TValue, update); - var _sfast = _TFast.Add(TValue, update); - Signal.Add((TValue.t, _sfast.v - _sslow.v)); - - var res = (TValue.t, Count < _fast - 1 && _NaN ? double.NaN : _sfast.v - _sslow.v); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MAD_Series.cs b/archive/Calculations/_Updated/MAD_Series.cs deleted file mode 100644 index 23a7bf05..00000000 --- a/archive/Calculations/_Updated/MAD_Series.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 - - */ - -public class MAD_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MAD_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MAD({period})"; - } - public MAD_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MAD_Series() : this(period: 0, useNaN: false) { } - public MAD_Series(int period) : this(period: period, useNaN: false) { } - public MAD_Series(TBars source) : this(source.Close, 0, false) { } - public MAD_Series(TBars source, int period) : this(source.Close, period, false) { } - public MAD_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MAD_Series(TSeries source) : this(source, 0, false) { } - public MAD_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - double _mad = 0; - for (int i = 0; i < _buffer.Count; i++) { _mad += Math.Abs(_buffer[i] - _sma); } - _mad /= this._buffer.Count; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _mad); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MAE_Series.cs b/archive/Calculations/_Updated/MAE_Series.cs deleted file mode 100644 index 566b47c2..00000000 --- a/archive/Calculations/_Updated/MAE_Series.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -MAE: Mean Absolute Error - Defined as a Mean (Average) of the absolute difference between actual and estimated values. - MAE = (1/n) * Σ|y_i - MA_i| - -Sources: - https://en.wikipedia.org/wiki/Mean_absolute_error - - */ - -public class MAE_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MAE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MSE({period})"; - } - public MAE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MAE_Series() : this(period: 0, useNaN: false) { } - public MAE_Series(int period) : this(period: period, useNaN: false) { } - public MAE_Series(TBars source) : this(source.Close, 0, false) { } - public MAE_Series(TBars source, int period) : this(source.Close, period, false) { } - public MAE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MAE_Series(TSeries source) : this(source, 0, false) { } - public MAE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - double _mae = 0; - for (int i = 0; i < _buffer.Count; i++) { _mae += Math.Abs(_buffer[i] - _sma); } - _mae /= this._buffer.Count; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _mae); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MAMA_Series.cs b/archive/Calculations/_Updated/MAMA_Series.cs deleted file mode 100644 index 538f66a2..00000000 --- a/archive/Calculations/_Updated/MAMA_Series.cs +++ /dev/null @@ -1,207 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -MAMA: MESA Adaptive Moving Average - Created by John Ehlers, the MAMA indicator is a 5-period adaptive moving average of - high/low price that uses classic electrical radio-frequency signal processing algorithms - to reduce noise. - - KAMAi = KAMAi - 1 + SC * ( price - KAMAi-1 ) - -Sources: - https://mesasoftware.com/papers/MAMA.pdf - https://www.tradingview.com/script/foQxLbU3-Ehlers-MESA-Adaptive-Moving-Average-LazyBear/ - - */ - -public class MAMA_Series : TSeries -{ - private int _len; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - private double sumPr; - private double fastl, slowl; - private (double i, double i1, double i2, double i3, double i4, double i5, double i6, double io) pr, i1, q1, sm, dt; - private (double i, double i1, double io) i2, q2, re, im, pd, ph, mama, fama; - public TSeries Fama { get; } - private double mamaseed, famaseed; - - //core constructors - - public MAMA_Series(double fastlimit, double slowlimit, bool useNaN) - { - _period = (int)(2 / fastlimit) - 1; - fastl = fastlimit; - slowl = slowlimit; - Fama = new TSeries(); - _NaN = useNaN; - Name = $"MAMA({_period})"; - _len = 0; - } - public MAMA_Series(TSeries source, double fastlimit, double slowlimit, bool useNaN = false) : this(fastlimit, slowlimit, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MAMA_Series() : this(period: 0, useNaN: false) { } - public MAMA_Series(int period) : this(period, useNaN: false) { } - public MAMA_Series(int period, bool useNaN) : this(fastlimit: 2 / (period + 1), slowlimit: 0.2 / (period + 1), useNaN) - { - _period = period; - } - public MAMA_Series(TBars source) : this(source.Close, period: 0, useNaN: false) { } - public MAMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public MAMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MAMA_Series(TSeries source, int period) : this(source, period, false) { } - public MAMA_Series(TSeries source, int period, bool useNaN) : this(source, fastlimit: 2 / ((double)period + 1), slowlimit: 0.2 / ((double)period + 1), useNaN: useNaN) { } - - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - if (!update) - { - // roll forward (oldx = x) - pr.io = pr.i6; pr.i6 = pr.i5; pr.i5 = pr.i4; pr.i4 = pr.i3; pr.i3 = pr.i2; pr.i2 = pr.i1; pr.i1 = pr.i; - i1.io = i1.i6; i1.i6 = i1.i5; i1.i5 = i1.i4; i1.i4 = i1.i3; i1.i3 = i1.i2; i1.i2 = i1.i1; i1.i1 = i1.i; - q1.io = q1.i6; q1.i6 = q1.i5; q1.i5 = q1.i4; q1.i4 = q1.i3; q1.i3 = q1.i2; q1.i2 = q1.i1; q1.i1 = q1.i; - dt.io = dt.i6; dt.i6 = dt.i5; dt.i5 = dt.i4; dt.i4 = dt.i3; dt.i3 = dt.i2; dt.i2 = dt.i1; dt.i1 = dt.i; - sm.io = sm.i6; sm.i6 = sm.i5; sm.i5 = sm.i4; sm.i4 = sm.i3; sm.i3 = sm.i2; sm.i2 = sm.i1; sm.i1 = sm.i; - i2.io = i2.i1; i2.i1 = i2.i; q2.io = q2.i1; q2.i1 = q2.i; - re.io = re.i1; re.i1 = re.i; im.io = im.i1; im.i1 = im.i; - pd.io = pd.i1; pd.i1 = pd.i; ph.io = ph.i1; ph.i1 = ph.i; - mama.io = mama.i1; mama.i1 = mama.i; - fama.io = fama.i1; - fama.i1 = fama.i; - _len++; - } - if (_period == 0) - { - fastl = 2 / (double)_len; - slowl = fastl * 0.1; - } - if (_period == 1) - { - fastl = 1; - slowl = 1; - } - var i = _len - 1; - pr.i = TValue.v; - if (i > 5) - { - var adj = 0.075 * pd.i1 + 0.54; - - // smooth and detrender - sm.i = (4 * pr.i + 3 * pr.i1 + 2 * pr.i2 + pr.i3) / 10; - dt.i = (0.0962 * sm.i + 0.5769 * sm.i2 - 0.5769 * sm.i4 - 0.0962 * sm.i6) * adj; - - // in-phase and quadrature - q1.i = (0.0962 * dt.i + 0.5769 * dt.i2 - 0.5769 * dt.i4 - 0.0962 * dt.i6) * adj; - i1.i = dt.i3; - - // advance the phases by 90 degrees - double jI = (0.0962 * i1.i + 0.5769 * i1.i2 - 0.5769 * i1.i4 - 0.0962 * i1.i6) * adj; - double jQ = (0.0962 * q1.i + 0.5769 * q1.i2 - 0.5769 * q1.i4 - 0.0962 * q1.i6) * adj; - - // phasor addition for 3-bar averaging - i2.i = i1.i - jQ; - q2.i = q1.i + jI; - - i2.i = 0.2 * i2.i + 0.8 * i2.i1; // smoothing it - q2.i = 0.2 * q2.i + 0.8 * q2.i1; - - // homodyne discriminator - re.i = i2.i * i2.i1 + q2.i * q2.i1; - im.i = i2.i * q2.i1 - q2.i * i2.i1; - - re.i = 0.2 * re.i + 0.8 * re.i1; // smoothing it - im.i = 0.2 * im.i + 0.8 * im.i1; - - // calculate period - pd.i = im.i != 0 && re.i != 0 ? 6.283185307179586 / Math.Atan(im.i / re.i) : 0d; - - // adjust period to thresholds - pd.i = pd.i > 1.5 * pd.i1 ? 1.5 * pd.i1 : pd.i; - pd.i = pd.i < 0.67 * pd.i1 ? 0.67 * pd.i1 : pd.i; - pd.i = pd.i < 6d ? 6d : pd.i; - pd.i = pd.i > 50d ? 50d : pd.i; - - // smooth the period - pd.i = 0.2 * pd.i + 0.8 * pd.i1; - - // determine phase position - ph.i = i1.i != 0 ? Math.Atan(q1.i / i1.i) * 57.29577951308232 : 0; - - // change in phase - var delta = Math.Max(ph.i1 - ph.i, 1d); - - // adaptive alpha value - var alpha = Math.Max(fastl / delta, slowl); - - // final indicators - mama.i = alpha * (pr.i - mama.i1) + mama.i1; - fama.i = 0.5d * alpha * (mama.i - fama.i1) + fama.i1; - } - else - { - sumPr += pr.i; - pd.i = sm.i = dt.i = i1.i = q1.i = i2.i = q2.i = re.i = im.i = ph.i = 0; - mama.i = fama.i = sumPr / (i + 1); - - if (_len == 1) - { - mamaseed = famaseed = TValue.v; - } - else - { - mamaseed = fastl * (TValue.v - mamaseed) + mamaseed; - famaseed = slowl * (TValue.v - famaseed) + famaseed; - } - } - - double _fama = (i > 5) ? fama.i : famaseed; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _fama); - Fama.Add(res, update); - double _mama = (i > 5) ? mama.i : mamaseed; - res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _mama); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MAPE_Series.cs b/archive/Calculations/_Updated/MAPE_Series.cs deleted file mode 100644 index 0ac76546..00000000 --- a/archive/Calculations/_Updated/MAPE_Series.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 - - */ - -public class MAPE_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MAPE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MAPE({period})"; - } - public MAPE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MAPE_Series() : this(period: 0, useNaN: false) { } - public MAPE_Series(int period) : this(period: period, useNaN: false) { } - public MAPE_Series(TBars source) : this(source.Close, 0, false) { } - public MAPE_Series(TBars source, int period) : this(source.Close, period, false) { } - public MAPE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MAPE_Series(TSeries source) : this(source, 0, false) { } - public MAPE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - 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 /= (_buffer.Count > 0) ? _buffer.Count : 1; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _mape); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MAX_Series.cs b/archive/Calculations/_Updated/MAX_Series.cs deleted file mode 100644 index 17aa9c71..00000000 --- a/archive/Calculations/_Updated/MAX_Series.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -MAX - Maximum value in the given period in the series. - If period = 0 => period = full length of the series - - */ - -public class MAX_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MAX_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MAX({period})"; - } - public MAX_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MAX_Series() : this(period: 0, useNaN: false) { } - public MAX_Series(int period) : this(period: period, useNaN: false) { } - public MAX_Series(TBars source) : this(source.Close, 0, false) { } - public MAX_Series(TBars source, int period) : this(source.Close, period, false) { } - public MAX_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MAX_Series(TSeries source) : this(source, 0, false) { } - public MAX_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _max = _buffer.Max(); - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _max); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MEDIAN_Series.cs b/archive/Calculations/_Updated/MEDIAN_Series.cs deleted file mode 100644 index e431c979..00000000 --- a/archive/Calculations/_Updated/MEDIAN_Series.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 - - */ - -public class MEDIAN_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MEDIAN_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MEDIAN({period})"; - } - public MEDIAN_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MEDIAN_Series() : this(period: 0, useNaN: false) { } - public MEDIAN_Series(int period) : this(period: period, useNaN: false) { } - public MEDIAN_Series(TBars source) : this(source.Close, 0, false) { } - public MEDIAN_Series(TBars source, int period) : this(source.Close, period, false) { } - public MEDIAN_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MEDIAN_Series(TSeries source) : this(source, 0, false) { } - public MEDIAN_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - 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 res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _med); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MIDPOINT_Series.cs b/archive/Calculations/_Updated/MIDPOINT_Series.cs deleted file mode 100644 index ba98b3b3..00000000 --- a/archive/Calculations/_Updated/MIDPOINT_Series.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -MIDPOINT: Midpoint value (max+min)/2 in the given period in the series. - If period = 0 => period = full length of the series - -Sources: - https://thefaqblog.com/what-is-the-midpoint-in-statistics/ - - */ - -public class MIDPOINT_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MIDPOINT_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MIDPOINT({period})"; - } - public MIDPOINT_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MIDPOINT_Series() : this(period: 0, useNaN: false) { } - public MIDPOINT_Series(int period) : this(period: period, useNaN: false) { } - public MIDPOINT_Series(TBars source) : this(source.Close, 0, false) { } - public MIDPOINT_Series(TBars source, int period) : this(source.Close, period, false) { } - public MIDPOINT_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MIDPOINT_Series(TSeries source) : this(source, 0, false) { } - public MIDPOINT_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _max = _buffer.Max(); - double _min = _buffer.Min(); - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : (_max + _min) * 0.5); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MIDPRICE_Series.cs b/archive/Calculations/_Updated/MIDPRICE_Series.cs deleted file mode 100644 index 851b23fd..00000000 --- a/archive/Calculations/_Updated/MIDPRICE_Series.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -MIDPRICE: Midpoint price (highhest high + lowest low)/2 in the given period in the series. - If period = 0 => period = full length of the series - - */ - -public class MIDPRICE_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TBars _data; - private readonly System.Collections.Generic.List _bufferhi = new(); - private readonly System.Collections.Generic.List _bufferlo = new(); - - //core constructors - public MIDPRICE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MIDPRICE({period})"; - } - public MIDPRICE_Series(TBars source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(data: _data); - } - public MIDPRICE_Series() : this(period: 2, useNaN: false) { } - public MIDPRICE_Series(int period) : this(period: period, useNaN: false) { } - public MIDPRICE_Series(TBars source) : this(source, period: 2, useNaN: false) { } - public MIDPRICE_Series(TBars source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - BufferTrim(_bufferhi, TBar.h, _period, update); - BufferTrim(_bufferlo, TBar.l, _period, update); - double _mid = (_bufferhi.Max() + _bufferlo.Min()) * 0.5; - - var res = (TBar.t, Count < _period - 1 && _NaN ? double.NaN : _mid); - return base.Add(res, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _bufferhi.Clear(); - _bufferlo.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MIN_Series.cs b/archive/Calculations/_Updated/MIN_Series.cs deleted file mode 100644 index d3d7bb73..00000000 --- a/archive/Calculations/_Updated/MIN_Series.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -MIN - Minimum value in the given period in the series. - If period = 0 => period = full length of the series - - */ - -public class MIN_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MIN_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MAX({period})"; - } - public MIN_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MIN_Series() : this(period: 0, useNaN: false) { } - public MIN_Series(int period) : this(period: period, useNaN: false) { } - public MIN_Series(TBars source) : this(source.Close, 0, false) { } - public MIN_Series(TBars source, int period) : this(source.Close, period, false) { } - public MIN_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MIN_Series(TSeries source) : this(source, 0, false) { } - public MIN_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _max = _buffer.Min(); - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _max); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/MSE_Series.cs b/archive/Calculations/_Updated/MSE_Series.cs deleted file mode 100644 index 34440185..00000000 --- a/archive/Calculations/_Updated/MSE_Series.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 - - */ - -public class MSE_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public MSE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"MSE({period})"; - } - public MSE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public MSE_Series() : this(period: 0, useNaN: false) { } - public MSE_Series(int period) : this(period: period, useNaN: false) { } - public MSE_Series(TBars source) : this(source.Close, 0, false) { } - public MSE_Series(TBars source, int period) : this(source.Close, period, false) { } - public MSE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public MSE_Series(TSeries source) : this(source, 0, false) { } - public MSE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - double _mse = 0; - for (int i = 0; i < _buffer.Count; i++) { _mse += (_buffer[i] - _sma) * (_buffer[i] - _sma); } - _mse /= this._buffer.Count; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _mse); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/OBV_Series.cs b/archive/Calculations/_Updated/OBV_Series.cs deleted file mode 100644 index 2025034e..00000000 --- a/archive/Calculations/_Updated/OBV_Series.cs +++ /dev/null @@ -1,106 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -OBV: On-Balance Volume - On-balance volume (OBV) is a technical trading momentum indicator that uses volume flow to predict - changes in stock price. Joseph Granville first developed the OBV metric in the 1963 book - Granville's New Key to Stock Market Profits. - - | +volume; if close > close[previous] - OBV = OBV[previous] + | 0; if close = close[previous] - | -volume; if close < close[previous] - -Sources: - https://www.investopedia.com/terms/o/onbalancevolume.asp - https://www.tradingview.com/wiki/On_Balance_Volume_(OBV) - https://www.tradingtechnologies.com/help/x-study/technical-indicator-definitions/on-balance-volume-obv/ - https://www.motivewave.com/studies/on_balance_volume.htm - -Note: - There is no consensus on what is the first OBV value in the series: - - TA-LIB uses the first volume: OBV[0] = volume[0] - - Skender stock library uses 0: OBV[0] = 0 - - */ - -public class OBV_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TBars _data; - private double _lastobv, _lastlastobv; - private double _lastclose, _lastlastclose; - - //core constructors - public OBV_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"OBV({period})"; - this._lastobv = this._lastlastobv = 0; - this._lastclose = this._lastlastclose = 0; - } - public OBV_Series(TBars source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(data: _data); - } - public OBV_Series() : this(period: 2, useNaN: false) { } - public OBV_Series(int period) : this(period: period, useNaN: false) { } - public OBV_Series(TBars source) : this(source, period: 2, useNaN: false) { } - public OBV_Series(TBars source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - - if (update) - { - this._lastobv = this._lastlastobv; - this._lastclose = this._lastlastclose; - } - - double _obv = this._lastobv; - if (TBar.c > this._lastclose) { _obv += TBar.v; } - if (TBar.c < this._lastclose) { _obv -= TBar.v; } - - this._lastlastobv = this._lastobv; - this._lastobv = _obv; - - this._lastlastclose = this._lastclose; - this._lastclose = TBar.c; - - var res = (TBar.t, (this.Count < this._period && this._NaN) ? double.NaN : _obv); - return base.Add(res, update); - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - this._lastobv = this._lastlastobv = 0; - this._lastclose = this._lastlastclose = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/RMA_Series.cs b/archive/Calculations/_Updated/RMA_Series.cs deleted file mode 100644 index a1b94259..00000000 --- a/archive/Calculations/_Updated/RMA_Series.cs +++ /dev/null @@ -1,133 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -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. - - */ - -public class RMA_Series : TSeries -{ - private double _k; - private double _lastrma, _oldrma; - private double _sum, _oldsum; - private readonly bool _useSMA; - private int _len; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructor - public RMA_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - _useSMA = useSMA; - Name = $"RMA({period})"; - _k = 1.0 / (double)(this._period); - _len = 0; - _sum = _oldsum = _lastrma = _oldrma = 0; - } - //generic constructors (source) - - public RMA_Series() : this(0, false, true) { } - public RMA_Series(int period) : this(period, false, true) { } - public RMA_Series(TBars source) : this(source.Close, 0, false) { } - public RMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public RMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public RMA_Series(TSeries source, int period) : this(source, period, false, true) { } - public RMA_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - public RMA_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) - { - _lastrma = _oldrma; - _sum = _oldsum; - } - else - { - _oldrma = _lastrma; - _oldsum = _sum; - _len++; - } - - double _rma = 0; - if (_period == 0) - { - _k = 1.0 / (double)(this._len); - } - - if (Count == 0) - { - _rma = _sum = TValue.v; - - } - else if (_len <= _period && _useSMA && _period != 0) - { - _sum += TValue.v; - if (_period != 0 && _len > _period) - { - _sum -= _data[Count - _period - (update ? 1 : 0)].v; - } - _rma = _sum / Math.Min(_len, _period); - } - else - { - _rma = _k * (TValue.v - _lastrma) + _lastrma; - } - - _lastrma = double.IsNaN(_rma) ? _lastrma : _rma; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _rma); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _sum = _oldsum = _lastrma = _oldrma = 0; - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/RSI_Series.cs b/archive/Calculations/_Updated/RSI_Series.cs deleted file mode 100644 index 6a037b28..00000000 --- a/archive/Calculations/_Updated/RSI_Series.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -RSI: Relative Strength Index - Created by J. Welles Wilder, the Relative Strength Index measures strength - of the winning/losing streak over N lookback periods on a scale of 0 to 100, - to depict overbought and oversold conditions. - -Sources: - https://www.investopedia.com/terms/r/rsi.asp - - */ - -public class RSI_Series : TSeries -{ - private readonly System.Collections.Generic.List _gain = new(); - private readonly System.Collections.Generic.List _loss = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private double _avgGain, _avgLoss, _lastValue; - private double _avgGain_o, _avgLoss_o, _lastValue_o; - private int i; - - //core constructors - public RSI_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"RSI({period})"; - i = 0; - } - public RSI_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public RSI_Series() : this(period: 0, useNaN: false) { } - public RSI_Series(int period) : this(period: period, useNaN: false) { } - public RSI_Series(TBars source) : this(source.Close, 0, false) { } - public RSI_Series(TBars source, int period) : this(source.Close, period, false) { } - public RSI_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public RSI_Series(TSeries source) : this(source, 0, false) { } - public RSI_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - - double _rsi = 0; - if (update) - { - _lastValue = _lastValue_o; - _avgGain = _avgGain_o; - _avgLoss = _avgLoss_o; - } - else - { - _lastValue_o = _lastValue; - _avgGain_o = _avgGain; - _avgLoss_o = _avgLoss; - } - - if (i == 0) { _lastValue = TValue.v; } - - double _gainval = (TValue.v > _lastValue) ? TValue.v - _lastValue : 0; - BufferTrim(_gain, _gainval, _period, update); - double _lossval = (TValue.v < _lastValue) ? _lastValue - TValue.v : 0; - BufferTrim(_loss, _lossval, _period, update); - _lastValue = TValue.v; - - // calculate RSI - if (i > _period && _period != 0) - { - _avgGain = ((_avgGain * (_period - 1)) + _gain[^1]) / _period; - _avgLoss = ((_avgLoss * (_period - 1)) + _loss[^1]) / _period; - if (_avgLoss > 0) - { - double rs = _avgGain / _avgLoss; - _rsi = 100 - (100 / (1 + rs)); - } - else { _rsi = 100; } - } - // initialize average gain - else - { - double _sumGain = 0; - for (int p = 0; p < _gain.Count; p++) { _sumGain += _gain[p]; } - double _sumLoss = 0; - for (int p = 0; p < _loss.Count; p++) { _sumLoss += _loss[p]; } - - _avgGain = _sumGain / _gain.Count; - _avgLoss = _sumLoss / _loss.Count; - - _rsi = (_avgLoss > 0) ? 100 - (100 / (1 + (_avgGain / _avgLoss))) : 100; - } - if (!update) { i++; } - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _rsi); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - i = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SDEV_Series.cs b/archive/Calculations/_Updated/SDEV_Series.cs deleted file mode 100644 index 88fe0ce1..00000000 --- a/archive/Calculations/_Updated/SDEV_Series.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -SDEV: 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: - SDEV (Population Standard Deviation) is also known as a biased/uncorrected Standard Deviation. - For unbiased version that uses Bessel's correction, use SDEV instead. - - */ - -public class SDEV_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public SDEV_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"SDEV({period})"; - } - public SDEV_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SDEV_Series() : this(period: 0, useNaN: false) { } - public SDEV_Series(int period) : this(period: period, useNaN: false) { } - public SDEV_Series(TBars source) : this(source.Close, 0, false) { } - public SDEV_Series(TBars source, int period) : this(source.Close, period, false) { } - public SDEV_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SDEV_Series(TSeries source) : this(source, 0, false) { } - public SDEV_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - double _var = 0; - for (int i = 0; i < _buffer.Count; i++) { _var += (_buffer[i] - _sma) * (_buffer[i] - _sma); } - _var /= this._buffer.Count; - double _sdev = Math.Sqrt(_var); - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _sdev); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SLOPE_Series.cs b/archive/Calculations/_Updated/SLOPE_Series.cs deleted file mode 100644 index c47b8650..00000000 --- a/archive/Calculations/_Updated/SLOPE_Series.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -SLOPE: Slope of linear regression (using Least Square Method) - Linear Regression provides a slope of a straight line that is the best approximation of the given set of data. - The method of least squares is a standard approach in linear regression analysis to approximate the solution - by minimizing the sum of the squares of the residuals made in the results of each individual equation. - -Additional outputs provided by LINREG: - .Intercept - y-intercept point of the best fit line - .RSquared - R-Squared (R²), Coefficient of Determination - .StdDev - Standard Deviation of data over given periods - - y = Slope * x + Intercept - -Sources: - https://en.wikipedia.org/wiki/Least_squares - - */ - -public class SLOPE_Series : TSeries -{ - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly TSeries p_Intercept = new(); - private readonly TSeries p_RSquared = new(); - private readonly TSeries p_StdDev = new(); - private readonly System.Collections.Generic.List _buffer = new(); - public TSeries Intercept => p_Intercept; - public TSeries RSquared => p_RSquared; - public TSeries StdDev => p_StdDev; - //core constructors - public SLOPE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"SLOPE({period})"; - } - public SLOPE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SLOPE_Series() : this(period: 0, useNaN: false) { } - public SLOPE_Series(int period) : this(period: period, useNaN: false) { } - public SLOPE_Series(TBars source) : this(source.Close, 0, false) { } - public SLOPE_Series(TBars source, int period) : this(source.Close, period, false) { } - public SLOPE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SLOPE_Series(TSeries source) : this(source, 0, false) { } - public SLOPE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - int _len = this._buffer.Count; - - // get averages for period - double sumX = 0; - double sumY = 0; - - for (int p = 0; p < _len; p++) - { - sumX += this.Count - _len + 2 + p; - sumY += _buffer[p]; - } - double avgX = sumX / _len; - double avgY = sumY / _len; - - // least squares method - double sumSqX = 0; - double sumSqY = 0; - double sumSqXY = 0; - - for (int p = 0; p < _len; p++) - { - double devX = this.Count - _len + 2 + p - avgX; - double devY = _buffer[p] - avgY; - - sumSqX += devX * devX; - sumSqY += devY * devY; - sumSqXY += devX * devY; - } - - double _slope = sumSqXY / sumSqX; - double _intercept = avgY - (_slope * avgX); - - // calculate Standard Deviation and R-Squared - double stdDevX = Math.Sqrt(sumSqX / _len); - double stdDevY = Math.Sqrt(sumSqY / _len); - double _StdDev = stdDevY; - - double arrr = (stdDevX * stdDevY != 0) ? sumSqXY / (stdDevX * stdDevY) / _len : 0; - double _RSquared = arrr * arrr; - - var ret = (TValue.t, this.Count < this._period - 1 && this._NaN ? double.NaN : _intercept); - p_Intercept.Add(ret, update); - - ret = (TValue.t, this.Count < this._period - 1 && this._NaN ? double.NaN : _StdDev); - p_StdDev.Add(ret, update); - - ret = (TValue.t, this.Count < this._period - 1 && this._NaN ? double.NaN : _RSquared); - p_RSquared.Add(ret, update); - - ret = (TValue.t, this.Count < this._period - 1 && this._NaN ? double.NaN : _slope); - return base.Add(ret, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SMAPE_Series.cs b/archive/Calculations/_Updated/SMAPE_Series.cs deleted file mode 100644 index a2e65e05..00000000 --- a/archive/Calculations/_Updated/SMAPE_Series.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 - - */ - -public class SMAPE_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public SMAPE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"SMAPE({period})"; - } - public SMAPE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SMAPE_Series() : this(period: 0, useNaN: false) { } - public SMAPE_Series(int period) : this(period: period, useNaN: false) { } - public SMAPE_Series(TBars source) : this(source.Close, 0, false) { } - public SMAPE_Series(TBars source, int period) : this(source.Close, period, false) { } - public SMAPE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SMAPE_Series(TSeries source) : this(source, 0, false) { } - public SMAPE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - 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 res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _smape); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SMA_Series.cs b/archive/Calculations/_Updated/SMA_Series.cs deleted file mode 100644 index e4c7b9e6..00000000 --- a/archive/Calculations/_Updated/SMA_Series.cs +++ /dev/null @@ -1,112 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -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 (slow) iterative methods. It is not as fast as TA-LIB - implementation, but it does allow incremental additions of inputs and real-time calculations of SMA() - - */ -public class SMA_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - - private double _sum, _oldsum; - private readonly int _period; - private readonly TSeries _data; - protected readonly bool _NaN; - - //core constructor - public SMA_Series(int period, bool useNaN) - { - _period = Math.Max(0, period); - _NaN = useNaN; - Name = $"SMA({period})"; - _sum = _oldsum = 0; - } - public SMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SMA_Series() : this(0, false) { } - public SMA_Series(int period) : this(period, false) { } - public SMA_Series(TBars source) : this(source.Close, 0, false) { } - public SMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public SMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SMA_Series(TSeries source) : this(source, 0, false) { } - public SMA_Series(TSeries source, int period) : this(source, period, false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return (TValue.t, double.NaN); - } - else - { - if (update && _buffer.Count > 0) - { - _sum -= _buffer[^1]; - _buffer[^1] = TValue.v; - _oldsum = _sum; - } - else - { - _buffer.Add(TValue.v); - _oldsum = _sum; - } - - _sum += TValue.v; - if (_period != 0 && _buffer.Count > _period) - { - _sum -= _buffer[0]; - _buffer.RemoveAt(0); - } - } - - double _div = _period == 0 ? _buffer.Count : Math.Min(_buffer.Count, _period); - var _sma = _sum / _div; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _sma); - return base.Add(res, update); - } - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - - //reset calculation - public override void Reset() - { - _sum = _oldsum = 0; - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SMMA_Series.cs b/archive/Calculations/_Updated/SMMA_Series.cs deleted file mode 100644 index cfba2a57..00000000 --- a/archive/Calculations/_Updated/SMMA_Series.cs +++ /dev/null @@ -1,105 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Linq; - -/* -SMMA: Smoothed Moving Average - The Smoothed Moving Average (SMMA) is a combination of a SMA and an EMA. It gives the recent prices - an equal weighting as the historic prices as it takes all available price data into account. - The main advantage of a smoothed moving average is that it removes short-term fluctuations. - - SMMA(i) = (SMMA-1*(N-1) + CLOSE (i)) / N - -Sources: - https://blog.earn2trade.com/smoothed-moving-average - https://guide.traderevolution.com/traderevolution/mobile-applications/phone/android/technical-indicators/moving-averages/smma-smoothed-moving-average - https://www.chartmill.com/documentation/technical-analysis-indicators/217-MOVING-AVERAGES-%7C-The-Smoothed-Moving-Average-%28SMMA%29 - - */ - -public class SMMA_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private double _lastsmma, _lastlastsmma; - - //core constructors - public SMMA_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"SMMA({period})"; - } - public SMMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SMMA_Series() : this(period: 0, useNaN: false) { } - public SMMA_Series(int period) : this(period: period, useNaN: false) { } - public SMMA_Series(TBars source) : this(source.Close, 0, false) { } - public SMMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public SMMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SMMA_Series(TSeries source) : this(source, 0, false) { } - public SMMA_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, double.NaN), update); - } - - double _smma = 0; - if (update) { this._lastsmma = this._lastlastsmma; } - - if (this.Count < this._period) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - _smma = _buffer.Average(); - } - else - { - _smma = ((_lastsmma * (_period - 1)) + TValue.v) / _period; - } - - this._lastlastsmma = this._lastsmma; - this._lastsmma = _smma; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _smma); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - this._lastsmma = this._lastlastsmma = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SSDEV_Series.cs b/archive/Calculations/_Updated/SSDEV_Series.cs deleted file mode 100644 index ae2a10de..00000000 --- a/archive/Calculations/_Updated/SSDEV_Series.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -SSDEV: (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 - - */ - -public class SSDEV_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public SSDEV_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"SSDEV({period})"; - } - public SSDEV_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SSDEV_Series() : this(period: 0, useNaN: false) { } - public SSDEV_Series(int period) : this(period: period, useNaN: false) { } - public SSDEV_Series(TBars source) : this(source.Close, 0, false) { } - public SSDEV_Series(TBars source, int period) : this(source.Close, period, false) { } - public SSDEV_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SSDEV_Series(TSeries source) : this(source, 0, false) { } - public SSDEV_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - double _svar = 0; - for (int i = 0; i < this._buffer.Count; i++) { _svar += (_buffer[i] - _sma) * (_buffer[i] - _sma); } - _svar /= (_buffer.Count > 1) ? _buffer.Count - 1 : 1; // Bessel's correction - double _ssdev = Math.Sqrt(_svar); - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _ssdev); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/SVAR_Series.cs b/archive/Calculations/_Updated/SVAR_Series.cs deleted file mode 100644 index 3438c9d5..00000000 --- a/archive/Calculations/_Updated/SVAR_Series.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -VAR: Population Variance - Population variance without Bessel's correction - -Sources: - https://en.wikipedia.org/wiki/Variance - Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction - -Remark: - VAR (Population Variance) is also known as a biased Sample Variance. For unbiased - sample variance use SVAR instead. - - */ - -public class SVAR_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public SVAR_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"SVAR({period})"; - } - public SVAR_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public SVAR_Series() : this(period: 0, useNaN: false) { } - public SVAR_Series(int period) : this(period: period, useNaN: false) { } - public SVAR_Series(TBars source) : this(source.Close, 0, false) { } - public SVAR_Series(TBars source, int period) : this(source.Close, period, false) { } - public SVAR_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public SVAR_Series(TSeries source) : this(source, 0, false) { } - public SVAR_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - 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 res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _svar); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/T3_Series.cs b/archive/Calculations/_Updated/T3_Series.cs deleted file mode 100644 index b203f818..00000000 --- a/archive/Calculations/_Updated/T3_Series.cs +++ /dev/null @@ -1,173 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Numerics; - -/* -T3: Tillson T3 Moving Average - Tim Tillson described it in "Technical Analysis of Stocks and Commodities", January 1998 in the - article "Better Moving Averages". Tillson’s moving average becomes a popular indicator of - technical analysis as it gets less lag with the price chart and its curve is considerably smoother. - -Sources: - https://technicalindicators.net/indicators-technical-analysis/150-t3-moving-average - http://www.binarytribune.com/forex-trading-indicators/t3-moving-average-indicator/ - */ - -public class T3_Series : TSeries -{ - private readonly double _k, _k1m, _c1, _c2, _c3, _c4; - private readonly System.Collections.Generic.List _buffer1 = new(); - private readonly System.Collections.Generic.List _buffer2 = new(); - private readonly System.Collections.Generic.List _buffer3 = new(); - private readonly System.Collections.Generic.List _buffer4 = new(); - private readonly System.Collections.Generic.List _buffer5 = new(); - private readonly System.Collections.Generic.List _buffer6 = new(); - private readonly bool _useSMA; - private double _lastema1, _lastema2, _lastema3, _lastema4, _lastema5, _lastema6; - private double _llastema1, _llastema2, _llastema3, _llastema4, _llastema5, _llastema6; - protected int _len; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public T3_Series(int period, double vfactor, bool useSMA, bool useNaN) - { - _period = period; - _len = 0; - _NaN = useNaN; - Name = $"T3({period})"; - _useSMA = useSMA; - double _a = vfactor; //0.7; //0.618 - _c1 = -_a * _a * _a; - _c2 = 3 * _a * _a + 3 * _a * _a * _a; - _c3 = -6 * _a * _a - 3 * _a - 3 * _a * _a * _a; - _c4 = 1 + 3 * _a + _a * _a * _a + 3 * _a * _a; - - _k = 2.0 / (_period + 1); - _k1m = 1.0 - _k; - _lastema1 = _llastema1 = _lastema2 = _llastema2 = _lastema3 = _llastema3 = _lastema4 = _llastema4 = _lastema5 = _llastema5 = _lastema5 = _llastema5 = 0; - } - public T3_Series(TSeries source, int period, double vfactor, bool useSMA, bool useNaN) : this(period, vfactor, useSMA, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public T3_Series() : this(period: 0, vfactor: 0.7, useSMA: true, useNaN: false) { } - public T3_Series(int period) : this(period: period, vfactor: 0.7, useSMA: true, useNaN: false) { } - public T3_Series(TBars source) : this(source.Close, 0, vfactor: 0.7, useSMA: true, useNaN: false) { } - public T3_Series(TBars source, int period) : this(source.Close, period, vfactor: 0.7, useSMA: true, useNaN: false) { } - public T3_Series(TBars source, int period, bool useNaN) : this(source.Close, period, vfactor: 0.7, useSMA: true, useNaN: useNaN) { } - public T3_Series(TBars source, int period, double vfactor, bool useNaN) : this(source.Close, period, vfactor: vfactor, useSMA: true, useNaN: useNaN) { } - public T3_Series(TBars source, int period, bool useSMA, bool useNaN) : this(source.Close, period, vfactor: 0.7, useSMA: useSMA, useNaN: useNaN) { } - public T3_Series(TSeries source) : this(source, 0, vfactor: 0.7, useSMA: true, useNaN: false) { } - public T3_Series(TSeries source, int period) : this(source: source, period: period, vfactor: 0.7, useSMA: true, useNaN: false) { } - public T3_Series(TSeries source, int period, bool useNaN) : this(source: source, period: period, vfactor: 0.7, useSMA: true, useNaN: useNaN) { } - public T3_Series(TSeries source, int period, double vfactor) : this(source: source, period: period, vfactor: vfactor, useSMA: true, useNaN: false) { } - public T3_Series(TSeries source, int period, double vfactor, bool useNaN) : this(source: source, period: period, vfactor: vfactor, useSMA: true, useNaN: useNaN) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - double _ema1, _ema2, _ema3, _ema4, _ema5, _ema6; - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - - if (update) { _lastema1 = _llastema1; _lastema2 = _llastema2; _lastema3 = _llastema3; _lastema4 = _llastema4; _lastema5 = _llastema5; _lastema6 = _llastema6; } - else { _llastema1 = _lastema1; _llastema2 = _lastema2; _llastema3 = _lastema3; _llastema4 = _lastema4; _llastema5 = _lastema5; _llastema6 = _lastema6; } - - if (_len == 0) { _lastema1 = _lastema2 = _lastema3 = _lastema4 = _lastema5 = _lastema6 = TValue.v; } - - - if ((_len < _period) && _useSMA) - { - BufferTrim(_buffer1, TValue.v, _period, update); - _ema1 = 0; - for (int i = 0; i < _buffer1.Count; i++) { _ema1 += _buffer1[i]; } - _ema1 /= _buffer1.Count; - - BufferTrim(_buffer2, _ema1, _period, update); - _ema2 = 0; - for (int i = 0; i < _buffer2.Count; i++) { _ema2 += _buffer2[i]; } - _ema2 /= _buffer2.Count; - - BufferTrim(_buffer3, _ema2, _period, update); - _ema3 = 0; - for (int i = 0; i < _buffer3.Count; i++) { _ema3 += _buffer3[i]; } - _ema3 /= _buffer3.Count; - - BufferTrim(_buffer4, _ema3, _period, update); - _ema4 = 0; - for (int i = 0; i < _buffer4.Count; i++) { _ema4 += _buffer4[i]; } - _ema4 /= _buffer4.Count; - - BufferTrim(_buffer5, _ema4, _period, update); - _ema5 = 0; - for (int i = 0; i < _buffer5.Count; i++) { _ema5 += _buffer5[i]; } - _ema5 /= _buffer5.Count; - - BufferTrim(_buffer6, _ema5, _period, update); - _ema6 = 0; - for (int i = 0; i < _buffer6.Count; i++) { _ema6 += _buffer6[i]; } - _ema6 /= _buffer6.Count; - } - else - { - _ema1 = (TValue.v * this._k) + (this._lastema1 * this._k1m); - _ema2 = (_ema1 * this._k) + (this._lastema2 * this._k1m); - _ema3 = (_ema2 * this._k) + (this._lastema3 * this._k1m); - _ema4 = (_ema3 * this._k) + (this._lastema4 * this._k1m); - _ema5 = (_ema4 * this._k) + (this._lastema5 * this._k1m); - _ema6 = (_ema5 * this._k) + (this._lastema6 * this._k1m); - } - _len++; - _lastema1 = _ema1; - _lastema2 = _ema2; - _lastema3 = _ema3; - _lastema4 = _ema4; - _lastema5 = _ema5; - _lastema6 = _ema6; - - double _T3 = _c1 * _ema6 + _c2 * _ema5 + _c3 * _ema4 + _c4 * _ema3; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _T3); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _lastema1 = _llastema1 = _lastema2 = _llastema2 = _lastema3 = _llastema3 = _lastema4 = _llastema4 = _lastema5 = _llastema5 = _lastema5 = _llastema5 = 0; - _buffer1.Clear(); - _buffer2.Clear(); - _buffer3.Clear(); - _buffer4.Clear(); - _buffer5.Clear(); - _buffer6.Clear(); - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/TBars.cs b/archive/Calculations/_Updated/TBars.cs deleted file mode 100644 index 2d72df30..00000000 --- a/archive/Calculations/_Updated/TBars.cs +++ /dev/null @@ -1,153 +0,0 @@ -namespace QuanTAlib; -using System; - -/* -TBars class - includes all series for common data used in indicators and other calculations. - Has a bit limited overloading and casting (compared to TSeries) - Includes Select(int) method to simplify choosing the most optimal data source for indicators - Includes the most basic pricing calcs: HL2, OC2, OHL3, HLC3, OHLC4, HLCC4 - (it is 'cheaper' to calculate them once during data capture than each time during data analysis) - - */ - -public class TBars : System.Collections.Generic.List<(DateTime t, double o, double h, double l, double c, double v)> -{ - public string Name { get; set; } - private readonly TSeries _open = new("open"); - private readonly TSeries _high = new("high"); - private readonly TSeries _low = new("low"); - private readonly TSeries _close = new("close"); - private readonly TSeries _volume = new("volume"); - private readonly TSeries _hl2 = new("HL2"); - private readonly TSeries _oc2 = new("OC2"); - private readonly TSeries _ohl3 = new("OHL3"); - private readonly TSeries _hlc3 = new("HLC3"); - private readonly TSeries _ohlc4 = new("OHLC4"); - private readonly TSeries _hlcc4 = new("HLCC4"); - - 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 TBars() { } - - public TBars(string Name) - { - this.Name = Name; - } - - public (DateTime t, double o, double h, double l, double c, double v) Last => this[^1]; - public TBars Tail(int count = 10) - { - TBars outBars = new(); - if (count > this.Count) { count = this.Count; } - for (int i = this.Count - count; i < this.Count; i++) { outBars.Add(this[i]); } - return outBars; - } - 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 => "HLC3", - 8 => "OHLC4", - _ => "HLCC4", - }; - } - - public virtual (DateTime t, double v) Add((double o, double h, double l, double c, double v) p, bool update = false) => - Add((t: (this.Count == 0) ? DateTime.Today : this[^1].t.AddDays(1), p.o, p.h, p.l, p.c, p.v), update); - - public virtual (DateTime t, double v) Add(double o, double h, double l, double c, double v, bool update = false) => - Add((o, h, l, c, v), update); - - public virtual (DateTime t, double v) Add(DateTime t, double o, double h, double l, double c, double v, bool update = false) => - this.Add((t, o, h, l, c, v), update); - - public virtual (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - if (update) { this[^1] = TBar; } else { base.Add(TBar); } - - _open.Add((TBar.t, TBar.o), update); - _high.Add((TBar.t, TBar.h), update); - _low.Add((TBar.t, TBar.l), update); - _close.Add((TBar.t, TBar.c), update); - _volume.Add((TBar.t, TBar.v), update); - _hl2.Add((TBar.t, (TBar.h + TBar.l) * 0.5), update); - _oc2.Add((TBar.t, (TBar.o + TBar.c) * 0.5), update); - _ohl3.Add((TBar.t, (TBar.o + TBar.h + TBar.l) * 0.333333333333333), update); - _hlc3.Add((TBar.t, (TBar.h + TBar.l + TBar.c) * 0.333333333333333), update); - _ohlc4.Add((TBar.t, (TBar.o + TBar.h + TBar.l + TBar.c) * 0.25), update); - _hlcc4.Add((TBar.t, (TBar.h + TBar.l + TBar.c + TBar.c) * 0.25), update); - - this.OnEvent(update); - return (TBar.t, (TBar.o + TBar.h + TBar.l + TBar.c) * 0.25); - } - - public delegate void NewDataEventHandler(object source, TSeriesEventArgs args); - public event NewDataEventHandler Pub; - protected virtual void OnEvent(bool update = false) - { - if (Pub != null && Pub.Target != this) - { - Pub(this, new TSeriesEventArgs { update = update }); - } - } - - public void Sub(object source, TSeriesEventArgs e) - { - TBars ss = (TBars)source; if (ss.Count > 1) - { - for (int i = 0; i < ss.Count; i++) { this.Add(ss[i]); } - } - else - { - this.Add(ss[^1], e.update); - } - } - - /// common helpers - public static void BufferTrim(System.Collections.Generic.List buffer, double value, int period, bool update) - { - if (!update) - { - buffer.Add(value); - if (buffer.Count > period && period > 0) { buffer.RemoveAt(0); } - return; - } - buffer[^1] = value; - } - public virtual void Reset() - { - } -} diff --git a/archive/Calculations/_Updated/TEMA_Series.cs b/archive/Calculations/_Updated/TEMA_Series.cs deleted file mode 100644 index f1720fad..00000000 --- a/archive/Calculations/_Updated/TEMA_Series.cs +++ /dev/null @@ -1,134 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -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 - - */ - -public class TEMA_Series : TSeries -{ - private double _k; - private double _sum, _oldsum; - private double _lastema1, _oldema1, _lastema2, _oldema2, _lastema3, _oldema3; - private int _len; - private readonly bool _useSMA; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructor - public TEMA_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - _useSMA = useSMA; - Name = $"TEMA({period})"; - _k = 2.0 / (_period + 1); - _len = 0; - _sum = _oldsum = _lastema1 = _lastema2 = _lastema3 = 0; - } - public TEMA_Series() : this(0, false, true) { } - public TEMA_Series(int period) : this(period, false, true) { } - public TEMA_Series(TBars source) : this(source.Close, 0, false) { } - public TEMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public TEMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public TEMA_Series(TSeries source, int period) : this(source, period, false, true) { } - public TEMA_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - public TEMA_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) - { - _lastema1 = _oldema1; - _lastema2 = _oldema2; - _lastema3 = _oldema3; - _sum = _oldsum; - } - else - { - _oldema1 = _lastema1; - _oldema2 = _lastema2; - _oldema3 = _lastema3; - _oldsum = _sum; - _len++; - } - - if (_period == 0) { _k = 2.0 / (_len + 1); } - - double _ema1, _ema2, _ema3, _tema; - if (this.Count == 0) - { - _ema1 = _ema2 = _ema3 = _sum = TValue.v; - } - else if (_len <= _period && _useSMA && _period != 0) - { - _sum += TValue.v; - _ema1 = _sum / Math.Min(_len, _period); - _ema2 = _ema1; - _ema3 = _ema2; - } - else - { - _ema1 = (TValue.v - _lastema1) * _k + _lastema1; - _ema2 = (_ema1 - _lastema2) * _k + _lastema2; - _ema3 = (_ema2 - _lastema3) * _k + _lastema3; - } - - _tema = (3 * (_ema1 - _ema2)) + _ema3; - - _lastema1 = Double.IsNaN(_ema1) ? _lastema1 : _ema1; - _lastema2 = Double.IsNaN(_ema2) ? _lastema2 : _ema2; - _lastema3 = Double.IsNaN(_ema3) ? _lastema3 : _ema3; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _tema); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _sum = _oldsum = _lastema1 = _lastema2 = 0; - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/TRIMA_Series.cs b/archive/Calculations/_Updated/TRIMA_Series.cs deleted file mode 100644 index 3c972143..00000000 --- a/archive/Calculations/_Updated/TRIMA_Series.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -TRIMA: Triangular Moving Average - A weighted moving average where the shape of the weights are triangular and the greatest - weight is in the middle of the period, - -Sources: - https://www.tradingtechnologies.com/help/x-study/technical-indicator-definitions/triangular-moving-average-trima/ - -Remark: - trima = sma(sma(signal, n/2), n/2) - - */ - -public class TRIMA_Series : TSeries -{ - private readonly int _p1a, _p1b; - private readonly SMA_Series sma, trima; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public TRIMA_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"xMA({period})"; - _p1a = (int)Math.Floor((period * 0.5) + 1); - _p1b = (int)Math.Ceiling(0.5 * period); - sma = new(_p1a); - trima = new(_p1b); - - } - public TRIMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public TRIMA_Series() : this(period: 0, useNaN: false) { } - public TRIMA_Series(int period) : this(period: period, useNaN: false) { } - public TRIMA_Series(TBars source) : this(source.Close, 0, false) { } - public TRIMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public TRIMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public TRIMA_Series(TSeries source) : this(source, 0, false) { } - public TRIMA_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - - var _sma = sma.Add(TValue, update); - var _trima = trima.Add(_sma, update); - - var res = (_trima.t, Count < _period - 1 && _NaN ? double.NaN : _trima.v); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - sma.Reset(); - trima.Reset(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/TRIX_Series.cs b/archive/Calculations/_Updated/TRIX_Series.cs deleted file mode 100644 index 490eeccb..00000000 --- a/archive/Calculations/_Updated/TRIX_Series.cs +++ /dev/null @@ -1,132 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -TRIX: Triple Exponential Average Oscillator - Developed by Jack Hutson in the early 1980s, the triple exponential average (TRIX) - has become a popular technical analysis tool to aid chartists in spotting diversions - and directional cues in stock trading patterns. - -Sources: - https://www.investopedia.com/terms/t/trix.asp - - */ - -public class TRIX_Series : TSeries -{ - private readonly double _k; - private readonly System.Collections.Generic.List _buffer1 = new(); - private readonly System.Collections.Generic.List _buffer2 = new(); - private readonly System.Collections.Generic.List _buffer3 = new(); - private double _lastema1, _lastema2, _lastema3; - private double _llastema1, _llastema2, _llastema3; - private int _len; - private readonly bool _useSMA; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - - public TRIX_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - _useSMA = useSMA; - Name = $"TRIX({period})"; - _k = 2.0 / (_period + 1); - _len = 0; - _lastema1 = _llastema1 = _lastema2 = _llastema2 = _lastema3 = _llastema3 = 0; - } - public TRIX_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public TRIX_Series() : this(0, false, true) { } - public TRIX_Series(int period) : this(period, false, true) { } - public TRIX_Series(TBars source) : this(source.Close, 0, false) { } - public TRIX_Series(TBars source, int period) : this(source.Close, period, false) { } - public TRIX_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public TRIX_Series(TSeries source, int period) : this(source, period, false, true) { } - public TRIX_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (double.IsNaN(TValue.v)) - { - return base.Add((TValue.t, Double.NaN), update); - } - if (_len == 0) { _lastema1 = _lastema2 = _lastema3 = TValue.v; } - if (update) { _lastema1 = _llastema1; _lastema2 = _llastema2; _lastema3 = _llastema3; } - else - { - _llastema1 = _lastema1; _llastema2 = _lastema2; _llastema3 = _lastema3; _len++; - } - - double _ema1, _ema2, _ema3; - if ((this.Count < _period) && _useSMA) - { - BufferTrim(_buffer1, TValue.v, _period, update); - _ema1 = 0; - for (int i = 0; i < _buffer1.Count; i++) { _ema1 += _buffer1[i]; } - _ema1 /= _buffer1.Count; - - BufferTrim(_buffer2, _ema1, _period, update); - _ema2 = 0; - for (int i = 0; i < _buffer2.Count; i++) { _ema2 += _buffer2[i]; } - _ema2 /= _buffer2.Count; - - BufferTrim(_buffer3, _ema2, _period, update); - _ema3 = 0; - for (int i = 0; i < _buffer3.Count; i++) { _ema3 += _buffer3[i]; } - _ema3 /= _buffer3.Count; - } - else - { - _ema1 = (TValue.v - _lastema1) * _k + _lastema1; - _ema2 = (_ema1 - _lastema2) * _k + _lastema2; - _ema3 = (_ema2 - _lastema3) * _k + _lastema3; - } - double _trix = 100 * (_ema3 - _lastema3) / _lastema3; - _lastema1 = _ema1; - _lastema2 = _ema2; - _lastema3 = _ema3; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _trix); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _len = 0; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/TR_Series.cs b/archive/Calculations/_Updated/TR_Series.cs deleted file mode 100644 index 49d942ce..00000000 --- a/archive/Calculations/_Updated/TR_Series.cs +++ /dev/null @@ -1,91 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -TR: True Range - True Range was introduced by J. Welles Wilder in his book New Concepts in Technical Trading Systems. - It measures the daily range plus any gap from the closing price of the preceding day. - -Calculation: - d1 = ABS(High - Low) - d2 = ABS(High - Previous close) - d3 = ABS(Previous close - Low) - TR = MAX(d1,d2,d3) - -Sources: - https://www.macroption.com/true-range/ - - */ - -public class TR_Series : TSeries -{ - protected readonly TBars _data; - private double _cm1, _cm1_o; - - //core constructors - public TR_Series() - { - Name = $"TR()"; - _cm1 = _cm1_o = double.NaN; - } - public TR_Series(TBars source) - { - _data = source; - Name = $"TR({(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _cm1 = _cm1_o = double.NaN; - _data.Pub += Sub; - Add(data: _data); - } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - - if (update) - { - _cm1 = _cm1_o; - } - else - { - _cm1_o = _cm1; - } - - if (_cm1 is double.NaN) - { - _cm1 = TBar.c; - } - - double d1 = Math.Abs(TBar.h - TBar.l); - double d2 = Math.Abs(_cm1 - TBar.h); - double d3 = Math.Abs(_cm1 - TBar.l); - _cm1 = TBar.c; - var ret = (TBar.t, Math.Max(d1, Math.Max(d2, d3))); - return base.Add(ret, update); - - } - - public new void Add(TBars data) - { - foreach (var item in data) { Add(item, false); } - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TBar: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TBar: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TBar: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _cm1 = _cm1_o = double.NaN; - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/TSeries.cs b/archive/Calculations/_Updated/TSeries.cs deleted file mode 100644 index 4763e6c3..00000000 --- a/archive/Calculations/_Updated/TSeries.cs +++ /dev/null @@ -1,137 +0,0 @@ -namespace QuanTAlib; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Data; -using System.Linq; - -/* -TSeries is the cornerstone of all QuanTAlib classes. - TSeries is a single List of tuples (time, value) and contains several operators, casts, overloads - and other helpers that simplify usage of library. - Think of TSeries as an equivalent of Numpy array. - - - includes Length property (to mimic array's method) - - includes publishing and subscribing methods that attach to events - - */ -public class TSeriesEventArgs : EventArgs -{ - public bool update { get; set; } -} - -public class TSeries : List<(DateTime t, double v)> -{ - private readonly (DateTime t, double v) Default = (DateTime.MinValue, double.NaN); - public IEnumerable t => this.Select(item => item.t); - public IEnumerable v => this.Select(item => item.v); - public (DateTime t, double v) Last => Count > 0 ? this[^1] : Default; - - public int Length => Count; - public string Name { get; set; } - public int Keep = 0; - - public TSeries() - { - this.Name = "data"; - } - - public TSeries(string Name) - { - this.Name = Name; - } - - public virtual (DateTime t, double v) Add(double v, bool update = false) - { - return Add((t: Count == 0 ? DateTime.Today : this[^1].t.AddDays(1), v), update); - } - - public virtual (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - if (update) - { - this[^1] = TValue; - } - else - { - base.Add(TValue); - } - - OnEvent(update); - return TValue; - } - - public virtual (DateTime t, double v) Add((DateTime t, double o, double h, double l, double c, double v) TBar, bool update = false) - { - if (update) - { - this[this.Count - 1] = (TBar.t, TBar.c); - } - else - { - base.Add((TBar.t, TBar.c)); - } - - OnEvent(update); - return (TBar.t, TBar.c); - } - - public virtual (DateTime t, double v) Add(TSeries data) - { - foreach (var item in data) { Add(item); } - return data.Last; - } - - public virtual (DateTime t, double v) Add(TBars data) - { - foreach (var item in data) { Add(item.c, false); } - return (data.Last.t, data.Last.c); - } - - public void Sub(object source, TSeriesEventArgs e) - { - var data = (TSeries)source; - if (data == null) { return; } - foreach (var item in data) { Add(item); } - } - - public delegate void NewEventHandler(object source, TSeriesEventArgs args); - - public event NewEventHandler Pub; - - protected virtual void OnEvent(bool update = false) - { - if (Keep > 0) - { - TrimToSize(keep: Keep); - } - Pub?.Invoke(this, new TSeriesEventArgs { update = update }); - } - - /// common helpers - public static void BufferTrim(List buffer, double value, int period, bool update) - { - if (!update) - { - buffer.Add(value); - if (buffer.Count > period && period > 0) { buffer.RemoveAt(0); } - return; - } - buffer[^1] = value; - } - public virtual void Reset() - { - } - - public void TrimToSize(int keep) - { - if (keep >= this.Count) - { - return; // No need to trim if the series is already smaller than or equal to n - } - - // Remove elements from the beginning of the list - int elementsToRemove = this.Count - keep; - RemoveRange(0, elementsToRemove); - } -} diff --git a/archive/Calculations/_Updated/VAR_Series.cs b/archive/Calculations/_Updated/VAR_Series.cs deleted file mode 100644 index 4f03e12d..00000000 --- a/archive/Calculations/_Updated/VAR_Series.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -VAR: Population Variance - Population variance without Bessel's correction - -Sources: - https://en.wikipedia.org/wiki/Variance - Bessel's correction: https://en.wikipedia.org/wiki/Bessel%27s_correction - -Remark: - VAR (Population Variance) is also known as a biased Sample Variance. For unbiased - sample variance use SVAR instead. - - */ - -public class VAR_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public VAR_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"VAR({period})"; - } - public VAR_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public VAR_Series() : this(period: 0, useNaN: false) { } - public VAR_Series(int period) : this(period: period, useNaN: false) { } - public VAR_Series(TBars source) : this(source.Close, 0, false) { } - public VAR_Series(TBars source, int period) : this(source.Close, period, false) { } - public VAR_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public VAR_Series(TSeries source) : this(source, 0, false) { } - public VAR_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - double _pvar = 0; - for (int i = 0; i < _buffer.Count; i++) { _pvar += (_buffer[i] - _sma) * (_buffer[i] - _sma); } - _pvar /= this._buffer.Count; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _pvar); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/WMAPE_Series.cs b/archive/Calculations/_Updated/WMAPE_Series.cs deleted file mode 100644 index 55935b85..00000000 --- a/archive/Calculations/_Updated/WMAPE_Series.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -WMAPE: Weighted Mean Absolute Percentage Error - Measures the size of the error in percentage terms. Improves problems with MAPE - when there are zero or close-to-zero values because there would be a division by zero - or values of MAPE tending to infinity. - -Sources: - https://en.wikipedia.org/wiki/WMAPE - - */ - -public class WMAPE_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public WMAPE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"WMAPE({period})"; - } - public WMAPE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public WMAPE_Series() : this(period: 0, useNaN: false) { } - public WMAPE_Series(int period) : this(period: period, useNaN: false) { } - public WMAPE_Series(TBars source) : this(source.Close, 0, false) { } - public WMAPE_Series(TBars source, int period) : this(source.Close, period, false) { } - public WMAPE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public WMAPE_Series(TSeries source) : this(source, 0, false) { } - public WMAPE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - - double _sma = _buffer.Average(); - - 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 != 0) ? _wmape / _div : double.PositiveInfinity; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _wmape); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/WMA_Series.cs b/archive/Calculations/_Updated/WMA_Series.cs deleted file mode 100644 index 7fbf16a1..00000000 --- a/archive/Calculations/_Updated/WMA_Series.cs +++ /dev/null @@ -1,117 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -/* -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 : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - private System.Collections.Generic.List _weights; - protected int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - protected int _len; - public int Len - { - get { return _len; } - set { _len = value; } - } - - //core constructors - public WMA_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"WMA({period})"; - _len = 1; - _weights = CalculateWeights(_period); - } - public WMA_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public WMA_Series() : this(period: 0, useNaN: false) { } - public WMA_Series(int period) : this(period: period, useNaN: false) { } - public WMA_Series(TBars source) : this(source.Close, 0, false) { } - public WMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public WMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public WMA_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - if (_period == 0) - { - _weights = CalculateWeights(_len); - _len++; - } - double _wma = 0; - double totalWeights = (_buffer.Count * (_buffer.Count + 1)) * 0.5; - object lockObj = new object(); - Parallel.For(0, _buffer.Count, i => - { - double temp = _buffer[i] * this._weights[i]; - lock (lockObj) { _wma += temp; } - }); - _wma /= totalWeights; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _wma); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //calculating weights - private static List CalculateWeights(int period) - { - List weights = new List(period); - for (int i = 0; i < period; i++) - { - weights.Add(i + 1); - } - return weights; - } - - //reset calculation - public override void Reset() - { - _len = 0; - _weights = CalculateWeights(_period); - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ZLEMA_Series.cs b/archive/Calculations/_Updated/ZLEMA_Series.cs deleted file mode 100644 index 676e7fe5..00000000 --- a/archive/Calculations/_Updated/ZLEMA_Series.cs +++ /dev/null @@ -1,105 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -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) - -Remark: - 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 : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - private int _len; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly EMA_Series _ema; - - //core constructor - public ZLEMA_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - Name = $"ZLEMA({period})"; - _len = 1; - _ema = new(period); - } - //generic constructors (source) - - public ZLEMA_Series() : this(0, false, true) { } - public ZLEMA_Series(int period) : this(period, false, true) { } - public ZLEMA_Series(TBars source) : this(source.Close, 0, false) { } - public ZLEMA_Series(TBars source, int period) : this(source.Close, period, false) { } - public ZLEMA_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public ZLEMA_Series(TSeries source, int period) : this(source, period, false, true) { } - public ZLEMA_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - public ZLEMA_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - int _lag; - if (_period == 0) - { - _lag = (int)((_len - 1) * 0.5); - _len++; - } - else { _lag = (int)((_period - 1) * 0.5); } - _lag = Math.Min(_lag, _buffer.Count - 1); - _lag = Math.Max(_lag, 0) + 1; - double _zlValue = 2 * TValue.v - _buffer[^_lag]; - double _zlema = _ema.Add((TValue.t, _zlValue), update).v; - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _zlema); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - _ema.Reset(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ZL_Series.cs b/archive/Calculations/_Updated/ZL_Series.cs deleted file mode 100644 index ee7aa4ce..00000000 --- a/archive/Calculations/_Updated/ZL_Series.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace QuanTAlib; - -using System; -using System.Linq; - -/* -ZL: Zero Lag - Data is de-lagged by removing the data from “lag” days ago, thus removing - (or attempting to) the cumulative effect of the moving average. - -Calculation: - Lag = (Period-1)/2 - ZL = Data + (Data - Data(Lag days ago) ) - -Sources: - https://mudrex.com/blog/zero-lag-ema-trading-strategy/ - - */ - -public class ZL_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - private int _len; - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - private readonly EMA_Series _ema; - - //core constructor - public ZL_Series(int period, bool useNaN, bool useSMA) - { - _period = period; - _NaN = useNaN; - Name = $"ZL({period})"; - _len = 1; - _ema = new(period); - } - //generic constructors (source) - - public ZL_Series() : this(0, false, true) { } - public ZL_Series(int period) : this(period, false, true) { } - public ZL_Series(TBars source) : this(source.Close, 0, false) { } - public ZL_Series(TBars source, int period) : this(source.Close, period, false) { } - public ZL_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public ZL_Series(TSeries source, int period) : this(source, period, false, true) { } - public ZL_Series(TSeries source, int period, bool useNaN) : this(source, period, useNaN, true) { } - public ZL_Series(TSeries source, int period, bool useNaN, bool useSMA) : this(period, useNaN, useSMA) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - int _lag; - if (_period == 0) - { - _lag = (int)((_len - 1) * 0.5); - _len++; - } - else { _lag = (int)((_period - 1) * 0.5); } - _lag = Math.Min(_lag, _buffer.Count - 1); - _lag = Math.Max(_lag, 0) + 1; - double _zlValue = 2 * TValue.v - _buffer[^_lag]; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _zlValue); - return base.Add(res, update); - } - - //variation of Add() - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - _ema.Reset(); - } -} \ No newline at end of file diff --git a/archive/Calculations/_Updated/ZSCORE_Series.cs b/archive/Calculations/_Updated/ZSCORE_Series.cs deleted file mode 100644 index 52c45d70..00000000 --- a/archive/Calculations/_Updated/ZSCORE_Series.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System.Linq; - -namespace QuanTAlib; -using System; -using System.Collections.Generic; - -/* -ZSCORE: number of standard deviations from SMA - Z-score describes a value's relationship to the mean of a series, as measured in - terms of standard deviations from the mean. If a Z-score is 0, it indicates that - the data point's score is identical to the mean score. A Z-score of 1.0 would - indicate a value that is one standard deviation from the mean. Z-scores may be - positive or negative, with a positive value indicating the score is above the - mean and a negative score indicating it is below the mean. - -Sources: - https://en.wikipedia.org/wiki/Z-score - https://www.investopedia.com/terms/z/zscore.asp - -Calculation: - std = std * STDEV(close, length) - mean = SMA(close, length) - ZSCORE = (close - mean) / std - - */ - -public class ZSCORE_Series : TSeries -{ - private readonly System.Collections.Generic.List _buffer = new(); - protected readonly int _period; - protected readonly bool _NaN; - protected readonly TSeries _data; - - //core constructors - public ZSCORE_Series(int period, bool useNaN) - { - _period = period; - _NaN = useNaN; - Name = $"ZSCORE({period})"; - } - public ZSCORE_Series(TSeries source, int period, bool useNaN) : this(period, useNaN) - { - _data = source; - Name = Name.Substring(0, Name.IndexOf(")")) + $", {(string.IsNullOrEmpty(_data.Name) ? "data" : _data.Name)})"; - _data.Pub += Sub; - Add(_data); - } - public ZSCORE_Series() : this(period: 0, useNaN: false) { } - public ZSCORE_Series(int period) : this(period: period, useNaN: false) { } - public ZSCORE_Series(TBars source) : this(source.Close, 0, false) { } - public ZSCORE_Series(TBars source, int period) : this(source.Close, period, false) { } - public ZSCORE_Series(TBars source, int period, bool useNaN) : this(source.Close, period, useNaN) { } - public ZSCORE_Series(TSeries source) : this(source, 0, false) { } - public ZSCORE_Series(TSeries source, int period) : this(source: source, period: period, useNaN: false) { } - - ////////////////// - // core Add() algo - public override (DateTime t, double v) Add((DateTime t, double v) TValue, bool update = false) - { - BufferTrim(buffer: _buffer, value: TValue.v, period: _period, update: update); - double _sma = _buffer.Average(); - - 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); - double _zscore = (_psdev == 0) ? 1 : (TValue.v - _sma) / _psdev; - - var res = (TValue.t, Count < _period - 1 && _NaN ? double.NaN : _zscore); - return base.Add(res, update); - } - - public override (DateTime t, double v) Add(TSeries data) - { - if (data == null) { return (DateTime.Today, Double.NaN); } - foreach (var item in data) { Add(item, false); } - return _data.Last; - } - public (DateTime t, double v) Add(bool update) - { - return this.Add(TValue: _data.Last, update: update); - } - public (DateTime t, double v) Add() - { - return Add(TValue: _data.Last, update: false); - } - private new void Sub(object source, TSeriesEventArgs e) - { - Add(TValue: _data.Last, update: e.update); - } - - //reset calculation - public override void Reset() - { - _buffer.Clear(); - } -} \ No newline at end of file diff --git a/archive/Indicators/Charts/2MACross_chart.cs b/archive/Indicators/Charts/2MACross_chart.cs deleted file mode 100644 index d655896b..00000000 --- a/archive/Indicators/Charts/2MACross_chart.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System; -using System.Drawing; -using System.Linq; -using TradingPlatform.BusinessLayer; -namespace QuanTAlib; - -public class MovingAverage_chart : Indicator -{ - #region Parameters - [InputParameter("MA1: Type:", 0, variants: new object[] - { "SMA", 0, "EMA", 1, "WMA", 2, "T3", 3, "SMMA", 4, "TRIMA", 5, "DWMA", 6, "FWMA", 7, "DEMA", 8, "TEMA", 9, - "ALMA", 10, "HMA", 11, "HEMA", 12, "MAMA", 13, "KAMA", 14, "ZLEMA", 15, "JMA", 16})] - private int MA1type = 15; - - [InputParameter("MA1: Smoothing period:", 1, 1, 999, 1, 1)] - private int MA1Period = 10; - - [InputParameter("MA1: Data source:", 2, 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 MA1DataSource = 3; - - [InputParameter("MA2: Type:", 3, variants: new object[] - { "SMA", 0, "EMA", 1, "WMA", 2, "T3", 3, "SMMA", 4, "TRIMA", 5, "DWMA", 6, "FWMA", 7, "DEMA", 8, "TEMA", 9, - "ALMA", 10, "HMA", 11, "HEMA", 12, "MAMA", 13, "KAMA", 14, "ZLEMA", 15, "JMA", 16})] - private int MA2type = 16; - - [InputParameter("MA2: Smoothing period:", 4, 1, 999, 1, 1)] - private int MA2Period = 50; - - [InputParameter("MA2: Data source:", 5, 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 MA2DataSource = 8; - - [InputParameter("Long trades", 6)] - private bool LongTrades = true; - - [InputParameter("Short trades", 6)] - private bool ShortTrades = true; - - #endregion Parameters - - protected HistoricalData History; - private TBars bars; - - /////// - private TSeries MA1, MA2; - private CROSS_Series trades; - private COMPARE_Series overunder; - - /////// - - public MovingAverage_chart() - { - this.SeparateWindow = false; - this.Name = "MAs Crossover"; - this.AddLineSeries("MA1", Color.LimeGreen, 2, LineStyle.Solid); - this.AddLineSeries("MA2", Color.OrangeRed, 2, LineStyle.Solid); - } - - protected override void OnInit() - { - this.bars = new(); - this.History = this.Symbol.GetHistory(period: this.HistoricalData.Period, fromTime: HistoricalData.FromTime); - for (int i = this.History.Count - 1; i >= 0; i--) - { - var rec = this.History[i, SeekOriginHistory.Begin]; - bars.Add(rec.TimeLeft, rec[PriceType.Open], - rec[PriceType.High], rec[PriceType.Low], - rec[PriceType.Close], rec[PriceType.Volume]); - } - this.Name = "MAs Cross: [ "; - switch (MA1type) - { - case 0: - MA1 = new SMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"SMA"; - break; - case 1: - MA1 = new EMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"EMA"; - break; - case 2: - MA1 = new WMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"WMA"; - break; - case 3: - MA1 = new T3_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"T3"; - break; - case 4: - MA1 = new SMMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"SMMA"; - break; - case 5: - MA1 = new TRIMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"TRIMA"; - break; - case 6: - MA1 = new DWMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"DWMA"; - break; - case 7: - MA1 = new FWMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period); - this.Name += $"FWMA"; - break; - case 8: - MA1 = new DEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"DEMA"; - break; - case 9: - MA1 = new TEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"TEMA"; - break; - case 10: - MA1 = new ALMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"ALMA"; - break; - case 11: - MA1 = new HMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"HMA"; - break; - case 12: - MA1 = new HEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"HEMA"; - break; - case 13: - double factor = 1.015 * Math.Exp(-0.043 * (double)this.MA1Period); - MA1 = new MAMA_Series(source: bars.Select(this.MA1DataSource), fastlimit: factor, slowlimit: factor * 0.1, useNaN: false); - this.Name += $"MAMA"; - break; - case 14: - MA1 = new KAMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"KAMA"; - break; - case 15: - MA1 = new ZLEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"ZLEMA"; - break; - default: - MA1 = new JMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"JMA"; - break; - } - - this.Name = this.Name + $" ({MA1Period}:{TBars.SelectStr(this.MA1DataSource)}) : "; - - switch (MA2type) - { - case 0: - MA2 = new SMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"SMA"; - break; - case 1: - MA2 = new EMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"EMA"; - break; - case 2: - MA2 = new WMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"WMA"; - break; - case 3: - MA2 = new T3_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"T3"; - break; - case 4: - MA2 = new SMMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"SMMA"; - break; - case 5: - MA2 = new TRIMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"TRIMA"; - break; - case 6: - MA2 = new DWMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"DWMA"; - break; - case 7: - MA2 = new FWMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period); - this.Name += $"FWMA"; - break; - case 8: - MA2 = new DEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"DEMA"; - break; - case 9: - MA2 = new TEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"TEMA"; - break; - case 10: - MA2 = new ALMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"ALMA"; - break; - case 11: - MA2 = new HMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"HMA"; - break; - case 12: - MA2 = new HEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"HEMA"; - break; - case 13: - double factor = 1.015 * Math.Exp(-0.043 * (double)this.MA2Period); - MA2 = new MAMA_Series(source: bars.Select(this.MA2DataSource), fastlimit: factor, slowlimit: factor * 0.1, useNaN: false); - this.Name += $"MAMA"; - break; - case 14: - MA2 = new KAMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"KAMA"; - break; - case 15: - MA2 = new ZLEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"ZLEMA"; - break; - default: - MA2 = new JMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"JMA"; - break; - } - this.Name += $"({MA2Period}:{TBars.SelectStr(this.MA2DataSource)}) ]"; - - int maxKeep = Math.Max(Math.Max(this.MA1Period, this.MA2Period), 100); - MA1.Keep = maxKeep; - MA2.Keep = maxKeep; - trades.Keep = maxKeep; - overunder.Keep = maxKeep; - - overunder = new(MA1, MA2); - trades = new(MA1, MA2); - } - - 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.SetValue(this.MA1[^1].v, lineIndex: 0); - this.SetValue(this.MA2[^1].v, lineIndex: 1); - - if (trades[^1].v == 1) - { - this.EndCloud(0, 1, Color.Empty); - if (LongTrades) - { - this.LinesSeries[0].SetMarker(0, new IndicatorLineMarker(Color.LimeGreen, bottomIcon: IndicatorLineMarkerIconType.UpArrow)); - this.BeginCloud(0, 1, Color.FromArgb(127, Color.Green)); - } - if (ShortTrades) - { - this.LinesSeries[1].SetMarker(0, new IndicatorLineMarker(Color.OrangeRed, upperIcon: IndicatorLineMarkerIconType.DownArrow)); - } - } - if (trades[^1].v == -1) - { - this.EndCloud(0, 1, Color.Empty); - if (ShortTrades) - { - this.LinesSeries[1].SetMarker(0, new IndicatorLineMarker(Color.OrangeRed, upperIcon: IndicatorLineMarkerIconType.UpArrow)); - this.BeginCloud(0, 1, Color.FromArgb(127, Color.Red)); - } - if (LongTrades) - { - this.LinesSeries[0].SetMarker(0, new IndicatorLineMarker(Color.LimeGreen, bottomIcon: IndicatorLineMarkerIconType.DownArrow)); - } - } - } - public override void OnPaintChart(PaintChartEventArgs args) - { - base.OnPaintChart(args); - if (this.CurrentChart == null) { return; } - Graphics graphics = args.Graphics; - var mainWindow = this.CurrentChart.MainWindow; - int leftIndex = (int)mainWindow.CoordinatesConverter.GetBarIndex(mainWindow.CoordinatesConverter.GetTime(mainWindow.ClientRectangle.Left)); - int rightIndex = (int)Math.Ceiling(mainWindow.CoordinatesConverter.GetBarIndex(mainWindow.CoordinatesConverter.GetTime(mainWindow.ClientRectangle.Right))); - int historycount = HistoricalData.Count; - int ymax = mainWindow.ClientRectangle.Height; - int xmax = mainWindow.ClientRectangle.Width; - - /* - for (int i = leftIndex; i <= rightIndex; i++) { - int xi = (int)Math.Round(mainWindow.CoordinatesConverter.GetChartX(Time(Count - 1 - i))); - int width = this.CurrentChart.BarsWidth; - int height = (int)((equity[i+historycount].v) *proportion); - - Brush bb = Brushes.DarkSlateGray; - bb = (overunder[i+historycount].v>0 && LongTrades)? Brushes.Green : bb; - bb = (overunder[i + historycount].v < 0 && ShortTrades) ? Brushes.Red : bb; - - graphics.FillRectangle(bb, xi, ymax - height, width, height); - } - */ - } -} diff --git a/archive/Indicators/Charts/2MASlope_chart.cs b/archive/Indicators/Charts/2MASlope_chart.cs deleted file mode 100644 index db75d157..00000000 --- a/archive/Indicators/Charts/2MASlope_chart.cs +++ /dev/null @@ -1,320 +0,0 @@ -using System; -using System.Drawing; -using System.Linq; -using TradingPlatform.BusinessLayer; -namespace QuanTAlib; - -public class MovingAverageSlope_chart : Indicator -{ - #region Parameters - [InputParameter("MA1: Type:", 0, variants: new object[] - { "SMA", 0, "EMA", 1, "WMA", 2, "T3", 3, "SMMA", 4, "TRIMA", 5, "DWMA", 6, "FWMA", 7, "DEMA", 8, "TEMA", 9, - "ALMA", 10, "HMA", 11, "HEMA", 12, "MAMA", 13, "KAMA", 14, "ZLEMA", 15, "JMA", 16})] - private int MA1type = 16; - - [InputParameter("MA1: Smoothing period:", 1, 1, 999, 1, 1)] - private int MA1Period = 10; - - [InputParameter("MA1: Data source:", 2, 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 MA1DataSource = 3; - - [InputParameter("MA2: Type:", 3, variants: new object[] - { "SMA", 0, "EMA", 1, "WMA", 2, "T3", 3, "SMMA", 4, "TRIMA", 5, "DWMA", 6, "FWMA", 7, "DEMA", 8, "TEMA", 9, - "ALMA", 10, "HMA", 11, "HEMA", 12, "MAMA", 13, "KAMA", 14, "ZLEMA", 15, "JMA", 16})] - private int MA2type = 6; - - [InputParameter("MA2: Smoothing period:", 4, 1, 999, 1, 1)] - private int MA2Period = 50; - - [InputParameter("MA2: Data source:", 5, 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 MA2DataSource = 8; - - [InputParameter("Data required for slope calc:", 6, 2, 10, 1, 1)] - private int SlopePeriod = 3; - - [InputParameter("Long trades", 7)] - private bool LongTrades = true; - - [InputParameter("Short trades", 8)] - private bool ShortTrades; - - #endregion Parameters - - protected HistoricalData History; - private TBars bars; - - /////// - private TSeries MA1, MA2; - private SLOPE_Series sMA1, sMA2; - private CROSS_Series sig1, sig2; - - private bool inLong, inShort; - /////// - - public MovingAverageSlope_chart() - { - this.SeparateWindow = false; - this.Name = "Slopes convergence"; - this.AddLineSeries("MA1", Color.DarkSlateGray, 2, LineStyle.Solid); - this.AddLineSeries("MA2", Color.DarkSlateGray, 2, LineStyle.Solid); - } - - protected override void OnInit() - { - this.bars = new(); - this.History = this.Symbol.GetHistory(period: this.HistoricalData.Period, fromTime: HistoricalData.FromTime); - for (int i = this.History.Count - 1; i >= 0; i--) - { - var rec = this.History[i, SeekOriginHistory.Begin]; - bars.Add(rec.TimeLeft, rec[PriceType.Open], - rec[PriceType.High], rec[PriceType.Low], - rec[PriceType.Close], rec[PriceType.Volume]); - } - this.Name = "Slopes convergence: [ "; - switch (MA1type) - { - case 0: - MA1 = new SMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"SMA"; - break; - case 1: - MA1 = new EMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"EMA"; - break; - case 2: - MA1 = new WMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"WMA"; - break; - case 3: - MA1 = new T3_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"T3"; - break; - case 4: - MA1 = new SMMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"SMMA"; - break; - case 5: - MA1 = new TRIMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"TRIMA"; - break; - case 6: - MA1 = new DWMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"DWMA"; - break; - case 7: - MA1 = new FWMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period); - this.Name += $"FWMA"; - break; - case 8: - MA1 = new DEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"DEMA"; - break; - case 9: - MA1 = new TEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"TEMA"; - break; - case 10: - MA1 = new ALMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"ALMA"; - break; - case 11: - MA1 = new HMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"HMA"; - break; - case 12: - MA1 = new HEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"HEMA"; - break; - case 13: - double factor = 1.015 * Math.Exp(-0.043 * (double)this.MA1Period); - MA1 = new MAMA_Series(source: bars.Select(this.MA1DataSource), fastlimit: factor, slowlimit: factor * 0.1, useNaN: false); - this.Name += $"MAMA"; - break; - case 14: - MA1 = new KAMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"KAMA"; - break; - case 15: - MA1 = new ZLEMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"ZLEMA"; - break; - default: - MA1 = new JMA_Series(source: bars.Select(this.MA1DataSource), period: this.MA1Period, useNaN: false); - this.Name += $"JMA"; - break; - } - - this.Name = this.Name + $" ({MA1Period}:{TBars.SelectStr(this.MA1DataSource)}) : "; - - switch (MA2type) - { - case 0: - MA2 = new SMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"SMA"; - break; - case 1: - MA2 = new EMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"EMA"; - break; - case 2: - MA2 = new WMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"WMA"; - break; - case 3: - MA2 = new T3_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"T3"; - break; - case 4: - MA2 = new SMMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"SMMA"; - break; - case 5: - MA2 = new TRIMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"TRIMA"; - break; - case 6: - MA2 = new DWMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"DWMA"; - break; - case 7: - MA2 = new FWMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period); - this.Name += $"FWMA"; - break; - case 8: - MA2 = new DEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"DEMA"; - break; - case 9: - MA2 = new TEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"TEMA"; - break; - case 10: - MA2 = new ALMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"ALMA"; - break; - case 11: - MA2 = new HMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"HMA"; - break; - case 12: - MA2 = new HEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"HEMA"; - break; - case 13: - double factor = 1.015 * Math.Exp(-0.043 * (double)this.MA2Period); - MA2 = new MAMA_Series(source: bars.Select(this.MA2DataSource), fastlimit: factor, slowlimit: factor * 0.1, useNaN: false); - this.Name += $"MAMA"; - break; - case 14: - MA2 = new KAMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"KAMA"; - break; - case 15: - MA2 = new ZLEMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"ZLEMA"; - break; - default: - MA2 = new JMA_Series(source: bars.Select(this.MA2DataSource), period: this.MA2Period, useNaN: false); - this.Name += $"JMA"; - break; - } - this.Name += $"({MA2Period}:{TBars.SelectStr(this.MA2DataSource)}) ]"; - - sMA1 = new(MA1, SlopePeriod); - sMA2 = new(MA2, SlopePeriod); - sig1 = new(sMA1, 0); - sig2 = new(sMA2, 0); - - int maxKeep = Math.Max(Math.Max(this.MA1Period, this.MA2Period), 100); - - MA1.Keep = maxKeep; - MA2.Keep = maxKeep; - sMA1.Keep = maxKeep; - sMA2.Keep = maxKeep; - sig1.Keep = maxKeep; - sig2.Keep = maxKeep; - } - - protected override void OnUpdate(UpdateArgs args) - { - bool update = !(args.Reason == UpdateReason.NewBar || - args.Reason == UpdateReason.HistoricalBar); - this.bars.Add(this.Time(), this.Open(), this.High(), this.Low(), this.Close(), this.Volume(), update); - this.SetValue(this.MA1[^1].v, lineIndex: 0); - this.SetValue(this.MA2[^1].v, lineIndex: 1); - - Color s1Color = (this.sMA1[^1].v > 0) ? Color.LimeGreen : Color.OrangeRed; - Color s2Color = (this.sMA2[^1].v > 0) ? Color.LimeGreen : Color.OrangeRed; - - this.LinesSeries[0].SetMarker(0, s1Color); - this.LinesSeries[1].SetMarker(0, s2Color); - - if (sig1[^1].v > 0 || sig2[^1].v > 0) - { - if (sMA1[^1].v >= 0 && sMA2[^1].v >= 0 && LongTrades) - { - inLong = true; - this.BeginCloud(0, 1, Color.FromArgb(127, Color.DarkGreen)); - this.LinesSeries[(this.MA1[^1].v < this.MA2[^1].v) ? 0 : 1].SetMarker(0, new IndicatorLineMarker(Color.LimeGreen, bottomIcon: IndicatorLineMarkerIconType.UpArrow)); - } - else - { - this.EndCloud(0, 1, Color.Empty); - if (inShort && this.Count > 1) - { - this.LinesSeries[(this.MA1[^1].v < this.MA2[^1].v) ? 1 : 0].SetMarker(1, new IndicatorLineMarker(Color.OrangeRed, upperIcon: IndicatorLineMarkerIconType.DownArrow)); - inShort = false; - } - } - } - - if (sig1[^1].v < 0 || sig2[^1].v < 0) - { - if (sMA1[^1].v <= 0 && sMA2[^1].v <= 0 && ShortTrades) - { - inShort = true; - this.BeginCloud(0, 1, Color.FromArgb(100, Color.Red)); - this.LinesSeries[(this.MA1[^1].v > this.MA2[^1].v) ? 0 : 1].SetMarker(0, new IndicatorLineMarker(Color.OrangeRed, upperIcon: IndicatorLineMarkerIconType.UpArrow)); - } - else - { - this.EndCloud(0, 1, Color.Empty); - if (inLong && this.Count > 1) - { - LinesSeries[(this.MA1[^1].v > this.MA2[^1].v) ? 1 : 0].SetMarker(1, new IndicatorLineMarker(Color.LimeGreen, bottomIcon: IndicatorLineMarkerIconType.DownArrow)); - inLong = false; - } - } - } - } - public override void OnPaintChart(PaintChartEventArgs args) - { - base.OnPaintChart(args); - if (this.CurrentChart == null) { return; } - Graphics graphics = args.Graphics; - var mainWindow = this.CurrentChart.MainWindow; - int leftIndex = (int)mainWindow.CoordinatesConverter.GetBarIndex(mainWindow.CoordinatesConverter.GetTime(mainWindow.ClientRectangle.Left)); - int rightIndex = (int)Math.Ceiling(mainWindow.CoordinatesConverter.GetBarIndex(mainWindow.CoordinatesConverter.GetTime(mainWindow.ClientRectangle.Right))); - /* - int historycount = HistoricalData.Count; - int ymax = mainWindow.ClientRectangle.Height; - - - for (int i = leftIndex; i <= rightIndex; i++) { - int xi = (int)Math.Round(mainWindow.CoordinatesConverter.GetChartX(Time(Count - 1 - i))); - int width = this.CurrentChart.BarsWidth; - int height = (int)((equity[i+historycount].v) *proportion); - - Brush bb = Brushes.DarkSlateGray; - bb = (overunder[i+historycount].v>0 && LongTrades)? Brushes.Green : bb; - bb = (overunder[i + historycount].v < 0 && ShortTrades) ? Brushes.Red : bb; - - graphics.FillRectangle(bb, xi, ymax - height, width, height); - } - */ - } -} diff --git a/archive/Indicators/Charts/JMA_chart.cs b/archive/Indicators/Charts/JMA_chart.cs deleted file mode 100644 index 1f7ec9aa..00000000 --- a/archive/Indicators/Charts/JMA_chart.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Diagnostics; -using System.Drawing; -using System.Linq; -using TradingPlatform.BusinessLayer; -using TradingPlatform.BusinessLayer.Chart; -namespace QuanTAlib; - -public class JMA_chart : Indicator -{ - #region Parameters - - [InputParameter("Data source", 0, 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; - - [InputParameter("Smoothing period", 1, 1, 999, 1, 1)] - private int Period = 9; - - [InputParameter("Volatility short", 2, 3, 50, 1, 1)] - private int Vshort = 10; - - [InputParameter("Volatility long", 3, 20, 500, 1, 1)] - private int Vlong = 65; - - [InputParameter("Phase", 4, -100, 100, 1, 2)] - private double Jphase; - - #endregion Parameters - - /////// - private JMA_Series indicator; - /////// - - protected TBars bars; - protected IChartWindow mainWindow; - protected Graphics graphics; - protected int firstOnScreenBarIndex, lastOnScreenBarIndex; - protected HistoricalData History; - protected int HistPeriod; - public JMA_chart() - { - Name = "JMA - Jurik Moving Avg"; - Description = "Jurik Moving Average description"; - AddLineSeries(lineName: "JMA", lineColor: Color.Yellow, lineWidth: 3, lineStyle: LineStyle.Solid); - SeparateWindow = false; - HistPeriod = Period; - } - - - protected override void OnInit() - { - base.OnInit(); - bars = new(); - var dur1 = this.HistoricalData.FromTime; - var dur = this.HistoricalData.Period.Duration.TotalSeconds * (HistPeriod * 4); //seconds of two periods - - this.History = this.Symbol.GetHistory(period: this.HistoricalData.Period, fromTime: HistoricalData.FromTime); - - for (int i = this.History.Count - 1; i >= 0; i--) - { - - var rec = this.History[i, SeekOriginHistory.Begin]; - - bars.Add(rec.TimeLeft, rec[PriceType.Open], - rec[PriceType.High], rec[PriceType.Low], - rec[PriceType.Close], rec[PriceType.Volume]); - } - - indicator = new(source: bars.Select(DataSource), period: Period, phase: Jphase, vshort: Vshort, vlong: Vlong, useNaN: true); - indicator.Keep = Math.Max(Period, 100); - } - - protected override void OnUpdate(UpdateArgs args) - { - base.OnUpdate(args); - bars.Add(Time(), GetPrice(PriceType.Open), - GetPrice(PriceType.High), - GetPrice(PriceType.Low), - GetPrice(PriceType.Close), - GetPrice(PriceType.Volume), - update: !(args.Reason == UpdateReason.NewBar || args.Reason == UpdateReason.HistoricalBar)); - - this.SetValue(indicator[^1].v, lineIndex: 0); - } - public override void OnPaintChart(PaintChartEventArgs args) - { - base.OnPaintChart(args); - if (this.CurrentChart == null) - { - return; - } - - graphics = args.Graphics; - mainWindow = this.CurrentChart.MainWindow; - - DateTime leftTime = mainWindow.CoordinatesConverter.GetTime(mainWindow.ClientRectangle.Left); - DateTime rightTime = mainWindow.CoordinatesConverter.GetTime(mainWindow.ClientRectangle.Right); - firstOnScreenBarIndex = (int)mainWindow.CoordinatesConverter.GetBarIndex(leftTime); - lastOnScreenBarIndex = (int)Math.Ceiling(mainWindow.CoordinatesConverter.GetBarIndex(rightTime)); - } - -} diff --git a/archive/Indicators/Charts/TrailingStop.cs b/archive/Indicators/Charts/TrailingStop.cs deleted file mode 100644 index ad480826..00000000 --- a/archive/Indicators/Charts/TrailingStop.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Diagnostics; -using System.Drawing; -using System.Linq; -using TradingPlatform.BusinessLayer; -namespace QuanTAlib; - -public class TrailingStop_chart : Indicator -{ - #region Parameters - - [InputParameter("Period", 0, 1, 100, 1, 1)] - protected int _period = 30; - - [InputParameter("Factor", 1, 1, 100, 0.1, 1)] - protected double _factor = 10; - - [InputParameter("Long TS", 2)] - private bool _LongTS = true; - - [InputParameter("Short TS", 3)] - private bool _ShortTS = true; - - #endregion Parameters - - /////// - private HistoricalData History; - private TBars bars; - private ATR_Series _atr; - private double _tslineL, _ratchetL, _tslineS, _ratchetS; - - /////// - - public TrailingStop_chart() - { - Name = $"ATR Trailing Stop"; - AddLineSeries(lineName: "TrailingATR Long", lineColor: Color.Yellow, lineWidth: 1, lineStyle: LineStyle.Dot); - AddLineSeries(lineName: "Ratchet Long", lineColor: Color.Yellow, lineWidth: 3, lineStyle: LineStyle.Solid); - - AddLineSeries(lineName: "TrailingATR Short", lineColor: Color.Yellow, lineWidth: 1, lineStyle: LineStyle.Dot); - AddLineSeries(lineName: "Ratchet Short", lineColor: Color.Yellow, lineWidth: 3, lineStyle: LineStyle.Solid); - - SeparateWindow = false; - } - - - protected override void OnInit() - { - this.Name = $"Trailing Stop (ATR:{_period}, Mult:{_factor:f2})"; - this.bars = new(); - - this.History = this.Symbol.GetHistory(period: this.HistoricalData.Period, fromTime: HistoricalData.FromTime); - for (int i = this.History.Count - 1; i >= 0; i--) - { - var rec = this.History[i, SeekOriginHistory.Begin]; - bars.Add(rec.TimeLeft, rec[PriceType.Open], - rec[PriceType.High], rec[PriceType.Low], - rec[PriceType.Close], rec[PriceType.Volume]); - } - _atr = new(source: bars, _period, useNaN: true); - _ratchetL = Double.NegativeInfinity; - _ratchetS = Double.PositiveInfinity; - - this.LinesSeries[0].Visible = _LongTS; - this.LinesSeries[1].Visible = _LongTS; - this.LinesSeries[2].Visible = _ShortTS; - this.LinesSeries[3].Visible = _ShortTS; - } - - 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); - - _tslineL = bars.High[^1].v - (_factor * _atr[^1].v); - _ratchetL = Math.Max(_tslineL, _ratchetL); - if (_ratchetL > bars.Low[^1].v) - { - this.LinesSeries[1].SetMarker(0, new IndicatorLineMarker(Color.Yellow, bottomIcon: IndicatorLineMarkerIconType.DownArrow)); - _ratchetL = _tslineL; - } - - _tslineS = bars.High[^1].v + (_factor * _atr[^1].v); - _ratchetS = Math.Min(_tslineS, _ratchetS); - if (_ratchetS < bars.High[^1].v) - { - this.LinesSeries[3].SetMarker(0, new IndicatorLineMarker(Color.Yellow, upperIcon: IndicatorLineMarkerIconType.UpArrow)); - _ratchetS = _tslineS; - } - - this.SetValue(_tslineL, lineIndex: 0); - this.SetValue(_ratchetL, lineIndex: 1); - this.SetValue(_tslineS, lineIndex: 2); - this.SetValue(_ratchetS, lineIndex: 3); - } -} - diff --git a/archive/Indicators/Indicators.csproj b/archive/Indicators/Indicators.csproj deleted file mode 100644 index 5b9da593..00000000 --- a/archive/Indicators/Indicators.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - net7.0 - preview - false - AnyCPU - Indicator - QuanTAlib_Indicators - QuanTAlib - embedded - AnyCPU - disable - False - ..\.sonarlint\mihakralj_quantalibcsharp.ruleset - 0.2.1.0 - 0.2.1.0 - 0.2.1-dev.2+Branch.dev.Sha.cb5fe2dc86a78fe9358da810d17952c82299ed3d - 0.2.1-dev.2 - NETSDK1057 - true - NETSDK1057 - - - True - 3 - True - anycpu - full - - - embedded - True - 3 - True - anycpu - - - - - - - - - - - - - QuanTAlib\%(RecursiveDir)%(Filename)%(Extension) - - - - - ..\.github\TradingPlatform.BusinessLayer.dll - - - \ No newline at end of file diff --git a/archive/QuanTAlib.sln_old b/archive/QuanTAlib.sln_old deleted file mode 100644 index a2d92cf3..00000000 --- a/archive/QuanTAlib.sln_old +++ /dev/null @@ -1,24 +0,0 @@ -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}") = "Calculations", "v2\calculations.csproj", "{AAE21F8A-9BC2-4647-A9EB-4DC86C569080}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AAE21F8A-9BC2-4647-A9EB-4DC86C569080}.Debug|Any CPU.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 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E5592DC2-0542-45B2-A0CF-C6B1EDC72B87} - EndGlobalSection -EndGlobal \ No newline at end of file diff --git a/archive/Strategies/Strategies.csproj b/archive/Strategies/Strategies.csproj deleted file mode 100644 index e665dc50..00000000 --- a/archive/Strategies/Strategies.csproj +++ /dev/null @@ -1,53 +0,0 @@ - - - net7.0 - preview - false - AnyCPU - Strategy - QuanTAlib_Strategies - QuanTAlib - embedded - AnyCPU - disable - False - ..\.sonarlint\mihakralj_quantalibcsharp.ruleset - 0.2.1.0 - 0.2.1.0 - 0.2.1-dev.2+Branch.dev.Sha.cb5fe2dc86a78fe9358da810d17952c82299ed3d - 0.2.1-dev.2 - NETSDK1057 - true - NETSDK1057 - - - True - 3 - True - anycpu - full - - - embedded - True - 3 - True - anycpu - - - - - - - QuanTAlib\%(RecursiveDir)%(Filename)%(Extension) - - - - - - - - ..\.github\TradingPlatform.BusinessLayer.dll - - - \ No newline at end of file diff --git a/archive/Tests/Basic tests/Indicators.cs b/archive/Tests/Basic tests/Indicators.cs deleted file mode 100644 index 431aa94f..00000000 --- a/archive/Tests/Basic tests/Indicators.cs +++ /dev/null @@ -1,156 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; - -namespace Basics; -#nullable disable -public class Indicators -{ - private static Type[] maSeriesTypes = new Type[] - { - typeof(SMA_Series), - typeof(EMA_Series), - typeof(DEMA_Series), - typeof(TEMA_Series), - typeof(WMA_Series), - typeof(ALMA_Series), - typeof(DWMA_Series), - typeof(FWMA_Series), - typeof(HMA_Series), - typeof(ZLEMA_Series), - typeof(RMA_Series), - typeof(HEMA_Series), - typeof(JMA_Series), - typeof(CUSUM_Series), - typeof(SMMA_Series), - typeof(T3_Series), - typeof(KAMA_Series), - typeof(TRIMA_Series), - typeof(MAMA_Series), - typeof(HWMA_Series), - }; - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Name_exists(Type classType) - { - TSeries data = new("Data") { 1, 2, 3 }; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - Assert.NotEmpty(MA_Series.Name); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Series_Length(Type classType) - { - GBM_Feed feed = new(1000); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - Assert.Equal(1000, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Return_data(Type classType) - { - TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - var result = MA_Series.Add(20); - Assert.Equal(result.v, MA_Series.Last.v); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Update(Type classType) - { - TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - var pre_update = MA_Series.Last.v; - - double pre_data = data.Last.v; - data.Add(20, true); - data.Add(pre_data, true); - - Assert.Equal(pre_update, MA_Series.Last.v); - Assert.Equal(data.Count, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Period_zero(Type classType) - { - GBM_Feed feed = new(100); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 0, false) as TSeries; - Assert.Equal(data.Count, MA_Series.Count); - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Reset(Type classType) - { - GBM_Feed feed = new(10); - TSeries data = feed.OHLC4; - var MA_Series = Activator.CreateInstance(classType, data, 10, false) as TSeries; - MA_Series.Reset(); - data.Add(0); - Assert.Equal(data.Last.v, MA_Series.Last.v); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Period_one(Type classType) - { - GBM_Feed feed = new(100); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 1, false) as TSeries; - Assert.InRange(MA_Series.Last.v - data.Last.v, -10e-6, 10e-6); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void NaN_test(Type classType) - { - GBM_Feed feed = new(100); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries; - Assert.True(double.IsNaN(MA_Series[0].v)); - Assert.True(double.IsNaN(MA_Series[8].v)); - Assert.False(double.IsNaN(MA_Series[9].v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Edge_numbers(Type classType) - { - TSeries data = new() { double.Epsilon, double.PositiveInfinity, double.MaxValue, double.NegativeInfinity }; - var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries; - Assert.Equal(4, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void handling_NaN(Type classType) - { - TSeries data = new("Name") { 1, 2, 3, 4, 5, 6, double.NaN, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; - var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries; - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - public static IEnumerable MASeriesData() - { - foreach (var type in maSeriesTypes) - { - yield return new object[] { type }; - } - } -} -#nullable restore \ No newline at end of file diff --git a/archive/Tests/Basic tests/Oscillators.cs b/archive/Tests/Basic tests/Oscillators.cs deleted file mode 100644 index fcf86f06..00000000 --- a/archive/Tests/Basic tests/Oscillators.cs +++ /dev/null @@ -1,161 +0,0 @@ -using Xunit; -using System; -using System.Runtime.InteropServices; -using QuanTAlib; - -namespace Basics; -#nullable disable -public class Oscillators -{ - private static Type[] maSeriesTypes = new[] - { - typeof(BIAS_Series), - typeof(MAX_Series), - typeof(MIN_Series), - typeof(MIDPOINT_Series), - typeof(ZL_Series), - typeof(DECAY_Series), - typeof(ENTROPY_Series), - typeof(KURTOSIS_Series), - typeof(MAD_Series), - typeof(MAPE_Series), - typeof(MAE_Series), - typeof(MSE_Series), - typeof(SDEV_Series), - typeof(SMAPE_Series), - typeof(WMAPE_Series), - typeof(SSDEV_Series), - typeof(VAR_Series), - typeof(SVAR_Series), - typeof(MEDIAN_Series), - typeof(ZSCORE_Series), - typeof(CMO_Series), - typeof(RSI_Series), - typeof(TRIX_Series), - typeof(BBANDS_Series), -}; - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Name_exists(Type classType) - { - TSeries data = new("Data") { 1, 2, 3 }; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - Assert.NotEmpty(MA_Series.Name); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Series_Length(Type classType) - { - GBM_Feed feed = new(1000); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - Assert.Equal(1000, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Return_data(Type classType) - { - TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - var result = MA_Series.Add(20); - Assert.Equal(result.v, MA_Series.Last.v); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Update(Type classType) - { - TSeries data = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; - - var MA_Series = Activator.CreateInstance(classType, data, 5, false) as TSeries; - var pre_update = MA_Series.Last.v; - - double pre_data = data.Last.v; - data.Add(20, true); - data.Add(pre_data, true); - - Assert.Equal(pre_update, MA_Series.Last.v); - Assert.Equal(data.Count, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Period_zero(Type classType) - { - GBM_Feed feed = new(100); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 0, false) as TSeries; - Assert.Equal(data.Count, MA_Series.Count); - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Reset(Type classType) - { - GBM_Feed feed = new(10); - TSeries data = feed.OHLC4; - var MA_Series = Activator.CreateInstance(classType, data, 10, false) as TSeries; - MA_Series.Reset(); - data.Add(1); - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Period_one(Type classType) - { - GBM_Feed feed = new(100); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 1, false) as TSeries; - Assert.False(double.IsNaN(MA_Series[^1].v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void NaN_test(Type classType) - { - GBM_Feed feed = new(100); - TSeries data = feed.OHLC4; - - var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries; - Assert.True(double.IsNaN(MA_Series[0].v)); - Assert.True(double.IsNaN(MA_Series[8].v)); - Assert.False(double.IsNaN(MA_Series[9].v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Edge_numbers(Type classType) - { - TSeries data = new() { double.Epsilon, double.PositiveInfinity, double.MaxValue, double.NegativeInfinity }; - var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries; - Assert.Equal(4, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void handling_NaN(Type classType) - { - TSeries data = new("Name") { 1, 2, 3, 4, 5, 6, double.NaN, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; - var MA_Series = Activator.CreateInstance(classType, data, 10, true) as TSeries; - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - public static IEnumerable MASeriesData() - { - foreach (var type in maSeriesTypes) - { - yield return new object[] { type }; - } - } -} -#nullable restore \ No newline at end of file diff --git a/archive/Tests/Basic tests/TBars_input.cs b/archive/Tests/Basic tests/TBars_input.cs deleted file mode 100644 index 02489ff7..00000000 --- a/archive/Tests/Basic tests/TBars_input.cs +++ /dev/null @@ -1,97 +0,0 @@ -using Xunit; -using System; -using System.Runtime.InteropServices; -using QuanTAlib; - -namespace Basics; -#nullable disable -public class TBars -{ - private static Type[] maSeriesTypes = new Type[] - { - typeof(ATR_Series), - typeof(ATRP_Series), - typeof(TR_Series), - typeof(ADL_Series), - typeof(CCI_Series), - typeof(OBV_Series), - typeof(ADOSC_Series), - typeof(MIDPRICE_Series), - }; - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Name_exists(Type classType) - { - GBM_Feed data = new(10); - - var MA_Series = Activator.CreateInstance(classType, data) as TSeries; - Assert.NotEmpty(MA_Series.Name); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Series_Length(Type classType) - { - GBM_Feed data = new(1000); - - var MA_Series = Activator.CreateInstance(classType, data) as TSeries; - Assert.Equal(1000, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Return_data(Type classType) - { - GBM_Feed data = new(10); - var MA_Series = Activator.CreateInstance(classType, data) as TSeries; - var result = MA_Series.Add((DateTime.Today, 1, 2, 3, 4, 5)); - Assert.Equal(result.v, MA_Series.Last.v); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Update(Type classType) - { - GBM_Feed data = new(10); - var MA_Series = Activator.CreateInstance(classType, data) as TSeries; - var pre_update = MA_Series.Last; - - var pre_data = data.Last; - data.Add((DateTime.Today, 1, 2, 3, 4, 5), true); - data.Add(pre_data, true); - - Assert.Equal(pre_update.v, MA_Series.Last.v); - Assert.Equal(data.Count, MA_Series.Count); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Reset(Type classType) - { - GBM_Feed data = new(10); - var MA_Series = Activator.CreateInstance(classType, data) as TSeries; - MA_Series.Reset(); - data.Add(); - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - [Theory] - [MemberData(nameof(MASeriesData))] - public void Period_default(Type classType) - { - GBM_Feed data = new(100); - - var MA_Series = Activator.CreateInstance(classType, data) as TSeries; - Assert.False(double.IsNaN(MA_Series.Last.v)); - } - - public static IEnumerable MASeriesData() - { - foreach (var type in maSeriesTypes) - { - yield return new object[] { type }; - } - } -} -#nullable restore \ No newline at end of file diff --git a/archive/Tests/Pairs/ADD_Test.cs b/archive/Tests/Pairs/ADD_Test.cs deleted file mode 100644 index 2c86e5a8..00000000 --- a/archive/Tests/Pairs/ADD_Test.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; - -namespace Pairs; -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/archive/Tests/Pairs/DIV_Test.cs b/archive/Tests/Pairs/DIV_Test.cs deleted file mode 100644 index 0b011bc6..00000000 --- a/archive/Tests/Pairs/DIV_Test.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; - -namespace Pairs; -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/archive/Tests/Pairs/MUL_Test.cs b/archive/Tests/Pairs/MUL_Test.cs deleted file mode 100644 index cc1c9718..00000000 --- a/archive/Tests/Pairs/MUL_Test.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; - -namespace Pairs; -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/archive/Tests/Pairs/SUB_Test.cs b/archive/Tests/Pairs/SUB_Test.cs deleted file mode 100644 index 2a96d81d..00000000 --- a/archive/Tests/Pairs/SUB_Test.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; - -namespace Pairs; -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/archive/Tests/Pairs/TBars_Test.cs b/archive/Tests/Pairs/TBars_Test.cs deleted file mode 100644 index cae4ecec..00000000 --- a/archive/Tests/Pairs/TBars_Test.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; - -namespace Bars; -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/archive/Tests/Tests.csproj b/archive/Tests/Tests.csproj deleted file mode 100644 index 41673a8b..00000000 --- a/archive/Tests/Tests.csproj +++ /dev/null @@ -1,45 +0,0 @@ - - - net7.0 - preview - enable - enable - false - AnyCPU;x64 - 0.2.1.0 - 0.2.1.0 - 0.2.1-dev.2+Branch.dev.Sha.cb5fe2dc86a78fe9358da810d17952c82299ed3d - 0.2.1-dev.2 - $(NoWarn);NETSDK1057 - true - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/archive/Tests/Validations/Trends/Pandas_TA.cs b/archive/Tests/Validations/Trends/Pandas_TA.cs deleted file mode 100644 index 4656dc13..00000000 --- a/archive/Tests/Validations/Trends/Pandas_TA.cs +++ /dev/null @@ -1,484 +0,0 @@ -using Xunit; -using System; -using QuanTAlib; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.Marshalling; -using Python.Runtime; - -namespace Validations; - -public class PandasTA : IDisposable -{ - private bool disposed = false; - private readonly GBM_Feed bars; - private readonly Random rnd = new(); - private readonly int period, skip; - private readonly int digits; - private readonly dynamic np; - private readonly dynamic ta; - private readonly dynamic pd; - private readonly dynamic df; - - public PandasTA() - { - bars = new GBM_Feed(5000, 0.8, 0.0); - period = rnd.Next(28) + 3; - skip = period + 50; - digits = 8; - - var pythonDLL = PythonLibrary.Locate(); - Runtime.PythonDLL = pythonDLL; - PythonEngine.Initialize(); - - np = Py.Import("numpy"); - pd = Py.Import("pandas"); - ta = Py.Import("pandas_ta"); - - string[] cols = { "open", "high", "low", "close", "volume" }; - var ary = new double[bars.Count, 5]; - for (var i = 0; i < bars.Count; i++) - { - ary[i, 0] = bars.Open[i].v; - ary[i, 1] = bars.High[i].v; - ary[i, 2] = bars.Low[i].v; - ary[i, 3] = bars.Close[i].v; - ary[i, 4] = bars.Volume[i].v; - } - - df = ta.DataFrame(data: np.array(ary), index: np.array(bars.Close.t), columns: np.array(cols)); - } - - public void Dispose() - { - Dispose(true); - PythonEngine.Shutdown(); - GC.SuppressFinalize(this); - } - - ~PandasTA() - { - Dispose(false); - } - - protected virtual void Dispose(bool disposing) - { - if (!disposed) - { - disposed = true; - } - } - - [Fact] - private void ADL() - { - ADL_Series QL = new(bars); - var pta = df.ta.ad(high: df.high, low: df.low, close: df.close, volume: df.volume); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void BBANDS() - { - BBANDS_Series QL = new(bars.Close, period); - var pta = df.ta.bbands(close: df.close, length: period).to_numpy(); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL.Lower[i].v; - var PanTA_item = (double)pta[i][0]; //lower - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - QL_item = QL.Mid[i].v; - PanTA_item = (double)pta[i][1]; //mid - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - QL_item = QL.Upper[i].v; - PanTA_item = (double)pta[i][2]; //upper - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void BIAS() - { - BIAS_Series QL = new(bars.Close, period, false); - var pta = df.ta.bias(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void CCI() - { - CCI_Series QL = new(bars, period, false); - var pta = df.ta.cci(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void DEMA() - { - DEMA_Series QL = new(bars.Close, period, false); - var pta = df.ta.dema(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void EMA() - { - EMA_Series QL = new(bars.Close, period, false); - var pta = df.ta.ema(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void ENTROPY() - { - ENTROPY_Series QL = new(bars.Close, period, false); - var pta = df.ta.entropy(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void HL2() - { - var pta = df.ta.hl2(high: df.high, low: df.low); - for (var i = bars.HL2.Length - 1; i > skip; i--) - { - var QL_item = bars.HL2[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void HLC3() - { - var pta = df.ta.hlc3(high: df.high, low: df.low, close: df.close); - for (var i = bars.HLC3.Length; i > skip; i--) - { - var QL_item = bars.HLC3[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void HMA() - { - HMA_Series QL = new(bars.Close, period, false); - var pta = df.ta.hma(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void KURTOSIS() - { - KURTOSIS_Series QL = new(bars.Close, period, false); - var pta = df.ta.kurtosis(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void MACD() - { - MACD_Series QL = new(bars.Close, 26, 12, 9, false); - var pta = df.ta.macd(close: df.close).to_numpy(); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1][0]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - QL_item = QL.Signal[i - 1].v; - PanTA_item = (double)pta[i - 1][2]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void MAD() - { - MAD_Series QL = new(bars.Close, period, false); - var pta = df.ta.mad(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void MEDIAN() - { - MEDIAN_Series QL = new(bars.Close, period); - var pta = df.ta.median(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void OBV() - { - OBV_Series QL = new(bars); - var pta = df.ta.obv(close: df.close, volume: df.volume); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void OHLC4() - { - var pta = df.ta.ohlc4(open: df.open, high: df.high, low: df.low, close: df.close); - for (var i = bars.OHLC4.Length; i > skip; i--) - { - var QL_item = bars.OHLC4[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void SDEV() - { - SDEV_Series QL = new(bars.Close, period, false); - var pta = df.ta.stdev(close: df.close, length: period, ddof: 0); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void SMA() - { - SMA_Series QL = new(bars.Close, period, false); - var pta = df.ta.sma(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void SSDEV() - { - SSDEV_Series QL = new(bars.Close, period, false); - var pta = df.ta.stdev(close: df.close, length: period, ddof: 1); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void SVARIANCE() - { - SVAR_Series QL = new(bars.Close, period); - var pta = df.ta.variance(close: df.close, length: period, ddof: 1); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void TEMA() - { - TEMA_Series QL = new(bars.Close, period, false); - var pta = df.ta.tema(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void TR() - { - TR_Series QL = new(bars); - var pta = df.ta.true_range(high: df.high, low: df.low, close: df.close); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void TRIMA() - { - // TODO: return length to variable length (period) when Pandas-TA fixes trima to calculate even periods right - TRIMA_Series QL = new(bars.Close, 11); - var pta = df.ta.trima(close: df.close, length: 11); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void VARIANCE() - { - VAR_Series QL = new(bars.Close, period); - var pta = df.ta.variance(close: df.close, length: period, ddof: 0); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void WMA() - { - WMA_Series QL = new(bars.Close, period, false); - var pta = df.ta.wma(close: df.close, length: period); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - private void ZSCORE() - { - ZSCORE_Series QL = new(bars.Close, period, false); - var pta = df.ta.zscore(close: df.close, length: period, ddof: 0); - for (var i = QL.Length - 1; i > skip; i--) - { - var QL_item = QL[i - 1].v; - var PanTA_item = (double)pta[i - 1]; - Assert.InRange(PanTA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } -} - -public static class PythonLibrary -{ - public static string Locate() - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - string[] paths = Environment.GetEnvironmentVariable("PATH")?.Split(';') ?? Array.Empty(); - foreach (string path in paths) - { - string[] pythonDLLs = Directory.GetFiles(path, "python3*.dll"); - if (pythonDLLs.Length > 0) - { - foreach (string item in pythonDLLs) - { - if (!item.EndsWith("python3.dll", StringComparison.OrdinalIgnoreCase)) - { - return item; - } - } - - } - } - throw new FileNotFoundException("Python library not found in PATH"); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - return "/usr/lib/x86_64-linux-gnu/libpython3.10.so"; - /* - List pythonLibraries = new List(); - List directoriesToSearch = new List { "/home/runner/.local/lib" }; // Add more directories as needed - string filePattern = "libpython3.*.so"; - SearchFiles(directoriesToSearch, filePattern, pythonLibraries); - - if (pythonLibraries.Count > 0) { - return pythonLibraries[0]; - } - else { - throw new FileNotFoundException("Python library not found"); - } - */ - } - - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - throw new NotSupportedException("Not supported yet"); - } - - else { throw new NotSupportedException("Unsupported operating system"); } - } - static void SearchFiles(List directoriesToSearch, string filePattern, List foundFiles) - { - foreach (string directory in directoriesToSearch) - { - if (Directory.Exists(directory)) - { - try - { - string[] files = Directory.GetFiles(directory, filePattern, SearchOption.AllDirectories); - foundFiles.AddRange(files); - } - catch (Exception e) - { - Console.WriteLine("Error searching in directory: " + directory + " - " + e.Message); - } - } - } - } -} \ No newline at end of file diff --git a/archive/Tests/Validations/Trends/Skender.cs b/archive/Tests/Validations/Trends/Skender.cs deleted file mode 100644 index 393f55f1..00000000 --- a/archive/Tests/Validations/Trends/Skender.cs +++ /dev/null @@ -1,489 +0,0 @@ -using System; -using QuanTAlib; -using Skender.Stock.Indicators; -using Xunit; - -namespace Validations; -public class Skender -{ - private readonly GBM_Feed bars; - private readonly Random rnd = new(); - private readonly int period, digits, skip; - private readonly IEnumerable quotes; - - - public Skender() - { - bars = new(Bars: 10000, Volatility: 0.5, Drift: 0.0, Precision: 2); - period = rnd.Next(30) + 5; - digits = 6; //minimizing rounding errors in type conversions - skip = period + 2; - - quotes = 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 ADL() - { - ADL_Series QL = new(bars); - var SK = quotes.GetAdl().Select(i => i.Adl); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1)!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits)); - } - } - */ - [Fact] - public void ALMA() - { - ALMA_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetAlma(period).Select(i => i.Alma.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void ATR() - { - ATR_Series QL = new(bars, period: period, useNaN: false); - var SK = quotes.GetAtr(period).Select(i => i.Atr.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void ATRP() - { - ATRP_Series QL = new(bars, period, false); - var SK = quotes.GetAtr(period).Select(i => i.Atrp.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void BBANDS() - { - BBANDS_Series QL = new(bars.Close, period, 2.0, useNaN: false); - var SK = quotes.GetBollingerBands(period, 2.0); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL.Mid[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Sma!.Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.Upper[i - 1].v; - SK_item = SK.ElementAt(i - 1).UpperBand!.Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.Lower[i - 1].v; - SK_item = SK.ElementAt(i - 1).LowerBand!.Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.Bandwidth[i - 1].v; - SK_item = SK.ElementAt(i - 1).Width!.Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.PercentB[i - 1].v; - SK_item = SK.ElementAt(i - 1).PercentB!.Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.Zscore[i - 1].v; - SK_item = SK.ElementAt(i - 1).ZScore!.Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void CCI() - { - CCI_Series QL = new(bars, period, false); - var SK = quotes.GetCci(period).Select(i => i.Cci.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void CMO() - { - CMO_Series QL = new(bars.Close, period, false); - var SK = quotes.GetCmo(period).Select(i => i.Cmo.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void CORR() - { - CORR_Series QL = new(bars.High, bars.Low, period, false); - var SK = quotes.Use(CandlePart.High).GetCorrelation(quotes.Use(CandlePart.Low), period).Select(i => i.Correlation.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void COVAR() - { - COVAR_Series QL = new(bars.High, bars.Low, period, false); - var SK = quotes.Use(CandlePart.High).GetCorrelation(quotes.Use(CandlePart.Low), period).Select(i => i.Covariance.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void DEMA() - { - DEMA_Series QL = new(bars.Close, period, false, useSMA: true); - var SK = quotes.GetDema(period).Select(i => i.Dema.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void EMA() - { - EMA_Series QL = new(bars.Close, period, false); - var SK = quotes.GetEma(lookbackPeriods: period).Select(i => i.Ema.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void HL2() - { - TSeries QL = bars.HL2; - var SK = quotes.GetBaseQuote(CandlePart.HL2).ToList(); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void HLC3() - { - TSeries QL = bars.HLC3; - var SK = quotes.GetBaseQuote(CandlePart.HLC3).ToList(); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void HMA() - { - HMA_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetHma(period).Select(i => i.Hma.Null2NaN()!); - for (int i = QL.Length; i > skip * 2; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - - [Fact] - public void KAMA() - { - // TODO: check precision of KAMA() - KAMA_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetKama(period).Select(i => i.Kama.Null2NaN()!); - for (int i = QL.Length; i > skip + 2; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void SLOPE() - { - SLOPE_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetSlope(period); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = (double)SK.ElementAt(i - 1).Slope!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.Intercept[i - 1].v; - SK_item = (double)SK.ElementAt(i - 1).Intercept!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.RSquared[i - 1].v; - SK_item = (double)SK.ElementAt(i - 1).RSquared!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.StdDev[i - 1].v; - SK_item = (double)SK.ElementAt(i - 1).StdDev!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void MACD() - { - MACD_Series QL = new(bars.Close, 26, 12, 9, useNaN: false); - var SK = quotes.GetMacd(12, 26, 9); - for (int i = QL.Length; i > 27; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Macd.Null2NaN()!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - //QL_item = QL.Signal[i - 1].v; - //SK_item = SK.ElementAt(i - 1).Signal.Null2NaN()!; - //Assert.InRange(SK_item! - QL_item, -Math.Pow(10,-digits), Math.Pow(10,-digits)); - } - } - [Fact] - public void MAD() - { - MAD_Series QL = new(bars.Close, period, false); - var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mad.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void MAMA() - { - MAMA_Series QL = new(bars.HL2, fastlimit: 0.5, slowlimit: 0.05); - var SK = quotes.GetMama(fastLimit: 0.5, slowLimit: 0.05); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Mama.Null2NaN()!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - QL_item = QL.Fama[i - 1].v; - SK_item = SK.ElementAt(i - 1).Fama.Null2NaN()!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void MAPE() - { - MAPE_Series QL = new(bars.Close, period, false); - var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mape.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void MSE() - { - MSE_Series QL = new(bars.Close, period, false); - var SK = quotes.GetSmaAnalysis(period).Select(i => i.Mse.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void OBV() - { - OBV_Series QL = new(bars, period, false); - var SK = quotes.GetObv(period).Select(i => i.Obv!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL.Last().v; - // adding volume[0] to OBV to pass the test and keep compatibility with TA-LIB - double SK_item = SK.Last()! + (double)quotes.First().Volume!; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void OC2() - { - TSeries QL = bars.OC2; - var SK = quotes.GetBaseQuote(CandlePart.OC2).ToList(); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void OHL3() - { - TSeries QL = bars.OHL3; - var SK = quotes.GetBaseQuote(CandlePart.OHL3).ToList(); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void OHLC4() - { - TSeries QL = bars.OHLC4; - var SK = quotes.GetBaseQuote(CandlePart.OHLC4).ToList(); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1).Value; - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void RSI() - { - RSI_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetRsi(period).Select(i => i.Rsi.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void SDEV() - { - SDEV_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetStdDev(period).Select(i => i.StdDev.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void SMA() - { - SMA_Series QL = new(bars.Close, period, false); - var SK = quotes.GetSma(period).Select(i => i.Sma.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void SMMA() - { - SMMA_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetSmma(period).Select(i => i.Smma.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void T3() - { - T3_Series QL = new(source: bars.Close, period: period, vfactor: 0.7, false); - var SK = quotes.GetT3(lookbackPeriods: period, volumeFactor: 0.7).Select(i => i.T3.Null2NaN()!); - for (int i = QL.Length; i > period * 15; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void TRIX() - { - TRIX_Series QL = new(bars.Close, period, false); - var SK = quotes.GetTrix(period).Select(i => i.Trix.Null2NaN()!); - for (int i = QL.Length; i > period * 12; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void TEMA() - { - TEMA_Series QL = new(bars.Close, period, false); - var SK = quotes.GetTema(period).Select(i => i.Tema.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void TR() - { - TR_Series QL = new(bars); - var SK = quotes.GetTr().Select(i => i.Tr.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void WMA() - { - WMA_Series QL = new(bars.Close, period, false); - var SK = quotes.GetWma(period).Select(i => i.Wma.Null2NaN()!); - for (int i = QL.Length; i > skip * 2; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - [Fact] - public void ZSCORE() - { - ZSCORE_Series QL = new(bars.Close, period, useNaN: false); - var SK = quotes.GetStdDev(period).Select(i => i.ZScore.Null2NaN()!); - for (int i = QL.Length; i > skip; i--) - { - double QL_item = QL[i - 1].v; - double SK_item = SK.ElementAt(i - 1); - Assert.InRange(SK_item! - QL_item, -Math.Pow(10, -digits), Math.Pow(10, -digits)); - } - } - -} diff --git a/archive/Tests/Validations/Trends/TA_LIB.cs b/archive/Tests/Validations/Trends/TA_LIB.cs deleted file mode 100644 index 0e2c3654..00000000 --- a/archive/Tests/Validations/Trends/TA_LIB.cs +++ /dev/null @@ -1,487 +0,0 @@ -using Xunit; -using System; -using TALib; -using QuanTAlib; - -namespace Validations; -public class Ta_Lib -{ - private readonly GBM_Feed bars; - private readonly Random rnd = new(); - private readonly int period, digits, skip; - private readonly double[] TALIB; - private readonly double[] TALIB2; - private readonly double[] inopen; - private readonly double[] inhigh; - private readonly double[] inlow; - private readonly double[] inclose; - private readonly double[] involume; - - public Ta_Lib() - { - bars = new(Bars: 5000, Volatility: 0.8, Drift: 0.0, Precision: 3); - period = rnd.Next(28) + 3; - skip = period + 2; - digits = 9; - - TALIB = new double[bars.Count]; - TALIB2 = new double[bars.Count]; - inopen = bars.Open.v.ToArray(); - inhigh = bars.High.v.ToArray(); - inlow = bars.Low.v.ToArray(); - inclose = bars.Close.v.ToArray(); - involume = bars.Volume.v.ToArray(); - } - - [Fact] - public void ADD() - { - ADD_Series QL = new(bars.Open, bars.Close); - Core.Add(inopen, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ADL() - { - ADL_Series QL = new(bars); - Core.Ad(inhigh, inlow, inclose, involume, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > 0; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ADOSC() - { - ADOSC_Series QL = new(bars, 3, 10, false); - Core.AdOsc(inhigh, inlow, inclose, involume, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip * 2; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ATR() - { - ATR_Series QL = new(bars, period: period, useNaN: false); - Core.Atr(inhigh, inlow, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - public void BBANDS() - { - double[] outMiddle = new double[bars.Count]; - double[] outUpper = new double[bars.Count]; - double[] outLower = new double[bars.Count]; - BBANDS_Series QL = new(bars.Close, period: period, multiplier: 2.0, false); - Core.Bbands(inclose, 0, bars.Count - 1, outRealUpperBand: outUpper, outRealMiddleBand: outMiddle, outRealLowerBand: outLower, out int outBegIdx, out _, optInTimePeriod: period, optInNbDevUp: 2.0, optInNbDevDn: 2.0); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL.Upper[i].v; - double TA_item = outUpper[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), high: Math.Exp(-digits)); - QL_item = QL.Mid[i].v; - TA_item = outMiddle[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), high: Math.Exp(-digits)); - QL_item = QL.Lower[i].v; - TA_item = outLower[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), high: Math.Exp(-digits)); - } - } - [Fact] - public void CCI() - { - CCI_Series QL = new(bars, period, false); - Core.Cci(inhigh, inlow, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - /* CMO in TA-LIB is not valid - [Fact] - public void CMO() { - CMO_Series QL = new(bars.Close, period, false); - Core.Cmo(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - */ - [Fact] - public void CORR() - { - CORR_Series QL = new(bars.Open, bars.Close, period); - Core.Correl(inopen, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, optInTimePeriod: period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void DEMA() - { - DEMA_Series QL = new(bars.Close, period, false, useSMA: false); - Core.Dema(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > period * 10; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void DIV() - { - DIV_Series QL = new(bars.Open, bars.Close); - Core.Div(inopen, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void EMA() - { - EMA_Series QL = new(bars.Close, period, false); - Core.Ema(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void HL2() - { - TSeries QL = bars.HL2; - Core.MedPrice(inhigh, inlow, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void HLC3() - { - TSeries QL = bars.HLC3; - Core.TypPrice(inhigh, inlow, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void HLCC4() - { - TSeries QL = bars.HLCC4; - Core.WclPrice(inhigh, inlow, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void KAMA() - { - KAMA_Series QL = new(bars.Close, period, fast: 2, slow: 30); - Core.Kama(inReal: inclose, startIdx: 0, endIdx: bars.Count - 1, outReal: TALIB, outBegIdx: out int outBegIdx, outNbElement: out _, optInTimePeriod: period); - for (int i = QL.Length - 1; i > skip * 15; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MACD() - { - double[] macdSignal = new double[bars.Count]; - double[] macdHist = new double[bars.Count]; - MACD_Series QL = new(bars.Close, slow: 26, fast: 12, signal: 9, false); - // TA-LIB runs EMA without SMA, leaving first 100 values for convergence - Core.Macd(inclose, 0, bars.Count - 1, outMacd: TALIB, outMacdSignal: macdSignal, outMacdHist: macdHist, out int outBegIdx, out _, optInFastPeriod: 12, optInSlowPeriod: 26, optInSignalPeriod: 9); - for (int i = QL.Length - 1; i > 100; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - QL_item = QL.Signal[i].v; - TA_item = macdSignal[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - /* - [Fact] - public void MAMA() - { - MAMA_Series QL = new(bars.Close, fastlimit: 0.5, slowlimit: 0.05); - Core.Mama(inReal: inclose, startIdx: 0, endIdx: bars.Count - 1, outMama: TALIB, outFama: TALIB2, outBegIdx: out int outBegIdx, outNbElement: out _, optInFastLimit: 0.5, optInSlowLimit: 0.05); - for (int i = QL.Length - 1; i > skip * 10; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits-1), Math.Exp(-digits-1)); - } - } - */ - [Fact] - public void MAX() - { - MAX_Series QL = new(bars.Close, period, false); - Core.Max(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MIDPOINT() - { - MIDPOINT_Series QL = new(bars.Close, period, false); - Core.MidPoint(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MIDPRICE() - { - MIDPRICE_Series QL = new(bars, period, false); - Core.MidPrice(inhigh, inlow, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MIN() - { - MIN_Series QL = new(bars.Close, period, false); - Core.Min(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MUL() - { - MUL_Series QL = new(bars.Open, bars.Close); - Core.Mult(inopen, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void OBV() - { - OBV_Series QL = new(bars, period, false); - Core.Obv(inclose, involume, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void OHLC4() - { - TSeries QL = bars.OHLC4; - Core.AvgPrice(inopen, inhigh, inlow, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void RSI() - { - RSI_Series QL = new(bars.Close, period, false); - Core.Rsi(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SDEV() - { - SDEV_Series QL = new(bars.Close, period, false); - Core.StdDev(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SMA() - { - SMA_Series QL = new(bars.Close, period, false); - Core.Sma(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SUB() - { - SUB_Series QL = new(bars.Open, bars.Close); - Core.Sub(inopen, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SUM() - { - CUSUM_Series QL = new(bars.Close, period, false); - Core.Sum(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void T3() - { - T3_Series QL = new(source: bars.Close, period: period, vfactor: 0.7, useNaN: false); - Core.T3(inReal: inclose, startIdx: 0, endIdx: bars.Count - 1, outReal: TALIB, outBegIdx: out int outBegIdx, outNbElement: out _, optInTimePeriod: period, optInVFactor: 0.7); - for (int i = QL.Length - 1; i > period * 10; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TEMA() - { - TEMA_Series QL = new(bars.Close, period, false); - Core.Tema(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip * 15; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TR() - { - TR_Series QL = new(bars); - Core.TRange(inhigh, inlow, inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TRIMA() - { - TRIMA_Series QL = new(bars.Close, period, false); - Core.Trima(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TRIX() - { - TRIX_Series QL = new(bars.Close, period, useNaN: false, useSMA: true); - Core.Trix(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > period * 10; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void VAR() - { - VAR_Series QL = new(bars.Close, period, false); - Core.Var(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip * 15; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void WMA() - { - WMA_Series QL = new(bars.Close, period, false); - Core.Wma(inclose, 0, bars.Count - 1, TALIB, out int outBegIdx, out _, period); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TA_item = TALIB[i - outBegIdx]; - Assert.InRange(TA_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - -} diff --git a/archive/Tests/Validations/Trends/Tulip.cs b/archive/Tests/Validations/Trends/Tulip.cs deleted file mode 100644 index fc36b359..00000000 --- a/archive/Tests/Validations/Trends/Tulip.cs +++ /dev/null @@ -1,578 +0,0 @@ -using Xunit; -using System; -using Tulip; -using QuanTAlib; - -namespace Validations; -public class Tulip_Test -{ - private readonly GBM_Feed bars; - private readonly Random rnd = new(); - private readonly int period, digits, skip; - private readonly double[] outdata; - private readonly double[] inopen; - private readonly double[] inhigh; - private readonly double[] inlow; - private readonly double[] inclose; - private readonly double[] involume; - - public Tulip_Test() - { - bars = new(Bars: 5000, Volatility: 0.8, Drift: 0.0, Precision: 3); - period = rnd.Next(28) + 3; - skip = period + 5; - digits = 8; - - outdata = new double[bars.Count]; - inopen = bars.Open.v.ToArray(); - inhigh = bars.High.v.ToArray(); - inlow = bars.Low.v.ToArray(); - inclose = bars.Close.v.ToArray()!; - involume = bars.Volume.v.ToArray()!; - - } - [Fact] - public void ADL() - { - double[][] arrin = { inhigh, inlow, inclose, involume }; - double[][] arrout = { outdata }; - ADL_Series QL = new(bars); - Tulip.Indicators.ad.Run(inputs: arrin, options: new double[] { }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ADD() - { - double[][] arrin = { inhigh, inlow }; - double[][] arrout = { outdata }; - ADD_Series QL = new(bars.High, bars.Low); - Tulip.Indicators.add.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ADOSC() - { - double[][] arrin = { inhigh, inlow, inclose, involume }; - double[][] arrout = { outdata }; - int s = 3; - ADOSC_Series QL = new(bars, s, period, false); - Tulip.Indicators.adosc.Run(inputs: arrin, options: new double[] { s, period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ATR() - { - double[][] arrin = { inhigh, inlow, inclose }; - double[][] arrout = { outdata }; - - ATR_Series QL = new(bars, period: period, useNaN: false); - Tulip.Indicators.atr.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - //Tulip ATR doesn't use warm-up SMA, compensating with 200 warming bars - for (int i = QL.Length - 1; i > 200 + skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void BBANDS() - { - double[][] arrin = { inclose }; - double[] outmid = new double[bars.Count]; - double[] outlower = new double[bars.Count]; - double[] outupper = new double[bars.Count]; - double[][] arrout = { outlower, outmid, outupper }; - BBANDS_Series QL = new(bars.Close, period, 2, false); - Tulip.Indicators.bbands.Run(inputs: arrin, options: new double[] { period, 2 }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL.Lower[i].v; - double TU_item = outlower[i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - QL_item = QL.Mid[i].v; - TU_item = outmid[i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - QL_item = QL.Upper[i].v; - TU_item = outupper[i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - /* - [Fact] - public void CCI() { - double[][] arrin = { inhigh, inlow, inclose }; - double[][] arrout = { outdata }; - CCI_Series QL = new(bars, period, useNaN: false); - Tulip.Indicators.cci.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) { - double QL_item = QL[i].v; - double TU_item = outdata[i - period + 1]; - Assert.Equal(QL_item,TU_item); - //Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - */ - [Fact] - public void CMO() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - CMO_Series QL = new(bars.Close, period, useNaN: false); - Tulip.Indicators.cmo.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void DECAY() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - DECAY_Series QL = new(bars.Close, period, useNaN: false); - Tulip.Indicators.decay.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip + 200; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void DEMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - DEMA_Series QL = new(bars.Close, period, useNaN: false, useSMA: false); - Tulip.Indicators.dema.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip + 200; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - (period + period - 2)]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void DIV() - { - double[][] arrin = { inhigh, inlow }; - double[][] arrout = { outdata }; - DIV_Series QL = new(bars.High, bars.Low); - Tulip.Indicators.div.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void EDECAY() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - DECAY_Series QL = new(bars.Close, period, exponential: true, useNaN: false); - Tulip.Indicators.edecay.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip + 200; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void EMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - // Tulip EMA doesn't use SMA to warm-up - EMA_Series QL = new(bars.Close, period, false, useSMA: false); - Tulip.Indicators.ema.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void HL2() - { - double[][] arrin = { inhigh, inlow }; - double[][] arrout = { outdata }; - - TSeries QL = bars.HL2; - Tulip.Indicators.medprice.Run(inputs: arrin, options: new double[] { }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void HLC3() - { - double[][] arrin = { inhigh, inlow, inclose }; - double[][] arrout = { outdata }; - - TSeries QL = bars.HLC3; - Tulip.Indicators.typprice.Run(inputs: arrin, options: new double[] { }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void HLCC4() - { - double[][] arrin = { inhigh, inlow, inclose }; - double[][] arrout = { outdata }; - - TSeries QL = bars.HLCC4; - Tulip.Indicators.wcprice.Run(inputs: arrin, options: new double[] { }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - public void HMA() - { - int p = 10; - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - HMA_Series QL = new(bars.Close, p, false); - Tulip.Indicators.hma.Run(inputs: arrin, options: new double[] { p }, outputs: arrout); - for (int i = QL.Length - 1; i > skip + 2; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - p - 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits - 2), Math.Exp(-digits - 2)); - } - } - - [Fact] - public void KAMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - KAMA_Series QL = new(bars.Close, period); - Tulip.Indicators.kama.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > 250; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - - [Fact] - public void LINREG() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - SLOPE_Series QL = new(bars.Close, period); - Tulip.Indicators.linregslope.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MACD() - { - - double[] outsignal = new double[bars.Count]; - double[] outhist = new double[bars.Count]; - double[][] arrin = { inclose }; - double[][] arrout = { outdata, outsignal, outhist }; - MACD_Series QL = new(bars.Close, slow: 26, fast: 10, signal: 9); - Tulip.Indicators.macd.Run(inputs: arrin, options: new double[] { 10, 26, 9 }, outputs: arrout); - for (int i = QL.Length - 1; i > 150; i--) - { - double QL_item = QL[i].v; - double TU_item = outdata[i - 26 + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MAX() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - MAX_Series QL = new(bars.Close, period, false); - Tulip.Indicators.max.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MIN() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - MIN_Series QL = new(bars.Close, period, false); - Tulip.Indicators.min.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void MUL() - { - double[][] arrin = { inhigh, inlow }; - double[][] arrout = { outdata }; - MUL_Series QL = new(bars.High, bars.Low); - Tulip.Indicators.mul.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void OBV() - { - double[][] arrin = { inclose, involume }; - double[][] arrout = { outdata }; - OBV_Series QL = new(bars, period, false); - Tulip.Indicators.obv.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i] + arrin[1][0]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void OHLC4() - { - double[][] arrin = { inopen, inhigh, inlow, inclose }; - double[][] arrout = { outdata }; - - TSeries QL = bars.OHLC4; - Tulip.Indicators.avgprice.Run(inputs: arrin, options: new double[] { }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void RMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - RMA_Series QL = new(bars.Close, period, false); - Tulip.Indicators.wilders.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void RSI() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - RSI_Series QL = new(bars.Close, period, false); - Tulip.Indicators.rsi.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - SMA_Series QL = new(bars.Close, period, false); - Tulip.Indicators.sma.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SDEV() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - SDEV_Series QL = new(bars.Close, period, false); - Tulip.Indicators.stddev.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SUB() - { - double[][] arrin = { inhigh, inlow }; - double[][] arrout = { outdata }; - SUB_Series QL = new(bars.High, bars.Low); - Tulip.Indicators.sub.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void SUM() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - CUSUM_Series QL = new(bars.Close, period, false); - Tulip.Indicators.sum.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TR() - { - double[][] arrin = { inhigh, inlow, inclose }; - double[][] arrout = { outdata }; - TR_Series QL = new(bars); - Tulip.Indicators.tr.Run(inputs: arrin, options: new double[] { }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TEMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - TEMA_Series QL = new(bars.Close, period, false); - Tulip.Indicators.tema.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip + 200; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - (period - 1) * 3]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void TRIMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - TRIMA_Series QL = new(bars.Close, period, false); - Tulip.Indicators.trima.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - /* - [Fact] - public void TRIX() { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - TRIX_Series QL = new(bars.Close, period); - Tulip.Indicators.trix.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > period+200; i--) { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - (period*3) + 2]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits+2), Math.Exp(-digits+2)); - } - } - */ - [Fact] - public void VAR() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - VAR_Series QL = new(bars.Close, period, false); - Tulip.Indicators.var.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void WMA() - { - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - WMA_Series QL = new(bars.Close, period, false); - Tulip.Indicators.wma.Run(inputs: arrin, options: new double[] { period }, outputs: arrout); - for (int i = QL.Length - 1; i > skip; i--) - { - double QL_item = QL[i].v; - double TU_item = arrout[0][i - period + 1]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits), Math.Exp(-digits)); - } - } - [Fact] - public void ZLEMA() - { - int p = 4; - double[][] arrin = { inclose }; - double[][] arrout = { outdata }; - ZLEMA_Series QL = new(bars.Close, p, false); - Tulip.Indicators.zlema.Run(inputs: arrin, options: new double[] { p }, outputs: arrout); - for (int i = QL.Length - 1; i > skip + 20; i--) - { - double QL_item = QL[i].v; - double TU_item = outdata[i]; - Assert.InRange(TU_item! - QL_item, -Math.Exp(-digits - 2), Math.Exp(-digits - 2)); - } - } -} diff --git a/archive/Tests/requirements.txt b/archive/Tests/requirements.txt deleted file mode 100644 index 2cc91dd6..00000000 --- a/archive/Tests/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -pytz -six -python-dateutil -numpy -pandas -pandas-ta \ No newline at end of file diff --git a/archive/docs/.nojekyll b/archive/docs/.nojekyll deleted file mode 100644 index 8b137891..00000000 --- a/archive/docs/.nojekyll +++ /dev/null @@ -1 +0,0 @@ - diff --git a/archive/docs/ALMA.md b/archive/docs/ALMA.md deleted file mode 100644 index ca86d632..00000000 --- a/archive/docs/ALMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# ALMA: Arnaud Legoux Moving Average - -period = 10 - -![Alt text](./img/ALMA_chart.svg) diff --git a/archive/docs/DEMA.md b/archive/docs/DEMA.md deleted file mode 100644 index e82d1ef9..00000000 --- a/archive/docs/DEMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# DEMA: Double Exponential Moving Average - -period = 10 - -![Alt text](./img/DEMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/DWMA.md b/archive/docs/DWMA.md deleted file mode 100644 index 9ba59690..00000000 --- a/archive/docs/DWMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# DWMA: Double Weighted Moving Average - -period = 10 - -![Alt text](./img/DWMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/EMA.md b/archive/docs/EMA.md deleted file mode 100644 index ba8091d8..00000000 --- a/archive/docs/EMA.md +++ /dev/null @@ -1,50 +0,0 @@ -# EMA: Exponential Moving Average - -Also known as exponentially weighted moving average, as it places greater weight on the most recent data points. -EMA reacts more agressively to recent data changes and calculates the current value using just the previous EMA value and current data point. The weight applied to the new value is typically $k = 2 / (period-1)$ - -## Calculation - -EMA is a rolling calculation requiring only one historical data point to calculate the current value and is denoted as ${EMA}_{p}{(data)}$ where $p$ represents the period and $data$ represents the list of data points. - -Some implementations of EMA calculate a seeding value of $EMA$ as a ${SMA}_{p}$ when $n < period$ - and start the $EMA$ calculation only after the warm-up period. QuanTAlib offers an option to enable/disable SMA warm-up. - -$$ -EMA_n = \left\{ \begin{array}{cl} -\frac{1}{p}\left( data_{n}-data_{n-p}\right)+SMA_{n-1} & : \ n \leq period \\ -{k}\times ({data_{n}} - EMA_{n-1}) + EMA_{n-1} & : \ n > period -\end{array} \right. -$$ - -## Behavior -![Alt text](./img/EMA_chart.svg) - -## Reference Calculation -period = 5 -``` -TSeries data = new() {81.59, 81.06, 82.87, 83.00, 83.61, 83.15, 82.84, 83.99, 84.55, 84.36, 85.53, 86.54, 86.89, 87.77, 87.29}; -EMA_Series ema = new(data, 5, useNaN: false); -EMA_Series ema_nan = new(data, 5, useNaN: true); -for (int i=0; i< data.Count; i++) - Console.WriteLine($"{i}\t{data[i].v,7:f2}\t{ema_nan[i].v,7:f3}\t{ema[i].v,7:f3}"); -``` -| #| Input | **QuanTAlib** | _TA-LIB_ | _Skender_ | _Pandas-TA_ | _Tulip_ | -|--|:--:|:--:|:--:|:--:|:--:|:--:| -|0| 81.59| **81.590**| _NaN_| _NaN_| _NaN_| _NaN_| -|1| 81.06| **81.840**| _NaN_| _NaN_| _NaN_| _NaN_| -|2| 82.87| **81.840**| _NaN_| _NaN_| _NaN_| _NaN_| -|3| 83.00| **82.130**| _NaN_| _NaN_| _NaN_| _NaN_| -|4| 83.61| **82.426**| _82.426_| _82.426_| _82.426_| _82.426_| -|5| 83.15| **82.667**| _82.667_| _82.667_| _82.667_|_82.667_| -|6| 82.84| **82.725**| _82.725_| _82.725_| _82.725_|_82.725_| -|7| 83.99| **83.147**| _83.147_| _83.147_| _83.147_|_83.147_| -|8| 84.55| **83.614**| _83.614_| _83.614_| _83.614_|_83.614_| -|9| 84.36| **83.863**| _83.863_| _83.863_| _83.863_|_83.863_| -|10| 85.53| **84.419**| _84.419_| _84.419_| _84.419_|_84.419_| -|11| 86.54| **85.126**| _85.126_| _85.126_| _85.126_|_85.126_| -|12| 86.89| **85.714**| _85.714_| _85.714_| _85.714_|_85.714_| -|13| 87.77| **86.399**| _86.399_| _86.399_| _86.399_|_86.399_| -|14| 87.29| **86.696**| _86.696_| _86.696_| _86.696_|_86.696_| -## References - -- https://en.wikipedia.org/wiki/Exponential_smoothing \ No newline at end of file diff --git a/archive/docs/FMA.md b/archive/docs/FMA.md deleted file mode 100644 index 50b42426..00000000 --- a/archive/docs/FMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# FMA: Fibonacci Moving Average -period = 6 - -![Alt text](./img/FMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/HEMA.md b/archive/docs/HEMA.md deleted file mode 100644 index 5ede117a..00000000 --- a/archive/docs/HEMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# HEMA: Hull-Exponential Moving Average -period = 10 - -![Alt text](./img/HEMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/HMA.md b/archive/docs/HMA.md deleted file mode 100644 index 22761879..00000000 --- a/archive/docs/HMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# HMA: Hull Moving Average -period = 10 - -![Alt text](./img/HMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/HWMA.md b/archive/docs/HWMA.md deleted file mode 100644 index 6102933e..00000000 --- a/archive/docs/HWMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# HWMA: Holt-Winter Moving Average -nA = 0.5; nB = 0.3; nC = 0.01; - -![Alt text](./img/HWMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/JMA.md b/archive/docs/JMA.md deleted file mode 100644 index 31c7de3e..00000000 --- a/archive/docs/JMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# JMA: Jurik Moving Average -period = 10 - -![Alt text](./img/JMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/KAMA.md b/archive/docs/KAMA.md deleted file mode 100644 index 594d4d10..00000000 --- a/archive/docs/KAMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# KAMA: Kaufman's Adaptive Moving Average -period = 10 - -![Alt text](./img/KAMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/MAMA.md b/archive/docs/MAMA.md deleted file mode 100644 index 19dacbb0..00000000 --- a/archive/docs/MAMA.md +++ /dev/null @@ -1,4 +0,0 @@ -# MAMA: MESA Adaptive Moving Average -period = 10 - -![Alt text](./img/MAMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/QA.md b/archive/docs/QA.md deleted file mode 100644 index 3e56fcda..00000000 --- a/archive/docs/QA.md +++ /dev/null @@ -1,40 +0,0 @@ -### Is QuanTAlib fast? - -Well, _no_, but actually *yes*. QuanTAlib works on an additive principle, meaning that even when served a full list of quotes, QuanTAlib will process them one item at the time, rolling forward throug the given time series of data. -- If the last bar is still forming (parameter `update: true`), QuanTAlib can easily recalculates the last entry as often as needed without any need to recalculate the history. -- If a new bar is added to the input, QuanTAlib will process that one item (default parameter `update: false`) and add that one result to the List. No recalculation of the history needed. - -So, if you test QuanTAlib with small set of 500 historical bars and calculate EMA(20) on it, the performance of QuanTAlib will be dead last compared to all other TA libraries. - -But when the system uses 10,000 or historical bars, updates the current data at every new tick, and adds a new bar every minute, QuanTAlib has no rivals; all other libraries will need to re-calculate the full length of the indicator on each update/addition to the time series, while QuanTAlib will just update the last entry or add a single new value to the series. No back calculations are performed - ever. Longer the input data series and more updates/additions it gets, the greater advantage there is for QuanTAlib. - -### Are results of QuanTAlib valid? - -QuanTAlib includes battery of tests to compare its results with four well-known and reviewed Technical Analysis libraries to assure accuracy and validity of results: - -- [TA-LIB](https://www.ta-lib.org/function.html) -- [Skender Stock Indicators](https://dotnet.stockindicators.dev/) -- [Pandas-TA](https://twopirllc.github.io/pandas-ta/) -- [Tulip Indicators](https://tulipindicators.org/) - -Not all indicators are implemented by all libraries - and sometimes results of the four reference libraries disagree with each other. Indicators that return equivalent result set to **all four** libraries are marked with ⭐ on [the list of indicators](indicators.md) - these are indicators that can be trusted most. Each verified equivalency of results is marked with ✔️, and each discrepancy is marked with ❌. - -For each discrepancy the research was done to establish the reason and to select the implementation that is the most faithful to the original description of the indicator. - -_For example, CMO indicator was described by Tushar S. Chande in his book The New Technical Trader, where he includes the example of calculating 10-day CMO on a given data. QuanTAlib, Skender.NET and Tulip libraries can all replicate the results, while TA-LIB and Pandas-TA return something very different:_ - -| #| Input | **QuanTAlib** | TA-LIB | Skender | Pandas-TA | Tulip | -|--|:--:|:--:|:--:|:--:|:--:|:--:| -| 0| 101.03|**0.00**| NaN| NaN| NaN| NaN| -| 1| 101.03|**0.00**| NaN| NaN| NaN| NaN| -| 2| 101.12|**100.00**| NaN| NaN| NaN| NaN| -| 3| 101.97|**100.00**| NaN| NaN| NaN| NaN| -| 4| 102.78|**100.00**| NaN| NaN| NaN| NaN| -| 5| 103.00|**100.00**| NaN| NaN| NaN| NaN| -| 6| 102.97|**96.87**| NaN| NaN| NaN| NaN| -| 7| 103.06|**97.01**| NaN| NaN| NaN| NaN| -| 8| 102.94|**85.91**| NaN| NaN| NaN| NaN| -| 9| 102.72|**69.23**| NaN| NaN| NaN| NaN| -|10| 102.75|**69.62**| 69.62| 69.62| ~55.22~| 69.62| -|11| 102.91|**71.43**| ~71.62~| 71.43| ~60.09~| 71.43| -|12| 102.97|**71.08**| ~72.42~| 71.08| ~61.93~| 71.08| \ No newline at end of file diff --git a/archive/docs/RMA.md b/archive/docs/RMA.md deleted file mode 100644 index e33234d9..00000000 --- a/archive/docs/RMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# RMA: wildeR Moving Average - -period = 10 - -![Alt text](./img/RMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/SMA.md b/archive/docs/SMA.md deleted file mode 100644 index c84295b5..00000000 --- a/archive/docs/SMA.md +++ /dev/null @@ -1,57 +0,0 @@ -# SMA: Simple Moving Average - -SMA is is an arithmetic moving average where the weights in SMA are **equally** distributed across the given period, resulting in a mean() of the data within the period. - -## Calculation - -SMA is a rolling calculation that is looking backwards from the position ${n}$ and is denoted as ${SMA}_{p}{(data)}$ where $p$ represents the period and $data$ represents the list of data points: -$$ -SMA_p{(data)} = \frac{1}{p}\sum_{i=n-p+1}^{n} data_i -$$ -When calculating the value of the next $SMA_{p,next}$ while knowing previous SMA values, SMA calculation can be reduced to: -$$ -SMA_{p,next} = SMA_{p,prev}+\frac{1}{p}\left( data_{n+1}-data_{n+1-p}\right) -$$ - -## Implementation -`TSeries SMA_Series (TSeries source, int period = 0, bool useNaN = false)` - -- SMA_Series returns TSeries list -- `source`: input of type TSeries; SMA_Series automatically subscribes to events of new data added to the source -- `period`: optional size of a lookback window; if set to 0, SMA calculates cumulative average across the whole source -- `useNaN`: if set to _true_, SMA_Series will hide values within the initial period with NaN (for compatibility with other libraries) - -## Behavior -![Alt text](./img/SMA_chart.svg) -## Reference Calculation & Validation -period = 5 -``` -TSeries data = new() {81.59, 81.06, 82.87, 83.00, 83.61, 83.15, 82.84, 83.99, 84.55, 84.36, 85.53, 86.54, 86.89, 87.77, 87.29}; -SMA_Series sma = new(data, 5, useNaN: false); -``` - -| #| Input | **QuanTAlib** | _TA-LIB_ | _Skender_ | _Pandas-TA_ | _Tulip_ | -|--|:--:|:--:|:--:|:--:|:--:|:--:| -| 0| 212.80|**212.80**| _NaN_| _NaN_| _NaN_| _NaN_| -| 1| 214.06|**213.43**| _NaN_| _NaN_| _NaN_| _NaN_| -| 2| 213.89|**213.58**| _NaN_| _NaN_| _NaN_| _NaN_| -| 3| 214.66|**213.85**| _NaN_| _NaN_| _NaN_| _NaN_| -| 4| 213.95|**213.87**| _213.87_| _213.87_| _213.87_| _213.87_| -| 5| 213.95|**214.10**| _214.10_| _214.10_| _214.10_| _214.10_| -| 6| 214.55|**214.20**| _214.20_| _214.20_| _214.20_| _214.20_| -| 7| 214.02|**214.23**| _214.23_| _214.23_| _214.23_| _214.23_| -| 8| 214.51|**214.20**| _214.20_| _214.20_| _214.20_| _214.20_| -| 9| 213.75|**214.16**| _214.16_| _214.16_| _214.16_| _214.16_| -|10| 214.22|**214.21**| _214.21_| _214.21_| _214.21_| _214.21_| -|11| 213.43|**213.99**| _213.99_| _213.99_| _213.99_| _213.99_| -|12| 214.21|**214.02**| _214.02_| _214.02_| _214.02_| _214.02_| -|13| 213.66|**213.85**| _213.85_| _213.85_| _213.85_| _213.85_| -|14| 215.03|**214.11**| _214.11_| _214.11_| _214.11_| _214.11_| -|15| 216.89|**214.64**| _214.64_| _214.64_| _214.64_| _214.64_| -|16| 216.66|**215.29**| _215.29_| _215.29_| _215.29_| _215.29_| - - -## References - - https://en.wikipedia.org/wiki/Moving_average#Simple_moving_average - - Kaufman, Perry J. (2013) Trading Systems and Methods - - Murphy, J. (1999) Technical Analysis of the Financial Markets \ No newline at end of file diff --git a/archive/docs/SMMA.md b/archive/docs/SMMA.md deleted file mode 100644 index 9d5946f4..00000000 --- a/archive/docs/SMMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# SMMA: Smoothed Moving Average - -period = 10 - -![Alt text](./img/SMMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/T3.md b/archive/docs/T3.md deleted file mode 100644 index ae8f7082..00000000 --- a/archive/docs/T3.md +++ /dev/null @@ -1,5 +0,0 @@ -# T3: Tillson T3 Moving Average - -period = 10 - -![Alt text](./img/T3_chart.svg) \ No newline at end of file diff --git a/archive/docs/TEMA.md b/archive/docs/TEMA.md deleted file mode 100644 index 1d79871e..00000000 --- a/archive/docs/TEMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# TEMA: Triple Exponential Moving Average - -period = 10 - -![Alt text](./img/TEMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/TRIMA.md b/archive/docs/TRIMA.md deleted file mode 100644 index 712eefb1..00000000 --- a/archive/docs/TRIMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# TRIMA: Triangular Moving Average - -period = 10 - -![Alt text](./img/TRIMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/Trading_example.ipynb b/archive/docs/Trading_example.ipynb deleted file mode 100644 index 6b1af863..00000000 --- a/archive/docs/Trading_example.ipynb +++ /dev/null @@ -1,458 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 46, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
Installed Packages
  • QuanTAlib, 0.2.1
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "#r \"nuget: QuanTAlib\"\n", - "#r \"nuget: Plotly.NET;\"\n", - "#r \"nuget: Plotly.NET.Interactive;\"\n", - "\n", - "using QuanTAlib;\n", - "using Plotly.NET;\n", - "using Plotly.NET.LayoutObjects;" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - }, - "polyglot_notebook": { - "kernelName": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "string symbol=\"SPY\"; // we'll focus on SPY symbol\n", - "int warmup = 50; // we'll allow 50 bars to pass by with no trading - for warm-up\n", - "Yahoo_Feed bars = new(symbol,350); //collect bars of symbol from Yahoo feed\n", - "TSeries data = bars.Close; //we need just one average value - (Open+High+Low+CLose)/4\n", - "\n", - "//make a chart\n", - "var d = Chart2D.Chart.Candlestick(bars.Open.v.Skip(warmup).ToList(), bars.High.v.Skip(warmup).ToList(),\n", - "bars.Low.v.Skip(warmup).ToList(), bars.Close.v.Skip(warmup).ToList(), bars.Open.t.Skip(warmup).ToList(), symbol)\n", - " .WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false)).WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle(symbol);\n", - "d" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "JMA_Series fastMA = new(data,12); //typically MACD uses EMA(12), but let's try with superior JMA(12)\n", - "JMA_Series slowMA = new(data,26); //likewise, let's use JMA(26) instead of EMA(26)\n", - "\n", - "//make a chart\n", - "var cfast = Chart2D.Chart.Line(fastMA.t.Skip(warmup).ToList(), fastMA.v.Skip(warmup).ToList(), false, \"Fast MA\").WithLineStyle(Width: 2, Color: Color.fromString(\"blue\"));\n", - "var cslow = Chart2D.Chart.Line(slowMA.t.Skip(warmup).ToList(), slowMA.v.Skip(warmup).ToList(), false, \"Slow MA\").WithLineStyle(Width: 2, Color: Color.fromString(\"red\"));\n", - "var chart = Chart.Combine(new []{cfast,cslow}).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", - " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle($\"slow MA and fast MA of {symbol} OHLC4\");\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - }, - "polyglot_notebook": { - "kernelName": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SUB_Series MACD_line = new(fastMA, slowMA); //MACD line is just a SUBtraction fastMA-slowMA\n", - "JMA_Series signal_line = new(MACD_line, 9); //signal line is an EMA(9) of MACD; we use superior JMA(9) instead\n", - "\n", - "//make a chart\n", - "var cfast = Chart2D.Chart.Line(MACD_line.t.Skip(warmup).ToList(), MACD_line.v.Skip(warmup).ToList(), false, \"MACD\").WithLineStyle(Width: 2, Color: Color.fromString(\"orange\"));\n", - "var cslow = Chart2D.Chart.Line(signal_line.t.Skip(warmup).ToList(), signal_line.v.Skip(warmup).ToList(), false, \"signal\").WithLineStyle(Width: 2, Color: Color.fromString(\"green\"));\n", - "var chart = Chart.Combine(new []{cfast,cslow}).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", - " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle($\"MACD line and signal line of fastMA-slowMA\");\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - }, - "polyglot_notebook": { - "kernelName": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "SUB_Series histogram = new(MACD_line, signal_line); //MACD histogram is an oscillator of MACD-signal\n", - "\n", - "//make a chart\n", - "var cfast = Chart2D.Chart.Column(values: histogram.v.Skip(warmup).ToList(), Keys: histogram.t.Skip(warmup).ToList())\n", - ".WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false)).WithXAxisRangeSlider(RangeSlider.init(Visible:false))\n", - ".WithTitle(\"MACD histogram of MACD-signal\");\n", - "cfast" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - }, - "polyglot_notebook": { - "kernelName": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "COMPARE_Series over = new(histogram,0); //generate over/under series when histogram is above/below zero\n", - "CROSS_Series trades = new(histogram,0); //generate a signal series where histogram crosses zero (from below and from above)\n", - "\n", - "//make a chart\n", - "var cover = Chart2D.Chart.Line(over.t.Skip(warmup).ToList(),over.v.Skip(warmup).ToList(),false,\"state\").WithLineStyle(Width: 1, Color: Color.fromString(\"blue\"));\n", - "var cbars = Chart2D.Chart.Area(trades.t.Skip(warmup).ToList(), trades.v.Skip(warmup).ToList(),false );\n", - "var chart = Chart.Combine(new []{cover,cbars}).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", - " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle(\"in-market signal and trading orders based on MACD histogram\");\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - }, - "polyglot_notebook": { - "kernelName": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "EQUITY_Series folio = new(trades, data, Long:true, Short:false, Warmup:warmup); //generate equity curve from trades and\n", - "\n", - "//make a chart\n", - "var cbars = Chart2D.Chart.Area(folio.t.Skip(warmup).ToList(), folio.v.Skip(warmup).ToList(),false ).WithSize(1200,400).WithMargin(Margin.init(30,10,40,30,1,false))\n", - " .WithXAxisRangeSlider(RangeSlider.init(Visible:false)).WithTitle($\"Equity curve (long trades only) for MACD on {symbol}\");\n", - "cbars" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - }, - "polyglot_notebook": { - "kernelName": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
107.93999999999998
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "// some what-if examples\n", - "string symbol=\"IBM\";\n", - "int warmup = 50;\n", - "Yahoo_Feed bars = new(symbol,350);\n", - "TSeries data = bars.Close;\n", - "HEMA_Series fastMA = new(data,12);\n", - "JMA_Series slowMA = new(data,23,-100);\n", - "SUB_Series MACD_line = new(fastMA, slowMA);\n", - "JMA_Series signal_line = new(MACD_line, 9);\n", - "SUB_Series histogram = new(MACD_line, signal_line);\n", - "CROSS_Series trades = new(histogram,0);\n", - "EQUITY_Series folio = new(trades, data, Long:true, Short:false, Warmup:warmup);\n", - "folio[^1].v" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".NET (C#)", - "language": "C#", - "name": ".net-csharp" - }, - "language_info": { - "name": "polyglot-notebook" - }, - "polyglot_notebook": { - "kernelInfo": { - "defaultKernelName": "csharp", - "items": [ - { - "aliases": [ - "C#", - "c#" - ], - "languageName": "C#", - "name": "csharp" - }, - { - "aliases": [ - "frontend" - ], - "name": "vscode" - } - ] - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/archive/docs/WMA.md b/archive/docs/WMA.md deleted file mode 100644 index 42792053..00000000 --- a/archive/docs/WMA.md +++ /dev/null @@ -1,49 +0,0 @@ -# WMA: Weighted Moving Average -period = 10 - -![Alt text](./img/WMA_chart.svg) - -WMA is linearly weighted moving Average where the weights are linearly decreasing over the _period_ and the most recent data has the heaviest weight. - -## Calculation - -WMA is a rolling calculation that is looking backwards from the position ${n}$ and is denoted as ${WMA}_{p}{(data)}$ where $p$ represents the period, $w$ represents the assigned weight and $data$ represents the list of data points: -$$ -WMA_p{(data)} = \frac{1}{\sum w }\sum_{i=n-p+1}^{n} w_i data_i -$$ -Weights $w$ are linearly increasing from $1$ to $p$. For example, the weights $w$ for a $p=5$ would be {1, 2, 3, 4, 5} - - - -## Reference Calculation -period = 5 -``` -TSeries data = new() {81.59, 81.06, 82.87, 83.00, 83.61, 83.15, 82.84, 83.99, 84.55, 84.36, 85.53, 86.54, 86.89, 87.77, 87.29}; -WMA_Series wma = new(data, 5, useNaN: false); -WMA_Series wma_nan = new(data, 5, useNaN: true); -for (int i=0; i< data.Count; i++) - Console.WriteLine($"{i}\t{data[i].v,7:f2}\t{wma_nan[i].v,7:f3}\t{wma[i].v,7:f3}"); -``` - -|#|input|wma_NaN|wma| -|--|:--:|:--:|:--:| -|0| 81.59| NaN| 81.590| -|1| 81.06| NaN| 81.237| -|2| 82.87| NaN| 82.053| -|3| 83.00| NaN| 82.432| -|4| 83.61| 82.825| 82.825| -|5| 83.15| 83.066| 83.066| -|6| 82.84| 83.100| 83.100| -|7| 83.99| 83.399| 83.399| -|8| 84.55| 83.809| 83.809| -|9| 84.36| 84.053| 84.053| -|10| 85.53| 84.637| 84.637| -|11| 86.54| 85.399| 85.399| -|12| 86.89| 86.031| 86.031| -|13| 87.77| 86.763| 86.763| -|14| 87.29| 87.121| 87.121| - -## References - - https://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average - - Kaufman, Perry J. (2013) Trading Systems and Methods - - Murphy, J. (1999) Technical Analysis of the Financial Markets \ No newline at end of file diff --git a/archive/docs/ZLEMA.md b/archive/docs/ZLEMA.md deleted file mode 100644 index 5df16918..00000000 --- a/archive/docs/ZLEMA.md +++ /dev/null @@ -1,5 +0,0 @@ -# ZLEMA: Zero-lag Exponential Moving Average - -period = 10 - -![Alt text](./img/ZLEMA_chart.svg) \ No newline at end of file diff --git a/archive/docs/_sidebar.md b/archive/docs/_sidebar.md deleted file mode 100644 index ceb3a715..00000000 --- a/archive/docs/_sidebar.md +++ /dev/null @@ -1,24 +0,0 @@ -* [Home](/) - * [FAQ - Frequently asked questions answered](QA.md) - -* [List of all Indicators](indicators.md "Indicators coverage") - - * [SMA - Simple Moving Average](SMA.md) - * [EMA - Exponential Moving Average](EMA.md) - * [WMA - Weighted Moving Average](WMA.md) - * [T3 - Tillson T3 Exponential MA](T3.md) - * [SMMA - Smoothed Moving Average](SMMA.md) - * [TRIMA - Triangular Moving Average](TRIMA.md) - * [DWMA - Double Weighted Moving Average](DWMA.md) - * [FMA - Fibonacci Moving Average](FMA.md) - * [DEMA - Double Exponential MA](DEMA.md) - * [TEMA - Triple Exponential MA](TEMA.md) - * [ALMA - Arnaud Legoux Moving Average](ALMA.md) - * [HMA - Hull Moving Average](HMA.md) - * [HEMA - Hull/Exponential Moving Average](HEMA.md) - * [HWMA - Holt-Winter Moving Average](HWMA.md) - * [MAMA - MESA Adaptive Moving Average](MAMA.md) - * [KAMA - Kaufman Adaptive Moving Average](KAMA.md) - * [ZLEMA - Zero-Lag Exponential MA](ZLEMA.md) - * [JMA - Jurik Moving Average](JMA.md) - diff --git a/archive/docs/getting_started.ipynb b/archive/docs/getting_started.ipynb deleted file mode 100644 index 681f37e2..00000000 --- a/archive/docs/getting_started.ipynb +++ /dev/null @@ -1,445 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quick Start\n", - "\n", - "In order to use this .NET Interactive Notebook and play along with QuanTAlib (outside of making your own app or plugging QuanTAlib into Quantower platform), you will need:\n", - "\n", - "- Installed Visual 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": 1, - "metadata": { - "dotnet_interactive": { - "language": "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 2023-03-27\t 158.28\t\t 158.28\t\t NaN\n", - "1\t 2023-03-28\t 157.97\t\t 158.12\t\t NaN\n", - "2\t 2023-03-29\t 158.90\t\t 158.38\t\t NaN\n", - "3\t 2023-03-30\t 159.77\t\t 158.73\t\t NaN\n", - "4\t 2023-03-31\t 160.79\t\t 159.14\t\t 158.69\n", - "5\t 2023-04-03\t 162.37\t\t 160.22\t\t 159.25\n", - "6\t 2023-04-04\t 163.97\t\t 161.47\t\t 160.10\n", - "7\t 2023-04-05\t 164.56\t\t 162.50\t\t 161.07\n", - "8\t 2023-04-06\t 165.02\t\t 163.34\t\t 162.04\n" - ] - } - ], - "source": [ - "#r \"nuget:QuanTAlib;\"\n", - "using QuanTAlib;\n", - "\n", - "Yahoo_Feed aapl = new(\"AAPL\", 10);\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; iindexvalue0
(4/7/2023 12:00:00 AM, 105.3)
Item12023-04-07 00:00:00Z
Item2
105.3
1
(4/7/2023 2:34:48 PM, 293.1)
Item12023-04-07 14:34:48Z
Item2
293.1
2
(4/7/2023 2:34:48 PM, 0)
Item12023-04-07 14:34:48Z
Item2
0
3
(4/4/2023 2:34:48 PM, 10)
Item12023-04-04 14:34:48Z
Item2
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": 3, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
[ 105.3, 293.1, 0, 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": 4, - "metadata": { - "dotnet_interactive": { - "language": "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": 5, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
[ Infinity, 0.6666666666666666, 0.3333333333333333, 0.2, 0.14285714285714285, 0.1111111111111111, 0.09090909090909091, 0.07692307692307693, 0.06666666666666667, 0.058823529411764705, 0.25 ]
" - ] - }, - "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": 6, - "metadata": { - "dotnet_interactive": { - "language": "csharp" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.000974358974349343, -0.03456027049873228, -0.13792617985566447, -0.4729486712049916, -0.825402881197467, -0.8902360596814031, -0.9360607784903126, -0.7333381872239422 ... (79 more) ]
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Yahoo_Feed aapl = new(\"AAPL\", 100);\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": { - "name": "polyglot-notebook" - }, - "polyglot_notebook": { - "kernelInfo": { - "defaultKernelName": "csharp", - "items": [ - { - "aliases": [ - "C#", - "c#" - ], - "languageName": "C#", - "name": "csharp" - }, - { - "aliases": [], - "languageName": "KQL", - "name": "kql" - }, - { - "aliases": [ - "frontend" - ], - "name": "vscode" - } - ] - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/archive/docs/img/ALMA_chart.svg b/archive/docs/img/ALMA_chart.svg deleted file mode 100644 index 2e3ef221..00000000 --- a/archive/docs/img/ALMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/DEMA_chart.svg b/archive/docs/img/DEMA_chart.svg deleted file mode 100644 index 16913aa6..00000000 --- a/archive/docs/img/DEMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.5102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/DWMA_chart.svg b/archive/docs/img/DWMA_chart.svg deleted file mode 100644 index 2ed01660..00000000 --- a/archive/docs/img/DWMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/EMA_chart.svg b/archive/docs/img/EMA_chart.svg deleted file mode 100644 index 7fe95988..00000000 --- a/archive/docs/img/EMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/FMA_chart.svg b/archive/docs/img/FMA_chart.svg deleted file mode 100644 index 93d2997e..00000000 --- a/archive/docs/img/FMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/HEMA_chart.svg b/archive/docs/img/HEMA_chart.svg deleted file mode 100644 index ed35c54f..00000000 --- a/archive/docs/img/HEMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.5102040600102030020406001020300204060−1−0.500.510204060−1010204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.511.50204060−1001020300204060−1010204060−10120204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/HMA_chart.svg b/archive/docs/img/HMA_chart.svg deleted file mode 100644 index 7fa9c1b1..00000000 --- a/archive/docs/img/HMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.51020406000.510204060−100102030020406001020300204060−1−0.500.510204060−1010204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−10120204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/HWMA_chart.svg b/archive/docs/img/HWMA_chart.svg deleted file mode 100644 index 660fa53f..00000000 --- a/archive/docs/img/HWMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.510204060−100102030020406001020300204060−1−0.500.510204060−1010204060−1010204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.511.50204060−100102030400204060−1010204060−10120204060170175 \ No newline at end of file diff --git a/archive/docs/img/JMA_chart.svg b/archive/docs/img/JMA_chart.svg deleted file mode 100644 index 4be3d13e..00000000 --- a/archive/docs/img/JMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/KAMA_chart.svg b/archive/docs/img/KAMA_chart.svg deleted file mode 100644 index 2ed53b3a..00000000 --- a/archive/docs/img/KAMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/MAMA_chart.svg b/archive/docs/img/MAMA_chart.svg deleted file mode 100644 index fd2cef35..00000000 --- a/archive/docs/img/MAMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/RMA_chart.svg b/archive/docs/img/RMA_chart.svg deleted file mode 100644 index 3be85be9..00000000 --- a/archive/docs/img/RMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/SMA_chart.svg b/archive/docs/img/SMA_chart.svg deleted file mode 100644 index 9de5db90..00000000 --- a/archive/docs/img/SMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/SMMA_chart.svg b/archive/docs/img/SMMA_chart.svg deleted file mode 100644 index e856b1f3..00000000 --- a/archive/docs/img/SMMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/T3_chart.svg b/archive/docs/img/T3_chart.svg deleted file mode 100644 index 906a89ab..00000000 --- a/archive/docs/img/T3_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.5102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/TEMA_chart.svg b/archive/docs/img/TEMA_chart.svg deleted file mode 100644 index 4351664f..00000000 --- a/archive/docs/img/TEMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.5102040600102030020406001020300204060−1−0.500.510204060−1010204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.510204060−1001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/TRIMA_chart.svg b/archive/docs/img/TRIMA_chart.svg deleted file mode 100644 index ad79cb56..00000000 --- a/archive/docs/img/TRIMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/WMA_chart.svg b/archive/docs/img/WMA_chart.svg deleted file mode 100644 index 15e010d0..00000000 --- a/archive/docs/img/WMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.20.40.60.8102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/ZLEMA_chart.svg b/archive/docs/img/ZLEMA_chart.svg deleted file mode 100644 index fe9ceab2..00000000 --- a/archive/docs/img/ZLEMA_chart.svg +++ /dev/null @@ -1 +0,0 @@ -020406000.20.40.60.81020406000.5102040600102030020406001020300204060−1−0.500.510204060−1−0.500.510204060−1−0.500.510204060−0.4−0.200.20.40204060−1−0.500.50204060−1−0.500.510204060−1−0.500.51020406000.51020406001020300204060−1010204060−1010204060170172174176178 \ No newline at end of file diff --git a/archive/docs/img/quotes.gif b/archive/docs/img/quotes.gif deleted file mode 100644 index f7ffdd1ba88a769df34f18ccf1e694749d8bf100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 780780 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%0D3FEayRRP! zpth^ZqvSbtmV0yicWueGHaL__A44x1SEhEj`KNLf3P9d_b-C$;-o$Z$y$gNkx^DyRGL zymykQ?{spdeDE+K4?Ug3DW3{to;1%%PO}k-U-)2s34r*&6S)fd_CI7uH`{hnKt7G5wz$d*$eDHU5M4*l62)qKkaS;?$UL0jLn*j7edhGKfA^14I z-QlqSjCx63;@8Jk#Ibtw!({b@$BN?hu_5PUyH>To}@8h5I zZpTJZ0#cKx=!+&ubhek3Djo<>5vleeIu@0Od+y^TBANF)1ZdC_9b61F5CEGT4viK) zikmehq8KMyvsp>n=HYNCPKfOOjZ->m207D-KyZDoM660%JCx#vcrXAAYG{KR_SuGh zx`Chl45&cc@CGn|1~2P$q$OssK}nzzlAJ(RwtS;P0GLZ~mHH1i2opID6%C#ALDX6t zWjM}}LP;_z)Ks7}QA0S&N58U2LI>o&1$G8i@~jyf+zC(bICs- zu-?u+E$!M|$f?$_3}gNA_6g(Qz#;tDaiRQLw>{53vGhe*q+vD z6k(%tzrR7=UJI^OV<`NVN`WNQehR_9DZ z8ZrTE#D!)1h5!TC}`Usf=%=)$$HKEq0k!<1UJH08@N z2YT=9<+|G8<4&Bf!2z%e*{&BDLuSG_)_~1Qt^$Co&=G(;S>A0lk%^(*>4_zd5O~Y^ zwTzayvu9pLWQVso`iz>(D%rF^BzKC{`4zW=wTv6+P)`Qr4UrKo!~wL5VEDANj~p@{ zPoP1gOH?|0DITkW2yH3XLe5e?VhNomrL-mU<`5VPu~au4jBGE>h6u`rGbfehQ1`9V zoSSx>6)_0=nJsi!{yyz6=C&m+|4JDzRkj^vp&x86+h{K?#bOJo!tfLEQT^2QYxS zUfz&hA7Crh$b^N-yo?_X2hh+2xB&_gfvlJ-Si94xWB7fvO=z>?g6nwJ)*VtE!nq_M zxho7MvN+G0)`D0o^`+dBv~!cy8wg15H}E?}otDlqTk)MjK4BhwKLXz?*$Y%-l7M2< zFBCmmEs@-V?hod%Ps&;`dmCdl%~FRXmu9##np0=FsTfjbX32KN-rnpkQAl1zC)qwF z#aM5KzvshhCk!C-I%#jlmA`f~91U-{1P>SORybq#_y_jPhD5+dWnvX-p~YHZV`b(Qc?Lu%r2s{-(F*e= zaS<3*Ovh^DgbZzV5v!9*_$4~~@Ez_Tg4@wxppbfkaR4N61x@e-W+Zb121{82R~cbQ z`OE(V%wOHw&BMew>zK$M=8(5l&y%gzYDN>}4co z!70fUb!!!EXZ9u0)L?*h4}zr+I+hM=FfT@iV76xfM}P%ZU<4OHX-4E~isb%Xzz{ci z5)KPx8s@Ik03?6~Sa1XwaBl?= zcU*y8UL{Fmu?gdlFA!#gK5C9KvJ7I9>wC=!n2lC2dO!5DgM zsbQAmIV*{Zmg9TeC>^>)Cp1|qHbWHkaTIe#kOfw71ao+AhxvNOQ$5vEc6}2aS1|)sm3r^fP03jZAdr!q zsgd~EIDCheKO%rTVMJauHK}Nl{W*MtlVmM)LV@uLK~$i^fS_Fzpi@(Ci_tPTW_k@& zMe_C~A+m!8Z~;t^1y>*fLwACdCQT;fIS^VHjX49+m4g*iG7;kfG+LuJdZRdMqcXZP zJnAqf)1yEdq#d)PLh3OqQ=}jBqd+R731FdRSSl+L4*_!k0+RtFkOf)L1Q^f&M@pm* zLoivSxJPt zNrRM0kBUeO0H}@HM{D$`w<$iLaveIhmrKE4f-z(VZ~<><1zd0ed-F%OCm^l*nE;As zz5@V%n086Il(VjfjZb8eg)fA2j|JA-d3sG-!@WD3VjNfwWU@{HbPPre#d1 zmJO$LYhaiM6!U&#dx5pV%q0FdG-v$`Tnj}S^~RwQC%RSbI?;sdegWuHu&nVc!7 zX%;n|hJXthir@By>?DEMmuc}D3+~8H2IOMTrg1I%JX9ilUGz?(f*ldG9nnK+APSJZ z8a(g`D#!|#n^l*g@LQO-`riyF! zZDu7Ah+CG_XElxccO2E4i?Dt0Vv`DhsvO{xRxpqgMv%rpFN{(zpv5`FHVHoifOisN z1TeU|tCgC$j3P&yc*t=Mh$ZT_eE#s07D8K_QN^yWC2Gt&ui6AC(8>};f>m3lwLMo? z5Q>C(Mux*ASfqn`o#34SDTfMCE?@?(3#JjpRxUh9VaK?c&RCzk>!yv^4WPx2GD)&q zmw)?v4F`x;DN7;ihJgn7Cp>|cAUmO|d1GgTQ{S7Nr@~(#f&e?I1OO`nbBMIgDH!9B zU@99|C}ArI0c?@^aTzhOocRIrOR*byxgBg*5aKt{hO(RnaaJ2W;Zh)==6Dvgfggox zU?;Nd_FW-cwUHqy?{tr96IlE86ko!6D=4BDP@x zmAfvil`4$JgQvwoELxZs{uAmZ!26@axA2L{wxG?cw`QSjRNE46QeADSk|Wo~ErC^% zaSpV~4k4&x8)}QX3Wr=Ubi2kC!(kD-){+F=ieOd{2k{4fV5bGCXvDw*^ox<4nZ}w~ zxFc32GrY3OXSV$NzpJ)&g+O`0d4)X33lyk zH(hjtPTt^bW`?#XOdMqAaL#F`-HSz5@40K)DgojKs3Xe77=20GFC~Ob8EKJ5V{l7F)3!d6k}7EK3NA{5w7{)^B{Z&<%(w z;5Anysl30NZltLrrWmm(+sDkpinKXpv9yhg)NV5?D#hd~6RZFO8<EewcP`Ql`WCu4bn+bx`#%M6``TT=}j zh403a9NjRwadhM8#?c|-=vF{l&@sA4hlry?)X`wz==76NLQrWzL9qZ8@#BBE_dfTW z^PcllM;TbkQdAPug{_yxa{KxEK7O1`|JvLUpSeB!M*6Lo=Bt+>cdy1tU5CvSUMvUE z_&=K}7#gIf`=#FytyR>G_V|-Dd6F^tC4pH$PSX0XdkbRN{X6GIH}62`@;$_B@4t?M za+w2D;?ya*(wjH;V$S#o>vxRK=DI8k-ySn2EI;Zid)%MWKeqPvaUl*LwspgEd^|kn zN(u0UZbLA4*1O6>Cw^`$S_^ zuO(Yyb+XZA&A+{>Mo~>qXqp*8gsJ3_oeA3UOusI+FRB~tG2i_ESSRdp?QeJU?Z-PF^u)eF)e@*&P*byfC z+bz#*0^<=w-3%(3_O^hhO%KI?C+u53k1|;Qsx!k5FLo<2L=m- zro=1(i>1!lEa}BKr#JPQj<@TRusEzsfEneSww-VxFC#y4(`q6~Qol7^%OCSpOiG*g zk$EhF{$yBWXlWsXEbiQwq1XI#*`I zrM^w|0N8#6bS~DM^w7DUrU@cuN*K3sG|q6Ooc#8OibjuZc(j`{y=lK3m?5MDb8?kz z_FieX$~q1J17D4eZps|reG7gH`JfWNcU{7&W2gA%O}YUw=%Vkn8+P;J|H+!j*FA~5 z<}Rw2&$xIcx>#^+_;HDJ*P=B`BF(AwMG?GY&*#-FmPqF|*9ET_!mrT>qLBydxXE|o zq+qGOjrIFi!-%<+aiK%4l=%&nXF%8H)Ljq#%2J0t@B6JDpTx&<_^z!k;U8YOddADI z<JdQg%;@FV3PYuI;Z$`n@j7qdiK)apF?Fsm z;Ruk!1ID_9~dLQL2+(Z)SH_y4`0=8#PN+cgkO>9z@n9el7O~Wy9XoT;BfsjkeG} zcB9J2*7qofFEU*S%3%U&ni9Pu5a?W4US&$H2>EZ6Q7h$dadqmG^$dx#P)nZOjEFGM zRKUF~9ZpH|-5;^lb;XeKy@uuL3Ax5L+Ktv8k^>m%_G^f~FAX|;{9mEc?0|8}*Eoav zTQ}16MmU7IFfCeR1#03k3%ZR#x&=)gj2@*Azl~G+Ln8g)waa42+`@-Tv>mg^`OUET zi9P3DuENY3xk-VfgON-JiwW&N*=p_8zJp?v$vg(Bzzg+Jc3)J#ziG_jRnto}V&y~w zS0Hsz(l==zFgK=tGt&vHtFZqu_mR)Q9Of?LVk|=RU#{m@>22bqLZhEfq~wFqY*Wt5 zc@069%Zni&RFz)L>Zr)EziVmj>;`6nZhZEkv3~iZUBQIQ4i7prAbiS5Qn9&#VvO2E4&@a*~_a(*nzEsdeJvX3a^*vsh@4Z~>wZZQT+m;PkMfr>u zn#2&-8xrxBlMhr<13lxgPFa$*&aySKC;Y+1`yU{(n_Eq2xu=reDJ^gh;h_eqN~ zfNH1<`1Y`*W_*m^8^L=8Wo<{3=olAA)21ayOgp1iqZ_nKO4^VV_O1Q5gT&ow(3^Hc z!+n1TRn)sfzaFTY^iEZEs&msm)7T2_^L zSKEt*rxAcEO|LV=7%?Q~!bcsR%7doQo)|$|jqR8GJrg>aSuucAtH;?+TiB`Z^wdoV&p1H*38lQKF~itrvyFf)g+J(7$_RGk8=eDOJ?G{L_5lF(>;2I*-Pe;O-HZ zY)^6E-OYCisnO}O4};UL2$6qICz;ik4;L<=l;ZIOL^@d8}~&VSOS z!-uh!uG_$kqi!nSS3{`2)oRDnu`}y#KILTN-XL-4!ef4i5A8i}(zA^>mX*z)+}J=1 zVdK`ynpHpIQu`K)d7nbB+PT7ac;vY2p&cfl%)?$G`5&`bI7pY=_VRZgj;&E;dH8Lk zX&p5+I1e0Q@UK>=;(_$0v_m_MqoP6UvdkTiPZXO?`_y|E{2Xuu{VQDqD{4j>tNHEH z%6Hz9XAqoi-)7#YlC>-sJf`!9*L@A`j-0-5Fe~i3S9j9C`@FpTr!i;%V_{&?bMW6E zN9@zDYTv#qsdlcr+n|!pxDTgRp4AL3ZG(!ku4f1&52?1^+Jg=&B!qB`=WB2TDz$`I z$xIvyTN1O>lDR`Oaf~jNx)il0Bo1zJ`31JFJu}-E?lu^@j>s?N4qoCg&ztxaQ?YPZ{ zzBcmee6Pi&zke#@6VO&X3#7^TW|qFmT|zwai(LSHNO?$p`CLxoQp=t|h`yqjVQDvw z{VipuRQ0>KXi1;cg$>1(YvpgA&_?k^KP>LA3`G;h4Jrf-3<%&_+Gscw;kU9wa>^w!RLf~}X$lmZTJ z81YRkp{d(ObTHhfTT$B9O?e{>yja|zk^#YH=BHL_-Ol+G&6C2n? zWb{pYK4`ZIGwC#5OaX^K#E16-4htrFWCy~*nr$W7I-^$bvLf_i>Qx}ki8WlmAMmJB z<4HX`Nyv#(i4{c{Ix2i>)9RZAd;4cL_8JI%qx(DK`BF`;43heAT%f|AqXBkpY+bPp zktmR2nIn`H!OCFU=3hO=m>cGK;>a2~BiO3!|BghgYbSn8@+%#rmG>f~vN%6WyR_Es zKZi%4XN2Z_5bk=pE5m%WtcedyqgF=~JzvYo9%Z^p(7r`r^F6N#mqf=O6PyiY*0ycR zg|9xMq+f6nJ5_+%qWvY(i7`fzDymm~Mg#wP>t2H4P3oOK8N?I;z`A7a<8^j{HITo* ziMF47oN|PMY5{_ze}EB?MCwpGkje`(BER(0chh2_x|CssY`wy`db&?6GRbNBXBy>& z5__(k;UX?H7D{GCmaz%)+(mUlg|mx{vM%f|M~kj`7uz&DeJ0DwEf=Z;6n-XH&%uaY zD#SsU_s@3NPe`%#a`A=a0taro=Nm`^_+^KI48^q!B$dq`9*Z63_2DwTQth+CoX@s| zJTnz|d_uS6>9S#qUX|c+VorMA8(Y>KTow@APQ2b9b)nY>76~wF9BW%Cu#YEa9rTvf ziP#^ZXyRj;5LjNLD0`OIMZL56f73$rq}-kXTHQ7Qz8i(@22$FwT8!!Gt?MCVh|W!e zfM=fG3wn|dk1o>M-ra9gyt|AKcNQK|5p7Wk88yq9!Sk;fNama6Oa`0@eDb_xIu!Jl zaP@Elb_0OgpzOS9L!q74`A zYhsePOqFx!(A;DCUa?Z*6r8hrX3?`@&g#T4Ir~ZnDA#^@*?cLMY7pln$_-Pw^`Ph8 z4IIo91^w7_Zv_?la)@)x(|_StbNE16O`rr<=0H!}NyDUC{cOD- zS?#B3sIf=?pI@A(qwUO~n}$@#cxurhJm)hyzL+AvJRw1ICqaR7N;VAzT5$}w`M9gnMDk^y=r}8dsLMwQ}fbQ ztIcj&xhRo-4|oaN*DB}3=tDhw(Hf66`TR%2T@V28{X$vurfp-5V7h{+nwU9zw@+oDA3#l0hb+_s(>MU%x=Ay)y(e7z zNa0E zzfEyvDdh3Z=U2bi9nF^?#e}K;@%^e!L6*2kXI1oKP^d$IX$`pibi~CH#CQm>kw?5L zNARZripsX}u{#;f;js=5S?yl?%`QI!a##>4?+GyZ)N|E5aFEi^`6q#Q(dLFlXOSN4 zL8G95L~E^-vPxT*yx|kz?E8&cN%ms7E$ej@0K z9HOl#P^VC+ITgwk3gVn$)tF@brP;~PQm{E`5A=c?T|4)k2L}$FDvk-7?X}V?I*1N8 zSH5ZXkXcT-Y5cVK>Da6+b}VU+ED$P$FY8== zjC1_wXm9(rpXbbV(r(bFh<(~hv6M%%uPZ_Cjd8JIP#!g>pTLQ-rO{P?F?Fe~gYs6RSlvVp}kLi6#IWi#gp z%~DA8lPo5qspBQZRW0s1QRR`$%ki$4m6=10e`>qmG-4}Fv#7@3!U}N`K%!)bC6>|j z#Tn%IbO>QlC-TJk+6!l|w#r9k&qN<*}$zp}!90BpC99{+jF zqdykqsfq4O<@FD;&-4gwS!y&+7umdZpl5!ILmzkO6@t~tUA>&4*NI<@W#LM5S;{!V zN*;cCYfL?VxR#x$kgC%mmYPTI19xUdo{L;@A1A!A+f?k#+3Lk+w$$$?%bLlmoMgI5;@iJSdl7nwVkB#E9AutL$`CsUp#+-Gjr zJMFim%eOfBR{{>$JwOj(4-E#1`EBa9^R0P|2QvwGrNAOoIxs`9ANR5Fk|!Qsk}u|6 zb>oE)TF70r?t`b;P=-1m(lUwB)C+j8^X@VQYBKYx(~vzGH8VV1r}`hS45fyTPHpQ~ ze1`t@=|RcqpsLydCOXODp-+rHRx5>7v!2tO^xIn%0^2p|+f?$Hw5rQ#y4ryHYV(f7 z5l1Vuys^)y!n;a(DzpE!ELYojgSFiQ*!TMiz5s%vr@H@W8QgPdL)=I?uy2E0w^CmM5)B=lSf01bYvX+O9#R4?<>?H^|W5j_*EI}Gq zXSKh4*SIvzNLDU+GkW{;G@*(YJ@Ir!Bm1c^{$+W`n!+2lZ$HFZvs@f}u}^5vNo)KJ z>`x+VUT=x&8|%|OHWs72PxKgiVH#eULI?`<0Y?v8duu|17GHTKx;DfRhM@V}O}{-$ zU)(H1(qB;y75rFu!6m=^`@86Jjna9`4iF$D@cI*OApGN<;v~TB`LDZ=fT}#@%ICjo z@|2M{5DVdV^P}JQ@BL=Qt~6Z&B^OE*1z!A-B;k3&E>v%#6cF>_@JPNKS$(tRK@z`Q z9}?eOWVm-HrKakUtDNUY*U~jM!ypE4%uO%K7gdJZ*%z=7sgS|YvltV|kVAm?iha)5 zdj&^k=OiCyYz&AS4K@#jZV{H<02+}Q6h|IPhJaEbC&>c{IyxjVB{eNQBQq;IEjc$O z8J?4rla~(T;pP#e=ebu|MZU{ZLw}c^mYIe1!NW(Cwg>FY%2n-5{VZ=*S0duyQH}= z4(p^0+MO&S$RO%;Nw2%rrOh|?5TWHgPCy8lUUQrEfEr)n|JFY9q(_tvtnUZruq52U zLU>h+OrL_FnX@~vBzW{Y%Nr{`x6{}$1f?-Xwi~`5>+DQE z{1+S}%M6M+s zep09#@BOgJ=v~1=_*41H?4Q8L`QK{*w87wI@a=y%>H>SH8)$z*wBq7#p)zs;>`fy9 z98*_4ntZLPEtMz4d)GK6uy-~!h2I)6dgi2kg5SuHY>4q>(xjXWp*R34*idn7GM@tgC{$yvbN=Zk38ZqVaCE{O&llSqb>x*~-%|e~e?SHS; zUfqCbtMTiD&{TjctW3{{?Zb38FK;--PD1PYiTJz)v3;fAc@NY4r9Um?{ewbtBN|=$6NVbWsTkPFrcN5`A%&X938$WdT$be>HHP(IM zBR-EMh5HK20`F zJY*0a8DJj>m#@74uvsdh@2t=t@+*nkH@z5t9VxMN=g~9C{hME&XIV*LY-=WdfA%AC z@7vu+DDT^XTGnlhHEf0*_cgDL=PQg}#{kYx^*CBXtx}_4T;SuaAwJ#bP&`{ASS$rM z1d=7a0&(I)lN+7AJw}+TiEG4Iu4VN(V*$1kNqrcGeV*_w$FgwzJW>C73B-~9bI?*q znor-P8D^aJX*DXiEmC!g09=H49CW|&)e2dC`wrj3r0t9$T#<_i&A$>?{fRR#Isiho zg~*?74jG6!UywKs4}Aoa1cLiu3~I0Mx7sf%JC|n2RE54)IpFaHS`vhe*>LHJx$XX& zB~evA{cJoDwl~hiQM=--)JqV>!_9f~quvV1N%{BM`cW%BVMeUR*@pvgA)i;XZv2th zhRsGHyxV8mXx;m`KkK?nQx~o`&r}T0X*6m^cMi4Q4eZDXSq*!6_jcF(yEU3@VC|0k zv_nh8gZuXU>y;0_v67~gWfgvXJ}y{nVx%n zTr~XGIuw4b8}mPFbNHn%q3OO%QhzG)_EmgZ9stSnQQR!nkK3psQNU2`+SoAApsz)uOXl573iAbUT!xW%-getyv*PTIbqh0beZ?$H&w! zuFf|cci_c9fUO+&t1(850Ec9lA1dq}vnl%7UIJD`6of?Vq>y2%KBeS7Bq308bY#6w z^Jz-~mPe8gK(|R9p4#1Oou|C+d}$r^)VT^mHqke~e>nl--}CV2O96U4AXMR!8OLKB zjiPcWa%(N`ag+=sfCXRqv=pL-xm%VW?vb=yKVZJ2k;2d%aPXT8)=dLtZ}(E2eseaH zs;qiZl`2G|_@hcPk$Y~od^S~U+u;TWbod@X_K@tz)&KFGMX_2&eqLnYzwQqHOk4*v zN88Mu$G;;cgH34t>4Z~|qT|)7S@R(oQrU^}z54ojAgr~S|C7B*WUt4)8R5E%%_DNp zu1%5Cw2MtGH#pODl`rt;*Ny9c>@1Hcl46ROdoJ4eDC=Di4WMxMf{wpAzTifYDm~Sl zku2prI*~FJDAe(}NP@Wi!Sct~<_`;fg?y=PH(nsm-whU^TeUvup^+6xGzA#WHP3Lv zfekChl0~S1_UqM;2+k9hm9M$k+lKYH$H{`7XCHj(W|4Xk`h@GG>JrM7#97EfqEiTi zz3am75AGjE<n0|P z%Rs4p#1+GqdJ?7zXhQ3ZwMJvg*cLuwox@FSF+w z+A%Kw=V1HDmt0zkVE4Nc8rADr{qHkpjm=*Z|N3@4zqy{yYbJtUM;r^5ceX+<@Qli) zy&Ux2_xZ5pQvW$B%ryR7L-dlMH>QPLeB3$sgW{ZEF)szag@q-b`Am6k0kBb>coLXn zgUz?o^)1+X^NZWO6!O=2Dt;sZnLqC7`Eiv#O z1<_HBgktlSEF1vtH~7VCQ(qEBJ+D{XM#=RJ5r4{LP4L!4FrYI#*e zL>rA7>9XE$t7~Xeknxf=+kb?#R_eNR)j#ds+Ku81Unjni9agzGeYaoHy|yttpt0{I z7Pk`mzdL-T1#NhO9~agAcWZ*qv}8O*1h~_(iqxD<%bEMaz?EY^<*++ie)y615@ytK z9F#3uJ{IxsPm#uGVDAI>>?^?xSAXdVzFl=nth#vsS{=_ORx{sMm}n@aU&k#Co|{9T^MV4m|(jQS3y`H0Pk1eOzXmlE9l5k3^C`FLR!3O z6huE71hi?<*^57~7DN)+O4J0I$@aNFjf7a)XxEk5#CZCBL`%B3uJ(d9;IOSm_h?(s z{bCT!Ax)Hs+Gislz6 z;H$k{z6Iw?yWlr=F~Ng{~c8(3o+S+k2N{1CTc&m)>doMgUv z9i=5-r_g)uso(%(uZ((q`HvgmGjq0NE5qcMUdiXi!>~VaWyiaGULtLmDL_BiAY4*% zMSuT$Jd-D!LATi$Jq$DyK=NdBt)yL0L`{Ee9Kk z;KvHI0b(e_VN5ATyz^w3=?iIg)-c#!DbQbOq?Vo;lr%wj>)1Vso@x<)`B9UV^m}MeT z??D(t4kLYI6gt%bBW#IJERA1ANeGvmCQ0q<2j;ptupm%=Ge##Vl7(m8hhP>g!6ho* zd!1jZ>{!37^hVj8*96uQ7S%p^?g35=&f5tK9_A`23$W%aDOj5iW^9Tx+=l<2AwG&x zP$<5{f0hJ9tl#|k%aq%LQ*_-&Z3x9h1!2f;{l>}jhDF^I$^R%i&t4}N7sxbv7>Y<~ z?w*%h>x(_gB9FaQgR!@6eAB(LA^UghQkW?Y%x*gGY08Y14~ga!vk7uFir!TaNMl9E zImz4{#40KT?@wIF8Mkq1a>+E&Mfw#JJ?`a-MhgxY_BTMd$VF@^1;8ZX3XlE0O}o1; ztg_3J2^6vjEbI3c?{PpyZmc{<9E+s!1sDm$by#6em7@APa1oM6OtZ_Y?Y?^ikN!|_ z{cbFn?0<#{#!J?67Don9Ln3{gc-!5*M|p#8pAJ93Wx^dd`)c;VZ=u9l@mrK*4Zh71r5+x%_te4L&ys% zXeHen=B%1xt}7kfp4SQXQ`W#30{ zV1Y66di6)2uhH%DbQV)hs{njFNcvr2oaRB58pLzj52W$n8)5CbU+H$GT#{*GLm^5TL3q?Frn&ni8?cqBmMy}IfFa80JD zH)IVKfrE$4^m?PC3}$F9;`%NE5FJwA#TgoGsPOHg5(2yY4VP*jp;9R=Ki?JSUkWIR zGRhNsFWrIWk&1dckH9+Bd;c|-I}}zlWMsXLgI4-O1j#7vsR%^{M=h0b4o8eIT&A&v zX_ppO-rc3Rr;ufT@5oI4W?S>>A0xu7GR(p?`cVr^131k4304{_pztUSmr72Nkg^|^>Uk5&EhY%NjAaZ(KY?}_z$P1btF2dYRG zL0qTvAwL?Uw5dF3b@?Hht#O1`A4-*^m3De1Q+Q>HlkH^K^f70Gmy-WamU#t4JW&u% zMTJa3bb9#Tu0OIu)jV)168zp@PQx`Iy}Uei<0@B(NATu9guG<@kc$n zD|(LU!T)6mPPQrT1*W>C`9g5Fo!A~Vx^U*bl2=sacdbb%oN-pL%Qo#D;l_Z?u--=9 zZo0=xqUZ?Nj6-(-n;I)CI>nlyljYhgHsbwaF7FFwbHxX>3J*MBo&fX_$l^SWp%_AG zAIvzTp{uj}r~?R!f7W6RVi7v)z6NEKg><37+k>3Up zgonqvL2W2A@E4kpzsojgDC2>4)dr+0{7qFm^wO|YYshT+K2!w-er0bpCvrWZP^50K zq*0#}q5$;E0aQ7F23YO?yD}iRI&!e02%G;LaN&;|xb%lge}l3!Id5<7)?vsxVCk1E&q81J*tN4Woi!xD;j=z&gn`h>LehfY2nIqglV;tioch3%%Z6=voRLD2BJ|W(LJ7_drSdnun;XOjh}U& zpDsth08RcW&9#1-5Cs5v_#U_gmVLMJ=k5DbD}tOgJrTu3Lhb&*F(u0HrsLoLcw3$D zmtSK8oK4vMj@c^`*rPkt+Wnn*HG|h*@){&GYdOR%{3}yI@yo23R*(c>K$Q!TY{wqb zoYC(?uY}GzQJ@?lP8)a|nE>ABLs55j~ocRw~mxWstzVC@W;FA8Rhg4z)_{hibK!n znUkLY7I;~6?c?aJ#f_FlZV?7R1G=c<)HB;3@sjC(d~?mZ)HvA%!M*T(krvD0(&P?qI!)p6{vz_pM0n+*@l^=jKJ;e7 z8|w>3A~Q|7t~o}tcZ6x?&qhHPW`3Fyj$K1%ws5drj7gNTT`U*~{s&xpd9d{E=ndm% zCW4YE6&iV|--!%mp4G-dev%czkvm{GCG~p4waD+Pi4YuNMoIJxpxA_`r^nb5!+Xoh z(n(lsC>G;FYVMnuFzbu`Ro-`w-*N-L&1TkT*MGkm9Awe52=|HfQU3N=AHao@2)H+W z)L$#*^evTU)2(K~`=|6D{TKlJ+vCxN1Gx_eJEP(fjPL$7;3$Lr-+nW`{Pt1riwBW_ zFKep)I*vewCMANj!nb-ohEfMoG+2bEXKTmugbmUWd+l519J0>c-hJW8S?P2zdOph5 zzNoo5t*SpzwmWQ5{?|}c!xNgtCW|8{b1V5-^J>1!jM8#?WyJ$!=EKF%ss!3M+Dd81 z0Bh7VW;x>+evjew0&&ZS!2|7Wo9yBy*(5?(B6;vE75V91?<~n(b zMXb4M$;DF~2qqCRbS8WOVNjwF%I0jC$r{W&d`lJm19cm|?n6S~-t*$ZN{|mtOEW?V zgT4)tA1tM6nwF=PeOWjGT{1g1Q@YGW(NY}MxnZu=9zR1w%28*AO&(KNz;ptYQW?_y zHX@m!17d2l;UsGoEaZjGhcQ(dVW@Owa9u|(TxL9JC1(9uJCDwe5L(>w-*~2Jy!KW~ z(5=XW$gBE9dei`v6HkR&8`X^DvxIODq?ih)6A~$0-snN(1)O^IMYh0`K@#6VGL+Rg zlnUYw$`%Qp8()ycT4uAQL~LSj!1Wy<)5I`yjj-k4SMHr8I1r?GSk9l0;fCIcQh8b zK9uZ?6+WwtRTdlf_Y|*ylII$(6_y)kia~=N%^+DIJA!OmJazEDABTvfoUK6>gO$b8 zqWL?`VftK!v4!=7O=W+K2#=q+aUGY@xdVd_S}|Qz%k^Yzt2O{N>gBXNO&W9pGC3js z8M?YrWjTo%j$(*%;MSp9>Un9O5wz-dQiu{f@d2tO&CHU;z-`KU;iM;E4rNc#TyKz@ zO%b@4ssa_M{(OV&4FRkSz?o9LvLAgKwWY;ttxlLqI}O0{=60UEKW~Y2EKNG$@yQah z9(j|O-w8Zhg9H`nrj*J$(CAwW66>1u6schEti^C-92*r-Z>r|~q+epeazX+D*9 z3$pjEESn4^f$zMf+ywPvy^R0t`;-u?*$^x2RCUzOqtzKpMd|rr`7?k>{eUJfn?ht!al_CsFnMpKMZ|0xwhV8bHG}X!h5OIa^k!&H~sIV26zt z#CZU4%)l`px0)fo!!fL48r1HI9K(-_hSWe}83=hV41vVDYSt+P9w=@5BC1~urL#mg zMFF8{`&2VY$FG@phd0v6F$kIB;cKK+#k$wcEQ%slG3+EFC&XpE zN+$e+^`VDoBNi&94#IvtgsHT8FkFu@;F+VqRO<95?LI3OKdOYO2akfhTJEgs zP^G)&sLTEH{9h0~m;T;N3Eb6N6+DzM$71Et_x{*yXB5R=In-yUf;I#`BSToj4Nt5| z0t{#@sK^lulje7^xcmkv&)u(QT6Bi;F~7RE6X8{>B0FAS=uCP+b?W^V_$YKB!*wQQ z+1Wo+fb|1QL+{7LC(=?6|GPeLSDlfPA9Xg(E&08bB9rO*lLFTM?SGDUA!+}4| z4>~+9sb^qyTP7%WYU^El$p9Gu=<#o9P=qIMUt9xGZoWGxQB$=xVCrr=@NM!OfZK{$ zxNu-W-Z4W(1C^#d(kWW7(9O_CO$U1L@D*W33e4etJTD@uYVBg170!Rk{Bo$vvL zho}{BoDdF5zpR%y)2QCPRlat1B&E(;fR2JB#)^Bndch`lc(@%R79vD}p(2wOIusR9 zY^pX|OuVA8ieqf+LcBHMJ@O=SH3kC_*|O&bWD&7gTsAH)h76ZdZUnXw#UEIe`Z|6DA+$I=syV<)S2LcgX(w~ zooh$f5-Wo`)D8t@HifdALhF;D9R8PbhnVfqy#8%a%nbM^Rr*~UudMCVghVVI-c!*&?2isJtJ;X0klwp{ISFBvOa3Vc<; z=YQqS1mA41O;NKGpp0D>I0TSnAYjJQ*c8XI1H+@^tGg6PcyIxPwZND@cYwFTkb!PS z;w$+g^@jAE_f-L`G90+2G2;XWS^xI9bt(K7yAVVLixKeDv`@bDej`1vkd?y}%EARL zRZnDY%D7{i$R(M`a6%yOvO3@ifHR?v3wExoa5xU=JmldL#9L3pk^;R1NOqUgCK)qF}OAn52LSV z!qCZC>Sv5e=Osrr8JOZ6cYJ~ZkI#vH<8S4S% zgvPfED-Ke15j$MQDpqUx(rqNAFSwf^46x3bu4%{_r6-7}wtXcA7RAYyr9cG{!gheL zLs4Q-Bed8#Q70?|hlW-opvb1odP$fALDL^k@Ff>&H5W$VVCQa(F0x1uS>#6rabdw` zzc|d0G?wK>BB6dyM(Ey-xKq`WlG7aAppIir$mdkzV1D*F`K&-@z|Y)#A*t`B6wBn2 z^L@otg~&{+`Y2PmjwZ9N7Ly z#>>wtjE{v?qAw2QlWOyU&m`6G(KIy?tGCCOACLf6WctypQ)HVOXSt5v7AKMdN(}>( zJA{nME@2W-OR9^}qKmNv>{JbQas3Wf0j|f*7KDRG&cJS<;C^J#HVZrw3!jOtoYU|z z@DLu8@|kskhoJ+p8+WmT>{q^uTx2O*Sp+F5Asd}?pBZN-eW;>JX5S69^qx@J+tAZm z3N~*lmrC}~D7^j+8}MK#XTB{d(oBD7SMj46u%ARP0;euAul%%|3&2aWkI?;7@;i&4qg}P}qeBC#@N`-a8cm8! z{e%H+80Q}$!{oy}g?zbtLvnX%G~0fOl^DY!al#QZuw&Eu2lc}4L$DAMoL2-FjD^qX z@f!}rt^*CL89+-lk39aS3;+@zz8KFX5WAaTTB~ct@^vpdkC;78lKPJ1hrJfQ z;o=cot{)$+uk;wy#fEF@vaA`iTuwv|tzqLbm}Jw$V~IQs-x%-f-Q@Tk*J^tnBA4+z zwhTnY(*xxJOQxhwtMpK&0|#1J8mahY`ra`xF97~yT-IK9@c<8&!JsaN(nNLCGU!=r zqSH6M#WXN=AWCX(rvjU&+>$MqRX2il@C*ba17Ub!apLrKCJ$dDJ-!rWs@K+`0*W&G4rQ)Dm|kZH;Al z8}SEkakBz{exB)V+vVTJWdbXVC@c`6bn8Z&!Pcz+ zdFa4)ejw28aZcO(O-DLL3metXnkJ(DyxJR#zkkvmC)JE`*&lExxvEHE#_@w~Dz{Jo zQMqY5$~Q!Gs&P@Ls)T_SF*FFlA>JPi#)R#U`)Yg%G4zNx3gLc zbwGXQL*C35KW8uv@_vV62MML9(EHm5PUe0Ty2Ds&)*8*ZEL`~q6uVcAjwuf~qk+DkrK_egov17^sK8TwK6 z{=Qk*ZqR^D4?yU-YmvHZ%Xpzi>CqF)U1Hm7sZalsJf+|GHiB7YN}PApSMITRqx zAl^VaZgj=+J{Ar{!Oy0(aFSV11?n8>>GJ<>N`e_elOAZN2q1?EDLx%r8J#Fi%+U830q_@o11O5=3 zz5?2483B7P&>b!Q|DFgV=^qD=3%D0>seG#P+E4OlrSjwZ=Izt?DFACg1)EnV@wHPz z3JOcH&4$NPkgJOJgh3G)pl0|;_My#6Hdl=0c*gBZe8(9G03*z`tf z=ynOLuIKEzde?KgTE4CP(PTQNz7)UjL80~>@Mms5AF}`3JB7spVF>&cK~^qa6j#Ha zirqF)kYqsla50nN@b8aFTv5}9GvHx%9cGUi=57fYjP@ao76w9t0(jIs+2uT? zu>qy6gOhY{xhyyy=VR~a)1UpHsLq_@&QuJAyS~!npHyvYB{y(BLc9@;SD6pk7(#Z6 z@5i=5yXl80QYt5K9*if~2M;y|PgQYbsltFye0W(=5Z{gmE9Ya&)G%Xy&xte(L=>{x z2AC-cQ7nzd{|#@z1u#1W6s0csJy`I&>wcYK@lGPZu%@V3=-ymv)>%=UEuj3&>%wSAJc&U0e?V%znrVW zsG8QH4Nz3g43aS#C?QIX5gFu2KPy;{*g)K>yKBez zGLIn%CQ6RgEyk09H7|2Mm7%A$Y6{|ULKT%Zn<-qr02LMB6csRAPjMq@{ zYXEsj;aXM;%1Xfi3=jv;+l`;A0KC{qYAeR+WB|qxCyQYm0dSDH^cWaE;=D1&w$0xD zH2rs!B8=VZo)i>}isuKn)f^@OChdXaIbLz0o8#?a91HN{2>|3kF62XAl zU;@R5<2G)5DuCloUU4`6B}0zoS+3<+e&k2~<6EBP2QcJxa^w*J=2`CLST5#7&gDU_ z% z8{Ngg7jZzo=3wsSMQ-L|UgSxR=2;#Anf~dQPUodw=cbP8sea~;u_>D32Y;}1lnk>n zi-w1=8Kyy}dMa{vO#lo0NXQp5eFru1+114@8JC$(LLOe!?Oo|~KkZdP#$EmZ@kI=F zeHrb&KEfb!CXTZ>2JOGF5~-^uV{8DvI@s5n=k$%ae0Ts6ux3(mBNXu86cFz*LIDtv z0F5f?)KRf;+>K``2NYgP_p|JiVI0#=04y^Mp`M=Hd(C=X~d z6U6G*;Oc)6nT}uxhM^CX1Pqm#3Y*YNiRUsdQ6Xwr0@2!rH8c#uj;9xY^X2Fnh}VmR z=M3p%Y=Wl=&kphDvx4mNCh55*7#>z!y^!w^3obgi?~w2{Qt$L40Tod1WG2~gfLeWf zrLiLp>9DzSoU%soxp|F0qcKy)@SvDLV8K)gpMmnJTQ!z4zApZ2@%}xB!nV(!F;;a; zE6>OE&fZSU~Ein-81!5KCSW-1o1y#CoIPp zJ^bRHu&{1r-~4G&B?|y+Ht$st`%*z>5P*4Juflp8%Km=#nCuOdUK(9FO1|Lsj-nhR z-U)Fp_qYwPhgYkopC+L2l?WF2)&T3Wf&v*g!s>CUxujrtf)D709wW-Y+@x#2#A`K; zRg_>HF^!cffhV89^tS2@$Uv*;HNlXv^OmCBrqK9y4+sTnhvD_3}9_+tE{cAY;rZEy?^g4YGt&;`lb;@#xq*5>Gg$=vCK0DkZ>?|y#`8YTGo zB`5j!B^>%TICIvnSONsf5E$6tPoF*%4kKn|OJ9vI#%mAEk zLkWiXAUbS#_-wXfajp49U^w3ifB^BSh!`<1-@0`E(_#D^j@@I51p)|S7U1I{jx^sA zq*imTHfR6IrMWdY^T0EK*)KP*=NSSIf>Og5I2T!BA(#3UFEv?nN%25M`LCm|| z7921O;5D(B1;vWH8z8ss(BO5izc_B4`o6>f$B+T9Ug3wFrJzq*v$aJ)NE}gCnPr?c zc$jB;x#d?or40fN0j<52Kzna>bIdTXna2@F1h6I9Asc~{&PciS6&X$k_*RJrJVgS+ zBRc`-2qsJ|h18D}JP@5!+4bTEE3_zpU6H%E(H%@LnX|xSt!+f$Xc2xUpIlmIdDcxC ztplbw`tb)(W%uxtSVSkNd02v|X#?JC!yx|9pqq+0SVCTNY8hW-VQAief zR3bTs91}rWm|()uUhZHhCzgD{_1HEE7{JpC9;~o}PaOb793?Cu5I~QgI0qys(4j&k zlWZKh3RX(4LLIGar~yYUshK5CStpH`7ouKvDd#lrjfp^u%7!MPlz{fB9}R#p=Vp3NbSZuFrBmTEsi{^@1kWY_Es1EAV~l4sITL{(Qw}0*hHs&l zQBBT#I_juA4Oe51E4ZMlCeE?CiK{(kJS45URFzATOX4yeRc??G%s~)FdO!rmasv~g ze||P$zMu^YU$o;I$n3$^Bv59y4gR9*AXwAtoRR_?Ea(tKc{=#4O3AXTVwW7g1g&0> zE=x$W%1CP$pqUD6$YWFXNsPs>qU{taYV6A79e2=?hIeY{%B!xwcn6b_My>VN zTMxda>Z6IN>~XLDSaGaiw0$>qSRs&xRkhm6In&PTeH)A`SJMi`+7oKG7wjdTAvg$|HztB1Hnq8N~oIX~iRf?3-33o_A#P z5`z3okf|)A7wh5;fJv*C?f3>pw>HMO93lV_0L*dvvjNFz-~b8*(`!BdNu(MOd|w1 zurYHl>e(q@Axezexk?lu9pJ23vB|i8^D0@P&L(N)hT=6Uc|bf+5I5Vwwp0*c@!2U( z+c(xa0tOR6^B#aoFxk%FlQ&mo2Mm?=JsNfvtXfT7XpOl{Li{$Kh$~$oS9cAKItG%@ zF)IZs0D*0`0f7m0;3}lzhBPRE0U`UO0dcWfSmZ$i3YgUU^3u1WebukzjZ9bL^1%#V z)g75@9tQyly#)LL9srofABy^qrSWl=f5qBM_?T3DfS9|D{OVv;yqj1`6T5r;?9S#? zjs5_7f?}1dz$Qk@R$bXw18LBe8{jM7Zvw*rCCXat^n%mZ)zhZE#ZN|q2xH{JBLEuq z)(kr**vmo>hLhum3}qO)EMCo>2qp_t<)>A7LfLT9LvvMa>ev%ibCN*9F%uQ=1+}(8 z4Q+6P8UzjKLbu`2e@+9T!H@w3zyZ*12(%g|4d_1$`p<_RbfDkxD}`7MArv&m1#yUt zDA$a)<1_Wn7ME%g7Jx88v#v$H>&}B9W*>RP2R}-@Cu25QYj@#om0cv3flla|EIx2} z%SIpdeu7o)rW6N20081-00T52@{yO^Tj$rYfG`>OopFc`FETsCATP*TtSnckTqOGm~L z0gvLDRSp1Rzg$zVoH!L`r7Xas;xrSCjFJHVN{ulF|Mx-ATGjgVTi2tE*>{F;&K1$m z?t%p~q(3RV^*T4kQ8q51?btRxw&=7Y^8S&Vxz~6^Nl#USo0>I`v$b2woNi zbkYYoOJ_OK^>jFKabTtoYJx&C*kPPeL!*~0LufDcvn*UhN2`bqKX-nBbx7t=e0@?B zNTFl=7Yb>nHCFh z67+acWATrTbS0*zFZPjjPM1Hb5{`+rWuEh4;$d}S^cX0Ed9YXl5Fuu|)|9>GC6|as zr75!&bljcnV@puCFV2jrnnE6>{KNmGo zX(9RvppEwcySbZFSPHr6e-6MLBJ}{h`9G)hpRj|7`iX%0741@ z5U`s?x}XFaq(Zu+LmC0w$9*bdqcuwYfpB&|{3v=n+7?AOm^WFaU{zdRmLC|#Mko{! zBKk(2QD-VPDc@Ijc_())_kG`&c2_rS(gdZ{@h`*>0Zy7>h6(_M zil~R0VTCHFf@u&@dRc)uaadD&iD+P6(pMJrfH4YMGCB^p6jbzpnExaQj_QpVQ76jq zeJ_DzX@@fBaSTvGr*)b`7p0sTVOgg~Emes%0eT|b;G_|79LJGi#fk~WdZ^9Na9I<0 zbs=_McTCk-irdAd@v*0Zhj3klCDsFVo+YM!kYW7+RX}MuCbE9T;1L_K5eN|$10jU1 z8Jx-XJi_>9%HnPa7l6Q3qKW<_Ef2P#>532`0RZDsN~Lsk1gI({k)70F2>sbZ_I4AR zb*WVqlhDH~Pxh^x3XBnV4x!o~{@^Wks1Ja%i32ey!D*Ex!VC?_68}1-(Nc<|wyX2! zt%8Ii8=J1dB{&oKjV!4Q1k$b>avV=Hd~s57C3=nVlXy6TuAg;A8LJzALS@Vnf%G>J zh&8JFAhJ{^itsi%+)73&VK0h8c@�sYA6lx{#uQDbK`xf@8Ix=&9?GA(KK72oaol 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

#E>Gn4MY!-hQzk7t_8ey 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%0A`yx_g$Q7xvAPzG2P6{9SeG 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 z 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 z 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 z

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] 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
- - - - - - - - - diff --git a/archive/docs/indicators.md b/archive/docs/indicators.md deleted file mode 100644 index 4c5301fe..00000000 --- a/archive/docs/indicators.md +++ /dev/null @@ -1,175 +0,0 @@ -# Coverage - -⭐= Calculation is validated against several TA libraries - -✔️= Validation tests passed - -❌= Issue - -|**BASIC TRANSFORMS**|**QuanTAlib**|**TA-LIB**|**Skender**|**Pandas TA**|**Tulip**| -|--|:--:|:--:|:--:|:--:|:--:| -|OC2 - (Open+Close)/2|️ `.OC2`||✔️CandlePart.OC2|| -|⭐HL2 - Median Price|`.HL2`|✔️MEDPRICE|✔️CandlePart.HL2|✔️hl2|✔️medprice| -|⭐HLC3 - Typical Price|`.HLC3`|✔️TYPPRICE|✔️CandlePart.HLC3|✔️hlc3|✔️typprice| -|OHL3 - (Open+High+Low)/3|`.OHL3`||✔️CandlePart.OHL3|| -|⭐OHLC4 - Average Price|`.OHLC4`|✔️AVGPRICE|️✔️CandlePart.OHLC4|✔️ohlc4|✔️avgprice| -|HLCC4 - Weighted Price|`.HLCC4`|✔️WCLPRICE|||✔️wcprice| -|MIDPOINT - Midpoint value|`MIDPOINT_Series`|✔️MIDPOINT||midpoint| -|MIDPRICE - Midpoint price|`MIDPRICE_Series`|✔️MIDPRICE||midprice| -|MAX - Max value|`MAX_Series`|✔️MAX|||✔️max| -|MIN - Min value|`MIN_Series`|✔️MIN|||✔️min| -|SUM - Summation|`SUM_Series`|✔️SUM|||✔️sum| -|ADD - Addition|`ADD_Series`|✔️ADD|||✔️add| -|SUB - Subtraction|`SUB_Series`|✔️SUB|||✔️sub| -|MUL - Multiplication|`MUL_Series`|✔️MUL|||✔️mul| -|DIV - Division|`DIV_Series`|✔️DIV|||✔️div| -||||| -|**STATISTICS & NUMERICAL ANALYSIS**| -|||||| -|BIAS - Bias|`BIAS_Series`|||✔️bias| -|CORR - Pearson's Correlation Coefficient|`CORR_Series`|✔️CORREL|✔️GetCorrelation|| -|COVAR - Covariance|`COVAR_Series`||✔️GetCorrelation|| -|DECAY - Linear Decay|`DECAY_Series`|||decay|✔️decay| -|EDECAY - Exponential Decay|`DECAY_Series`|||decay|✔️edecay| -|ENTROPY - Entropy|`ENTROPY_Series`|||entropy|| -|KURTOSIS - Kurtosis|`KURT_Series`|||✔️kurtosis| -|SLOPE - Slope of Linear Regression|`SLOPE_Series`||✔️GetSlope||✔️linregslope| -|MAD - Mean Absolute Deviation|`MAD_Series`||✔️GetSmaAnalysis|✔️mad| -|MAE - Mean Absolute Error|`MAE_Series`|||| -|MAPE - Mean Absolute Percent Error|`MAPE_Series`||✔️GetSmaAnalysis|| -|MEDIAN - Median value|`MEDIAN_Series`|||✔️median| -|MSE - Mean Squared Error|`MSE_Series`||✔️GetSmaAnalysis|| -|SKEW - Skewness||||skew| -|⭐SDEV - Standard Deviation (Volatility)|`SDEV_Series`|✔️STDDEV|✔️GetStdDev|✔️stdev|✔️stddev| -|SSDEV - Sample Standard Deviation|`SSDEV_Series`|||✔️stdev| -|SMAPE - Symmetric Mean Absolute Percent Error|`SMAPE_Series`|||| -|VAR - Population Variance|`VAR_Series`|✔️VAR||✔️variance|✔️var| -|SVAR - Sample Variance|`SVAR_Series`|||✔️variance| -|QUANTILE - Quantile||||quantile| -|WMAPE - Weighted Mean Absolute Percent Error|`WMAPE_Series`|||| -|ZSCORE - Number of standard deviations from mean|`ZSCORE_Series`||✔️GetStdDev|✔️zscore| -|||||| -|**TREND INDICATORS & AVERAGES**| -|||||| -|AFIRMA - Autoregressive Finite Impulse Response Moving Average||||| -|ALMA - Arnaud Legoux Moving Average|`ALMA_Series`||✔️GetAlma|alma| -|DEMA - Double EMA Average|`DEMA_Series`|✔️DEMA|✔️GetDema|✔️dema|✔️dema| -|DWMA - Double WMA Average|`DWMA_Series`||||| -|⭐[EMA - Exponential Moving Average](EMA.md)|`EMA_Series`|✔️EMA|✔️GetEma|✔️ema|✔️ema| -|EPMA - Endpoint Moving Average|||GetEpma|| -|FRAMA - Fractal Adaptive Moving Average||||| -|FMA - Fibonacci's Weighted Moving Average|`FMA_Series`|||fwma| -|HILO - Gann High-Low Activator||||hilo| -|HEMA - Hull/EMA Average|`HEMA_Series`|||| -|Hilbert Transform Instantaneous Trendline||HT_TRENDLINE|GetHtTrendline|| -|⭐HMA - Hull Moving Average|`HMA_Series`||✔️GetHma|✔️hma|✔️hma| -|HWMA - Holt-Winter Moving Average|`HWMA_Series`|||✔️hwma| -|JMA - Jurik Moving Average|`JMA_Series`|||jma|| -|KAMA - Kaufman's Adaptive Moving Average|`KAMA_Series`|✔️KAMA|✔️GetKama|✔️kama|✔️kama| -|KDJ - KDJ Indicator (trend reversal)||||kdj| -|LSMA - Least Squares Moving Average|||GetEpma|| -|⭐MACD - Moving Average Convergence/Divergence|`MACD_Series`|✔️MACD|✔️GetMacd|✔️macd|✔️macd| -|MAMA - MESA Adaptive Moving Average|`MAMA_Series`|✔️MAMA|✔️GetMama|| -|MCGD - McGinley Dynamic||||mcgd| -|MMA - Modified Moving Average||||| -|PPMA - Pivot Point Moving Average||||| -|PWMA - Pascal's Weighted Moving Average||||pwma| -|⭐RMA - WildeR's Moving Average|`RMA_Series`|||✔️rma|✔️rma| -|SINWMA - Sine Weighted Moving Average||||sinwma| -|⭐[SMA - Simple Moving Average](SMA.md)|`SMA_Series`|✔️SMA|✔️GetSma|✔️sma|✔️sma| -|SMMA - Smoothed Moving Average|`SMMA_Series`||✔️GetSmma|| -|SSF - Ehler's Super Smoother Filter||||ssf| -|SUPERTREND - Supertrend||||supertrend| -|SWMA - Symmetric Weighted Moving Average||||swma| -|T3 - Tillson T3 Moving Average|`T3_Series`|✔️T3|✔️GetT3|✔️t3|| -|⭐TEMA - Triple EMA Average|`TEMA_Series`|✔️TEMA|✔️GetTema|✔️tema|✔️tema| -|⭐TRIMA - Triangular Moving Average|`TRIMA_Series`|✔️TRIMA||✔️trima|✔️trima| -|TSF - Time Series Forecast||TSF||| -|VIDYA - Variable Index Dynamic Average||||vidya|vidya| -|VORTEX - Vortex Indicator||||vortex| -|⭐WMA - Weighted Moving Average|`WMA_Series`|✔️WMA|✔️GetWma|✔️wma|✔️wma| -|ZLEMA - Zero Lag EMA Average|`ZLEMA_Series`|||✔️zlma|❌zlema| -|||||| -|**VOLATILITY INDICATORS**| -|||||| -|⭐ADL - Chaikin Accumulation Distribution Line|`ADL_Series`|✔️AD|✔️GetAdl|✔️ad|✔️ad| -|⭐ADOSC - Chaikin Accumulation Distribution Oscillator|`ADOSC_Series`|✔️ADOSC||✔️adosc|✔️adosc| -|⭐ATR - Average True Range|`ATR_Series`|✔️ATR|✔️GetAtr|✔️atr|✔️atr| -|ATRP - Average True Range Percent|`ATRP_Series`||✔️GetAtr|| -|BETA - Beta coefficient||BETA|GetBeta|| -|⭐BBANDS - Bollinger Bands®|`BBANDS_Series`|✔️BBANDS|✔️GetBollingerBands|✔️bbands|✔️bbands| -|CHAND - Chandelier Exit|||GetChandelier|| -|CRSI - Connor RSI|||GetConnorsRsi|| -|CVI - Chaikins Volatility|||||cvi| -|DON - Donchian Channels|||GetDonchian|| -|FCB - Fractal Chaos Bands|||GetFcb|| -|FISHER - Fisher Transform|||GetFcb||fisher| -|HV - Historical Volatility||||| -|ICH - Ichimoku|||GetIchimoku|| -|KEL - Keltner Channels|||GetKeltner|| -|NATR - Normalized Average True Range||NATR|GetAtr|| -|CHN - Price Channel Indicator||||| -|RSI - Relative Strength Index|`RSI_Series`|✔️RSI|✔️GetRsi|✔️rsi|✔️rsi| -|SAR - Parabolic Stop and Reverse||SAR|GetParabolicSar|| -|SRSI - Stochastic RSI||STOCHRSI|GetStochRsi|| -|STARC - Starc Bands||||| -|TR - True Range|`TR_Series`|✔️TRANGE|✔️GetTr|✔️true_range|✔️tr| -|UI - Ulcer Index||||| -|VSTOP - Volatility Stop||||| -|||||| -|**MOMENTUM INDICATORS & OSCILLATORS**| -|||||| -|AC - Acceleration Oscillator||||| -|ADX - Average Directional Movement Index||ADX|GetAdx||adx| -|ADXR - Average Directional Movement Index Rating||ADXR|GetAdx||adxr| -|AO - Awesome Oscillator|||GetAwesome||ao| -|APO - Absolute Price Oscillator||APO|||apo| -|AROON - Aroon oscillator||AROON|GetAroon||aroon| -|BOP - Balance of Power||BOP|GetBop||bop| -|CCI - Commodity Channel Index|`CCI_Series`|✔️CCI|✔️GetCci||❌cci| -|CFO - Chande Forcast Oscillator||||| -|CMO - Chande Momentum Oscillator|`CMO_Series`|❌CMO|✔️GetCmo|❌cmo|✔️cmo| -|COG - Center of Gravity||||| -|COPPOCK - Coppock Curve||||| -|CTI - Ehler's Correlation Trend Indicator||||| -|DPO - Detrended Price Oscillator|||GetDpo|| -|DMI - Directional Movement Index||DX|GetAdx|| -|EFI - Elder Ray's Force Index|||GetElderRay|| -|FOSC - Forecast oscillator|||||fosc| -|GAT - Alligator oscillator|||GetGator|| -|HURST - Hurst Exponent|||GetHurst|| -|KRI - Kairi Relative Index||||| -|KVO - Klinger Volume Oscillator|||||| -|MFI - Money Flow Index||MFI|GetMfi|| -|MOM - Momentum||MOM||| -|NVI - Negative Volume Index||||| -|PO - Price Oscillator||||| -|PPO - Percentage Price Oscillator||PPO||| -|PMO - Price Momentum Oscillator||||| -|PVI - Positive Volume Index||||| -|ROC - Rate of Change||MOM|GetRoc|| -|RVGI - Relative Vigor Index||||| -|SMI - Stochastic Momentum Index||||| -|STC - Schaff Trend Cycle||||| -|STOCH - Stochastic Oscillator||STOCH|GetStoch|| -|TRIX - 1-day ROC of TEMA|`TRIX_Series`|✔️TRIX|✔️GetTrix|✔️trix|❌trix| -|TSI - True Strength Index||||| -|UO - Ultimate Oscillator||ULTOSC|GetUltimate||ultosc| -|WILLR - Larry Williams' %R||WILLR|GetWilliamsR||willr| -|WGAT - Williams Alligator||||| -|||||| -|**VOLUME INDICATORS**| -|||||| -|AOBV - Archer On-Balance Volume||||| -|CMF - Chaikin Money Flow||||| -|EOM - Ease of Movement|||||emv| -|KVO - Klinger Volume Oscilaltor|||||kvo| -|OBV - On-Balance Volume|`OBV_Series`|✔️OBV|✔️GetObv|✔️obv|❌obv| -|PRS - Price Relative Strength|||| -|PVOL - Price-Volume||||| -|PVO - Percentage Volume Oscillator||||| -|PVR - Price Volume Rank||||| -|PVT - Price Volume Trend||||| -|VP - Volume Profile||||| -|VWAP - Volume Weighted Average Price||||| -|VWMA - Volume Weighted Moving Average|||||vwma| diff --git a/archive/docs/readme.md b/archive/docs/readme.md deleted file mode 100644 index a8c3d92d..00000000 --- a/archive/docs/readme.md +++ /dev/null @@ -1,44 +0,0 @@ -# QuanTAlib - quantitative technical indicators for Quantower and other C#-based trading platorms - -[![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?style=flat-square)](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?style=flat-square)](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) -[![CodeFactor](https://www.codefactor.io/repository/github/mihakralj/quantalib/badge/main)](https://www.codefactor.io/repository/github/mihakralj/quantalib/overview/main) - -[![Nuget](https://img.shields.io/nuget/v/QuanTAlib?style=flat-square)](https://www.nuget.org/packages/QuanTAlib/) -![GitHub last commit](https://img.shields.io/github/last-commit/mihakralj/QuanTAlib) -[![Nuget](https://img.shields.io/nuget/dt/QuanTAlib?style=flat-square)](https://www.nuget.org/packages/QuanTAlib/) -[![GitHub watchers](https://img.shields.io/github/watchers/mihakralj/QuanTAlib?style=flat-square)](https://github.com/mihakralj/QuanTAlib/watchers) -[![.NET7.0](https://img.shields.io/badge/.NET-7.0%20%7C%206.0%20%7C%204.8-blue?style=flat-square)](https://dotnet.microsoft.com/en-us/download/dotnet/7.0) - -**Quan**titative **TA** **lib**rary (QuanTAlib) is a C# library of classess and methods for quantitative technical analysis useful for analyzing quotes with [Quantower](https://www.quantower.com/) and other C#-based trading platforms. - -**QuanTAlib** is written with some specific design criteria in mind - why there is '_yet another C# TA library_': - -- Prioritize **real-time data analysis** (series can add new data and indicator doesn't have to re-calculate the whole history) -- **Allow updates** to the last quote and adjusting the calculation to the still-forming bar -- **Calculate early data right** - output data is as valid as mathematically possible from the first value onwards - -![Alt text](./img/quotes.gif) - -If not obvious, QuanTAlib is intended for developers, and it does not focus on sources of OHLCV quotes. There are some very basic data feeds available to use in the learning process: `RND_Feed` and `GBM_Feed` for random data, `Yahoo_Feed` and `Alphavantage_Feed` for a quick grab of daily data of US stock market. - -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 [Polyglot Notebooks](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode) or in console apps, but the best usage of the library is with C#-enabled trading platforms - see **QuanTower_Charts** folder for Quantower examples and check **Releases** for compiled Quantower DLL. - -### Coverage - -[List of all indicators - current and planned](indicators.md) - -### Validation - -QuanTAlib uses validation tests with four other TA libraries to assure accuracy and validity of results: - -- [TA-LIB](https://www.ta-lib.org/function.html) -- [Skender Stock Indicators](https://dotnet.stockindicators.dev/) -- [Pandas-TA](https://twopirllc.github.io/pandas-ta/) -- [Tulip Indicators](https://tulipindicators.org/) - -### Questions - -[Some most common questions addressed](QA.md) \ No newline at end of file diff --git a/lib/averages/Alma.cs b/lib/averages/Alma.cs index f111922c..844351d6 100644 --- a/lib/averages/Alma.cs +++ b/lib/averages/Alma.cs @@ -22,8 +22,8 @@ public class Alma : AbstractBase private readonly int _period; private readonly double _offset; private readonly double _sigma; - private CircularBuffer? _buffer; - private CircularBuffer? _weight; + private readonly CircularBuffer? _buffer; + private readonly CircularBuffer? _weight; private double _norm; /// The number of data points used in the ALMA calculation. @@ -41,6 +41,8 @@ public class Alma : AbstractBase _sigma = sigma; WarmupPeriod = period; Name = "Alma"; + _buffer = new CircularBuffer(_period); + _weight = new CircularBuffer(_period); Init(); } @@ -57,8 +59,6 @@ public class Alma : AbstractBase public override void Init() { base.Init(); - _buffer = new CircularBuffer(_period); - _weight = new CircularBuffer(_period); _norm = 0; } diff --git a/lib/averages/Convolution.cs b/lib/averages/Convolution.cs index 470f426c..60226d61 100644 --- a/lib/averages/Convolution.cs +++ b/lib/averages/Convolution.cs @@ -4,8 +4,8 @@ public class Convolution : AbstractBase { private readonly double[] _kernel; private readonly int _kernelSize; - private CircularBuffer _buffer; - private double[] _normalizedKernel; + private readonly CircularBuffer _buffer; + private readonly double[] _normalizedKernel; public Convolution(double[] kernel) { diff --git a/lib/averages/Dsma.cs b/lib/averages/Dsma.cs index b6b74bad..50ed159c 100644 --- a/lib/averages/Dsma.cs +++ b/lib/averages/Dsma.cs @@ -28,7 +28,7 @@ public class Dsma : AbstractBase { private readonly int _period; private readonly CircularBuffer _buffer; - private readonly double _a1, _b1, _c1, _c2, _c3; + private readonly double _c1, _c2, _c3; private double _lastDsma, _p_lastDsma; private double _filt, _filt1, _filt2, _zeros, _zeros1; private double _p_filt, _p_filt1, _p_filt2, _p_zeros, _p_zeros1; @@ -49,8 +49,8 @@ public class Dsma : AbstractBase _buffer = new CircularBuffer(period); // SuperSmoother filter coefficients - _a1 = Math.Exp(-1.414 * Math.PI / (0.5 * period)); - _b1 = 2 * _a1 * Math.Cos(1.414 * Math.PI / (0.5 * period)); + double _a1 = Math.Exp(-1.414 * Math.PI / (0.5 * period)); + double _b1 = 2 * _a1 * Math.Cos(1.414 * Math.PI / (0.5 * period)); _c2 = _b1; _c3 = -_a1 * _a1; _c1 = 1 - _c2 - _c3; diff --git a/lib/averages/Ema.cs b/lib/averages/Ema.cs index 60c3dcd8..9aa575d8 100644 --- a/lib/averages/Ema.cs +++ b/lib/averages/Ema.cs @@ -30,10 +30,12 @@ public class Ema : AbstractBase // inherited _index // inherited _value private readonly int _period; - private CircularBuffer _sma; + private readonly CircularBuffer _sma; private double _lastEma, _p_lastEma; - private double _k, _e, _p_e; - private bool _isInit, _p_isInit, _useSma; + private double _e, _p_e; + private readonly double _k; + private bool _isInit, _p_isInit; + private readonly bool _useSma; public Ema(int period, bool useSma = true) { @@ -50,13 +52,14 @@ public class Ema : AbstractBase Init(); } - public Ema(double alpha) : base() + public Ema(double alpha) { _k = alpha; _useSma = false; _sma = new(1); _period = 1; WarmupPeriod = (int)Math.Ceiling(Math.Log(0.05) / Math.Log(1 - _k)); //95th percentile + _sma = new(_period); Init(); } @@ -74,7 +77,6 @@ public class Ema : AbstractBase _lastEma = 0; _isInit = false; _p_isInit = false; - _sma = new(_period); } protected override void ManageState(bool isNew) diff --git a/lib/averages/Frama.cs b/lib/averages/Frama.cs index 005e79d5..4d47e76a 100644 --- a/lib/averages/Frama.cs +++ b/lib/averages/Frama.cs @@ -6,14 +6,20 @@ namespace QuanTAlib { private readonly int _period; private readonly double _fc; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; private double _lastFrama; private double _prevLastFrama; public Frama(int period, double fc = 0.5) { if (period < 2) + { throw new ArgumentException("Period must be at least 2", nameof(period)); + } + if (fc <= 0 || fc >= 1) + { + throw new ArgumentException("Fc must be between 0 and 1", nameof(fc)); + } _period = period; _fc = fc; @@ -78,11 +84,11 @@ namespace QuanTAlib } double n1 = (hh - ll) / _period; - double n2 = (hh1 - ll1 + hh2 - ll2) / (_period / 2); + double n2 = (hh1 - ll1 + hh2 - ll2) / half; - double d = (Math.Log(n2 + double.Epsilon) - Math.Log(n1 + double.Epsilon)) / Math.Log(2); + double d = (Math.Log(n1 + double.Epsilon) - Math.Log(n2 + double.Epsilon)) / Math.Log(2); - double alpha = Math.Exp(-4.6 * (d - 1)); + double alpha = Math.Exp(-4.6 * (d - 1) * _fc); alpha = Math.Max(Math.Min(alpha, 1), 0.01); // Ensure alpha is between 0.01 and 1 _lastFrama = alpha * (Input.Value - _lastFrama) + _lastFrama; diff --git a/lib/averages/Htit.cs b/lib/averages/Htit.cs index a441f54e..1dd57f21 100644 --- a/lib/averages/Htit.cs +++ b/lib/averages/Htit.cs @@ -1,7 +1,7 @@ //not working yet //TODO consistency test -using QuanTAlib; +namespace QuanTAlib; public class Htit : AbstractBase { @@ -18,8 +18,8 @@ public class Htit : AbstractBase private readonly CircularBuffer _sdBuffer = new(2); private readonly CircularBuffer _itBuffer = new(4); - private double _lastPd = 0; - private double _p_lastPd = 0; + private double _lastPd; + private double _p_lastPd; public Htit() { diff --git a/lib/averages/Jma.cs b/lib/averages/Jma.cs index 4184b109..898b0a2a 100644 --- a/lib/averages/Jma.cs +++ b/lib/averages/Jma.cs @@ -1,14 +1,12 @@ -using QuanTAlib; +namespace QuanTAlib; //TODO consistency test public class Jma : AbstractBase { - public readonly int Period; + private readonly int Period; private readonly double _phase; - private readonly int _vshort, _vlong; - private CircularBuffer _values; - private CircularBuffer _voltyShort; - private CircularBuffer _vsumBuff; - private CircularBuffer _avoltyBuff; + private readonly CircularBuffer _values; + private readonly CircularBuffer _voltyShort; + private readonly CircularBuffer _vsumBuff; private double _beta, _len1, _pow1; private double _upperBand, _lowerBand, _prevMa1, _prevDet0, _prevDet1, _prevJma; @@ -21,17 +19,16 @@ public class Jma : AbstractBase throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than or equal to 1."); } Period = period; - _vshort = vshort; - _vlong = 65; + int _vshort = vshort; + int _vlong = 65; _phase = Math.Clamp((phase * 0.01) + 1.5, 0.5, 2.5); _values = new CircularBuffer(period); - _voltyShort = new CircularBuffer(vshort); + _voltyShort = new CircularBuffer(_vshort); _vsumBuff = new CircularBuffer(_vlong); - _avoltyBuff = new CircularBuffer(2); Name = "JMA"; - WarmupPeriod = period * 2; + WarmupPeriod = 65; Init(); } @@ -42,9 +39,6 @@ public class Jma : AbstractBase _beta = 0.45 * (Period - 1) / (0.45 * (Period - 1) + 2); _len1 = Math.Max((Math.Log(Math.Sqrt(Period - 1)) / Math.Log(2.0)) + 2.0, 0); _pow1 = Math.Max(_len1 - 2.0, 0.5); - _avoltyBuff.Clear(); - _avoltyBuff.Add(0, true); - _avoltyBuff.Add(0, true); base.Init(); } @@ -97,9 +91,9 @@ public class Jma : AbstractBase double vsum = _vsumBuff.Newest() + 0.1 * (volty - _voltyShort.Oldest()); _vsumBuff.Add(vsum, Input.IsNew); - double prevAvolty = _avoltyBuff.Newest(); - double avolty = prevAvolty + 2.0 / (Math.Max(4.0 * Period, 30) + 1.0) * (vsum - prevAvolty); - _avoltyBuff.Add(avolty, Input.IsNew); + double avolty = 0; + for (int i = 0; i < _vsumBuff.Count; i++) { avolty += _vsumBuff[i]; } + avolty /= _vsumBuff.Count; double dVolty = (avolty > 0) ? volty / avolty : 0; dVolty = Math.Min(Math.Max(dVolty, 1.0), Math.Pow(_len1, 1.0 / _pow1)); diff --git a/lib/averages/Kama.cs b/lib/averages/Kama.cs index 5aa4d495..1be50a04 100644 --- a/lib/averages/Kama.cs +++ b/lib/averages/Kama.cs @@ -6,7 +6,7 @@ public class Kama : AbstractBase { private readonly int _period; private readonly double _scFast, _scSlow; - private CircularBuffer? _buffer; + private readonly CircularBuffer? _buffer; private double _lastKama, _p_lastKama; public Kama(int period, int fast = 2, int slow = 30) @@ -20,6 +20,7 @@ public class Kama : AbstractBase _scSlow = 2.0 / (slow + 1); WarmupPeriod = period; Name = $"Kama({_period}, {fast}, {slow})"; + _buffer = new CircularBuffer(_period + 1); Init(); } @@ -32,7 +33,7 @@ public class Kama : AbstractBase public override void Init() { base.Init(); - _buffer = new CircularBuffer(_period + 1); + _lastKama = 0; } diff --git a/lib/averages/Ltma.cs b/lib/averages/Ltma.cs index ade9ed0b..87eeefb0 100644 --- a/lib/averages/Ltma.cs +++ b/lib/averages/Ltma.cs @@ -10,10 +10,12 @@ public class Ltma : AbstractBase public double Gamma => _gamma; - public Ltma(double gamma = 0.1) + public Ltma(double gamma = 0.1) { if (gamma < 0 || gamma > 1) + { throw new ArgumentOutOfRangeException(nameof(gamma), "Gamma must be between 0 and 1."); + } _gamma = gamma; Name = $"Laguerre({gamma:F2})"; WarmupPeriod = 4; // Minimum number of samples needed diff --git a/lib/averages/Maaf.cs b/lib/averages/Maaf.cs index 854efc72..6485d589 100644 --- a/lib/averages/Maaf.cs +++ b/lib/averages/Maaf.cs @@ -8,12 +8,13 @@ public class Maaf : AbstractBase { private readonly CircularBuffer _priceBuffer; private readonly CircularBuffer _smoothBuffer; - private double _prevFilter, _prevValue2, _threshold; + private double _prevFilter, _prevValue2; + private readonly double _threshold; private double _p_prevFilter, _p_prevValue2; private readonly int _period; - public Maaf(int Period = 39, double Threshold = 0.002) + public Maaf(int Period = 39, double Threshold = 0.002) { _period = Period; _threshold = Threshold; @@ -94,7 +95,10 @@ public class Maaf : AbstractBase length -= 2; } - if (length < 3) length = 3; + if (length < 3) + { + length = 3; + } double finalAlpha = 2.0 / (length + 1); double filter = finalAlpha * (smooth - _prevFilter) + _prevFilter; diff --git a/lib/averages/Mama.cs b/lib/averages/Mama.cs index 36565686..b090e52d 100644 --- a/lib/averages/Mama.cs +++ b/lib/averages/Mama.cs @@ -1,17 +1,17 @@ -using QuanTAlib; -using System; +namespace QuanTAlib; + public class Mama : AbstractBase { private readonly double _fastLimit, _slowLimit; - private CircularBuffer _pr, _sm, _dt, _i1, _q1, _i2, _q2, _re, _im, _pd, _ph; + private readonly CircularBuffer _pr, _sm, _dt, _i1, _q1, _i2, _q2, _re, _im, _pd, _ph; private double _mama, _fama; private double _prevMama, _prevFama, _sumPr; private double _p_prevMama, _p_prevFama, _p_sumPr; public TValue Fama { get; private set; } - public Mama(double fastLimit = 0.5, double slowLimit = 0.05) + public Mama(double fastLimit = 0.5, double slowLimit = 0.05) { Fama = new TValue(); Name = $"Mama({_fastLimit:F2}, {_slowLimit:F2})"; diff --git a/lib/averages/Qema.cs b/lib/averages/Qema.cs index ba0dae5b..d1d49d90 100644 --- a/lib/averages/Qema.cs +++ b/lib/averages/Qema.cs @@ -2,31 +2,25 @@ namespace QuanTAlib; public class Qema : AbstractBase { - private readonly double _k1, _k2, _k3, _k4; private readonly Ema _ema1, _ema2, _ema3, _ema4; private double _lastQema, _p_lastQema; - public Qema(double k1=0.2, double k2=0.2, double k3=0.2, double k4=0.2) + public Qema(double k1 = 0.2, double k2 = 0.2, double k3 = 0.2, double k4 = 0.2) { - if (k1 <= 0 || k2 <= 0 || k3 <= 0 || k4 <= 0 ) + if (k1 <= 0 || k2 <= 0 || k3 <= 0 || k4 <= 0) { - throw new ArgumentOutOfRangeException("All k values must be in the range (0, 1]."); + throw new ArgumentOutOfRangeException(nameof(k1), "All k values must be in the range (0, 1]."); } - _k1 = k1; - _k2 = k2; - _k3 = k3; - _k4 = k4; - _ema1 = new Ema(k1); _ema2 = new Ema(k2); _ema3 = new Ema(k3); _ema4 = new Ema(k4); Name = $"QEMA ({k1:F2},{k2:F2},{k3:F2},{k4:F2})"; - double smK = Math.Min(Math.Min(_k1, _k2), Math.Min(_k3, _k4)); + double smK = Math.Min(Math.Min(k1, k2), Math.Min(k3, k4)); - WarmupPeriod = (int) ((2 - smK) / smK); + WarmupPeriod = (int)((2 - smK) / smK); Init(); } diff --git a/lib/averages/Rema.cs b/lib/averages/Rema.cs index 51532904..2419b726 100644 --- a/lib/averages/Rema.cs +++ b/lib/averages/Rema.cs @@ -12,12 +12,16 @@ public class Rema : AbstractBase public int Period => _period; public double Lambda => _lambda; - public Rema(int period, double lambda = 0.5) + public Rema(int period, double lambda = 0.5) { if (period < 1) + { throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than or equal to 1."); + } if (lambda < 0) + { throw new ArgumentOutOfRangeException(nameof(lambda), "Lambda must be non-negative."); + } _period = period; _lambda = lambda; diff --git a/lib/averages/Rma.cs b/lib/averages/Rma.cs index 81c9f5fe..739c0733 100644 --- a/lib/averages/Rma.cs +++ b/lib/averages/Rma.cs @@ -5,7 +5,7 @@ namespace QuanTAlib { public class Rma : AbstractBase { private readonly int _period; - private double _alpha; + private readonly double _alpha; private double _lastRMA; private double _savedLastRMA; diff --git a/lib/averages/Sma.cs b/lib/averages/Sma.cs index 811a1718..3d2fb71d 100644 --- a/lib/averages/Sma.cs +++ b/lib/averages/Sma.cs @@ -4,8 +4,8 @@ public class Sma : AbstractBase { // inherited _index // inherited _value - public readonly int Period; - private CircularBuffer _buffer; + private readonly int Period; + private readonly CircularBuffer _buffer; public Sma(int period) { diff --git a/lib/averages/Smma.cs b/lib/averages/Smma.cs index cd6d674d..ccf28efd 100644 --- a/lib/averages/Smma.cs +++ b/lib/averages/Smma.cs @@ -5,10 +5,10 @@ namespace QuanTAlib; public class Smma : AbstractBase { private readonly int _period; - private CircularBuffer? _buffer; + private readonly CircularBuffer? _buffer; private double _lastSmma, _p_lastSmma; - public Smma(int period) + public Smma(int period) { if (period < 1) { @@ -17,6 +17,7 @@ public class Smma : AbstractBase _period = period; WarmupPeriod = period; Name = $"Smma({_period})"; + _buffer = new CircularBuffer(_period); Init(); } @@ -29,7 +30,6 @@ public class Smma : AbstractBase public override void Init() { base.Init(); - _buffer = new CircularBuffer(_period); _lastSmma = 0; } diff --git a/lib/averages/T3.cs b/lib/averages/T3.cs index 3fefa8c7..c2b216d7 100644 --- a/lib/averages/T3.cs +++ b/lib/averages/T3.cs @@ -3,30 +3,27 @@ namespace QuanTAlib; public class T3 : AbstractBase { private readonly int _period; - private readonly double _vfactor; private readonly bool _useSma; - private readonly double _k, _k1m, _c1, _c2, _c3, _c4; + private readonly double _k, _c1, _c2, _c3, _c4; private readonly CircularBuffer _buffer1, _buffer2, _buffer3, _buffer4, _buffer5, _buffer6; private double _lastEma1, _lastEma2, _lastEma3, _lastEma4, _lastEma5, _lastEma6; private double _p_lastEma1, _p_lastEma2, _p_lastEma3, _p_lastEma4, _p_lastEma5, _p_lastEma6; - public T3(int period, double vfactor = 0.7, bool useSma = true) + public T3(int period, double vfactor = 0.7, bool useSma = true) { if (period < 1) { throw new ArgumentException("Period must be greater than or equal to 1.", nameof(period)); } _period = period; - _vfactor = vfactor; _useSma = useSma; WarmupPeriod = period; _k = 2.0 / (_period + 1); - _k1m = 1.0 - _k; - _c1 = -_vfactor * _vfactor * _vfactor; - _c2 = 3 * _vfactor * _vfactor + 3 * _vfactor * _vfactor * _vfactor; - _c3 = -6 * _vfactor * _vfactor - 3 * _vfactor - 3 * _vfactor * _vfactor * _vfactor; - _c4 = 1 + 3 * _vfactor + _vfactor * _vfactor * _vfactor + 3 * _vfactor * _vfactor; + _c1 = -vfactor * vfactor * vfactor; + _c2 = 3 * vfactor * vfactor + 3 * vfactor * vfactor * vfactor; + _c3 = -6 * vfactor * vfactor - 3 * vfactor - 3 * vfactor * vfactor * vfactor; + _c4 = 1 + 3 * vfactor + vfactor * vfactor * vfactor + 3 * vfactor * vfactor; _buffer1 = new(period); _buffer2 = new(period); @@ -36,7 +33,7 @@ public class T3 : AbstractBase _buffer6 = new(period); - Name = $"T3({_period}, {_vfactor})"; + Name = $"T3({_period}, {vfactor})"; Init(); } diff --git a/lib/averages/Vidya.cs b/lib/averages/Vidya.cs index dda4db05..cbff1ee5 100644 --- a/lib/averages/Vidya.cs +++ b/lib/averages/Vidya.cs @@ -10,10 +10,10 @@ public class Vidya : AbstractBase private readonly int _longPeriod; private readonly double _alpha; private double _lastVIDYA, _p_lastVIDYA; - private CircularBuffer? _shortBuffer; - private CircularBuffer? _longBuffer; + private readonly CircularBuffer? _shortBuffer; + private readonly CircularBuffer? _longBuffer; - public Vidya(int shortPeriod, int longPeriod = 0, double alpha = 0.2) + public Vidya(int shortPeriod, int longPeriod = 0, double alpha = 0.2) { if (shortPeriod < 1) { @@ -24,6 +24,8 @@ public class Vidya : AbstractBase _alpha = alpha; WarmupPeriod = _longPeriod; Name = $"Vidya({_shortPeriod},{_longPeriod})"; + _shortBuffer = new CircularBuffer(_shortPeriod); + _longBuffer = new CircularBuffer(_longPeriod); Init(); } @@ -38,8 +40,6 @@ public class Vidya : AbstractBase { base.Init(); _lastVIDYA = 0; - _shortBuffer = new CircularBuffer(_shortPeriod); - _longBuffer = new CircularBuffer(_longPeriod); } protected override void ManageState(bool isNew) @@ -83,7 +83,7 @@ public class Vidya : AbstractBase } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private double CalculateStdDev(CircularBuffer buffer) + private static double CalculateStdDev(CircularBuffer buffer) { double mean = buffer.Average(); double sumSquaredDiff = buffer.Sum(x => Math.Pow(x - mean, 2)); diff --git a/lib/averages/Wma.cs b/lib/averages/Wma.cs index 9497ba25..2fcefb53 100644 --- a/lib/averages/Wma.cs +++ b/lib/averages/Wma.cs @@ -1,8 +1,9 @@ namespace QuanTAlib; +//TODO fix WMA - passing Talib test + public class Wma : AbstractBase { - private readonly int _period; private readonly Convolution _convolution; public Wma(int period) @@ -11,10 +12,9 @@ public class Wma : AbstractBase { throw new ArgumentException("Period must be greater than or equal to 1.", nameof(period)); } - _period = period; - _convolution = new Convolution(GenerateWmaKernel(_period)); + _convolution = new Convolution(GenerateWmaKernel(period)); Name = "Wma"; - WarmupPeriod = _period; + WarmupPeriod = period; Init(); } diff --git a/lib/averages/Zlema.cs b/lib/averages/Zlema.cs index 741a4be3..4c5ba651 100644 --- a/lib/averages/Zlema.cs +++ b/lib/averages/Zlema.cs @@ -6,12 +6,11 @@ namespace QuanTAlib; public class Zlema : AbstractBase { private readonly int _period; - private CircularBuffer? _buffer; - private double _alpha; - private int _lag; + private readonly CircularBuffer? _buffer; + private readonly double _alpha; private double _lastZLEMA, _p_lastZLEMA; - public Zlema(int period) + public Zlema(int period) { if (period < 1) { @@ -20,8 +19,8 @@ public class Zlema : AbstractBase _period = period; WarmupPeriod = period; _alpha = 2.0 / (_period + 1); - _lag = (_period - 1) / 2; Name = $"Zlema({_period})"; + _buffer = new CircularBuffer(_period); Init(); } @@ -34,7 +33,6 @@ public class Zlema : AbstractBase public override void Init() { base.Init(); - _buffer = new CircularBuffer(_period); _lastZLEMA = 0; } diff --git a/lib/core/circularbuffer.cs b/lib/core/circularbuffer.cs index 695c4da3..56169bc9 100644 --- a/lib/core/circularbuffer.cs +++ b/lib/core/circularbuffer.cs @@ -7,8 +7,8 @@ namespace QuanTAlib; public class CircularBuffer : IEnumerable { private readonly double[] _buffer; - private int _start = 0; - private int _size = 0; + private int _start; + private int _size; public int Capacity { get; } public int Count => _size; @@ -69,7 +69,9 @@ public class CircularBuffer : IEnumerable public double Newest() { if (_size == 0) + { return 0; + } return _buffer[(_start + _size - 1) % Capacity]; } @@ -109,7 +111,9 @@ public class CircularBuffer : IEnumerable public bool MoveNext() { if (_index + 1 >= _buffer._size) + { return false; + } _index++; _current = _buffer[_index]; diff --git a/lib/core/tbar.cs b/lib/core/tbar.cs index 9f71e5e4..0326b043 100644 --- a/lib/core/tbar.cs +++ b/lib/core/tbar.cs @@ -54,11 +54,11 @@ public class TBarSeries : List { private readonly TBar Default = new(DateTime.MinValue, double.NaN, double.NaN, double.NaN, double.NaN, double.NaN); - public TSeries Open; - public TSeries High; - public TSeries Low; - public TSeries Close; - public TSeries Volume; + public TSeries Open { get; set; } + public TSeries High { get; set; } + public TSeries Low { get; set; } + public TSeries Close { get; set; } + public TSeries Volume { get; set; } public TBar Last => Count > 0 ? this[^1] : Default; diff --git a/lib/core/tvalue.cs b/lib/core/tvalue.cs index 30a67d29..fa06f0f5 100644 --- a/lib/core/tvalue.cs +++ b/lib/core/tvalue.cs @@ -52,12 +52,6 @@ public class TSeries : List var pubEvent = source.GetType().GetEvent("Pub"); if (pubEvent != null) { - /* - var nameProperty = source.GetType().GetProperty("Name"); - if (nameProperty != null) { - Name = nameProperty.GetValue(nameProperty)?.ToString()!; - } - */ pubEvent.AddEventHandler(source, new ValueSignal(Sub)); } } diff --git a/lib/feeds/GbmFeed.cs b/lib/feeds/GbmFeed.cs index dfcf2365..6b6d6991 100644 --- a/lib/feeds/GbmFeed.cs +++ b/lib/feeds/GbmFeed.cs @@ -1,5 +1,3 @@ -using System.CommandLine.Rendering.Views; - namespace QuanTAlib; public class GbmFeed : TBarSeries @@ -8,7 +6,7 @@ public class GbmFeed : TBarSeries private readonly Random _random; private double _lastClose, _lastHigh, _lastLow; - public GbmFeed(double initialPrice = 100.0, double mu = 0.05, double sigma = 0.2) : base() + public GbmFeed(double initialPrice = 100.0, double mu = 0.05, double sigma = 0.2) { _lastClose = _lastHigh = _lastLow = initialPrice; _mu = mu; @@ -22,7 +20,6 @@ public class GbmFeed : TBarSeries public void Add(int count) { DateTime startTime = DateTime.UtcNow - TimeSpan.FromHours(count); - TBar lastBar = new(); for (int i = 0; i < count; i++) { Add(startTime, true); diff --git a/lib/quantalib.csproj b/lib/quantalib.csproj index 4c228dec..53b82781 100644 --- a/lib/quantalib.csproj +++ b/lib/quantalib.csproj @@ -1,57 +1,38 @@  - - QuanTAlib - Library of TA Calculations, Charts and Strategies for Quantower - Quantitative Technical Analysis Library in C# for Quantower + QuanTAlib + Library of TA Calculations, Charts and Strategies for Quantower + Quantitative Technical Analysis Library in C# for Quantower git - https://github.com/mihakralj/QuanTAlib - true - Miha Kralj - Miha Kralj - Apache-2.0 - readme.md - net8.0 - enable - preview - enable - false - en-US - QuanTAlib - QuanTAlib + https://github.com/mihakralj/QuanTAlib + Miha Kralj + Miha Kralj + Apache-2.0 + readme.md + QuanTAlib + QuanTAlib True - AnyCPU - False - full - 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; - + 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; $(NoWarn);NU5104 - false - false - false + QuanTAlib2.png + https://raw.githubusercontent.com/mihakralj/QuanTAlib/main/.github/QuanTAlib2.png + True - - QuanTAlib2.png - https://raw.githubusercontent.com/mihakralj/QuanTAlib/main/.github/QuanTAlib2.png - True - + - + + + - ..\.github\TradingPlatform.BusinessLayer.dll + ..\.github\TradingPlatform.BusinessLayer.dll TradingPlatform.BusinessLayer.xml - \ No newline at end of file diff --git a/lib/statistics/Entropy.cs b/lib/statistics/Entropy.cs index 67b86482..d1f2348b 100644 --- a/lib/statistics/Entropy.cs +++ b/lib/statistics/Entropy.cs @@ -7,9 +7,9 @@ using System.Linq; public class Entropy : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Entropy(int period) : base() + public Entropy(int period) { if (period < 2) { diff --git a/lib/statistics/Kurtosis.cs b/lib/statistics/Kurtosis.cs index 1a5be948..3b60f8ba 100644 --- a/lib/statistics/Kurtosis.cs +++ b/lib/statistics/Kurtosis.cs @@ -4,9 +4,9 @@ namespace QuanTAlib; public class Kurtosis : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Kurtosis(int period) : base() + public Kurtosis(int period) { if (period < 4) { diff --git a/lib/statistics/Max.cs b/lib/statistics/Max.cs index 2eccaaaf..1257f63d 100644 --- a/lib/statistics/Max.cs +++ b/lib/statistics/Max.cs @@ -5,12 +5,12 @@ namespace QuanTAlib public class Max : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; private readonly double _halfLife; private double _currentMax, _p_currentMax; private int _timeSinceNewMax, _p_timeSinceNewMax; - public Max(int period, double decay = 0) : base() + public Max(int period, double decay = 0) { if (period < 1) { diff --git a/lib/statistics/Median.cs b/lib/statistics/Median.cs index 9adb1ed5..fe6955a8 100644 --- a/lib/statistics/Median.cs +++ b/lib/statistics/Median.cs @@ -6,9 +6,9 @@ namespace QuanTAlib public class Median : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Median(int period) : base() + public Median(int period) { if (period < 1) { diff --git a/lib/statistics/Min.cs b/lib/statistics/Min.cs index eb842a16..03e0e14f 100644 --- a/lib/statistics/Min.cs +++ b/lib/statistics/Min.cs @@ -5,12 +5,12 @@ namespace QuanTAlib public class Min : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; private readonly double _halfLife; private double _currentMin, _p_currentMin; private int _timeSinceNewMin, _p_timeSinceNewMin; - public Min(int period, double decay = 0) : base() + public Min(int period, double decay = 0) { if (period < 1) { diff --git a/lib/statistics/Mode.cs b/lib/statistics/Mode.cs index 3aacd879..13b48465 100644 --- a/lib/statistics/Mode.cs +++ b/lib/statistics/Mode.cs @@ -3,9 +3,9 @@ namespace QuanTAlib; public class Mode : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Mode(int period) : base() + public Mode(int period) { if (period < 1) { diff --git a/lib/statistics/Percentile.cs b/lib/statistics/Percentile.cs index d90afe0e..244bbbc4 100644 --- a/lib/statistics/Percentile.cs +++ b/lib/statistics/Percentile.cs @@ -7,9 +7,9 @@ public class Percentile : AbstractBase { public readonly int Period; public readonly double Percent; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Percentile(int period, double percent) : base() + public Percentile(int period, double percent) { if (period < 2) { diff --git a/lib/statistics/Skew.cs b/lib/statistics/Skew.cs index f7aaeec8..6101ae0d 100644 --- a/lib/statistics/Skew.cs +++ b/lib/statistics/Skew.cs @@ -6,9 +6,9 @@ using System.Linq; public class Skew : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Skew(int period) : base() + public Skew(int period) { if (period < 3) { diff --git a/lib/statistics/Stddev.cs b/lib/statistics/Stddev.cs index d1eff641..c0463368 100644 --- a/lib/statistics/Stddev.cs +++ b/lib/statistics/Stddev.cs @@ -7,9 +7,9 @@ namespace QuanTAlib { public readonly int Period; public readonly bool IsPopulation; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Stddev(int period, bool isPopulation = false) : base() + public Stddev(int period, bool isPopulation = false) { if (period < 2) { diff --git a/lib/statistics/Variance.cs b/lib/statistics/Variance.cs index 675958ca..18f71a9f 100644 --- a/lib/statistics/Variance.cs +++ b/lib/statistics/Variance.cs @@ -7,9 +7,9 @@ namespace QuanTAlib { public readonly int Period; public readonly bool IsPopulation; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Variance(int period, bool isPopulation = false) : base() + public Variance(int period, bool isPopulation = false) { if (period < 2) { diff --git a/lib/statistics/Zscore.cs b/lib/statistics/Zscore.cs index 87f59b67..74d696f3 100644 --- a/lib/statistics/Zscore.cs +++ b/lib/statistics/Zscore.cs @@ -6,9 +6,9 @@ using System.Linq; public class Zscore : AbstractBase { public readonly int Period; - private CircularBuffer _buffer; + private readonly CircularBuffer _buffer; - public Zscore(int period) : base() + public Zscore(int period) { if (period < 2) { diff --git a/quantower/AbstractIndicatorBase.cs b/quantower/AbstractIndicatorBase.cs index 0f650904..961cb0c7 100644 --- a/quantower/AbstractIndicatorBase.cs +++ b/quantower/AbstractIndicatorBase.cs @@ -21,7 +21,7 @@ public abstract class AbstractIndicatorBase : Indicator public PriceType SourcePrice { get; set; } = PriceType.Close; [InputParameter(name: "Line smoothing", sortIndex: 19, minimum: 0.0, maximum: 1.0, increment: 0.1, decimalPlaces: 2)] - public double Tension = 0.2; + public double Tension { get; set; } = 0.2; [InputParameter("Show cold values", sortIndex: 20)] public bool ShowColdValues { get; set; } = true; @@ -31,7 +31,7 @@ public abstract class AbstractIndicatorBase : Indicator protected LineSeries? Series; protected abstract AbstractBase MovingAverage { get; } - protected AbstractIndicatorBase() : base() + protected AbstractIndicatorBase() { OnBackGround = true; SeparateWindow = false; @@ -71,7 +71,10 @@ public abstract class AbstractIndicatorBase : Indicator { base.OnPaintChart(args); List allPoints = new List(); - if (CurrentChart == null) return; + if (CurrentChart == null) + { + return; + } Graphics gr = args.Graphics; var mainWindow = CurrentChart.MainWindow; @@ -102,7 +105,7 @@ public abstract class AbstractIndicatorBase : Indicator private void DrawSmoothCombinedCurve(Graphics gr, List allPoints, int hotCount) { - if (allPoints.Count < 2) return; + if (allPoints.Count < 2) { return; } using (Pen defaultPen = new(Series!.Color, Series.Width) { DashStyle = ConvertLineStyleToDashStyle(Series.Style) }) using (Pen coldPen = new(Series!.Color, Series.Width) { DashStyle = DashStyle.Dot }) diff --git a/quantower/Averages/AlmaIndicator.cs b/quantower/Averages/AlmaIndicator.cs index 251ad0f1..dd3aa81a 100644 --- a/quantower/Averages/AlmaIndicator.cs +++ b/quantower/Averages/AlmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class AlmaIndicator : IndicatorBase { @@ -7,22 +7,21 @@ public class AlmaIndicator : IndicatorBase public int Period { get; set; } = 10; [InputParameter("Offset", sortIndex: 5)] - public double Offset = 0.85; + public double Offset { get; set; } = 0.85; [InputParameter("Sigma", sortIndex: 6)] - public double Sigma = 6.0; + public double Sigma { get; set; } = 6.0; private Alma? ma; protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"ALMA {Period} : {Offset:F2} : {Sigma:F0} : {SourceName}"; - public AlmaIndicator() : base() + public AlmaIndicator() { Name = "ALMA - Arnaud Legoux Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Alma(period: Period, offset: Offset, sigma: Sigma); } } diff --git a/quantower/Averages/DemaIndicator.cs b/quantower/Averages/DemaIndicator.cs index 185cf6a5..d8781e74 100644 --- a/quantower/Averages/DemaIndicator.cs +++ b/quantower/Averages/DemaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class DemaIndicator : IndicatorBase { @@ -9,14 +9,13 @@ public class DemaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"DEMA {Period} : {SourceName}"; - public DemaIndicator() : base() + public DemaIndicator() { Name = "DEMA - Double Exponential Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Dema(period: Period); } } diff --git a/quantower/Averages/DsmaIndicator.cs b/quantower/Averages/DsmaIndicator.cs index 6e16fd0d..bdf43876 100644 --- a/quantower/Averages/DsmaIndicator.cs +++ b/quantower/Averages/DsmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class DsmaIndicator : IndicatorBase { @@ -10,7 +10,7 @@ public class DsmaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"DSMA {Period} : {SourceName}"; - public DsmaIndicator() : base() + public DsmaIndicator() { Name = "DSMA - Deviation Scaled Moving Average"; } @@ -19,6 +19,5 @@ public class DsmaIndicator : IndicatorBase { ma = new Dsma(Period); MinHistoryDepths = ma.WarmupPeriod; - base.InitIndicator(); } } diff --git a/quantower/Averages/DwmaIndicator.cs b/quantower/Averages/DwmaIndicator.cs index 5b80c398..d0f45dcf 100644 --- a/quantower/Averages/DwmaIndicator.cs +++ b/quantower/Averages/DwmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class DwmaIndicator : IndicatorBase { @@ -11,7 +11,7 @@ public class DwmaIndicator : IndicatorBase public override string ShortName => $"DWMA {Period} : {SourceName}"; - public DwmaIndicator() : base() + public DwmaIndicator() { Name = "DWMA - Double Weighted Moving Average"; } @@ -19,6 +19,5 @@ public class DwmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Dwma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/EmaIndicator.cs b/quantower/Averages/EmaIndicator.cs index 7adecd30..4ffe50a6 100644 --- a/quantower/Averages/EmaIndicator.cs +++ b/quantower/Averages/EmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class EmaIndicator : IndicatorBase { @@ -13,7 +13,7 @@ public class EmaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"EMA {Period} : {SourceName}"; - public EmaIndicator() : base() + public EmaIndicator() { Name = "EMA - Exponential Moving Average"; Description = "Exponential Moving Average"; @@ -21,7 +21,6 @@ public class EmaIndicator : IndicatorBase protected override void InitIndicator() { - base.InitIndicator(); ma = new Ema(period: Period, useSma: UseSma); } } diff --git a/quantower/Averages/EpmaIndicator.cs b/quantower/Averages/EpmaIndicator.cs index 1a92d33c..186e87ec 100644 --- a/quantower/Averages/EpmaIndicator.cs +++ b/quantower/Averages/EpmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class EpmaIndicator : IndicatorBase { @@ -10,14 +10,13 @@ public class EpmaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"EPMA {Period} : {SourceName}"; - public EpmaIndicator() : base() + public EpmaIndicator() { Name = "EPMA - Endpoint Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Epma(period: Period); } } diff --git a/quantower/Averages/FramaIndicator.cs b/quantower/Averages/FramaIndicator.cs index 865f4a53..3dd036dd 100644 --- a/quantower/Averages/FramaIndicator.cs +++ b/quantower/Averages/FramaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class FramaIndicator : IndicatorBase { @@ -11,7 +11,7 @@ public class FramaIndicator : IndicatorBase public override string ShortName => $"FRAMA {Period} : {SourceName}"; - public FramaIndicator() : base() + public FramaIndicator() { Name = "FRAMA - Fractal Adaptive Moving Average"; } @@ -19,6 +19,5 @@ public class FramaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Frama(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/FwmaIndicator.cs b/quantower/Averages/FwmaIndicator.cs index b4a9a389..5a51f375 100644 --- a/quantower/Averages/FwmaIndicator.cs +++ b/quantower/Averages/FwmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class FwmaIndicator : IndicatorBase { @@ -11,7 +11,7 @@ public class FwmaIndicator : IndicatorBase public override string ShortName => $"FWMA {Period} : {SourceName}"; - public FwmaIndicator() : base() + public FwmaIndicator() { Name = "FWMA - Fibonacci-Weighted Moving Average"; } @@ -19,6 +19,5 @@ public class FwmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Fwma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/GmaIndicator.cs b/quantower/Averages/GmaIndicator.cs index 5d85e499..32614ee4 100644 --- a/quantower/Averages/GmaIndicator.cs +++ b/quantower/Averages/GmaIndicator.cs @@ -1,5 +1,5 @@ using TradingPlatform.BusinessLayer; -using QuanTAlib; +namespace QuanTAlib; public class GmaIndicator : IndicatorBase { @@ -11,7 +11,7 @@ public class GmaIndicator : IndicatorBase public override string ShortName => $"GMA {Period} : {SourceName}"; - public GmaIndicator() : base() + public GmaIndicator() { Name = "GMA - Gaussian-Weighted Moving Average"; } @@ -19,6 +19,5 @@ public class GmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Gma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/HmaIndicator.cs b/quantower/Averages/HmaIndicator.cs index 2dd2b472..14ce5420 100644 --- a/quantower/Averages/HmaIndicator.cs +++ b/quantower/Averages/HmaIndicator.cs @@ -11,7 +11,7 @@ public class HmaIndicator : IndicatorBase public override string ShortName => $"HMA {Period} : {SourceName}"; - public HmaIndicator() : base() + public HmaIndicator() { Name = "HMA - Hull Moving Average"; } @@ -19,6 +19,5 @@ public class HmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Hma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/HtitIndicator.cs b/quantower/Averages/HtitIndicator.cs index 8d0f4009..1368fd85 100644 --- a/quantower/Averages/HtitIndicator.cs +++ b/quantower/Averages/HtitIndicator.cs @@ -7,7 +7,7 @@ public class HtitIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"HTIT : {SourceName}"; - public HtitIndicator() : base() + public HtitIndicator() { Name = "HTIT - Hilbert Transform Instantaneous Trendline"; } @@ -16,6 +16,5 @@ public class HtitIndicator : IndicatorBase { ma = new Htit(); MinHistoryDepths = ma.WarmupPeriod; - base.InitIndicator(); } } diff --git a/quantower/Averages/HwmaIndicator.cs b/quantower/Averages/HwmaIndicator.cs index e777af3c..ce51079b 100644 --- a/quantower/Averages/HwmaIndicator.cs +++ b/quantower/Averages/HwmaIndicator.cs @@ -17,17 +17,13 @@ public class HwmaIndicator : IndicatorBase public override string ShortName => $"HWMA {nA:F2} : {nB:F2} : {nC:F2} : {SourceName}"; - public HwmaIndicator() : base() + public HwmaIndicator() { Name = "HWMA - Holt-Winter Moving Average"; } protected override void InitIndicator() { - //nA = 2 / (1 + (double)Period); - //nB = 1 / (double)Period; - //nC = 1 / (double)Period; ma = new Hwma(nA: nA, nB: nB, nC: nC); - base.InitIndicator(); } } diff --git a/quantower/Averages/JmaIndicator.cs b/quantower/Averages/JmaIndicator.cs index 88a0a2ea..c418d551 100644 --- a/quantower/Averages/JmaIndicator.cs +++ b/quantower/Averages/JmaIndicator.cs @@ -7,13 +7,13 @@ public class JmaIndicator : IndicatorBase public int Period { get; set; } = 10; [InputParameter("Phase", sortIndex: 2, -100, 100, 1, 0)] - public int Phase { get; set; } = 0; + public int Phase { get; set; } private Jma? ma; protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"JMA {Period} : {Phase} : {SourceName}"; - public JmaIndicator() : base() + public JmaIndicator() { Name = "JMA - Jurik Moving Average"; } @@ -21,6 +21,5 @@ public class JmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Jma(period: Period, phase: (double)Phase); - base.InitIndicator(); } } diff --git a/quantower/Averages/KamaIndicator.cs b/quantower/Averages/KamaIndicator.cs index 21587ab1..88d1a264 100644 --- a/quantower/Averages/KamaIndicator.cs +++ b/quantower/Averages/KamaIndicator.cs @@ -15,7 +15,7 @@ public class KamaIndicator : IndicatorBase public override string ShortName => $"KAMA {Period} : {Fast} : {Slow} : {SourceName}"; - public KamaIndicator() : base() + public KamaIndicator() { Name = "KAMA - Kaufman's Adaptive Moving Average"; } @@ -23,6 +23,5 @@ public class KamaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Kama(Period, Fast, Slow); - base.InitIndicator(); } } diff --git a/quantower/Averages/LtmaIndicator.cs b/quantower/Averages/LtmaIndicator.cs index d786d0bb..5c5b5f85 100644 --- a/quantower/Averages/LtmaIndicator.cs +++ b/quantower/Averages/LtmaIndicator.cs @@ -10,7 +10,7 @@ public class LtmaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"Laguerre {Gamma:F2} : {SourceName}"; - public LtmaIndicator() : base() + public LtmaIndicator() { Name = "LTMA - Laguerre Transform Moving Average"; } @@ -18,6 +18,5 @@ public class LtmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Ltma(gamma: Gamma); - base.InitIndicator(); } } diff --git a/quantower/Averages/MaafIndicator.cs b/quantower/Averages/MaafIndicator.cs index 6cb7128c..7dbe5950 100644 --- a/quantower/Averages/MaafIndicator.cs +++ b/quantower/Averages/MaafIndicator.cs @@ -7,20 +7,19 @@ public class MaafIndicator : IndicatorBase public int Period { get; set; } = 39; [InputParameter("Threshold", sortIndex: 5, minimum: 0, maximum: 1, increment: 0.001, decimalPlaces:3)] - public double Threshold = 0.002; + public double Threshold { get; set; } = 0.002; private Maaf? ma; protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"MAAF {Period} : {Threshold:F2} : {SourceName}"; - public MaafIndicator() : base() + public MaafIndicator() { Name = "MAAF - Median-Average Adaptive Filter"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Maaf(Period: Period, Threshold: Threshold); } } diff --git a/quantower/Averages/MamaIndicator.cs b/quantower/Averages/MamaIndicator.cs index d3e14f30..2d1ca0b9 100644 --- a/quantower/Averages/MamaIndicator.cs +++ b/quantower/Averages/MamaIndicator.cs @@ -12,7 +12,7 @@ public class MamaIndicator : IndicatorBase public override string ShortName => $"MAMA : {Fast} : {Slow} : {SourceName}"; - public MamaIndicator() : base() + public MamaIndicator() { Name = "MAMA - MESA Adaptive Moving Average"; } @@ -20,6 +20,5 @@ public class MamaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Mama(Fast, Slow); - base.InitIndicator(); } } diff --git a/quantower/Averages/MgdiIndicator.cs b/quantower/Averages/MgdiIndicator.cs index a9ed0bb0..528ea55b 100644 --- a/quantower/Averages/MgdiIndicator.cs +++ b/quantower/Averages/MgdiIndicator.cs @@ -15,7 +15,7 @@ public class MgdiIndicator : IndicatorBase public override string ShortName => $"MGDI {Period} : {kfactor:F2} : {SourceName}"; - public MgdiIndicator() : base() + public MgdiIndicator() { Name = "MGDI - McGinley Dynamic Index"; } @@ -23,6 +23,5 @@ public class MgdiIndicator : IndicatorBase protected override void InitIndicator() { ma = new Mgdi(period: Period, kFactor: kfactor); - base.InitIndicator(); } } diff --git a/quantower/Averages/MmaIndicator.cs b/quantower/Averages/MmaIndicator.cs index bf174265..5a029c15 100644 --- a/quantower/Averages/MmaIndicator.cs +++ b/quantower/Averages/MmaIndicator.cs @@ -10,14 +10,13 @@ public class MmaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"MMA {Period} : {SourceName}"; - public MmaIndicator() : base() + public MmaIndicator() { Name = "MMA - Modified Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Mma(period: Period); } } diff --git a/quantower/Averages/QemaIndicator.cs b/quantower/Averages/QemaIndicator.cs index 3434249e..a1208a0e 100644 --- a/quantower/Averages/QemaIndicator.cs +++ b/quantower/Averages/QemaIndicator.cs @@ -16,7 +16,7 @@ public class QemaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"QEMA {k1:F2} : {k2:F2} : {k3:F2} : {k4:F2} :{SourceName}"; - public QemaIndicator() : base() + public QemaIndicator() { Name = "QEMA - Quad Exponential Moving Average"; Description = "Quad Exponential Moving Average"; @@ -24,7 +24,6 @@ public class QemaIndicator : IndicatorBase protected override void InitIndicator() { - base.InitIndicator(); ma = new Qema(k1, k2, k3, k4); } } diff --git a/quantower/Averages/RemaIndicator.cs b/quantower/Averages/RemaIndicator.cs index 26193da4..cd66f1a8 100644 --- a/quantower/Averages/RemaIndicator.cs +++ b/quantower/Averages/RemaIndicator.cs @@ -13,14 +13,13 @@ public class RemaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"REMA {Period} : {Lambda:F2} : {SourceName}"; - public RemaIndicator() : base() + public RemaIndicator() { Name = "REMA - Regularized Exponential Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Rema(period: Period, lambda: Lambda); } } diff --git a/quantower/Averages/RmaIndicator.cs b/quantower/Averages/RmaIndicator.cs index a89e15a6..58f74fbe 100644 --- a/quantower/Averages/RmaIndicator.cs +++ b/quantower/Averages/RmaIndicator.cs @@ -11,7 +11,7 @@ public class RmaIndicator : IndicatorBase public override string ShortName => $"RMA {Period} : {SourceName}"; - public RmaIndicator() : base() + public RmaIndicator() { Name = "RMA - wildeR Moving Average"; } @@ -19,6 +19,5 @@ public class RmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Rma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/SinemaIndicator.cs b/quantower/Averages/SinemaIndicator.cs index 2f3b231f..56be7972 100644 --- a/quantower/Averages/SinemaIndicator.cs +++ b/quantower/Averages/SinemaIndicator.cs @@ -10,7 +10,7 @@ public class SinemaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"SINEMA {Period} : {SourceName}"; - public SinemaIndicator() : base() + public SinemaIndicator() { Name = "SINEMA - Sine-Weighted Moving Average"; } @@ -18,6 +18,5 @@ public class SinemaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Sinema(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/SmaIndicator.cs b/quantower/Averages/SmaIndicator.cs index 3cbf26fa..7ab77528 100644 --- a/quantower/Averages/SmaIndicator.cs +++ b/quantower/Averages/SmaIndicator.cs @@ -11,7 +11,7 @@ public class SmaIndicator : IndicatorBase public override string ShortName => $"SMA {Period} : {SourceName}"; - public SmaIndicator() : base() + public SmaIndicator() { Name = "SMA - Simple Moving Average"; } @@ -19,6 +19,5 @@ public class SmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Sma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/SmmaIndicator.cs b/quantower/Averages/SmmaIndicator.cs index a7516e22..5ac66cb7 100644 --- a/quantower/Averages/SmmaIndicator.cs +++ b/quantower/Averages/SmmaIndicator.cs @@ -11,7 +11,7 @@ public class SmmaIndicator : IndicatorBase public override string ShortName => $"SMMA {Period} : {SourceName}"; - public SmmaIndicator() : base() + public SmmaIndicator() { Name = "SMMA - Smoothed Moving Average"; } @@ -19,6 +19,5 @@ public class SmmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Smma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/T3Indicator.cs b/quantower/Averages/T3Indicator.cs index 5b8f4766..47adeac4 100644 --- a/quantower/Averages/T3Indicator.cs +++ b/quantower/Averages/T3Indicator.cs @@ -10,13 +10,13 @@ public class T3Indicator : IndicatorBase public double Vfactor { get; set; } = 0.62; [InputParameter("Use SMA for warmup", sortIndex: 3)] - public bool UseSma { get; set; } = false; + public bool UseSma { get; set; } private T3? ma; protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"T3 {Period} : {Vfactor:F2} : {SourceName}"; - public T3Indicator() : base() + public T3Indicator() { Name = "T3 - Tillson T3 Moving Average"; } @@ -24,6 +24,5 @@ public class T3Indicator : IndicatorBase protected override void InitIndicator() { ma = new T3(period: Period, vfactor: Vfactor, useSma: UseSma); - base.InitIndicator(); } } diff --git a/quantower/Averages/TemaIndicator.cs b/quantower/Averages/TemaIndicator.cs index 57d50da3..4ad2b4cb 100644 --- a/quantower/Averages/TemaIndicator.cs +++ b/quantower/Averages/TemaIndicator.cs @@ -10,14 +10,13 @@ public class TemaIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"TEMA {Period} : {SourceName}"; - public TemaIndicator() : base() + public TemaIndicator() { Name = "TEMA - Triple Exponential Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Tema(period: Period); } } diff --git a/quantower/Averages/TrimaIndicator.cs b/quantower/Averages/TrimaIndicator.cs index b0612356..2296ba37 100644 --- a/quantower/Averages/TrimaIndicator.cs +++ b/quantower/Averages/TrimaIndicator.cs @@ -11,7 +11,7 @@ public class TrimaIndicator : IndicatorBase public override string ShortName => $"TRIMA {Period} : {SourceName}"; - public TrimaIndicator() : base() + public TrimaIndicator() { Name = "TRIMA - Triangular Moving Average"; } @@ -19,6 +19,5 @@ public class TrimaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Trima(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/VidyaIndicator.cs b/quantower/Averages/VidyaIndicator.cs index a9ed10ad..b46e29f3 100644 --- a/quantower/Averages/VidyaIndicator.cs +++ b/quantower/Averages/VidyaIndicator.cs @@ -15,7 +15,7 @@ public class VidyaIndicator : IndicatorBase public override string ShortName => $"VIDYA {Period} : {SourceName}"; - public VidyaIndicator() : base() + public VidyaIndicator() { Name = "VIDYA - Variable Index Dynamic Average"; } @@ -23,6 +23,5 @@ public class VidyaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Vidya(Period, LPeriod, Alpha); - base.InitIndicator(); } } diff --git a/quantower/Averages/WmaIndicator.cs b/quantower/Averages/WmaIndicator.cs index 5cc6a396..3c61c8f9 100644 --- a/quantower/Averages/WmaIndicator.cs +++ b/quantower/Averages/WmaIndicator.cs @@ -11,7 +11,7 @@ public class WmaIndicator : IndicatorBase public override string ShortName => $"WMA {Period} : {SourceName}"; - public WmaIndicator() : base() + public WmaIndicator() { Name = "WMA - Weighted Moving Average"; } @@ -19,6 +19,5 @@ public class WmaIndicator : IndicatorBase protected override void InitIndicator() { ma = new Wma(Period); - base.InitIndicator(); } } diff --git a/quantower/Averages/ZlemaIndicator.cs b/quantower/Averages/ZlemaIndicator.cs index c42b045c..fbfdaec2 100644 --- a/quantower/Averages/ZlemaIndicator.cs +++ b/quantower/Averages/ZlemaIndicator.cs @@ -11,14 +11,13 @@ public class ZlemaIndicator : IndicatorBase public override string ShortName => $"ZLEMA {Period} : {SourceName}"; - public ZlemaIndicator() : base() + public ZlemaIndicator() { Name = "ZLEMA - Weighted Moving Average"; } protected override void InitIndicator() { - base.InitIndicator(); ma = new Zlema(Period); } } diff --git a/quantower/Averages/_IndicatorBase.cs b/quantower/Averages/_IndicatorBase.cs index 043fd9e1..76c628b9 100644 --- a/quantower/Averages/_IndicatorBase.cs +++ b/quantower/Averages/_IndicatorBase.cs @@ -3,10 +3,11 @@ using TradingPlatform.BusinessLayer; using TradingPlatform.BusinessLayer.Chart; using System.Runtime.CompilerServices; using System.Drawing.Drawing2D; -using QuanTAlib; using System.Collections; using TradingPlatform.BusinessLayer.TimeSync; +namespace QuanTAlib; + #pragma warning disable CA1416 // Validate platform compatibility public abstract class IndicatorBase : Indicator, IWatchlistIndicator { @@ -27,7 +28,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator [InputParameter("Show cold values", sortIndex: 20)] public bool ShowColdValues { get; set; } = true; - public int MinHistoryDepths; + public int MinHistoryDepths { get; set; } // LineSeries.LineSeries(string, Color, int, LineStyle)' @@ -37,7 +38,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator int IWatchlistIndicator.MinHistoryDepths => 0; - protected IndicatorBase() : base() + protected IndicatorBase() { OnBackGround = true; SeparateWindow = false; @@ -45,13 +46,9 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator Series = new(name: $"{Name}", color: Color.Yellow, width: 2, style: LineStyle.Solid); AddLineSeries(Series); - InitIndicator(); } - protected virtual void InitIndicator() - { - SourceName = GetName(Source); - } + protected abstract void InitIndicator(); protected override void OnInit() { @@ -95,7 +92,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator { base.OnPaintChart(args); List allPoints = new List(); - if (CurrentChart == null) return; + if (CurrentChart == null) { return; } Graphics gr = args.Graphics; var mainWindow = this.CurrentChart.Windows[args.WindowIndex]; @@ -126,7 +123,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator private void DrawSmoothCombinedCurve(Graphics gr, List allPoints, int hotCount) { - if (allPoints.Count < 2) return; + if (allPoints.Count < 2) { return; } using (Pen defaultPen = new(Series!.Color, Series.Width) { DashStyle = ConvertLineStyleToDashStyle(Series.Style) }) using (Pen coldPen = new(Series!.Color, Series.Width) { DashStyle = DashStyle.Dot }) @@ -146,7 +143,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator } } } - private DashStyle ConvertLineStyleToDashStyle(LineStyle lineStyle) + private static DashStyle ConvertLineStyleToDashStyle(LineStyle lineStyle) { return lineStyle switch { @@ -157,7 +154,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator _ => DashStyle.Solid, }; } - protected void DrawText(Graphics gr, string text, Rectangle clientRect) + protected static void DrawText(Graphics gr, string text, Rectangle clientRect) { Font font = new Font("Inter", 8); SizeF textSize = gr.MeasureString(text, font); @@ -167,7 +164,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator gr.FillRectangle(SystemBrushes.ControlDarkDark, textRect); gr.DrawString(text, font, Brushes.White, new PointF(textRect.X + 6, textRect.Y + 5)); } - protected string GetName(int pType) + protected static string GetName(int pType) { return pType switch { diff --git a/quantower/Statistics/EntropyIndicator.cs b/quantower/Statistics/EntropyIndicator.cs index 8e141c01..f56adee1 100644 --- a/quantower/Statistics/EntropyIndicator.cs +++ b/quantower/Statistics/EntropyIndicator.cs @@ -10,7 +10,7 @@ public class EntropyIndicator : IndicatorBase protected override AbstractBase QuanTAlib => entropy!; public override string ShortName => $"ENTROPY {Period} : {SourceName}"; - public EntropyIndicator() : base() + public EntropyIndicator() { Name = "ENTROPY - Entropy"; SeparateWindow = true; @@ -20,6 +20,5 @@ public class EntropyIndicator : IndicatorBase { entropy = new(Period); MinHistoryDepths = entropy.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/KurtosisIndicator.cs b/quantower/Statistics/KurtosisIndicator.cs index c9d78068..c3071712 100644 --- a/quantower/Statistics/KurtosisIndicator.cs +++ b/quantower/Statistics/KurtosisIndicator.cs @@ -10,7 +10,7 @@ public class KurtosisIndicator : IndicatorBase protected override AbstractBase QuanTAlib => kurtosis!; public override string ShortName => $"KURTOSIS {Period} : {SourceName}"; - public KurtosisIndicator() : base() + public KurtosisIndicator() { Name = "KURTOSIS - Relative Flatness"; SeparateWindow = true; @@ -20,6 +20,5 @@ public class KurtosisIndicator : IndicatorBase { kurtosis = new(Period); MinHistoryDepths = kurtosis.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/MaxIndicator.cs b/quantower/Statistics/MaxIndicator.cs index e0b6200a..994cf19c 100644 --- a/quantower/Statistics/MaxIndicator.cs +++ b/quantower/Statistics/MaxIndicator.cs @@ -13,7 +13,7 @@ public class MaxIndicator : IndicatorBase protected override AbstractBase QuanTAlib => ma!; public override string ShortName => $"MAX {Period} : {Decay:F2} : {SourceName}"; - public MaxIndicator() : base() + public MaxIndicator() { Name = "MAX - Maximum value (with decay) "; } @@ -23,6 +23,5 @@ public class MaxIndicator : IndicatorBase ma = new Max(Period, Decay); MinHistoryDepths = ma.WarmupPeriod; Source = 2; - base.InitIndicator(); } } diff --git a/quantower/Statistics/MedianIndicator.cs b/quantower/Statistics/MedianIndicator.cs index e2e29d98..ab217f49 100644 --- a/quantower/Statistics/MedianIndicator.cs +++ b/quantower/Statistics/MedianIndicator.cs @@ -9,7 +9,7 @@ public class MedianIndicator : IndicatorBase private Median? med; protected override AbstractBase QuanTAlib => med!; public override string ShortName => $"MEDIAN {Period} : {SourceName}"; - public MedianIndicator() : base() + public MedianIndicator() { Name = "MEDIAN - Median historical value"; } @@ -18,6 +18,5 @@ public class MedianIndicator : IndicatorBase { med = new Median(Period); MinHistoryDepths = med.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/MinIndicator.cs b/quantower/Statistics/MinIndicator.cs index a4c14e9e..50aaf0c6 100644 --- a/quantower/Statistics/MinIndicator.cs +++ b/quantower/Statistics/MinIndicator.cs @@ -12,7 +12,7 @@ public class MinIndicator : IndicatorBase private Min? mi; protected override AbstractBase QuanTAlib => mi!; public override string ShortName => $"MIN {Period} : {Decay:F2} : {SourceName}"; - public MinIndicator() : base() + public MinIndicator() { Name = "MIN - Minimum value (with decay)"; } @@ -22,6 +22,5 @@ public class MinIndicator : IndicatorBase mi = new Min(Period, Decay); MinHistoryDepths = mi.WarmupPeriod; Source = 3; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/ModeIndicator.cs b/quantower/Statistics/ModeIndicator.cs index c293b643..5cacbab4 100644 --- a/quantower/Statistics/ModeIndicator.cs +++ b/quantower/Statistics/ModeIndicator.cs @@ -9,7 +9,7 @@ public class ModeIndicator : IndicatorBase private Mode? mode; protected override AbstractBase QuanTAlib => mode!; public override string ShortName => $"MODE {Period} : {SourceName}"; - public ModeIndicator() : base() + public ModeIndicator() { Name = "MODE - Most frequent historical value"; } @@ -18,6 +18,5 @@ public class ModeIndicator : IndicatorBase { mode = new Mode(Period); MinHistoryDepths = mode.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/PercentileIndicator.cs b/quantower/Statistics/PercentileIndicator.cs index dacb2fd9..4341286c 100644 --- a/quantower/Statistics/PercentileIndicator.cs +++ b/quantower/Statistics/PercentileIndicator.cs @@ -12,7 +12,7 @@ public class PercentileIndicator : IndicatorBase protected override AbstractBase QuanTAlib => percentile!; public override string ShortName => $"PERCENTILE {Period} {Percent:F0}% : {SourceName}"; - public PercentileIndicator() : base() + public PercentileIndicator() { Name = "PERCENTILE - n-th Percentile "; SeparateWindow = false; @@ -22,7 +22,6 @@ public class PercentileIndicator : IndicatorBase { percentile = new(Period, Percent); MinHistoryDepths = percentile.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/SkewIndicator.cs b/quantower/Statistics/SkewIndicator.cs index 7cce283e..36ea301a 100644 --- a/quantower/Statistics/SkewIndicator.cs +++ b/quantower/Statistics/SkewIndicator.cs @@ -11,7 +11,7 @@ public class SkewIndicator : IndicatorBase protected override AbstractBase QuanTAlib => skew!; public override string ShortName => $"SKEW {Period} : {SourceName}"; - public SkewIndicator() : base() + public SkewIndicator() { Name = "SKEW - Skewness"; SeparateWindow = true; @@ -21,6 +21,5 @@ public class SkewIndicator : IndicatorBase { skew = new(Period); MinHistoryDepths = skew.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/StddevIndicator.cs b/quantower/Statistics/StddevIndicator.cs index 6c9648c2..8cc639aa 100644 --- a/quantower/Statistics/StddevIndicator.cs +++ b/quantower/Statistics/StddevIndicator.cs @@ -7,12 +7,12 @@ public class StddevIndicator : IndicatorBase public int Period { get; set; } = 20; [InputParameter("Population", sortIndex: 2)] - public bool IsPopulation { get; set; } = false; + public bool IsPopulation { get; set; } private Stddev? stddev; protected override AbstractBase QuanTAlib => stddev!; public override string ShortName => $"STDDEV {Period} : {SourceName}"; - public StddevIndicator() : base() + public StddevIndicator() { Name = "STDDEV - Standard Deviation"; SeparateWindow = true; @@ -22,6 +22,5 @@ public class StddevIndicator : IndicatorBase { stddev = new(Period, IsPopulation); MinHistoryDepths = stddev.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/VarianceIndictor.cs b/quantower/Statistics/VarianceIndictor.cs index de983873..93e6ca17 100644 --- a/quantower/Statistics/VarianceIndictor.cs +++ b/quantower/Statistics/VarianceIndictor.cs @@ -7,12 +7,12 @@ public class VarianceIndicator : IndicatorBase public int Period { get; set; } = 20; [InputParameter("Population", sortIndex: 2)] - public bool IsPopulation { get; set; } = false; + public bool IsPopulation { get; set; } private Variance? variance; protected override AbstractBase QuanTAlib => variance!; public override string ShortName => $"VAR {Period} : {SourceName}"; - public VarianceIndicator() : base() + public VarianceIndicator() { Name = "VAR - Variance"; SeparateWindow = true; @@ -23,6 +23,5 @@ public class VarianceIndicator : IndicatorBase SeparateWindow = true; variance = new(Period, IsPopulation); MinHistoryDepths = variance.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/ZscoreIndicator.cs b/quantower/Statistics/ZscoreIndicator.cs index 19727511..eb630db1 100644 --- a/quantower/Statistics/ZscoreIndicator.cs +++ b/quantower/Statistics/ZscoreIndicator.cs @@ -10,7 +10,7 @@ public class ZScoreIndicator : IndicatorBase protected override AbstractBase QuanTAlib => zScore!; public override string ShortName => $"ZSCORE {Period} : {SourceName}"; - public ZScoreIndicator() : base() + public ZScoreIndicator() { Name = "ZSCORE - Standard Score"; SeparateWindow = true; @@ -20,7 +20,6 @@ public class ZScoreIndicator : IndicatorBase { zScore = new(Period); MinHistoryDepths = zScore.WarmupPeriod; - base.InitIndicator(); } } \ No newline at end of file diff --git a/quantower/Statistics/_IndicatorBase.cs b/quantower/Statistics/_IndicatorBase.cs index aef60342..d4d01fb7 100644 --- a/quantower/Statistics/_IndicatorBase.cs +++ b/quantower/Statistics/_IndicatorBase.cs @@ -28,7 +28,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator [InputParameter("Show cold values", sortIndex: 20)] public bool ShowColdValues { get; set; } = true; - public int MinHistoryDepths; + public int MinHistoryDepths { get; set; } // LineSeries.LineSeries(string, Color, int, LineStyle)' @@ -38,7 +38,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator int IWatchlistIndicator.MinHistoryDepths => 0; - protected IndicatorBase() : base() + protected IndicatorBase() { OnBackGround = true; SeparateWindow = false; @@ -46,17 +46,14 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator Series = new(name: $"{Name}", color: Color.RoyalBlue, width: 2, style: LineStyle.Solid); AddLineSeries(Series); - InitIndicator(); } - protected virtual void InitIndicator() - { - SourceName = GetName(Source); - } + protected abstract void InitIndicator(); protected override void OnInit() { InitIndicator(); + SourceName = GetName(Source); base.OnInit(); } @@ -96,7 +93,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator { base.OnPaintChart(args); List allPoints = new List(); - if (CurrentChart == null) return; + if (CurrentChart == null) { return; } Graphics gr = args.Graphics; @@ -128,7 +125,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator private void DrawSmoothCombinedCurve(Graphics gr, List allPoints, int hotCount) { - if (allPoints.Count < 2) return; + if (allPoints.Count < 2) { return; } using (Pen defaultPen = new(Series!.Color, Series.Width) { DashStyle = ConvertLineStyleToDashStyle(Series.Style) }) using (Pen coldPen = new(Series!.Color, Series.Width) { DashStyle = DashStyle.Dot }) @@ -148,7 +145,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator } } } - private DashStyle ConvertLineStyleToDashStyle(LineStyle lineStyle) + private static DashStyle ConvertLineStyleToDashStyle(LineStyle lineStyle) { return lineStyle switch { @@ -159,7 +156,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator _ => DashStyle.Solid, }; } - protected void DrawText(Graphics gr, string text, Rectangle clientRect) + protected static void DrawText(Graphics gr, string text, Rectangle clientRect) { Font font = new Font("Inter", 8); SizeF textSize = gr.MeasureString(text, font); @@ -169,7 +166,7 @@ public abstract class IndicatorBase : Indicator, IWatchlistIndicator gr.FillRectangle(SystemBrushes.ControlDarkDark, textRect); gr.DrawString(text, font, Brushes.White, new PointF(textRect.X + 6, textRect.Y + 5)); } - protected string GetName(int pType) + protected static string GetName(int pType) { return pType switch {

xwQlB$Tf-W=Pnazg{$6xk$IGdt`rhqiqGM}t6ABQrZ$^fqy3S;xGpZTE* z0~X*b^&lX@@wCw4DwDKR&M8BoM*taL#n>hbxhugAlVIl^unw|#g_U0cPZ_)ocA5m0 zcYvHG!SX~P4hs#sD%2bC`YZ?MI#iKhD!2jD-vi{+6y1J{jy))>!d@W9Jhk#iOcr$R zoNZ$knM!pp;=GE?o4_~PegvoV09*l3900O>T=NtT^#s)72+(I2U>ZQVtxA=+3iW?Q zv;r+aM||Pc&oU4HD%I8ITUTII9wDGzkt- z0f;oZWm4J~?Ia4ydkjXG=-FfbL6M2Qieh_OnFf-d>GS&?N-#q7A?tAk&#D1-$Qc3Y zwo%%s@5cNynIvnvv_8mrKO}$zkvD3RGinM#HeDNogaFV&0KUvUMCobFSPAX!QlT}e zeB6r89g;9PjMpQ9OeaAu_TUOQ@zxF)Jqa%JE3Wh_`lSk@BmhEt7=pZXzI;Q#FNIXr z^6Zw3k_~9J7k!6|)%^}iZkEe@+jey7(Eq2D={kyz@xynb>A__5_Lyk$x}3KR0RG5=MWr>v|yWsH3V&>qs+2rMdSk*kGjVU2o^R zu&kFY!r3QImhABqLXO%ha%-1ay1wNMH~__m?1Pf9SeSiKkIxG+&Z>E?LjR*w3EOP z3{G)5vB`lChRd-h6&iA2AM!D<7sJ|!l!QvGWLCWaXR#`==w&M61_}T=xpDseiUmXA zkA=VLy4o)FhQ?{Zd(24ocs63*%x>=r3eUgB_7OY&IL{K5iyueZ@$YRzK=cw2}+SOocglI{anQ#GVC1EM>~drC|J%Q-r_d>9X*dVvuA<+4 z+h9Ue@L_szulJl2m*4$#f9u>i8_D?w$h?#De8;AropV4fWV&piR)2uumF@IR@v5c| z-dDsWqodn5VZOq9<}MMda%!0X)`|Z?bwdV#`qM7%HVC7F3iSZ|$tJ;8T=N6xey)7xekdN|&?jraE-Yd7D6_dhWUViT6C)-;u_R$EL%v0IaRjT z*>#VSy)D7^{s&r1dF~geLiGCxM9Qpc`s6MB>m%wa^X$ArFC$|qJ$aWspSeqP%sssg zQ!JiqI|WOfe(eRYDeY@>!$*b{HWmxi+@8cwE6Dc*?kqQWfD_o0QhQKdzHN1+;J<-X z6le}_TSQE>_u5B04X-C#AKU$@r1gX>jH5~E>9Oa&o?rjako7G!SNMUy5aZsW-l0jx zQR609%ki;FQ}vwI47bbl>d6)vq`$QyKB>>VoxWA<_w>tHP7l}|5ao@ zd`?3Hq)P<=D2SBTCj*Zfql;2!G`dtjxu+$@!&`G?mmZHFZ=}ZbmwX{SN+2Pv!peV% z-Xpp(Q~e$a@*f}6caQNG+Gi`^%wb*pO(Ho}$$!|$U|2A=fVcy|9)AV>^clmIVdir* zdtkuMD@%1rex;q2NK-?dRHnGZCp}3$iBHA~AKVFy$nsTa17L@qf3@zkc~PueU3ri- zUfHnSqGdPAX4jn6!a590WLwNp>E4E1_NmH;6A#YFh(-zcqX`{9WWpmin%9^}oAAKv zry2*w{A$20jZg$v#@475HB8;h?fZ7kTmv>heV&F}IF0T6eOwRtUg1&CpZ2zni5)tP zc89s^Dp$p$;M5(!m_ewMl=>|%I3!uUN%jO145$(cZc6cTvp5Br;UOHSBaKigqE^mR z6hMbSc^yxw(nA@zNO_ZXUsHPj`VOW3LrN{&*5Ju5`cLt&e%INy!#KQD1TmCZc>6z; zad1u-wleb8>h-RTJAXCrAzhS=D|DYet{PRfO*&_e&uJB7;0(q?y*g@^;gHxm=-Nfi zh9SfR2sX$5AN+R3@;&-0q^+kHV>qBmmH}y_K!wuB#od%@$m3G!;|l54ZvwM?6K*dj zc8QWTt*oTyH&(x6^V_A~zz(WEmi8Lx?dq}heTH54*T~{ds@hIGbjxxClXjmi|5x0T zL5n5$jh6W?0l9X71~^XpD<+L3;D9nUle9+{P82f07aBkc{HK?1KQR$Lz2W)HgaQDF zi-R2YpsV(_AbRxqprRc*r|>rC0oQ=1?%fZv&V9W!Jejv^cL^;v=i8mVj9!~J*7LAT zS}P0#j_{^4hHKA!;D&_hVc<$I*yeP4TAwhiERCz8odNTl=3}(GkF>8ZW-2) z4e(~(kDQ1JT5jopd>+5Fde%yM@PXDV>nnoRlat%@n;@qp46<@!Mi>8E;|?vSmj&Hl zYO@bx!GD&-PeWXu@CTAx>v^n?C;4)00Ft?dH=NG>hUp5_xrfOtOZ2Q(u%CiLVyhTB zUY3FPSpgIQ9Zd*WpnqUs0FDL@r-D$yAYe#g0X3nhth}JCw4xdUuOOCF*Ob+l6B0TA zfQ|%kJ-D>KskUK=I5gzYD z5vgHs-X&u*bL(M*-U1FiTU!Tx4j2p${aBE_dIF}ZeO_@OkHlY%;hvD$ae`8sNnqTB z;l41f^RQwFha_qnv3Bzg!sEv8AAu+Z%z$25-?})Y)0!7(Nj22r-EXy(@U6TH|&ZHpSS`c-$o)4@%pAb?!T64N~F$p7` z(Axv<|G5Y>Iz7~A9^TBWb6ycP^PEkkE%m%wR|R~eTG#k-|6~W}Fq%~SytQ+y2BAoJ zQsg<4bUU1zul32Xom;@zLJ%+i`_Z3HbWH2^#O>G#^l zfBuy(inY889<)^9g%23f8ZcTmxapb0Ig1nM@H`V=$Q4tYN~tzv?L?Usfy!WXsn{W> zimSp{1zC#PtFpN?D)@X$WuDVpfc&-1l$}hi3pv8N-0~@TU)pd`e0Fx5b9ibok}UwQ zcyD4N?G7!!QI`Paxt5c92$$_`fG%)ilaJ>)LsR`)E4>~97g#et4j7mWSX8*>&@p&s z=kSYX!u`dK7^>wfr;yq{y^`+Sf(5&6zOu_0@0{Em@qwe}OVexVW-)QR1qw*I=`sr}Lia*{=(xX$eXkf^2g;cp!wCK`Q8v2v-Xi)y3n96K?wwP^ zee9j*5BS*2q4-J=@K1$et-92a!>D!DGr*Xb(mFjk5}y|!eeJNd^Yhrpp%3KG;}&z( z($-(r5MLhrdYSX(;h(zB?uUQ-5V-M6+KFJw(AR7yI+;=co6*BK+${4qUu5Y62q%}! zBaY>9*|9yI9cgRskUt?0gr0Kt0Pjtrv?cC1F2Kqhyo*qItcS0CGS?E?v$CGC#c*Za zew+0@D~`no9=4sEnfFA3;gg7r=!PY#HrTMXy2R{x>-XfsUqh!MbG6@XgkS`$U?(-c zWz`)lIuxL-<8i}BCL?ZcRewW@Q82A?lAoc3VDOXMmr?l4^9dEd=~=yVfMt$lVQ$9R z6VxD=^i>z*Xw}e|PAT`%5;~IoxO_7sPQFytAHU5&(FkY58Ijui-)M&A*ugwt{aByGiJ`-M5W@wau={QQsrI z$4~&@YCR8VE8k~o63;sym9uoSzaY_s=w7ct()y-0{fAz>$9`y(j?yw^&Pv|8`U7InU8 zyD7kd-advUh3(MWahzV2f)fqw43Z)HGlXz4!RB27d#Q-j_zTifmv@`N0F#p4lDV#zgmHClZT|XXlO|IJF9LHeJ*)Ye=^;~02H%hh4Dt@ z6RGS*lEeGXD%AN4Q%t80{yIAu2C~eF8K?1+F+zovHb^Q4xp>B~CZn4)WLqcW>icnt zV`G6oW}3oKZOYee3d53Iy}LrUJGc z`L>RiwbGqU-PsP+w(`7`S5}<5Qs_30r^h8tZaL@f>Y1k1yevFc>@W>Fvo7`EOz%ZD{fz2q@fdvV zBNZOpTJ^d0oKBFYW90-~Rq2zeF3eKMgQ1_!P7zb)Qo+4}=L3LSPHQd^_m1@EBb-jD zLvlT8qe)Lhjn#XvzkMeA{F#Ku5tVNx$gx4Lc=Wcj*!Qgm?*A?mpFKPmnR)Oz!2JGX zZcry%p*{0m5?9>h?OVhDJ@{7s^v|KXYr);^4JYB7-w)&5Kj;s41vponc<^YSYV-=( z2q40CSjtP`^{&_S%*OxAu%-#cO)+*&rqbI}SLU2vMMhm5sFfM_&Lgi3{i69Gzqv?8 z?s9FZUe(&2#N-7lZ9aKUvc5x-jvBh$;isd-FY?#2@QX4to*r_C14;P=iy@ z)kx@S1B=tNQ}*GV*_Nbr2zm$Xpk-~5Fzg5&Ok5%|DYXHTv`o^9wOb<{-yeidZ^S|k zZvS0?zdJ}ZT~wIXOCnC*A?v%kMRQM`t0hlCl#2vZ<+xsBpkAk-?>}S4rd3L{>})F1 zB&MPjY+bVZbd-N#iWyxbWG(t8**lPw)lJ$C-}Q|u3|_snSJ6$0WOD|nSdDzD$H|M-xk*bRJN-ao1SUOw*>VX8?lDKZo(!RE! z#uORb967c5nDfM_1;;pyPu=~mRQ-xI#rxg04u=6+z!*t)|X9t$wIZ|TYyte`77eKTp~Kb#{no~euwpo z!a&vxG+W$JTg2i5dwcCOdC88{r|a26Zn2HSOqc^kz@Vz_yL`HKlP5AZ*)Z#$GbnY% ztPv79GEWH2dWb;VWt)2iN^1G__A@hw>b@pHyit&~7+YO2sTd|{fHU&Ya_Enz^bV@)~v)KrzNvvF;fRrpx9f`=oeC> zrMrhmhZ705crXtR*?^6ldhVQ@6>620**8_lcFcGQbW&iZX%#C-_)#&SV(n|EVoe#o z0LyrjS=2CDJydFZv6sW1rNi|jPemX(E=H%iC~Hp%%kT{1gMygj!G6eU*(GGtPJRoE z`D!Zl6x`HLHD*F7#Q9jUKMm2*M)miYs?y!jNzC{K(50M-n)0N?Du&&nf}@ulUe5(OM?)>74#^tkWOCT-i*1e=$7Ef%$M{35B)T z3lx%`y|fvLdF-3jfS}egsj)7a(*xRNEwJZ z5^RNo_+lh$Pr1tQsSX)e^2tiXSbd17cE^UbLIsfk!gQ8XNq7fM{8p-V!->6wWW?BIEp|pM}ggN(2Yo{L5CZzl?WftYUDw7eUp)BoPW@u zX0A-oWslzdZ{_ZCYj<`78x>Ul7jzn1`eS zw!Df*pYmjqZmgYYmZMc4FjcM2rHrW60%2jGwCpdU;l`za+Z)g!VZ%E5`c^hm=p5pA zM{V3m*)4WEpX}VH9EPb%K0y}k=|5@00bQ0DNF)gY9nz|sVtn_Ktvn1j@zwFpVcu(B z1TQ@KyfC$(w7?eD9kFkBEYIDt%l%2oRrVNuO}D1ezn0*e7T8j>2naG@2c3CIjhwHN@fOI}2%&J}K=Ti{2PZYkY|ziVuHPib*PBAJw8^{++rx z%zvjB<_~rI;Y34CgrVH-3UfZV?;Dq>p0rAKj0STIlz(+PDtahb)R01i1Of8wI3V6K zT>b#wS)qvHqOnZUP6%4o##x5VdU-1bC3tKy1$n8)^v&Mu_)w)&tCKP)Rg1vC*Q2q8fSb=Vo z1hrPeqHB^6a_IhAc__@;zu{vP^+{pf4q!il@E?I-2>|cBx}A(uXI*?oy|PxQx17T^ zQ7l{3jj_(6jP8$1`9M^b6qkQC(;={1*XTAW8`<*+p383Exh=A|RmmGRz}S={plS(q z!MDw@}RPEffJFzNLf9in_#`yh@qO)v^s%xO|B*W0%F?1tHr$aY_ba#t% zNI7(O_s}if;SkawC9P5l0xF>hsPnwMAI|v!=Un^4Ue~(sg;9W&B-A+R$sAVWB(O*Z zI_g!KZ2@laQo0T3B%4C(E7Ka#jViU($WjMdc+?t-^Cr|$qk7_8GDKq z=xEeeO6P7z=y;Am;RwbWlYJb!wt74C?4I~Dl^H{=JG$Txb=3G9k=HHroJ~-gRa7X? zXbv73D!03z>iNAg&b^(di@?}pxQDT4j>`mn%=p$adcOs;w~$l4uh{5LK3fm($I*>9 ziF2?md-_m^N9K1a!7}8Wn6RW4sXp;g5BC*#G@h8}`=XuGqPmyntTg%fFyGua_*6gE zBJm?$`;0q)Gja9#r3v%}v|a7})Pn4ixZlZj#N8cq-!Bn`t?O0cI?Wk@7d!0tAWYJ* z9lnu{1}*hOb*07jtoG$ZW0s%xAvqU+VlMwXj#c-gWuj_fwtD6t7zAapfLmkGbJk5RKkr;SU zauE|5pZFhL z={^8{rVI!OBvI=;;3c6_lzqy#*fI={W8;bEmjEEobjp8XU;l*s2Uur0*L!phe{;uz zx+_b+BO+cf(~cCWiNhYXo4oJ(mW_Y{q z44h3DP1k$01>+YM4>l(4S~N-DYBFTZr&ux&YJ^)Q^WDy#ZWb5lVbqAw$i+HLn_&Bc z6L=4UMi8Tf(#u;%MxMO+l>QV1A%F;5_Ss&bW1|U(jZLS$8Iuz!_{@h)Ny}6t==XmO zZU|Sahy4b;5WORE8p-*K^)ZyXvWk}UUt1C;=S<2L3OY|A;S-VEf zrbrZzk{MYgELK^a)a7Q>WT|Ff8m|ii`1epCXku(hL7_N{I5ZS3o)uWTC~wN>8USV& z0td;q0VFRzVW>g$R0N|-@x**oGS<7nKFL#QCZ^WP`LA0{c2eNd$%x1;kjqXHWn7Oy zlzjrlUsg}omM^wl9%n_K#XU{C(VXoS!4259N=_V%~J-k)FVn|kfN zO{8C(4zWOkC*`sN&xVBaO9kl|Q`(Ol;UH89>DLtxvtgY!TVUhg`)irKH_Wg8`+AIg z*a6W~z=0cMY@_iwZ}+0eKp6n1bd?(*Zm!CD6fPeMFek=3utNK&eK!jOed!ZPXoY603AL8S(b~(fKrkj+4 z+p{FAO1Pc-@m%`CNmgk_PwLBLpckBsF!1}!+F6U0p@!=G=HVH9A^$YDFOU7As@O8R z#K;zkG?TceSx+V~Ow1h=4JhfZmS2S+_}-;zZPANaH-^GVpgV)((LMmEaMY&M*m%=+ zN>ty|*hm6FEEPDVn8ooq2<*A@y=FzVSqZ({Gsc87GR!H!IT$QJuz5lJZ|$7^ZO>tE z8-uCC7T5AhU#vkb=z~X*9Y}_Nl+0{$hxyCmTy&pSQl2FpZK4M@hst_nmr%>P?C?hN zgVmP`&ey%WSS`-d{sjZ-0I28ylk{WFY>e4f7I$XE>WmI%YZRO29x$b6na*n(ccaCfGN+O#ol7>G`rMb?N!CN)RUB1LRfP>i@wP zR{D;Xz74=oDA}G(>u*Zy#clUWk-}z|>cH7wzqJKFI9&Yv(T+D^l-8*CoLskm;C~D$ zA&=2uwqji_%vOfG-8WV4yx`r-yc)dG=vnU8`HtB9Y$fmYPW=NEI(3})-v8sm9dgv{_lllQL1+}*DRxU;xiH7 zy7W6b`>!Vo;BdKbA63hP`rOJizDONmCrH3%W0nqIMc|mNH?v~Qs7`!4ZV2^&QTo+7;Rq=!u+d`=o-!%wgVK76ga5R*Y+cS)dm#WQiKHvJ zfCv|ilK*(7^fy5bPpshJ$+E{=)-R)6sBXPbylUO=1tz1k&-83)9d`)b4B7$pbz$Fx zb@-H56YSfF)rJ$5@+LTQj{Y85J;Zy5tU>+%ex<(>t1?;yP1BT$)y8io(|<_lk#>?3 z3UD=CZ#Pxu^a3C}*R?i39H>818vYh1CXK zvFS~R!0YB$MV(8IW4QA|fx3`npVW_m6%!rx!l^`t+w__Fc~C{gXJ`V`5zMb~@bf)f zlLXMyu!HueBwiF22dGq{T3mHtgS8Wy>aXp7Wm|W4T#tfh&NxWJdP!NOYyn{Z ziCWRx38IwwFZfhaC^Dwx^364XzF5qBgv=5%;WOvu6nDcau|YF{%x{(HJC?N$tSX|}pL+TO$Li; zqe=5WxnFght$j24<-Z$Wp@dT{+hpc(w%bW%3rx(m=TC0z>!S*&RJ<4^^!AP(bZ>u^ zdv*qkxHFk@oo;2m(0ez%Y4J{|twux3s$;v4zrekTDzC+k_&*Qa+v#{6KVfGl(zZxm z+kLnx63n!R1=!(6?~ghrc*l$aV6uiZL^ig%-X0>h+Dt*E@ZCl(zk=c2uNi$*46kWh zsHi%w>~N+UeNuIhhx7(b;MF1^*coIp>1pElyHjEQrg3h5OB-5pNQql8)JYkG7Dj}$ z7X?a=gQ|6FR725P`IGs6x`9+X1q)YHu9XMhjfI&(kxqtyD9NcpD1z_<%sL~6&vqY| zX%7`aw*-Jewt)eYx8cvVMlGvo;XFHRQIJ1EHct`NNX_ zf=E~&l*Mc_S_}{1_$?Zo^VYN~c4*Gc(5?9sGKt$6K6uy#VQiLs%s?a6n%n6*gR&BV z_DL;zT5Ff&eu%QV#53_(&r2?vtpyCVbtVKShvk%^ssjcKU&wyWXP7}XG{V&~3YzV2W;ftfQnLdb}c=k5pYhaPO_Cn@&@z6zc z5|GQgovmjtwDFP2P+oRB@RDP;=+DR2%w+``F|^M4@`Li zme1gQf&o_q`3Ts5~0*MG%*WeWn~6=xpO(CR0P^hfP$T&#%&L^QGvz^wQRAVkqm+^Ayz#R z_D|k1fzSB;9oW}V+;d=K3zHXCxa^xtvAIy07rrr@B%DF*FMOwC;k^Rs7}sx{1SdkC zM@ukHOtcEQuSbjxLk55-LsAKf2Mva~kl;8W81hUL^CWTdOmWzdpodmt1un!I08u7^ zDC;FD=|P%q!SW;_v_>H~2oNheN)}A3=tA3>z~@p2>e~}dB;zr6B^t*~i6J3$&IB-C zAbBvrxy|S$Ryva^eCKhY_-x^tQPv$hO*MA*97QZH?TYj8l{3G0;L$BebuZA=7Q#Y8 zcOzt0Xh-GuJ6WE>J)BDd<&xfC;eVXToh-p*#X%4^#rVsG=)@MplL6vFWw7*S5cX%_ zxq)C09lkww`~uX;V`z~O1O1Gct`O9c?f<13Z45*c4Y5FF@ib&v03ZSy5G8a{lPN?Q z0c5%Wkyk`Xyd>po%k~#1{fhu9@Z>1a0u}B6N*Xz;Jiv#G8k__~1kdHj0CDeS;3Z~o zB8aWpDJ{N|vQz+MX0r1lNj-lXsCj2+b`T*(b3JDAj4mlW3n{#L^8I+oY!vb>NU46+ zrSKpHn0sHTjZ4oyv(Z<>Ar8iI!Xj`iuOZ1&3> zEN&<)G|S@bhgu?w*pZ+|-bHo&QG7I@H;Vpwqkgh8GRv=pdt5S$C^|3J(Gg+F9N!siU3ws8{ zpbzp$$jS2=-72Tq_-_tN^|%B@gQzhst}FaN-}s@0q67@F@iOzaB zF19$%ZHaloIQ9q}thzTu16d_H@c-_yggI1Zpz2Q`)MTl!_$Aa(s9H;}N)=W8$hNF@ zD@tcJCJzVzkw6rMAd0p%hUPWKMKva~HPQ%(f)GIex6`{mcMc>QH;B_STiaty-inMM zt&0j$Lx0BMvIht5&1AEZfHY80gM^|tS=6)+)I#>o9tH%hdUEqs-m9Z-cfp)R`{`+T z?4LJmy1|lZ$Im<_Dl(^}GbKQRd!Wa7h7*^N3DSokL=Z0l<>`$gOhCaTVZnRAIxY|i z0N5Ga)FYkDimukNh3I5JbkGl*ZiNPtu}^+gDVsy{HL6t6Q0?uaL0%v^5+a2HKiP|v zZNq{$i&|v%lD3n;jaj_X2mn616HxU=gqzr}CJ6Bbre{@K*i)BNdjL+`+mA5r zGrq6kGYw3DMspNI%N81r2W7vPc|f}5_65I_;fd+1c6bAzDv z{(N!VQ&M0!1{Qt+Lc8bk?19SZ8oBVH;qJ|P4|IeONJz^A>+PhdHAvD|0HooKV}OCH1~))xc87i z*nYbZ#i2X{uI*;MF$yajwf@eT$me3O8{E1ykXf2S&2r&cJYTbvk!z2ovfV>LY(&c%ZXc@ElA$Juz858v z%p`PE!BiZIbb|ml6R}tK%@}z<%S`NCYy#Tc8?2riU z^zah+QqeM9wI(ZQr!7ZyZbq?_fN+EWTDw_1ZdvSK3*|nnS_&0eUVzNeP&DsYCReW0 znKowz>laN|!X@B+1u)Lo^`R6>sOMUb`gjr!plbur0X{M90e^f0UJL^tTIzQ#pZ=77 zy8So)AK{*sUbQ)TE|~?Bye#?w6o^A8RM-<20D1MNQqE3AgJMvDm#kjBTab#h3zn{DMSegv0j2MdCr$hHJj-{3;QAZ9y98p5OrI~ zI^!6d5J=-+gNDE?+kT-%3^@v5dPkwBJVF^r)zeYpb0* zl@P}KkG^FahfQt;@y)#2$lMFV&~)fjlJr67HUF#rSDT)-VWWq{N_sa!t-qybX4BYc z4y+}?roA0l5KkW;SP0l32yVFr(`oldJMkHHz(SDpyv&@ zV97_!2ZeZ`r+qlTC1ukilGV*z36JT0z2|#4-72;9N&=!}t*?AB@szBQP*v1>&>9Sw zX7_FL&0wH$LcqgSf04y0?$Tz>NgbSHFKI-u}DeI+D1x4`%HXQfB$CEEx2X ziyhC)_G|u%Imc-8oa_q;8@8?8NCZ0m(myNWvg=w@nx`@KMkVav5h?5Y`&bxoRZz`S9 zsQphUzl(uN)=v{HbrTEK^;@7XwBdV+b<8WWyX|eHDVLu~;Sz@bd591+=CuDI#>K(I ziHVAhkB?4>izP@-kB38{VYy_&xe;E^OMIXEm-@Ot_bn@_dqD(e^5^v>J(FvYi%Ssp-+zC<(Q|t*GRo4)PBb`7>C#K15xz;>FbW>=sx{1h z266(Agf*|lb-i*+osv&A0wVm3R>(RbkTgna6&a;6>b%0gce13bJ`e++lWK6*FH(d< zQD0A7^@`=Q@dV7T8G*MHo)zL!F&T8U5nM$-&f|`3e3f&X83iGr=(c(K2Fs?Fbbj{9EAU&y#U%L_j#--T9XNM#7QXDhPYAc-t zEIA9E$#F-c#VZoyqFqHx;>?M`)dr?8hUqbd46e3HU4BN;nmY<+%ojrLI@J)Hky zGJDNvW5b%NCEVuMO1;;EaGg005UEtARx)^)`V$TZ8Svq+LjDt;zhH z6GF6=;5^9eM7YrA@Q~X}~|yGF;CK{LTPBB*!c$F!#^%>vu>j?3*7RVGdxDt|~0cslD`wG9LV9 zWFKeL&_qs*!Nz+DIpbKlE4Fc%N^rHwnC^MA#ZuLBv;91K!Dq*NO5pddZ@yLF2OnXS z7qgMz-tSK%_unv}Xz+K5xE}V`eF8A{rQpM4t;dOGdXy-ZNGSm_d(khn(UqbC;Y*4d z3p8L1fXWbkf7G;l_V`51Ce3D^TLywHB24*K8h*W?>qe;-`yclZE+X^RiKs+ec7 z+U>>RfA`prB^L}n$m{i3)semPMQH=(&%QiO*mW}=K0i3}?7wRnj9@n=UCA~(`;th} z|9xlB8sI~Vdc;f{lAfR(15g9lQak9QKv)t4Qpxl?r-K4Y;JIS%5c3dQV0?bVg=WdR^S8(C*t^-yw`9UDV}Qg%TA zsSD5PBU*d3P}pcPq4^>pgMNa%&^0-q8z2D8n6L=k=aH@92#-OR*h}AX{;N(7`+dhs zH-}5{yIucPEQy0QAeYAa`CH!W{n!eUobnn9G%7lyq`d98P6T_&oprLV72M9F0OU~S z!h0{g*a=$6eF4QrBMAkB#;F%CK!Ra*+$x3Re8QTn+I~yK@sN1i8ecQo{xrIb+hh$# zUS(R=m^ej$0Q@6FKs0mWSqFBLW%%yvlS97zflb^*+t*~GCVMRQ)GRe=A1GIz{V$lby?*HwB2v05_s?q zX7WTL(f1hEC->@lSwBUI@l@*GIp2EaK)$gn*wh1JI!1FFo-=W+17Ha~9goHvT~`F{ z@!)pET&X#3EYgNp3d#s40|c3>^)lJJ!tckWyF;9z2gj;qVLoZ6nTPgu+X=tq4BE3> zYE6%>pU_-9vN61j6+sNU7ms z_ahI$_+`OQ3tZB6g+)IkfaGHMUMQ2AJ_PakaScWxrIX||Ch6&@WIc%1xDKn3^v_mv z^&WLrkn{OP*@Wbidy*SuE(#cS=Uu1$?^57LsU}e9{qzqiXz4EbEN~XKrA~oR$x?m~ zuc-hnwV=vvKUAB#B}7syq5;y5=EO3jmc~7H<5Ml_R=IN%b#eMb-D@=vYt}bafO`2) z0^Uw9oenU)F~tj(?oru;_@9xw!Ti_mfzE&VZd4cd`cd690HUp!o2LigUGmW3N^ z>&%5+C?bEt@FKf9yGEJzx3urW5?M;)bLHECw1lN{$M9jRsT==6Pi6m%e4WaAc4vX> zJ7K!1LGNyV(heCZx0+EYiij$$-IcOtLrF$6(twRE#-WBU>}U=D_^r5e-IL1mg)Z@C zsmg_wWS%e5ChRM;`&>2?=~nk&8(C#1&FyNZci2>ulIg5s6z_T!7C!h-a^U3U;jRMyjo|K7a0BfvwyYh^r6y> zA#^c18#GBAI-m-2Bf3w{E|>dyLqh*G`pfs_hM_X1<9|DW9f!wa%qOzKW$l{%A?r`f zAFS>}?I>!|qX3`d))>+gEEtJzm1bd--(mW*%yl=~U-Yc6s6um2!nW^mm?PQtsuiv8 zz~avD`S9&!k!9hV;RNe{TBTEc;xD(V!x$vUgC_(2Y`m1;$H%>O{dmJgx8hqJ?_TRd zJ>4B*dx19+?d7$hSBLhy4-79Kd-)-b;zztG4zh6Xb?25<6$ zyIdXyxe#U>G=W{7Z`9E3~)R7xoY?o_shy-3Q47~~J2 z0)N^%__Z8Q z5GuIz2joDrxLL!D*_*6fqtyT6qa`W*Q`fWp#LIiChovF1MJ}KGrJy$GF%OA;LaULj z<><3x#QM$7eW(7##{`~Fem<7VSr|iHmKF8Nx5$4iY3ydtsLj$7moi?s<}Djb0Zt4! zU75+dUJd1CuI3xK_G=Sw!GQi;ykZo|?Br@+?RjqUqomSa@eu5*6ujarc(dmr(C~=t zB-J4o-zdj^3~35Dwm%Gx?ru_3nCh9)Zp4N8b%6r zMa^IHBe%lpXbBo$`nJOhdf)|B{p$H&y|vp54sVN-3X4bG3h#o7yQHLYQ1Rt&VbxM8 z0k_$U@1NraIaI0XQO3EGcqgiv`Cs_rnqBJa#6C-2w%m+07c@l#jd7*Mm)@$Ef1z}L zs$m=CmjCfFLQ#r>7>}8i$h}rKbk4ocDqOK zsYOVr4HTjW4a-wuaW}3{PJUTy>ql|pRJ`LZwu`JZ0Q%sblDEMtZl$X5sHt=>$!}c3 zmJO1iEi?jd3U#(Muw47BxTmgx|JD>Ur8GZjCshaT%CKFhg!KtSx?lq zz`!Tt*d|5nrP3Eq_X)s5Xqk3j&wo@;i~?rjHDu5M$%Jy=n1!A9I{Y!qFK~*xR*OP! zd*iug`}ap>#+QqzQrPrnWXILP3*sW906r{W<-%Ikp!5dK`UQVAn2YLCfO)~Q2PPF* zH~w_G@sU!^qdLFDzgY200==p>)ln z32OVQ%%7Ct!fg@)Qs`7nwiu0BI%TRub^0@Gqbnea=kG+yL{cro*wcP*g~&!5pT zXk10OFTu<3Z%Ns)Jpp^Xuh$(z6SrG#d7AuI{55{Rysq@Q+=ijwhK@)Jw({cQ^tSvJ zrZCIofekijQ3Nvinxkh_wHpe{x4rs$1uZIGC!GplLfYp!1XKZ{VEY`e)07+ghl zZQaKus8NO?!2Wg}M9R2Pr>`0~%=VKqr5Zx}mBSfk^dsJ@(~)tpaCrJ2nMe${eLHxi zKG*K*X6g~s%PrHT7MeYn)M}uWPtx1iMyDqG@)eaubrOe4JQ?^g3ZbbDgbT_lfe*q;^XBrv$fE!(5JbfAW4! z^}4}p=KNo?s5M5iqA~zQse@tsGv-4Lrow^!-m|TnYfQ{-C(KIk#6{a*ueA*eh3VE}oL2Yi%$ zHXuJH6QB<4#p9*8`Gs!zRpCIIFHiM+FZ2n>wfB#3pOoa#Lq5UtXQVkKcvGq|LaV(r zuj-{%Al?$pG#;TGV#r?C<_}_KdR+Z16hqly!V@Q0&|sB)UFBoiH!3uE$~H>QP_xH5 z@q4Q+ve;GOQ~;^ngdeODMuG(|#H;AJXwm)ZLJpv1L$kui3LfI~camj2JO&4!3qgii zl`|dc%UQMkEd7`YyT6lM{Z%-UEnPg-EgCII+;I&Sl^v>rCNuT1yNUquX}!~8mHW2| zyA1-{4c?m7@Ir(?E%8Tgd`$_m=eCO8ZOu!Aae0<;Z+{EVG+wF59nk zx|Hz1v4Hwh&fXj?2tS2sgATh>wvbPs3B;dBhFONdpHs~h*{ps1x7MXlRaJZ9{CpAe zgl$wEa$ zS=qT{1o^r6M5F~DO9+c_NXt<&vnUe+p5X%?lpY?805vW~10Gsub^>KSPW8w9YN8@= zdR0;ub(pLwg}f>On<+7u0gJ2#wU7s=^h;bNO*#d2pyo4xkvT#^om)c>@UUcLW949H zZDnI;ZSUyhTKeJ7TOY#Rm_ucV17vIdNP%vG2Q!5BQrddMU4Zsw{Y` zEc>WV`516Mi4xV!kTI$!wWw9GdadEuZ|K^^7rZ6rzr!CoBObW_C~%J{{GGP@jK2Gn zmfO0a$Hr5iHGQW&sewVg?m>oxb=tfQ*4Pd9f*tw1NxIq{sgVhuwl((rLx$cXx|V&m zt|N|?FRH`yYL&Z;v(vDRMY7cen#EP%&IZ})3c8fw2sVwfR&lp0#>CWnz=+Ao{pOg(OtDWuW ze2Y6hJc9?L2I6gO;sWBDQ=+q$aPd24IubvpoGfL(`!TiuxqS2L+xPpkySffQHbZq% zeA;rq@86F#oxfAw55>aIGzgGw6_0h7MHx+zY5V-ie}&4<9%`nt!FSug`0Cr7Mgo@c zq6XEknKEpq+^LGdE&e*?{>b=t#QU?k z^J;XejFn{A%&56_DxwrD^zzhDS^vXF`#Mn$4&MwiyJ`)>>#rqzI@Z-e`uq#ERQn&k zOy~zaRvVN)Ncr}fef<-Sik1ADh0RfQJ@v<*F0BC?x`wd(WU=Q3!)|Z%vt(yqi2JU5 z7Hi21&?D{C1e9ip|0aFOuC%CWJ`jgMqVUCTFXNe~R1N?}?GQF5dmkxZ3V~=b2OHsP z$H~1|Uk=x~=vlGg{dkN%4l6e*wP22${GO^*J*K1+BW=o2Y0hco2Gy2K;TA$O12@~M z#6L=o8OBK#6~Hqc%&=E;=DBdUBU9hRI(tb|~Ax7mJHCr-dE3m2;|c62&Lj}cX!9VXxJ;_yn~i;05OKQpR$lgi*3Co5qo>hb_e zk)!+qz1V!Dp*$UJbjo54?&DF*%?5{Niqi%}1x*yfb-u0RwCHOvw9KJU_-lO?Y+=0+CB1&f6xa9^mw8&ZhH@dGWLJ4m?@DZ=E4J9^bn2?3%uHF26YY*1Jb%;n_Wh zW6|7Cgr4K?e;Zib(oHUe_J9CSq$#2p{%L5}x1J3Cc=k8scE=`RjLe-kRM7OOpp~(| z%{d&}{BhhEOC{U>lGB`jySYr#7Z~w3vJ)BOErpxImLau!S-ZJu@uOsmGV4ceP9?Vw z`;qYOMGOa3_2;Cw2+K~Y&P7eEE(uxlbaq&8XUnSt zX2l5EmyqxAWr^;NGPTMu(?B)1D>mvAJiykLp>NK5@t%Y|uhi=NFmBU1PV8cGwgv6(zD=a?Zr!g`L z(1C{JALf5|U6zt^s?x0+O;0d2?rWz38GLjgX)K5%8|0byo}O8{-K3U}k9_Lp%Ch|D z2uCq3wT*)OJZ244DFWq3pd{xjh%(ipZn$Sd3;HqX^EbFnIu1r5G6gW&$kD-4P6OV7 zf=@US8EVjU<-!5@pGu#GAI;}BW<$^q-^B+F*1VEFz^m{EvwPv)nh##JkN@HIjel8Q zPMZlW`DJc0fpfnf>1U2Bx$B=<*vDb`7fw#lYFaYv#Of5!&rY5VfvX!o=DU zTR5HfWAdIXnXT;A^%!ydzp~CW8L}9$+LwS9DRSKpsxbR(nV2MmWXccoDW?ExJ&N|{!U{{7E+pl z#geB*jd03&4s-|`{fT~etMv-w0@|c6n$BAaT3O|Of?UaTJ6s!zGe<095d=T z4PZMKnlOhoa&;9cHM??nn9+M1x4-UgT45-(XyP%Bc1>-Mz2&tva^JWyJn&7qJr!f} zP#QWg>L@2{e(*HuQ0I!*NdMw>Y$`!Z~(P^I}I zf=&N;8dJR9mA2lJ9bj2EoskHr@-atcC_*v>#{FgW6EC>E}MEaZ{tDEtK~irBIr zYEm$2HV^N!@=Iv@@*^@Y^7#fUK2ll2z775dT^Ei%7PW6?KBquQ2a zwrdCZeT!lKco}VXzR!AXIwje25t}G`$nd9NLaeO)kaYt@ZF)Cry4aDoa~4IJZaNBC zZ%YQJpcof0pjYbG`0FWAV)=Ve4%8_A_FoWH8+wr+8Ckj$b}Vyv_b$xZuk`rbMdrA0 zG0xhrTpw|){9|h&p!OQgCUBzExwV*N+*Jl^anU|3T=xF%S59f=s*w+X7EgASYYd;r z)!i?9E&5gQ37kl{+`o^l6>VVo=O$5Q{=UH3zbro7!x(Ep_pb8h*Xzvi6WP^))kmn& zDz#D%m*o5H!ZiOnH61rOt&sOCwbu>#-`p(zE8I$WE!M&&_uaGAY%$wdtk`BLN_2Yv zC?9vQc!2(yNTDLetgcb-EbeBv-E` z3G?0oE$keGX)>k`AUtH1ICJJIxe{9r@cjb#;oQo3Rn+wUixv6hoJ_=3ro&%%cQUJY zPpz*P%1YY%2wN>R1WhV_TMqIZC(MYYT_)2r`g-WEPG)};t0VvCgNps}UZVJCbFu6x zgM#$d(=y}A!O|xB-~E%6m+h_6XrP}fnBnI2@8LJtNJ7+x4E-J^P8@fH(4$}+j3GK` zghPBqm_y!IyMq&7`MVDoY6b^XvAb?Ai7xJyd-rfIt)8z*ZD|u}T`ZH{8%B*lFPk-T z$;cN^qkrLiRWqKO!OP03zWK@i+|ntVTy9GVJ!F&aKb^S(Gh@$pey*lzRB86;V}KZs z^go?`iK|@gSJz$t(p>11cB{i~WZoDhD6w+IOZ5Hs?}tk?;}_yrGSg2klBUkpMNXHm z9iGT0q0O9)U;0(zPGw4V9avV56CF-5OaKX~DCy^yl{L8N7h)-{_LSOKBRVdEd+P}H zB=8Tpn12XG`MlNS+&3fJWa8~ZwcAHkcH-keUD!s!~~)NuQ1lC`wkz;^5C4aEpI^slvw={e*>u zxk9xm2oED75+)f^;FGX1$}yY4aVNqU=b%*tWXv|?jZsew?Tn{2WMS?jHJpz9K80hE z5NnM4Dj1z)s}8z%A!|}*NN!`wMT(0cQ4!wMOr5xm2hs-D!sz7@C_?xnN7LXMw<1#UO&@PHi57NwTKB(|xG+17`Ay~qJL0Knt{4mrErf@9EVWc! zF>{Hx5rv<3mC_WAFl{Gf?!^hjB)!^5GUtKqNW#iRXS=Z!jFL!Itn+u5YQp*+&(hExzUgKA-Ve1f*dBWdG%u z%FZqs?T8<&uf^|}ZgZ)vyC(Cbizg$IrmjDAM9&;|31BV+>)GetDzH+GnrMf#>Nr3~5ik^t!dFl~t&6Ew#x2<(?^xm` zRzNdzrwjWqDZ9o|Dbfp85M8@!-7S-HbHg81GE45Gb@~`jl*!N%jB6DktsQu|`=s%% zag8QP-=f2_uv_SMGGcWgx`bQvk1a+i1N&Zag=I=Y?DOy$xV$_lT5Q z-JA`*u|&s8CbaRAx#g`ERO;XWPH>#<}PK5WcX2Gre zO+BytFReF@hKrkAFL>e1*)$14$^$EgTMFtzx1sH@7!uQZUQ;9D>8RfLYO0fv*n0wn zTg%FgXcyClMX|Va>8O7i4HH1}C$|)N_w|cT31T#jIqr>0ruB1?lp+ZlZ1oMS1<~nA zJam!~4MkD)bj-IGA?Gah>bz=Ca+QclkkAQ`f?EBaa5SAM!^~Q8W6a|=Hc}eXq(RNF zd0`%GMt#H&4EwVw64kYrZ-4VJ;V}-=RmRt}sGX{)jcN*qn2K^S;uR1`IYbPMQVc63 zF=(RsfDv?>tprQqPq`zT@}IolM$v_kpnXH^yQJClx$4b@i40(^W)F0$6XZ5v4KRZN4Iz91}?d>aXDmn%D zlrZ}2a|s>7d@8VU>E~;Bcpy{SKUyOchO*W97kxWNMP%-km+eNC~}+Y zeZklN6Wz_9)APlF-sUGhly&GyQ*TwVs)jwI_1ut;jD+_lqq?EWiycx-Hq{=w3Lhai z1xB9!k(KQld8br9W;#3?3g1=|e_JQMoYVhlr?SjGv7xyC+F~feK&5qTSTQh5HBPX`FK|9S*#gDA%QzDLuna5yd*B}&@VwSuvXA4K8K;u=B1&; z&*utcu1Uv`Q*g||cL1VX6%#2)alxU!WntiVx>0vLs@lCr*E^j#S`z-rDftDgm0E8$ zE#A14D3<-zKIoCJ+`0D$&0Vn%*ud4EoHbDK_hRlp&UeCjGC#akC&%08pil5AWa zCA~pjIFHq^SVh|#g_i?Y`j1{_9+BnF+HdH&W$zyd1P^03BK~cl7&qruHln`q#|#U` z4hx=w_(Oa)$+rXr3OC<^3bMn%+kT|~{aw+rEdTWvZF%4Ps%q;YdTlWnF_qq)SfaYO zd}lhbU0zBZ$5z`)xWi1Q^;Yt214`WNuS`GSsXJ-gzJF`fY~Lh2^QQ5g zFzI{Qqm7*tcBWb5wJFz;iB6y69Cq>Y;4cc_-`eZK2hSxILP)(F%k`=;$`SF))3c3i z!r~z1*w@`b#iQQzstRRY(rnRakN*XADvH(NtllsFQ9bAGY^MA@o~Qoe{M*Uh0lkuO zzj2)-_Z-YuzS)v)%|{N&ye`8ZzRkS-%o^-A7<{5&`sNR83X}53TGHmDE)4%%?}MD? zah&AStTcnJ@2=xViYq5$cpM`!!4{6Qoqoxm$-LvMC>wM=f;_`gB;<4s#~6RMWc|)3 z^6KsmkFTERvuqwl%<-z*>Jpk1-P*MQc7R>+8wN%zgerNsF&oldcT_W3+`R@d;Ia5QXhAzbVp6zO?I0)Uj^d1-SzRLESxFhR?@pI+$PBg4$_ z?1~A~oAoNhBG8zw&U?)DSYQ71bjTkGkN+2}4e zC_n9Y2=n@F?R75eSoulkUbEKb}GBd=rDl5P$8U zj|n2%yNA^xJrB*1apod#?z1%Pw_mz|9PuAtnU@~;82{)~BiIE;fq)6~$LQWb7cEkwrqoYwEOG*?6Z==eIi@?n?36tZe zmlz||^JAmNO$H8nI*8yis89zyhZ^l!^r+IMM428<>NM(5s8XX+t%^0PR-rtvZvCp% zE7-7G#g0AObgWsW3YaEcVAGzBorM}6Sa6_WuaxFeox>~0m$kldO%B}1|9#)7lI?0V4a|Q;kwBl{G zMGG#>4%4h_gR}i2jV@DWQO$ro5+yr0ve$+$51Sk>FQMhYO<3_8L~i5ZjwDjkB1nsXH&;CYG;$>)&lL$|fBoB!y!Vx3@mf?}I})+y(iIy#x(0+2|i=8*sBLWly2 z`lA4hPwqLAoo%jilMOW7 z>#MEuS|FcZ@qJtlvtP^LW&=LL=vc=i5=PtkF~uX zc!;ySHAtqeja16XeFY!e%9h+Ru)s|bko#;b5SJ*Yrug1yF9X_O%JG|W>X@UOG_%ZZ zegVUL>COH&PP_8H)M$)mMRt~Yw3sNrJ807N7Ng4r&p}EdMs)gGtcz9O6acw*HIovr z+5X3EyD^ptEUrbHdN#w~=o@S!WSW?whBWUeY}RULSoWPr(`_w^D3KT^Vek#IZq@{i zy)oVTX)^uMpt7dPtN@_gjdGFvV5 zrNHutE1fhEJRgO{>=jKkib|X5vY#yQ;WWg9?x@_b6T)=>pq7Hr?O3}Wp{jM}o%i3e zSBtf&xYk-byuG?Du-e@#u1TZXdtUyI#;TVJUW^N)8bm0S*$d-~C`+dwY3yo>iw}RG z7XG~vVGK|nqn)<)BrG$PkA9<*7u%G^7od?2gGVFaNEUXY&ovD__X}aq05UjBy@yXN z`Ou-@N1p|vVnHzajEB7UL5y4g0GE?qJruzJ%$+AUJlh-i211kxQ7}c&KP4C9_vmZV-cO}K*JjHI8TMH)5qZ5f{|c*%zGRFyv`7UHtym@ zb|wak%{<~|e~gEsLfOf_@a8wpdBq`E;|o$kW|pr(4)xG+FKu;(G}N(S{mkeL{)9lw z8KJq0F%O`CECJvGxpBuN^YqC{IxHB;p-%7;s1H(AuZq>U;*h-Q5tw{L7BT@6IRBAE zfpp}Y7&%Z5xw(>bmJ^;Gp`te#l1v2v057zuR05U<3NV?663SA=4wE%cibRB*CIOWl z<&hWS1%^q6^PDc+<;u%6>>Y!|Om=qp3X)ihHJIpyv3}G^SFS1*ghL@px5XdY6m4SB z9AqJ1v&v;~CxDSGDJ3F;ph=!$kRKJPZ9qYsb5L?Kf=TAHpp}3HG+?Szm8w;#D%A#D zwE+p3YC9mg%A#f`k+Dh*pnL(M%B59|g1}sq9E3fy%0!-`JC%B7!Om6w&FZae!<)*& zX_3@j&xi{N9gjpfLdP}kTF3){vZnfg2aq7Ll%?!sD_hygYPC}NL8D-|=MRQD?Kt3B zs{+zkDP=9ssPw{{-FW4lx{}0wl4G6OE_lM92}F(_9PJS)VLjijiGchGpoG?k+r1t4 zeF}ZnB^WT(EzDsKV(5byriAUp19y7twB)$P|yP3 zsl<1_^o{RY>Wkm}>UY0dxvx)(qJR;QKnrzf0~`!&U^W;S4hKeX8y5WFHq3zpZ83^} z`TJi4fX9xDi0TDS>xhdGmrbXb=>tQ1ULi>{gQ^lL>!T2AM5dpO>et!nm*R7XF?9Td4z?OAwt6mecYP_Il2} zy4jhKiRO!U(0R&Np~b~r`|EZpY(}R@)-I{ZFy&@TkGvI4brrR8R$s#*=e!*=02TXjzLjm+iw9S# z2TIS4c8E466?BBN0S`o{w9yOm=+&LCxVPiv`6*pW6gM)x-`%kCqOZnU_tG`c zQ!+u5O(G)ypv@a!x3HtiwIgS=)yH-hDI>h@{#mZ_8yY^QZVVKJZAZJ%?vhp+K)oG~ z2096Zu4QZ| zoDFu6!?wE~IQ;bbYE0%B*EBwg)KV+!i9QiEyEo?v+RFIe3l7d(ZNlfY@9+~eSkKK{ zLngv@v$i7kCJd1#2BWuSZ(w@UmVIl`0A+Fj2~d5hV}NAWI8$OJod&Clb zBA9i`1q&e8MA(xz!Sz=x_cveHbfA?oA~8*R!+yrrM9d%#9dc+`BQcQ>bkbIBrl)$7u;R}JU46NUglh0qrM2|{=*!+M`!WQf*(g!gq-SARIP9U}*8gXeMU zHfI0=O&D=IPS{$PGIla|YdHgi2Pk^i)_|mEWe`{h6etLwCwxk?dq#pyesBn!^>FUR zcsF=hFt}ss6KM4JSIbvGa1u zs})E6_cdI@L;9dBc0nKbh6^fIg1ZJLeno<^A`KFFc8mybOTvX(LlIPDiL!MyhP7{2 z7mUORbHh_`l2&&`$Z!#u4q3!!_fuR919Se+L-p_n$P_V#&?3vIf*h0@K0*lHHjEKs zDHBJG6H$IEmwRo4MA{R7!@~YC*29Co_ci$(>Looqd0TyBb6-Duy{B>bZfnilKo3)9XSTUQa=>VA%6iM-3 zzv&Y|VHOIonibX+QgNG0(E!&cccjOCSf*{s$reb#nnuB!|Me9N&?yg9fsrDViiw#2 zpb#H1KaVtqizH;A^&aGMt_CG}5@-K6T#v|pXT}K%fH}!T zQ3mQfV~7!}HIi5dYyP8|mDZVA=6$8W01A)*32-GK7A>hzGEbHvniyozV-G&`2UM6P zkus5=SR~gVTJhK_7t|x=gqW!&gWr>OF(C`MXftOgk{JV@DdA4ck}b@#3dG}1zpy-6 z@)CJvkf0Z#{(4AlbjOEPH)M){bZppf0O1T9HX@kmS;}^JO~xhZL}uf;A-hba-ka&OxYw!U55Ie-c z2*u!}7lMqRux3z44EwY!#l%#CWC@ZG0G3o3)E!&|RH3Q}7_$IDv>llv6F|08K@uyB zp@g1lIL3qu2&t1>mWP~qdJS+|1Uebc!mDp|QGwGNmZuJ$F{*y|Lx(`0e$y~5>3j(x z4Nf}#sDt`edloa4IuSvXg$^-5M59M1NvEz7FQQU?%#xxAAZBAoFh96VqzXJVqOi>< zBd^*B&?W|xW(RbKjYDU2$y92l;6{;Rj@}?GQ#W#>=?{1TujPVf$B?9xATf-#jUjbZ zWrlWvq$lAwYk<@r!T<{?Br{GZ9WxR*vLPRZq%V0wAxc$)LaPZ$`c>0#QAV4!x%!Y6 z15_Rr4*@^`78wC`WRYcinifg6X3Mq~X|6|N2#PW|fL9wd_Zg5<41mE|2XLrX_N~=c zX%INBlYmB&AT1;{d1nbHsLGUr&?(~K2Y|v4<0VBVArj~Gg;04uNEJ>N0upwCwaxyg zujeBnHOnGza}v{65feZG6yUnAD*>}hyAnVFw0pa@O92%y0TBQ>LU~;C+D#=9rP-%& zY|wBa$1EN8W|!-GD3Mo?8zSWLuolNsBpHA5Hm5f#kolr(JxFm8v|K=fDj4F1sY7PB z@^hdG2?0O>A0Pqn`vD*jzw%qZ^LxLu`??lsJcRJDwiR}S$qLfKt%%B#-nUENrXbKU1iEiTAJPWfv=L-|Yh>!6DhKFf# z_9}Vbkd8nHd+^}C^7{cftiwB;!}qJh`wOvqf)@??f*p&Q?-*@7iDhfBZT@6(TDc)r z2_OOX4-o+E1%#C&|&ykega|2sfu|>oIjDt^`fmkSpotDZG8CQBVq*?S&1V8~DaK{_~0(Wf3 zb^HMo5CQ#*CDSmHsB#I;1`Ne(ya~ss!k{R0Fi_srA#d$^GUHHRR0 zwG~N;a-YWBWu#|xceziP!AmlsmcOdZQOgp zr9~c`CX1+KDmM#S$&MIZWEAU{Ahmr014RG zdk6u#S4Ibr0+me#M?isiAz}b@fvj_;kuZ+>u(G7xpTn5gEb|g5tlB?&&bad`Y7EzS zhI2(iDtP)eyn|6CvLKMqRR<6N_iF(6T+cdu#}c5d6WDbZUNaS6~HG?T0e74yzq=6=|Z;qO~=vNXYv=!ISt=doX1v72d8VaACR0T2QpAnCn5>6LEjl^y~V5CTit z6RY{>Jz<>Jf-iw+ZD$_~yCqO%e9?qPb$*&Q6BGj+bn7G0xDerxjixR=6P6o5nM)nRB6o zK;;I|0k@pPRet4G4%iY<0a5cnnBxucE&lA&2SCteiiCV+LOaT9)$|p4MpB#G*qmqYOLPTu7nh}o8Szmu^KZZs^#2ly58>$g{*hgvFr+tcQ2Tbf-6Q}}IkOfvy(f@=@v`zJM zyKMMv47s`w-FXx0x-2J?B*fKpftqxPz=G*LB&g)~a}wV%#($|YwHrxd5WGP8)ByXW zRau2RT2)n&A6}2IRnHv(b7y5En{aO6 z(2O+#Okm;BoJDvP&wHOLFYUi_58ic8+P>S`bXY2M#dRd+k_*)(W&D*f>W?@gTI#Hh z%jyYuQRG%mM*IeEgV8x31l~K70T%f`P!)MF$eB9O|=bBmh?l?jtcL&cw$N+1RPm zAVC5VOsrf%A_C;0keLoJE8K`@E(U)#*?76>DBz2as2cs1G$^E$wwW4h`U-c!*sm1j zRF(`VRI0#BCpZ3_bCIG+3JP67+*J!4$Pn#3#Pfzb8#xUG@c6M~hYlS(aFkzP9*6t) z>3t08Yv`ji(1dy4gtXvlQH68B!A5u3MP$c;6g8lL2uN6w1rvfW002Ovl|+^P+Dc zEmk_CYyPezdZ~~;mIzo#_aVSfS70&u(0~r%aUf;lRe4@|v}$SV4)XOCQzHR{INb$9 zMS5c|w*YwEs&K0MMjaxEki->OBq0JV3kZiHQz?EXDJlm@IOvBnHKIrYhdAIVj=}s? zTc3|E_mr6}x@c3G@k)xVVHb|1i@KH;r|4~#(spekB7U|=0t+46q_Px2FaQtc>5v1h z?(Oiyd+=4P!w*7W08J?u5Om0dj}|hlzmN!b-vW$XhX<<+Yq!P;DpWxQ6CP#tkBRwa z*sr?`c*4nt7mTJ4DGt2$^L{8hMPfmba@y}o?b;i4akt?1uDmMQ#0aE)7UR!rs@sR=XOWRxi^@dOq}barS+ zCjC_*rC8M~E&!Tras$zZ3bpjV_TJl!rbumC484UpWBTW?HNEw~%aPu6e}WwlKq(2B zooqyCyZO-C5WlV7l@!~`abF|_ZrlW{{C%7y{4{T@;k&=FhZ0!aJc20ykPMvCqX@T@ zQhpm6Q|2Ik$Tu^dGxs{z#|<;1z)SPn=+on~zM` zRXvG(rvU>1g77K^Hwsp)Jap5500 zVAGNoNW;g#tUG!L!xZk6f)VIU6^0lb_i6;b8Obgc2lzw))aRK-kST1iYZ{<-6e`!@ zB0rP5n){T4DJkaWY31V?5JQ5P!lf-T$-)D8#4|j(P4JC4@IetWfPo+gAss+?haTUN zM?Ln@2m(0Qehwg`QB2Qp4uKLMxDW*@Ai***u?%8X7q+PAFA_?u!6zm`lF^9bh+gy; zD47;YF2*Zr1ayV`EN8{yj1qPy5>29FXhuZ-Zc6HD8yqKyt2t(X2tJV8dM1Vg^hj(y z#>5g31~4knnQ9gNG2@e}hX?PlN;`QVgA=S!h3z4LT&2ha-n>YVRXYAtT%Wjr(EPxR z=wPLNkdslGv_&v&Ij3Ms;~Uk06D)i}&V2LKXJ}MWNXU%{89MQvyT+)KdGstns?+(#BMxPcaoo_yQWjTAFRq{s03^Q|1VfRkf5}d?i+`8VPgu zix8pYs*5TiR!Ec;tD_qTT4AxKohmC?awNEvSk2ncgx$}`nI;NJq2sobe#q^&>@o14jbYMg!23V zJtqBY#@vI~mg-=-7aLvgv7E+*E z@{YE&zs>J!)45InL?=y$RqCh)JYWG67>Gv$NP+znJ_0wmnFo%rM)L`ni3SV8qnfC} z4E7odf5xUAeH0KMF;S(Jn4pBju!#euuMMk0F&~ccghwn-$@Rk##6_eX)T9?(hJIGECtKPEbQ<$km@T z6_UfC0kMVjHR3W6n0*UIpHw#?I7pC7c8n?s6zNHvit>4%*Sgv(;q@s|U3DND(jr2CvTFe# zH>@f<1G?cI(BK6ymw^rzsn&!(v+7Xo``NtyF$A%dsI3qso03^9v@O8c=ym;Ud`WYc zY&PX_-t3Lz?~8VZOy)(8au_7x_T5Bw2c7_QFoY&l;RrjpbDfuv00qE65uOWOdus_j zOvV8a1mHrB2JtiDZZC4*z$!N6VGmP?f)mJa2RT?|AHQxMkG{9;)wgiu(V3PV^tv?Vu@73G)by8kJ1`U(Dd{$5vY()dY>J2W8*|PVfX=w?K68 z0BRKzX_8r|)Ek0y6KSVOt+6wcLq!+|OQy3Em2@V5H#HfOZOykRSy+I0hc)N48@<&7ydowCxdOoWGGc0(A6HxM1YClDR8JJHZnbE6Kmv#h(icwVW0;z1b{y@ zhPB~}Tu3a~7d{^H38b(yv2jF8@r7h)ZTPco5!ej7_A~SneSD%tGNL1-B#y`dcSX{P zT1a@#fDqGjT<*0n4xV92*$ErH>7%G zAO%n01$)pt(kKc${>XOoWEiH{3RnmXgOZ6OaZd;VMjhyZHbH!o>fcSaDQcp&K?&anv9B6&%vGzjU7?vY&=)Ll6MjDS^B$?+4ka1`jJ zF!t9ftS1FdfCkX$9bOk039xXzcNOwDc;u5V*oXk%QYb9=fxtF_)Q46tNeMZ5j>2b` zcZo8-5sHJ9Pcpm*00`*=3(1g2w!uHEo$Nm#y&`?6WHdW={^rVjU(L>my+rrdckAn*wGb3}sM6#5Yf6 zcG$?0M1*GkiEx|t#9_dB5r45}NVQKjmS9O0C`Z$Pwkac(h!AS23P=f?u~9~xX-h@f z08v((xEY*`XL&^cnJ_gxZDW-}7J7fNo)VS{EaPeuaR>0Vk#`UWjD>=k31S^4BKkm^ z&*^Lilb}tNl>E>VH;_(+zyRZ9oPjBr9$1o6BvvUwnB=5N80s$|`U+MxZD+-n%ppT? z!a&O6b#;j~hVYoV1UF6Aer=Q`R|yOR!GOGCNDUwc3L_DD08|?p2Gs;Jb^w4HCJFoy zPIqaKt?&;@#5oJcgj&-RNf{a%HJtYuoyE8}dsjrwi3sA8oL`EcvE*j4v|y?^eQwHO zXL|k;$|s$|*`@+TkHBeARTG{6Bv9CLr=rkmZIGBu0v@_JrU)TED={Go5C9keOf?E0 zHE1R5K~sE}k7Hz0&=44m;cu_jDvR_4PtXN>aDNUVjXPp3Bc@M(dZ13TW<)V0Wmct1 zL<(G$539?&Hw`HBceY@e5-6~!NKv=mIyi1YB&g&o@0j#4F2$# zK$cR(=H&r;gY)X3rh4^n_ya| zfM5DGv_xC9MtihKo3u(BTH)2Sqs0JSX`Zbj2M?fM|{KV!O2Yg#bS52NA$~U1fmIdM~lGMFmlz_!5qc83{+Sv!X&) zVI+=#>wy6C6D2ly4U13a2oMV}uQ&@YeUl@Rzz>-ThX#TjXGuR75{omMwZYU~+|^fn z<+b@Xj^#5NBS^0P<|M5`Yfc~qUI2U66cLoMiM7{-1(cOV0agfAjLd*O{=EVd?i!mH zH;N*M3zhhmiu-`7xC&=zjL{o5CmE0RB52L4xFIHsLdl$t3?Bd(7^jcK^WTxfimN`~&5xue3l3^RwTz@Zlsc`qpbbTOPUw{jj?;(qU2 zhR8-PgrpE!&=A;k1_k#7UqG6SRXw|F2_oq~8vMabBO3dPK8D1CQc5IZ43`s|ca-Fc zP{Et8v&c8OC#bV70+Vf;d~E^qK8zrO;He~1>ktS>K=0Bm?g^iqHpexHg9j*^^t1pF z&?ZpwSft8`_SZm6`ilNghL%%~pJKd_+RTG0W)(Q#blo=D~+b$4ozB459F-SuqQdw-Azn2dfvz z{g)jv+pcUWi^wN@Uvq&)af!{$lDIm>t7C@*%WZSly|@0CjZh>I{rb%$9Bd^gu_vLy zzu=My%?rO!plE!~c9o;VXtIdVE0H!b08&kQ0LV}v1!Ry1FVm0g z`hC*C4Blg~RP_{V7&&PN$=9}(dv}kxpuGJ8N}njv*A|N-&AbJrr6_^Xl+4hV%g7>( z9IJK#C~Qk=WDyf>KJA&cYP zhPW^=QwI=0hY69PU}GDO%n9fd7~#X0EL?V;JU_~etUNh*)mwJ1L%o>Ht59<~RsC_6 z<59FEzSN4IC*3tc1ILk>zBuY++qE7vmBYYI4Vb`#KygXd5}3C~v5l{J$ - - - - Document - - - - - - - -